From e4c1a799fb65d78a25808ae84617a20ac13ef788 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Wed, 20 Dec 2023 11:36:29 +0100 Subject: [PATCH 01/62] fix dark theme in global search bar (#173613) ## Summary partially address https://github.com/elastic/kibana/issues/173529 --- x-pack/plugins/global_search_bar/kibana.jsonc | 3 -- .../public/components/popover_placeholder.tsx | 9 +++--- .../public/components/search_bar.test.tsx | 6 ---- .../public/components/search_bar.tsx | 6 ++-- .../public/components/types.ts | 1 - .../global_search_bar/public/plugin.tsx | 28 ++++++++----------- .../public/telemetry/telmetry.test.tsx | 8 ------ .../plugins/global_search_bar/tsconfig.json | 2 +- 8 files changed, 21 insertions(+), 42 deletions(-) diff --git a/x-pack/plugins/global_search_bar/kibana.jsonc b/x-pack/plugins/global_search_bar/kibana.jsonc index 44689ddc5bdfd..552ee46e6e41d 100644 --- a/x-pack/plugins/global_search_bar/kibana.jsonc +++ b/x-pack/plugins/global_search_bar/kibana.jsonc @@ -16,9 +16,6 @@ "optionalPlugins": [ "usageCollection", "savedObjectsTagging" - ], - "requiredBundles": [ - "kibanaReact" ] } } diff --git a/x-pack/plugins/global_search_bar/public/components/popover_placeholder.tsx b/x-pack/plugins/global_search_bar/public/components/popover_placeholder.tsx index ecd4b2aee8f02..7783cc94cfdba 100644 --- a/x-pack/plugins/global_search_bar/public/components/popover_placeholder.tsx +++ b/x-pack/plugins/global_search_bar/public/components/popover_placeholder.tsx @@ -6,16 +6,17 @@ */ import React, { FC } from 'react'; -import { EuiImage, EuiText, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiImage, EuiText, EuiFlexGroup, EuiFlexItem, useEuiTheme } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; interface PopoverPlaceholderProps { - darkMode: boolean; basePath: string; } -export const PopoverPlaceholder: FC = ({ basePath, darkMode }) => { +export const PopoverPlaceholder: FC = ({ basePath }) => { + const { colorMode } = useEuiTheme(); + return ( = ({ basePath, dark })} size="fullWidth" url={`${basePath}illustration_product_no_search_results_${ - darkMode ? 'dark' : 'light' + colorMode === 'DARK' ? 'dark' : 'light' }.svg`} /> diff --git a/x-pack/plugins/global_search_bar/public/components/search_bar.test.tsx b/x-pack/plugins/global_search_bar/public/components/search_bar.test.tsx index fec5c4c008c09..1caa636e86cb5 100644 --- a/x-pack/plugins/global_search_bar/public/components/search_bar.test.tsx +++ b/x-pack/plugins/global_search_bar/public/components/search_bar.test.tsx @@ -52,7 +52,6 @@ describe('SearchBar', () => { const core = coreMock.createStart(); const basePathUrl = '/plugins/globalSearchBar/assets/'; - const darkMode = false; const eventReporter = new EventReporter({ analytics: core.analytics, usageCollection }); let searchService: ReturnType; let applications: ReturnType; @@ -109,7 +108,6 @@ describe('SearchBar', () => { globalSearch={searchService} navigateToUrl={applications.navigateToUrl} basePathUrl={basePathUrl} - darkMode={darkMode} chromeStyle$={chromeStyle$} reportEvent={eventReporter} /> @@ -138,7 +136,6 @@ describe('SearchBar', () => { globalSearch={searchService} navigateToUrl={applications.navigateToUrl} basePathUrl={basePathUrl} - darkMode={darkMode} chromeStyle$={chromeStyle$} reportEvent={eventReporter} /> @@ -171,7 +168,6 @@ describe('SearchBar', () => { globalSearch={searchService} navigateToUrl={applications.navigateToUrl} basePathUrl={basePathUrl} - darkMode={darkMode} chromeStyle$={chromeStyle$} reportEvent={eventReporter} /> @@ -203,7 +199,6 @@ describe('SearchBar', () => { globalSearch={searchService} navigateToUrl={applications.navigateToUrl} basePathUrl={basePathUrl} - darkMode={darkMode} chromeStyle$={chromeStyle$} reportEvent={eventReporter} /> @@ -227,7 +222,6 @@ describe('SearchBar', () => { globalSearch={searchService} navigateToUrl={applications.navigateToUrl} basePathUrl={basePathUrl} - darkMode={darkMode} chromeStyle$={chromeStyle$} reportEvent={eventReporter} /> diff --git a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx index f911b2bc18a4c..821a6efad3491 100644 --- a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx +++ b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx @@ -36,9 +36,9 @@ import { PopoverPlaceholder } from './popover_placeholder'; import './search_bar.scss'; import { SearchBarProps } from './types'; -const NoMatchesMessage = (props: { basePathUrl: string; darkMode: boolean }) => ( - -); +const NoMatchesMessage = (props: { basePathUrl: string }) => { + return ; +}; const EmptyMessage = () => ( diff --git a/x-pack/plugins/global_search_bar/public/components/types.ts b/x-pack/plugins/global_search_bar/public/components/types.ts index c56cde3bf443f..de0af36624db2 100644 --- a/x-pack/plugins/global_search_bar/public/components/types.ts +++ b/x-pack/plugins/global_search_bar/public/components/types.ts @@ -19,6 +19,5 @@ export interface SearchBarProps { reportEvent: EventReporter; taggingApi?: SavedObjectTaggingPluginStart; basePathUrl: string; - darkMode: boolean; chromeStyle$: Observable; } diff --git a/x-pack/plugins/global_search_bar/public/plugin.tsx b/x-pack/plugins/global_search_bar/public/plugin.tsx index 12f15036886c4..00cddfb65534f 100644 --- a/x-pack/plugins/global_search_bar/public/plugin.tsx +++ b/x-pack/plugins/global_search_bar/public/plugin.tsx @@ -7,8 +7,7 @@ import { ChromeNavControl, CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; import { GlobalSearchPluginStart } from '@kbn/global-search-plugin/public'; -import { I18nProvider } from '@kbn/i18n-react'; -import { KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { SavedObjectTaggingPluginStart } from '@kbn/saved-objects-tagging-plugin/public'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; import React from 'react'; @@ -38,26 +37,23 @@ export class GlobalSearchBarPlugin implements Plugin<{}, {}, {}, GlobalSearchBar private getNavControl(deps: { core: CoreStart } & GlobalSearchBarPluginStartDeps) { const { core, globalSearch, savedObjectsTagging, usageCollection } = deps; - const { application, http, theme, uiSettings } = core; + const { application, http, theme, i18n } = core; const reportEvent = new EventReporter({ analytics: core.analytics, usageCollection }); const navControl: ChromeNavControl = { order: 1000, mount: (container) => { ReactDOM.render( - - - - - , + + + , container ); diff --git a/x-pack/plugins/global_search_bar/public/telemetry/telmetry.test.tsx b/x-pack/plugins/global_search_bar/public/telemetry/telmetry.test.tsx index 6eec366dc5ab2..f44612a382972 100644 --- a/x-pack/plugins/global_search_bar/public/telemetry/telmetry.test.tsx +++ b/x-pack/plugins/global_search_bar/public/telemetry/telmetry.test.tsx @@ -50,7 +50,6 @@ describe('SearchBar', () => { const usageCollection = usageCollectionPluginMock.createSetupContract(); const core = coreMock.createStart(); const basePathUrl = '/plugins/globalSearchBar/assets/'; - const darkMode = false; let searchService: ReturnType; let applications: ReturnType; let mockReportUiCounter: typeof usageCollection.reportUiCounter; @@ -114,7 +113,6 @@ describe('SearchBar', () => { globalSearch={searchService} navigateToUrl={applications.navigateToUrl} basePathUrl={basePathUrl} - darkMode={darkMode} chromeStyle$={chromeStyle$} reportEvent={eventReporter} /> @@ -137,7 +135,6 @@ describe('SearchBar', () => { globalSearch={searchService} navigateToUrl={applications.navigateToUrl} basePathUrl={basePathUrl} - darkMode={darkMode} chromeStyle$={chromeStyle$} reportEvent={eventReporter} /> @@ -165,7 +162,6 @@ describe('SearchBar', () => { globalSearch={searchService} navigateToUrl={applications.navigateToUrl} basePathUrl={basePathUrl} - darkMode={darkMode} chromeStyle$={chromeStyle$} reportEvent={eventReporter} /> @@ -203,7 +199,6 @@ describe('SearchBar', () => { globalSearch={searchService} navigateToUrl={applications.navigateToUrl} basePathUrl={basePathUrl} - darkMode={darkMode} chromeStyle$={chromeStyle$} reportEvent={eventReporter} /> @@ -240,7 +235,6 @@ describe('SearchBar', () => { globalSearch={searchService} navigateToUrl={applications.navigateToUrl} basePathUrl={basePathUrl} - darkMode={darkMode} chromeStyle$={chromeStyle$} reportEvent={eventReporter} /> @@ -270,7 +264,6 @@ describe('SearchBar', () => { globalSearch={searchService} navigateToUrl={applications.navigateToUrl} basePathUrl={basePathUrl} - darkMode={darkMode} chromeStyle$={chromeStyle$} reportEvent={eventReporter} /> @@ -300,7 +293,6 @@ describe('SearchBar', () => { globalSearch={searchService} navigateToUrl={applications.navigateToUrl} basePathUrl={basePathUrl} - darkMode={darkMode} chromeStyle$={chromeStyle$} reportEvent={eventReporter} /> diff --git a/x-pack/plugins/global_search_bar/tsconfig.json b/x-pack/plugins/global_search_bar/tsconfig.json index 1084a9b1139d6..1e66c8225abea 100644 --- a/x-pack/plugins/global_search_bar/tsconfig.json +++ b/x-pack/plugins/global_search_bar/tsconfig.json @@ -11,11 +11,11 @@ "@kbn/saved-objects-tagging-plugin", "@kbn/analytics", "@kbn/i18n-react", - "@kbn/kibana-react-plugin", "@kbn/i18n", "@kbn/saved-objects-tagging-oss-plugin", "@kbn/core-chrome-browser", "@kbn/analytics-client", + "@kbn/react-kibana-context-render", ], "exclude": [ "target/**/*", From 8e29ce82429f2d5c20884d488753ef908d550890 Mon Sep 17 00:00:00 2001 From: Pete Harverson Date: Wed, 20 Dec 2023 10:43:59 +0000 Subject: [PATCH 02/62] [ML] Adds warning for legacy method for installing pre-configured APM transaction job (#173375) ## Summary Adds text to the anomaly detection job creation wizard card for the pre-configured job for APM transaction data that the job should be created inside the APM app. The APM UI adds metadata and an additional `service.environment` filter term to the datafeed query, and these extra properties are not added when creating the APM transaction job from within the ML job wizard image Closes #172160 ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../data_recognizer/modules/apm_transaction/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_transaction/manifest.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_transaction/manifest.json index f07c9dcba94a4..46f7f7362eb21 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_transaction/manifest.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_transaction/manifest.json @@ -1,7 +1,7 @@ { "id": "apm_transaction", "title": "APM", - "description": "Detect anomalies in transaction latency, throughput and failure rate from your APM services for metric data.", + "description": "Legacy job for detecting anomalies in transaction latency, throughput and failure rate from your APM services for metric data. The latest version can be installed from the APM app in Observability.", "type": "Transaction data", "logoFile": "logo.json", "defaultIndexPattern": "apm-*-metric,metrics-apm*", From 50f67699f7a6183ba770e24a7a4575567150ad05 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Wed, 20 Dec 2023 11:46:12 +0100 Subject: [PATCH 03/62] [Fleet] Do not write to metrics-fleet_server.usage* if .fleet-agents is not yet created (#173689) --- .../metrics/fetch_agent_metrics.test.ts | 8 ++++++++ .../services/metrics/fetch_agent_metrics.ts | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.test.ts b/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.test.ts index fee9e7497e0ef..d8e8030279620 100644 --- a/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.test.ts +++ b/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.test.ts @@ -29,6 +29,14 @@ describe('fetchAgentMetrics', () => { esClient = elasticsearch.client.asInternalUser as ElasticsearchClientMock; }); + it('should not fetch agent if .fleet-agents is not created', async () => { + esClient.indices.get.mockRejectedValue({ statusCode: 404 }); + + const result = await fetchAgentMetrics(mockCore, abortController); + + expect(result).toBeUndefined(); + }); + it('should fetch agent metrics', async () => { esClient.search.mockResolvedValue({ took: 5, diff --git a/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.ts b/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.ts index b768213986f3a..6fc0966e266ed 100644 --- a/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.ts +++ b/x-pack/plugins/fleet/server/services/metrics/fetch_agent_metrics.ts @@ -42,6 +42,23 @@ export const fetchAgentMetrics = async ( if (!soClient || !esClient) { return; } + + const fleetAgentsIndexExists = await esClient.indices + .get({ + index: AGENTS_INDEX, + }) + .catch((error) => { + if (error.statusCode === 404) { + return; + } + + throw error; + }); + + if (!fleetAgentsIndexExists) { + return; + } + const usage = { agents: await getAgentUsage(soClient, esClient), agents_per_version: await getAgentsPerVersion(esClient, abortController), From fc367aaaa405aaeb8905490bb27b0c80eac4a132 Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Wed, 20 Dec 2023 11:58:54 +0100 Subject: [PATCH 04/62] [EDR Workflows][Osquery] Proper schema generation for rules (#173611) https://github.com/elastic/kibana/issues/172452 Proper way of generating schema (`.schema.yaml` as source). https://github.com/elastic/kibana/assets/29123534/d7be0f71-62ad-4afb-aa43-98b6af7bfd47 --- .../model/rule_response_actions/response_actions.gen.ts | 2 ++ .../model/rule_response_actions/response_actions.schema.yaml | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_response_actions/response_actions.gen.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_response_actions/response_actions.gen.ts index eebcde55a0301..e6d00181a7a4e 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_response_actions/response_actions.gen.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_response_actions/response_actions.gen.ts @@ -52,6 +52,7 @@ export const OsqueryParams = z.object({ queries: z.array(OsqueryQuery).optional(), pack_id: z.string().optional(), saved_query_id: z.string().optional(), + timeout: z.number().optional(), }); export type OsqueryParamsCamelCase = z.infer; @@ -61,6 +62,7 @@ export const OsqueryParamsCamelCase = z.object({ queries: z.array(OsqueryQuery).optional(), packId: z.string().optional(), savedQueryId: z.string().optional(), + timeout: z.number().optional(), }); export type OsqueryResponseAction = z.infer; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_response_actions/response_actions.schema.yaml b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_response_actions/response_actions.schema.yaml index 9d27bb6e4a97c..3e4b37e115add 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_response_actions/response_actions.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_response_actions/response_actions.schema.yaml @@ -65,6 +65,8 @@ components: type: string saved_query_id: type: string + timeout: + type: number OsqueryParamsCamelCase: type: object @@ -81,6 +83,8 @@ components: type: string savedQueryId: type: string + timeout: + type: number OsqueryResponseAction: type: object From 643aa605cd803a3f323db323a679d207bd098544 Mon Sep 17 00:00:00 2001 From: Pete Harverson Date: Wed, 20 Dec 2023 11:02:57 +0000 Subject: [PATCH 05/62] [ML] Fixes display of actions column in the datafeed chart flyout (#173365) ## Summary Fixes the 'Actions' column in the datafeed chart flyout, opened from the anomaly detection jobs list, so that the 'Toggle in chart' action is only shown once per row. #### Before: datafeed_flyout_actions_before #### After: datafeed_flyout_actions_after Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/job_messages/job_messages.tsx | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/x-pack/plugins/ml/public/application/components/job_messages/job_messages.tsx b/x-pack/plugins/ml/public/application/components/job_messages/job_messages.tsx index c5a7826ac0ee9..adc56c5467133 100644 --- a/x-pack/plugins/ml/public/application/components/job_messages/job_messages.tsx +++ b/x-pack/plugins/ml/public/application/components/job_messages/job_messages.tsx @@ -48,7 +48,7 @@ export const JobMessages: FC = ({ }) => { const { showNodeInfo } = useEnabledFeatures(); const columns: Array> = useMemo(() => { - const cols = [ + const cols: Array> = [ { name: refreshMessage ? ( = ({ }); } - return cols; - }, [showNodeInfo, refreshMessage]); - - if (typeof actionHandler === 'function') { - columns.push({ - name: i18n.translate('xpack.ml.jobMessages.actionsLabel', { - defaultMessage: 'Actions', - }), - width: '10%', - actions: [ - { - render: (message: JobMessage) => { - return ( - { + return ( + + } + > + actionHandler(message)} /> - } - > - actionHandler(message)} - /> - - ); + + ); + }, }, - }, - ], - }); - } + ], + }); + } + + return cols; + }, [showNodeInfo, refreshMessage, actionHandler]); const defaultSorting = { sort: { From 4e049fa010e7e425455d6ad5d4464f146c0d2cb1 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Wed, 20 Dec 2023 12:41:48 +0100 Subject: [PATCH 06/62] Remove outdated code comment (#173711) --- packages/kbn-apm-config-loader/src/config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/kbn-apm-config-loader/src/config.ts b/packages/kbn-apm-config-loader/src/config.ts index 0dbff5b2385ca..7430454cc4c2a 100644 --- a/packages/kbn-apm-config-loader/src/config.ts +++ b/packages/kbn-apm-config-loader/src/config.ts @@ -9,7 +9,6 @@ import { join } from 'path'; import { merge } from 'lodash'; import { execSync } from 'child_process'; -// deep import to avoid loading the whole package import { getDataPath } from '@kbn/utils'; import { readFileSync } from 'fs'; import type { AgentConfigOptions } from 'elastic-apm-node'; From 730e53cb5ccde513e82a49c2c1f1fcef7ca67d07 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Wed, 20 Dec 2023 12:46:29 +0100 Subject: [PATCH 07/62] [ES|QL] Add missing functions to the supported definition list (#173656) ## Summary Added `ceil`, `least` and `to_cartesianpoint` functions to the supported list. Tests are automatically generated fro them. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../src/esql/lib/ast/definitions/functions.ts | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts b/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts index 6cabc530883aa..820ab04fea3bf 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts @@ -37,6 +37,19 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, ], }, + { + name: 'ceil', + description: i18n.translate('monaco.esql.definitions.ceilDoc', { + defaultMessage: 'Round a number up to the nearest integer.', + }), + signatures: [ + { + params: [{ name: 'field', type: 'number' }], + returnType: 'number', + examples: [`from index | eval ceil_value = ceil(field)`], + }, + ], + }, { name: 'log10', description: i18n.translate('monaco.esql.definitions.log10Doc', { @@ -209,6 +222,19 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, ], }, + { + name: 'to_cartesianpoint', + description: i18n.translate('monaco.esql.definitions.toCartesianPointDoc', { + defaultMessage: 'Converts an input value to a `point` value.', + }), + signatures: [ + { + params: [{ name: 'field', type: 'any' }], + returnType: 'cartesian_point', + examples: [`from index | EVAL point = to_cartesianpoint(field)`], + }, + ], + }, { name: 'to_datetime', alias: ['to_dt'], @@ -645,6 +671,22 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }, ], }, + { + name: 'least', + description: i18n.translate('monaco.esql.definitions.leastDoc', { + defaultMessage: 'Returns the minimum value from many columns.', + }), + signatures: [ + { + params: [ + { name: 'first', type: 'number' }, + { name: 'rest', type: 'number' }, + ], + returnType: 'number', + examples: ['from index | eval l = least(a, b)'], + }, + ], + }, { name: 'left', description: i18n.translate('monaco.esql.definitions.leftDoc', { From fcab43fcd0901ed82bbf9097457fa7e480322a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=BCrmer?= Date: Wed, 20 Dec 2023 12:46:50 +0100 Subject: [PATCH 08/62] [Logs Explorer] Avoid unreliable time range expansion in functional test (#173665) --- .../observability/observability_log_explorer/header_menu.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts index 90aea100989cc..14d8dd94376de 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts @@ -22,8 +22,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'svlCommonNavigation', ]); - // FLAKY: https://github.com/elastic/kibana/issues/173165 - describe.skip('Header menu', () => { + describe('Header menu', () => { before(async () => { await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); await esArchiver.load( @@ -143,9 +142,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); expect(await browser.getCurrentUrl()).contain('/app/discover'); - await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); - await PageObjects.discover.waitForDocTableLoadingComplete(); - await retry.try(async () => { expect(await PageObjects.discover.getCurrentlySelectedDataView()).not.to.eql('All logs'); }); From 6a43e94e6c3de4378c583a266611f30049332662 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Wed, 20 Dec 2023 12:00:55 +0000 Subject: [PATCH 09/62] [ML] Sharing install elastic model service (#171918) Shares our [recently added](https://github.com/elastic/kibana/pull/169939) install elastic model endpoint as a shared service. --- .../providers/__mocks__/trained_models.ts | 1 + .../shared_services/providers/trained_models.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/x-pack/plugins/ml/server/shared_services/providers/__mocks__/trained_models.ts b/x-pack/plugins/ml/server/shared_services/providers/__mocks__/trained_models.ts index fa37f3d468fc3..ea935aa9cb61d 100644 --- a/x-pack/plugins/ml/server/shared_services/providers/__mocks__/trained_models.ts +++ b/x-pack/plugins/ml/server/shared_services/providers/__mocks__/trained_models.ts @@ -18,6 +18,7 @@ const trainedModelsServiceMock = { putTrainedModel: jest.fn(), getELSER: jest.fn().mockResolvedValue({ model_id: '.elser_model_2' }), getCuratedModelConfig: jest.fn().mockResolvedValue({ model_id: '.elser_model_2' }), + installElasticModel: jest.fn(), } as jest.Mocked; export const createTrainedModelsProviderMock = () => diff --git a/x-pack/plugins/ml/server/shared_services/providers/trained_models.ts b/x-pack/plugins/ml/server/shared_services/providers/trained_models.ts index 6b04a3e7580d9..36d639066f97a 100644 --- a/x-pack/plugins/ml/server/shared_services/providers/trained_models.ts +++ b/x-pack/plugins/ml/server/shared_services/providers/trained_models.ts @@ -53,6 +53,7 @@ export interface TrainedModelsProvider { ): Promise; getELSER(params?: GetModelDownloadConfigOptions): Promise; getCuratedModelConfig(...params: GetCuratedModelConfigParams): Promise; + installElasticModel(modelId: string): Promise; }; } @@ -144,6 +145,17 @@ export function getTrainedModelsProvider( return modelsProvider(scopedClient, mlClient, cloud).getCuratedModelConfig(...params); }); }, + async installElasticModel(modelId: string) { + return await guards + .isFullLicense() + .hasMlCapabilities(['canGetTrainedModels']) + .ok(async ({ scopedClient, mlClient, mlSavedObjectService }) => { + return modelsProvider(scopedClient, mlClient, cloud).installElasticModel( + modelId, + mlSavedObjectService + ); + }); + }, }; }, }; From 7450a252c57f39ca4b100f6720af6a0917d0e5bf Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Wed, 20 Dec 2023 13:12:50 +0100 Subject: [PATCH 10/62] [UnifiedFieldList] Hide "Empty fields" section if there are no fields in it (#172956) ## Summary This PR hides "Empty fields" section when it's empty. Screenshot 2023-12-08 at 16 05 47 Screenshot 2023-12-08 at 16 06 09 ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Stratoula Kalafateli --- .../field_list_grouped.test.tsx | 74 +++++++++---------- .../use_grouped_fields.test.tsx.snap | 6 +- .../src/hooks/use_grouped_fields.ts | 2 +- .../discover_sidebar_responsive.test.tsx | 2 +- .../field_stats.ts | 2 +- .../apps/discover/group3/_drag_drop.ts | 4 +- .../apps/discover/group3/_sidebar.ts | 60 ++++++--------- .../datasources/form_based/datapanel.test.tsx | 2 +- .../common/discover/group3/_sidebar.ts | 58 ++++++--------- .../field_stats.ts | 2 +- 10 files changed, 94 insertions(+), 118 deletions(-) diff --git a/packages/kbn-unified-field-list/src/components/field_list_grouped/field_list_grouped.test.tsx b/packages/kbn-unified-field-list/src/components/field_list_grouped/field_list_grouped.test.tsx index 9a86b56f52dc7..6744fb92db152 100644 --- a/packages/kbn-unified-field-list/src/components/field_list_grouped/field_list_grouped.test.tsx +++ b/packages/kbn-unified-field-list/src/components/field_list_grouped/field_list_grouped.test.tsx @@ -22,7 +22,7 @@ import { FieldsAccordion } from './fields_accordion'; import { NoFieldsCallout } from './no_fields_callout'; import { useGroupedFields, type GroupedFieldsParams } from '../../hooks/use_grouped_fields'; -describe('UnifiedFieldList + useGroupedFields()', () => { +describe('UnifiedFieldList FieldListGrouped + useGroupedFields()', () => { let defaultProps: FieldListGroupedProps; let mockedServices: GroupedFieldsParams['services']; const allFields = dataView.fields; @@ -123,11 +123,11 @@ describe('UnifiedFieldList + useGroupedFields()', () => { ExistenceFetchStatus.unknown ); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe(''); - expect(wrapper.find(FieldsAccordion)).toHaveLength(3); - expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(3); + expect(wrapper.find(FieldsAccordion)).toHaveLength(2); + expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(2); expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('hasLoaded')) - ).toStrictEqual([false, false, false]); + ).toStrictEqual([false, false]); expect(wrapper.find(NoFieldsCallout)).toHaveLength(0); await act(async () => { @@ -144,17 +144,17 @@ describe('UnifiedFieldList + useGroupedFields()', () => { ExistenceFetchStatus.succeeded ); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '25 available fields. 0 empty fields. 3 meta fields.' + '25 available fields. 3 meta fields.' ); - expect(wrapper.find(FieldsAccordion)).toHaveLength(3); + expect(wrapper.find(FieldsAccordion)).toHaveLength(2); expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(0); expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('hasLoaded')) - ).toStrictEqual([true, true, true]); + ).toStrictEqual([true, true]); expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('paginatedFields').length) - ).toStrictEqual([25, 0, 0]); - expect(wrapper.find(NoFieldsCallout)).toHaveLength(1); + ).toStrictEqual([25, 0]); + expect(wrapper.find(NoFieldsCallout)).toHaveLength(0); }); it('renders correctly in failed state', async () => { @@ -173,16 +173,16 @@ describe('UnifiedFieldList + useGroupedFields()', () => { ExistenceFetchStatus.failed ); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '25 available fields. 0 empty fields. 3 meta fields.' + '25 available fields. 3 meta fields.' ); - expect(wrapper.find(FieldsAccordion)).toHaveLength(3); + expect(wrapper.find(FieldsAccordion)).toHaveLength(2); expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(0); expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('hasLoaded')) - ).toStrictEqual([true, true, true]); + ).toStrictEqual([true, true]); expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('showExistenceFetchError')) - ).toStrictEqual([true, true, true]); + ).toStrictEqual([true, true]); }); it('renders correctly in no fields state', async () => { @@ -199,13 +199,13 @@ describe('UnifiedFieldList + useGroupedFields()', () => { }); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '0 available fields. 0 empty fields. 0 meta fields.' + '0 available fields. 0 meta fields.' ); - expect(wrapper.find(FieldsAccordion)).toHaveLength(3); + expect(wrapper.find(FieldsAccordion)).toHaveLength(2); expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(0); expect( wrapper.find(NoFieldsCallout).map((callout) => callout.prop('fieldsExistInIndex')) - ).toStrictEqual([false, false, false]); + ).toStrictEqual([false, false]); }); it('renders correctly for text-based queries (no data view)', async () => { @@ -242,11 +242,11 @@ describe('UnifiedFieldList + useGroupedFields()', () => { }); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '25 available fields. 0 empty fields. 3 meta fields.' + '25 available fields. 3 meta fields.' ); expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('paginatedFields').length) - ).toStrictEqual([25, 0, 0]); + ).toStrictEqual([25, 0]); await act(async () => { await wrapper @@ -259,7 +259,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('paginatedFields').length) - ).toStrictEqual([25, 0, 3]); + ).toStrictEqual([25, 3]); }); it('renders correctly when paginated', async () => { @@ -275,11 +275,11 @@ describe('UnifiedFieldList + useGroupedFields()', () => { }); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '25 available fields. 112 unmapped fields. 0 empty fields. 3 meta fields.' + '25 available fields. 112 unmapped fields. 3 meta fields.' ); expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('paginatedFields').length) - ).toStrictEqual([25, 0, 0, 0]); + ).toStrictEqual([25, 0, 0]); await act(async () => { await wrapper @@ -292,11 +292,11 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('paginatedFields').length) - ).toStrictEqual([25, 50, 0, 0]); + ).toStrictEqual([25, 50, 0]); await act(async () => { await wrapper - .find('[data-test-subj="fieldListGroupedEmptyFields"]') + .find('[data-test-subj="fieldListGroupedMetaFields"]') .find('button') .first() .simulate('click'); @@ -305,7 +305,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('paginatedFields').length) - ).toStrictEqual([25, 88, 0, 0]); + ).toStrictEqual([25, 88, 0]); }); it('renders correctly when fields are searched and filtered', async () => { @@ -322,7 +322,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { }); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '25 available fields. 112 unmapped fields. 0 empty fields. 3 meta fields.' + '25 available fields. 112 unmapped fields. 3 meta fields.' ); await act(async () => { @@ -336,7 +336,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { }); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '2 available fields. 8 unmapped fields. 0 empty fields. 0 meta fields.' + '2 available fields. 8 unmapped fields. 0 meta fields.' ); await act(async () => { @@ -350,7 +350,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { }); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '3 available fields. 24 unmapped fields. 0 empty fields. 3 meta fields.' + '3 available fields. 24 unmapped fields. 3 meta fields.' ); await act(async () => { @@ -367,7 +367,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { }); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '1 available field. 4 unmapped fields. 0 empty fields. 0 meta fields.' + '1 available field. 4 unmapped fields. 0 meta fields.' ); }, 10000); @@ -385,7 +385,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { }); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '25 available fields. 112 unmapped fields. 0 empty fields. 3 meta fields.' + '25 available fields. 112 unmapped fields. 3 meta fields.' ); await act(async () => { @@ -399,7 +399,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { }); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '23 available fields. 104 unmapped fields. 0 empty fields. 3 meta fields.' + '23 available fields. 104 unmapped fields. 3 meta fields.' ); }); @@ -417,7 +417,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { }); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '25 available fields. 112 unmapped fields. 0 empty fields. 3 meta fields.' + '25 available fields. 112 unmapped fields. 3 meta fields.' ); await act(async () => { @@ -432,7 +432,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { }); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '2 selected fields. 25 available fields. 112 unmapped fields. 0 empty fields. 3 meta fields.' + '2 selected fields. 25 available fields. 112 unmapped fields. 3 meta fields.' ); }); @@ -452,7 +452,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { }); expect(wrapper.find(`#${defaultProps.screenReaderDescriptionId}`).first().text()).toBe( - '2 selected fields. 10 popular fields. 25 available fields. 112 unmapped fields. 0 empty fields. 3 meta fields.' + '2 selected fields. 10 popular fields. 25 available fields. 112 unmapped fields. 3 meta fields.' ); }); @@ -472,11 +472,11 @@ describe('UnifiedFieldList + useGroupedFields()', () => { // only Available is open expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('initialIsOpen')) - ).toStrictEqual([true, false, false, false]); + ).toStrictEqual([true, false, false]); await act(async () => { await wrapper - .find('[data-test-subj="fieldListGroupedEmptyFields"]') + .find('[data-test-subj="fieldListGroupedMetaFields"]') .find('button') .first() .simulate('click'); @@ -486,7 +486,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { // now Empty is open too expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('initialIsOpen')) - ).toStrictEqual([true, false, true, false]); + ).toStrictEqual([true, false, true]); const wrapper2 = await mountGroupedList({ listProps: { @@ -503,6 +503,6 @@ describe('UnifiedFieldList + useGroupedFields()', () => { // both Available and Empty are open for the second instance expect( wrapper2.find(FieldsAccordion).map((accordion) => accordion.prop('initialIsOpen')) - ).toStrictEqual([true, false, true, false]); + ).toStrictEqual([true, false, true]); }); }); diff --git a/packages/kbn-unified-field-list/src/hooks/__snapshots__/use_grouped_fields.test.tsx.snap b/packages/kbn-unified-field-list/src/hooks/__snapshots__/use_grouped_fields.test.tsx.snap index d3c95c363695d..bf62c67deafc3 100644 --- a/packages/kbn-unified-field-list/src/hooks/__snapshots__/use_grouped_fields.test.tsx.snap +++ b/packages/kbn-unified-field-list/src/hooks/__snapshots__/use_grouped_fields.test.tsx.snap @@ -19,7 +19,7 @@ Object { "fields": Array [], "helpText": "Fields that don't have any values based on your filters.", "hideDetails": false, - "hideIfEmpty": false, + "hideIfEmpty": true, "isAffectedByGlobalFilter": false, "isAffectedByTimeFilter": false, "isInitiallyOpen": false, @@ -105,7 +105,7 @@ Object { "fields": Array [], "helpText": "Fields that don't have any values based on your filters.", "hideDetails": false, - "hideIfEmpty": false, + "hideIfEmpty": true, "isAffectedByGlobalFilter": false, "isAffectedByTimeFilter": false, "isInitiallyOpen": false, @@ -191,7 +191,7 @@ Object { "fields": Array [], "helpText": "Fields that don't have any values based on your filters.", "hideDetails": false, - "hideIfEmpty": false, + "hideIfEmpty": true, "isAffectedByGlobalFilter": false, "isAffectedByTimeFilter": false, "isInitiallyOpen": false, diff --git a/packages/kbn-unified-field-list/src/hooks/use_grouped_fields.ts b/packages/kbn-unified-field-list/src/hooks/use_grouped_fields.ts index f51f9b0fffb2d..16758ea4ee7f2 100644 --- a/packages/kbn-unified-field-list/src/hooks/use_grouped_fields.ts +++ b/packages/kbn-unified-field-list/src/hooks/use_grouped_fields.ts @@ -252,7 +252,7 @@ export function useGroupedFields({ isInitiallyOpen: false, showInAccordion: true, hideDetails: false, - hideIfEmpty: !dataViewId, + hideIfEmpty: true, title: i18n.translate('unifiedFieldList.useGroupedFields.emptyFieldsLabel', { defaultMessage: 'Empty fields', }), diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx index 723c19b5b3d99..c4558f4590c5b 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx @@ -471,7 +471,7 @@ describe('discover responsive sidebar', function () { expect(findTestSubject(comp, 'fieldListGroupedAvailableFields-count').text()).toBe('1'); expect(findTestSubject(comp, 'fieldListGrouped__ariaDescription').text()).toBe( - '1 popular field. 1 available field. 0 empty fields. 0 meta fields.' + '1 popular field. 1 available field. 0 meta fields.' ); expect(mockCalcFieldCounts.mock.calls.length).toBe(1); }); diff --git a/test/examples/unified_field_list_examples/field_stats.ts b/test/examples/unified_field_list_examples/field_stats.ts index de662e737cb2d..9ed28ee618bf3 100644 --- a/test/examples/unified_field_list_examples/field_stats.ts +++ b/test/examples/unified_field_list_examples/field_stats.ts @@ -54,7 +54,7 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { describe('field distribution', () => { before(async () => { - await PageObjects.unifiedFieldList.toggleSidebarSection('empty'); // it will allow to render more fields in Available fields section + await PageObjects.unifiedFieldList.toggleSidebarSection('meta'); // it will allow to render more fields in Available fields section }); it('should return an auto histogram for numbers and top values', async () => { diff --git a/test/functional/apps/discover/group3/_drag_drop.ts b/test/functional/apps/discover/group3/_drag_drop.ts index 386844e82322f..3988daa287bd6 100644 --- a/test/functional/apps/discover/group3/_drag_drop.ts +++ b/test/functional/apps/discover/group3/_drag_drop.ts @@ -48,7 +48,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '53 available fields. 0 empty fields. 3 meta fields.' + '53 available fields. 3 meta fields.' ); expect((await PageObjects.discover.getColumnHeaders()).join(', ')).to.be( '@timestamp, Document' @@ -72,7 +72,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '53 available fields. 0 empty fields. 3 meta fields.' + '53 available fields. 3 meta fields.' ); expect((await PageObjects.discover.getColumnHeaders()).join(', ')).to.be( '@timestamp, Document' diff --git a/test/functional/apps/discover/group3/_sidebar.ts b/test/functional/apps/discover/group3/_sidebar.ts index 01e357b7f01e6..313c350209930 100644 --- a/test/functional/apps/discover/group3/_sidebar.ts +++ b/test/functional/apps/discover/group3/_sidebar.ts @@ -28,7 +28,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const fieldEditor = getService('fieldEditor'); const retry = getService('retry'); const dataGrid = getService('dataGrid'); - const INITIAL_FIELD_LIST_SUMMARY = '53 available fields. 0 empty fields. 3 meta fields.'; + const INITIAL_FIELD_LIST_SUMMARY = '53 available fields. 3 meta fields.'; describe('discover sidebar', function describeIndexTests() { before(async function () { @@ -72,7 +72,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('first updates', async () => { return ( (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === - '7 available fields. 0 empty fields. 2 meta fields.' + '7 available fields. 2 meta fields.' ); }); @@ -81,7 +81,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('second updates', async () => { return ( (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === - '13 available fields. 0 empty fields. 3 meta fields.' + '13 available fields. 3 meta fields.' ); }); @@ -155,7 +155,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('first updates', async () => { return ( (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === - '30 available fields. 0 empty fields. 2 meta fields.' + '30 available fields. 2 meta fields.' ); }); @@ -164,7 +164,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('second updates', async () => { return ( (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === - '4 available fields. 0 empty fields. 0 meta fields.' + '4 available fields. 0 meta fields.' ); }); @@ -179,7 +179,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('updates', async () => { return ( (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === - '2 available fields. 0 empty fields. 0 meta fields.' + '2 available fields. 0 meta fields.' ); }); @@ -194,7 +194,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('updates', async () => { return ( (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === - '4 available fields. 0 empty fields. 0 meta fields.' + '4 available fields. 0 meta fields.' ); }); @@ -300,10 +300,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(availableFields.join(', ')).to.be(expectedInitialAvailableFields); // Available fields after scrolling down - const emptySectionButton = await find.byCssSelector( - PageObjects.unifiedFieldList.getSidebarSectionSelector('empty', true) + const metaSectionButton = await find.byCssSelector( + PageObjects.unifiedFieldList.getSidebarSectionSelector('meta', true) ); - await emptySectionButton.scrollIntoViewIfNecessary(); + await metaSectionButton.scrollIntoViewIfNecessary(); await retry.waitFor('list to update after scrolling', async () => { availableFields = await PageObjects.unifiedFieldList.getSidebarSectionFieldNames( @@ -316,12 +316,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { `${expectedInitialAvailableFields}, url, utc_time, xss` ); - // Expand Empty section - await PageObjects.unifiedFieldList.toggleSidebarSection('empty'); - expect( - (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('empty')).join(', ') - ).to.be(''); - // Expand Meta section await PageObjects.unifiedFieldList.toggleSidebarSection('meta'); expect( @@ -354,16 +348,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ).to.be(true); // Available fields after scrolling down - const emptySectionButton = await find.byCssSelector( - PageObjects.unifiedFieldList.getSidebarSectionSelector('empty', true) + const metaSectionButton = await find.byCssSelector( + PageObjects.unifiedFieldList.getSidebarSectionSelector('meta', true) ); - await emptySectionButton.scrollIntoViewIfNecessary(); - - // Expand Empty section - await PageObjects.unifiedFieldList.toggleSidebarSection('empty'); - expect( - (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('empty')).join(', ') - ).to.be(''); + await metaSectionButton.scrollIntoViewIfNecessary(); // Expand Meta section await PageObjects.unifiedFieldList.toggleSidebarSection('meta'); @@ -378,7 +366,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ).to.be('relatedContent'); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '53 available fields. 1 unmapped field. 0 empty fields. 3 meta fields.' + '53 available fields. 1 unmapped field. 3 meta fields.' ); }); @@ -399,7 +387,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(availableFields.includes('@message')).to.be(true); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '2 selected fields. 2 popular fields. 53 available fields. 0 empty fields. 3 meta fields.' + '2 selected fields. 2 popular fields. 53 available fields. 3 meta fields.' ); await PageObjects.unifiedFieldList.clickFieldListItemRemove('@message'); @@ -419,7 +407,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ).to.be('@message, _id, extension'); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '3 selected fields. 3 popular fields. 53 available fields. 0 empty fields. 3 meta fields.' + '3 selected fields. 3 popular fields. 53 available fields. 3 meta fields.' ); }); @@ -471,7 +459,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '53 available fields. 0 empty fields. 3 meta fields.' + '53 available fields. 3 meta fields.' ); }); @@ -493,7 +481,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '0 available fields. 0 empty fields. 0 meta fields.' + '0 available fields. 0 meta fields.' ); await testSubjects.missingOrFail( `${PageObjects.unifiedFieldList.getSidebarSectionSelector('available')}-fetchWarning` @@ -538,7 +526,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '6 available fields. 0 empty fields. 3 meta fields.' + '6 available fields. 3 meta fields.' ); await PageObjects.discover.selectIndexPattern('with-timefield'); @@ -617,7 +605,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '6873 available fields. 0 empty fields. 3 meta fields.' + '6873 available fields. 3 meta fields.' ); await PageObjects.discover.selectIndexPattern('logstash-*'); @@ -656,7 +644,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '54 available fields. 0 empty fields. 3 meta fields.' + '54 available fields. 3 meta fields.' ); let allFields = await PageObjects.unifiedFieldList.getAllFieldNames(); @@ -675,7 +663,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '54 available fields. 0 empty fields. 3 meta fields.' + '54 available fields. 3 meta fields.' ); allFields = await PageObjects.unifiedFieldList.getAllFieldNames(); @@ -712,7 +700,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // check that the sidebar is rendered expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '54 available fields. 0 empty fields. 3 meta fields.' + '54 available fields. 3 meta fields.' ); let allFields = await PageObjects.unifiedFieldList.getAllFieldNames(); expect(allFields.includes('_invalid-runtimefield')).to.be(true); @@ -769,7 +757,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '7 available fields. 0 empty fields. 3 meta fields.' + '7 available fields. 3 meta fields.' ); await kibanaServer.importExport.unload( diff --git a/x-pack/plugins/lens/public/datasources/form_based/datapanel.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/datapanel.test.tsx index 01a31f98000f9..c7b6a2bcf6e90 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/datapanel.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/datapanel.test.tsx @@ -990,7 +990,7 @@ describe('FormBased Data Panel', () => { expect(wrapper.find(FieldItem).map((fieldItem) => fieldItem.prop('field').name)).toEqual([ DOCUMENT_FIELD_NAME, ]); - expect(wrapper.find(EuiCallOut).length).toEqual(3); + expect(wrapper.find(EuiCallOut).length).toEqual(2); }); it('should toggle type if clicked again', async () => { diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group3/_sidebar.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group3/_sidebar.ts index 17606ac87a429..0435fdffa7ede 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group3/_sidebar.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group3/_sidebar.ts @@ -26,7 +26,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const fieldEditor = getService('fieldEditor'); const retry = getService('retry'); const dataGrid = getService('dataGrid'); - const INITIAL_FIELD_LIST_SUMMARY = '53 available fields. 0 empty fields. 3 meta fields.'; + const INITIAL_FIELD_LIST_SUMMARY = '53 available fields. 3 meta fields.'; describe('discover sidebar', function describeIndexTests() { before(async function () { @@ -70,7 +70,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('first updates', async () => { return ( (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === - '7 available fields. 0 empty fields. 2 meta fields.' + '7 available fields. 2 meta fields.' ); }); @@ -79,7 +79,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('second updates', async () => { return ( (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === - '13 available fields. 0 empty fields. 3 meta fields.' + '13 available fields. 3 meta fields.' ); }); @@ -124,7 +124,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('first updates', async () => { return ( (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === - '30 available fields. 0 empty fields. 2 meta fields.' + '30 available fields. 2 meta fields.' ); }); @@ -133,7 +133,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('second updates', async () => { return ( (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === - '4 available fields. 0 empty fields. 0 meta fields.' + '4 available fields. 0 meta fields.' ); }); @@ -148,7 +148,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('updates', async () => { return ( (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === - '2 available fields. 0 empty fields. 0 meta fields.' + '2 available fields. 0 meta fields.' ); }); @@ -163,7 +163,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor('updates', async () => { return ( (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === - '4 available fields. 0 empty fields. 0 meta fields.' + '4 available fields. 0 meta fields.' ); }); @@ -269,10 +269,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(availableFields.join(', ')).to.be(expectedInitialAvailableFields); // Available fields after scrolling down - const emptySectionButton = await find.byCssSelector( - PageObjects.unifiedFieldList.getSidebarSectionSelector('empty', true) + const metaSectionButton = await find.byCssSelector( + PageObjects.unifiedFieldList.getSidebarSectionSelector('meta', true) ); - await emptySectionButton.scrollIntoViewIfNecessary(); + await metaSectionButton.scrollIntoViewIfNecessary(); await retry.waitFor('list to update after scrolling', async () => { availableFields = await PageObjects.unifiedFieldList.getSidebarSectionFieldNames( @@ -285,12 +285,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { `${expectedInitialAvailableFields}, url, utc_time, xss` ); - // Expand Empty section - await PageObjects.unifiedFieldList.toggleSidebarSection('empty'); - expect( - (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('empty')).join(', ') - ).to.be(''); - // Expand Meta section await PageObjects.unifiedFieldList.toggleSidebarSection('meta'); expect( @@ -323,16 +317,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ).to.be(true); // Available fields after scrolling down - const emptySectionButton = await find.byCssSelector( - PageObjects.unifiedFieldList.getSidebarSectionSelector('empty', true) + const metaSectionButton = await find.byCssSelector( + PageObjects.unifiedFieldList.getSidebarSectionSelector('meta', true) ); - await emptySectionButton.scrollIntoViewIfNecessary(); - - // Expand Empty section - await PageObjects.unifiedFieldList.toggleSidebarSection('empty'); - expect( - (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('empty')).join(', ') - ).to.be(''); + await metaSectionButton.scrollIntoViewIfNecessary(); // Expand Meta section await PageObjects.unifiedFieldList.toggleSidebarSection('meta'); @@ -347,7 +335,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ).to.be('relatedContent'); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '53 available fields. 1 unmapped field. 0 empty fields. 3 meta fields.' + '53 available fields. 1 unmapped field. 3 meta fields.' ); }); @@ -368,7 +356,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(availableFields.includes('@message')).to.be(true); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '2 selected fields. 2 popular fields. 53 available fields. 0 empty fields. 3 meta fields.' + '2 selected fields. 2 popular fields. 53 available fields. 3 meta fields.' ); await PageObjects.unifiedFieldList.clickFieldListItemRemove('@message'); @@ -388,7 +376,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ).to.be('@message, _id, extension'); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '3 selected fields. 3 popular fields. 53 available fields. 0 empty fields. 3 meta fields.' + '3 selected fields. 3 popular fields. 53 available fields. 3 meta fields.' ); }); @@ -412,7 +400,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '0 available fields. 0 empty fields. 0 meta fields.' + '0 available fields. 0 meta fields.' ); await testSubjects.missingOrFail( `${PageObjects.unifiedFieldList.getSidebarSectionSelector('available')}-fetchWarning` @@ -457,7 +445,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '6 available fields. 0 empty fields. 3 meta fields.' + '6 available fields. 3 meta fields.' ); await PageObjects.discover.selectIndexPattern('with-timefield'); @@ -536,7 +524,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '6873 available fields. 0 empty fields. 3 meta fields.' + '6873 available fields. 3 meta fields.' ); await PageObjects.discover.selectIndexPattern('logstash-*'); @@ -575,7 +563,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '54 available fields. 0 empty fields. 3 meta fields.' + '54 available fields. 3 meta fields.' ); let allFields = await PageObjects.unifiedFieldList.getAllFieldNames(); @@ -594,7 +582,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '54 available fields. 0 empty fields. 3 meta fields.' + '54 available fields. 3 meta fields.' ); allFields = await PageObjects.unifiedFieldList.getAllFieldNames(); @@ -631,7 +619,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // check that the sidebar is rendered expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '54 available fields. 0 empty fields. 3 meta fields.' + '54 available fields. 3 meta fields.' ); let allFields = await PageObjects.unifiedFieldList.getAllFieldNames(); expect(allFields.includes('_invalid-runtimefield')).to.be(true); @@ -688,7 +676,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( - '7 available fields. 0 empty fields. 3 meta fields.' + '7 available fields. 3 meta fields.' ); await kibanaServer.importExport.unload( diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/field_stats.ts b/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/field_stats.ts index 6b5529e7936eb..47bbefa0dc8d6 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/field_stats.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/field_stats.ts @@ -68,7 +68,7 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { describe('field distribution', () => { before(async () => { - await PageObjects.unifiedFieldList.toggleSidebarSection('empty'); // it will allow to render more fields in Available fields section + await PageObjects.unifiedFieldList.toggleSidebarSection('meta'); // it will allow to render more fields in Available fields section }); it('should return an auto histogram for numbers and top values', async () => { From 04b93f92cc412d01d3482715749db7413810dc15 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Wed, 20 Dec 2023 13:17:18 +0100 Subject: [PATCH 11/62] flag more packages without side effects (#173602) ## Summary Follow-up of https://github.com/elastic/kibana/pull/173351 `-1.8MB` more on async chunks --- .../analytics/utils/analytics_collection_utils/package.json | 3 ++- packages/home/sample_data_card/package.json | 3 ++- packages/home/sample_data_tab/package.json | 3 ++- packages/home/sample_data_types/package.json | 3 ++- packages/kbn-alerts-as-data-utils/package.json | 3 ++- packages/serverless/project_switcher/package.json | 3 ++- x-pack/packages/kbn-elastic-assistant-common/package.json | 3 ++- x-pack/packages/kbn-elastic-assistant/package.json | 3 ++- x-pack/packages/ml/aiops_components/package.json | 5 ++++- x-pack/packages/ml/anomaly_utils/package.json | 3 ++- x-pack/packages/ml/creation_wizard_utils/package.json | 3 ++- x-pack/packages/ml/data_frame_analytics_utils/package.json | 3 ++- x-pack/packages/ml/data_grid/package.json | 3 ++- x-pack/packages/ml/date_picker/package.json | 3 ++- x-pack/packages/ml/date_utils/package.json | 3 ++- x-pack/packages/ml/in_memory_table/package.json | 3 ++- x-pack/packages/observability/alert_details/package.json | 3 ++- x-pack/packages/security-solution/data_table/package.json | 3 ++- .../ecs_data_quality_dashboard/package.json | 3 ++- x-pack/packages/security-solution/navigation/package.json | 3 ++- x-pack/packages/security-solution/side_nav/package.json | 3 ++- x-pack/packages/security-solution/upselling/package.json | 3 ++- 22 files changed, 46 insertions(+), 22 deletions(-) diff --git a/packages/analytics/utils/analytics_collection_utils/package.json b/packages/analytics/utils/analytics_collection_utils/package.json index eb10b67ce94dd..7f8c62ab714c2 100644 --- a/packages/analytics/utils/analytics_collection_utils/package.json +++ b/packages/analytics/utils/analytics_collection_utils/package.json @@ -2,5 +2,6 @@ "name": "@kbn/analytics-collection-utils", "private": true, "version": "1.0.0", - "license": "SSPL-1.0 OR Elastic License 2.0" + "license": "SSPL-1.0 OR Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/packages/home/sample_data_card/package.json b/packages/home/sample_data_card/package.json index c82ba35d94238..af6b307173f48 100644 --- a/packages/home/sample_data_card/package.json +++ b/packages/home/sample_data_card/package.json @@ -2,5 +2,6 @@ "name": "@kbn/home-sample-data-card", "private": true, "version": "1.0.0", - "license": "SSPL-1.0 OR Elastic License 2.0" + "license": "SSPL-1.0 OR Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/packages/home/sample_data_tab/package.json b/packages/home/sample_data_tab/package.json index 435df25207ff8..9e51f80d68388 100644 --- a/packages/home/sample_data_tab/package.json +++ b/packages/home/sample_data_tab/package.json @@ -2,5 +2,6 @@ "name": "@kbn/home-sample-data-tab", "private": true, "version": "1.0.0", - "license": "SSPL-1.0 OR Elastic License 2.0" + "license": "SSPL-1.0 OR Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/packages/home/sample_data_types/package.json b/packages/home/sample_data_types/package.json index e18945e544a5e..b56eeff7bf186 100644 --- a/packages/home/sample_data_types/package.json +++ b/packages/home/sample_data_types/package.json @@ -2,5 +2,6 @@ "name": "@kbn/home-sample-data-types", "private": true, "version": "1.0.0", - "license": "SSPL-1.0 OR Elastic License 2.0" + "license": "SSPL-1.0 OR Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/packages/kbn-alerts-as-data-utils/package.json b/packages/kbn-alerts-as-data-utils/package.json index 25aa26b3d435c..bfb3dbda073a4 100644 --- a/packages/kbn-alerts-as-data-utils/package.json +++ b/packages/kbn-alerts-as-data-utils/package.json @@ -2,5 +2,6 @@ "name": "@kbn/alerts-as-data-utils", "private": true, "version": "1.0.0", - "license": "SSPL-1.0 OR Elastic License 2.0" + "license": "SSPL-1.0 OR Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/packages/serverless/project_switcher/package.json b/packages/serverless/project_switcher/package.json index 5910a823783d5..06240351496c7 100644 --- a/packages/serverless/project_switcher/package.json +++ b/packages/serverless/project_switcher/package.json @@ -2,5 +2,6 @@ "name": "@kbn/serverless-project-switcher", "private": true, "version": "1.0.0", - "license": "SSPL-1.0 OR Elastic License 2.0" + "license": "SSPL-1.0 OR Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/kbn-elastic-assistant-common/package.json b/x-pack/packages/kbn-elastic-assistant-common/package.json index 0f3f3f36814cc..9ecfbc4c81a07 100644 --- a/x-pack/packages/kbn-elastic-assistant-common/package.json +++ b/x-pack/packages/kbn-elastic-assistant-common/package.json @@ -2,5 +2,6 @@ "name": "@kbn/elastic-assistant-common", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/kbn-elastic-assistant/package.json b/x-pack/packages/kbn-elastic-assistant/package.json index 7bc41b6dffe64..7b944a6b2021c 100644 --- a/x-pack/packages/kbn-elastic-assistant/package.json +++ b/x-pack/packages/kbn-elastic-assistant/package.json @@ -2,5 +2,6 @@ "name": "@kbn/elastic-assistant", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/ml/aiops_components/package.json b/x-pack/packages/ml/aiops_components/package.json index fd64c49c074d3..ee8841277f96f 100644 --- a/x-pack/packages/ml/aiops_components/package.json +++ b/x-pack/packages/ml/aiops_components/package.json @@ -5,5 +5,8 @@ "homepage": "https://docs.elastic.dev/kibana-dev-docs/api/kbn-aiops-components", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": [ + "*.scss" + ] } \ No newline at end of file diff --git a/x-pack/packages/ml/anomaly_utils/package.json b/x-pack/packages/ml/anomaly_utils/package.json index f49b343d58cd1..3bd52876b8cda 100644 --- a/x-pack/packages/ml/anomaly_utils/package.json +++ b/x-pack/packages/ml/anomaly_utils/package.json @@ -2,5 +2,6 @@ "name": "@kbn/ml-anomaly-utils", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/ml/creation_wizard_utils/package.json b/x-pack/packages/ml/creation_wizard_utils/package.json index c48eab9641bde..adbca67cdfbaf 100644 --- a/x-pack/packages/ml/creation_wizard_utils/package.json +++ b/x-pack/packages/ml/creation_wizard_utils/package.json @@ -2,5 +2,6 @@ "name": "@kbn/ml-creation-wizard-utils", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/ml/data_frame_analytics_utils/package.json b/x-pack/packages/ml/data_frame_analytics_utils/package.json index 1377dab2d1814..d2817a1edf1a4 100644 --- a/x-pack/packages/ml/data_frame_analytics_utils/package.json +++ b/x-pack/packages/ml/data_frame_analytics_utils/package.json @@ -2,5 +2,6 @@ "name": "@kbn/ml-data-frame-analytics-utils", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } diff --git a/x-pack/packages/ml/data_grid/package.json b/x-pack/packages/ml/data_grid/package.json index 337af96195a8f..0df121b27abbb 100644 --- a/x-pack/packages/ml/data_grid/package.json +++ b/x-pack/packages/ml/data_grid/package.json @@ -2,5 +2,6 @@ "name": "@kbn/ml-data-grid", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/ml/date_picker/package.json b/x-pack/packages/ml/date_picker/package.json index 720cc013c10ee..62eece475d16d 100644 --- a/x-pack/packages/ml/date_picker/package.json +++ b/x-pack/packages/ml/date_picker/package.json @@ -2,5 +2,6 @@ "name": "@kbn/ml-date-picker", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } diff --git a/x-pack/packages/ml/date_utils/package.json b/x-pack/packages/ml/date_utils/package.json index fcd9fd7bc3b5a..7d3e7515296f5 100644 --- a/x-pack/packages/ml/date_utils/package.json +++ b/x-pack/packages/ml/date_utils/package.json @@ -2,5 +2,6 @@ "name": "@kbn/ml-date-utils", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/ml/in_memory_table/package.json b/x-pack/packages/ml/in_memory_table/package.json index 54cf41c738653..59a73fb1d7870 100644 --- a/x-pack/packages/ml/in_memory_table/package.json +++ b/x-pack/packages/ml/in_memory_table/package.json @@ -2,5 +2,6 @@ "name": "@kbn/ml-in-memory-table", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/observability/alert_details/package.json b/x-pack/packages/observability/alert_details/package.json index 2764095b1074f..607fe22afa7f7 100644 --- a/x-pack/packages/observability/alert_details/package.json +++ b/x-pack/packages/observability/alert_details/package.json @@ -3,5 +3,6 @@ "descriptio": "Helper and components related to alert details", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/security-solution/data_table/package.json b/x-pack/packages/security-solution/data_table/package.json index 53c640c3d9c6a..c4a1c789b3c5c 100644 --- a/x-pack/packages/security-solution/data_table/package.json +++ b/x-pack/packages/security-solution/data_table/package.json @@ -2,5 +2,6 @@ "name": "@kbn/securitysolution-data-table", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/package.json b/x-pack/packages/security-solution/ecs_data_quality_dashboard/package.json index 32fc5f7572c89..14601e6ea3590 100644 --- a/x-pack/packages/security-solution/ecs_data_quality_dashboard/package.json +++ b/x-pack/packages/security-solution/ecs_data_quality_dashboard/package.json @@ -2,5 +2,6 @@ "name": "@kbn/ecs-data-quality-dashboard", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/security-solution/navigation/package.json b/x-pack/packages/security-solution/navigation/package.json index 8170a942224b4..34ad9f45d71ab 100644 --- a/x-pack/packages/security-solution/navigation/package.json +++ b/x-pack/packages/security-solution/navigation/package.json @@ -2,5 +2,6 @@ "name": "@kbn/security-solution-navigation", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/security-solution/side_nav/package.json b/x-pack/packages/security-solution/side_nav/package.json index c80baa25af3e2..6d5af1d22427f 100644 --- a/x-pack/packages/security-solution/side_nav/package.json +++ b/x-pack/packages/security-solution/side_nav/package.json @@ -2,5 +2,6 @@ "name": "@kbn/security-solution-side-nav", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/security-solution/upselling/package.json b/x-pack/packages/security-solution/upselling/package.json index 92bd9e35078fa..737e14b89c932 100644 --- a/x-pack/packages/security-solution/upselling/package.json +++ b/x-pack/packages/security-solution/upselling/package.json @@ -2,5 +2,6 @@ "name": "@kbn/security-solution-upselling", "private": true, "version": "1.0.0", - "license": "Elastic License 2.0" + "license": "Elastic License 2.0", + "sideEffects": false } \ No newline at end of file From 19b82f8b61b284dd55308eed15f3fc37ea41c1ac Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Wed, 20 Dec 2023 13:31:21 +0100 Subject: [PATCH 12/62] [ML] Fix registering of the ML alerting rules with the basic license (#173644) ## Summary Fixes the license checks for registering ML alerting rules, so that if the user doesn't have the required license to create a rule instance, we still show the entry in the list. The alerting framework disables the rule type if license requirements aren't met. image --- x-pack/plugins/ml/public/plugin.ts | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/ml/public/plugin.ts b/x-pack/plugins/ml/public/plugin.ts index 90d107882f7bb..a4f0e6e230541 100644 --- a/x-pack/plugins/ml/public/plugin.ts +++ b/x-pack/plugins/ml/public/plugin.ts @@ -232,6 +232,19 @@ export class MlPlugin implements Plugin { } = await import('./register_helper'); registerSearchLinks(this.appUpdater$, fullLicense, mlCapabilities, !this.isServerless); + if ( + pluginsSetup.triggersActionsUi && + ((fullLicense && mlCapabilities.canUseMlAlerts && mlCapabilities.canGetJobs) || + // Register rules for basic license to show them in the UI as disabled + !fullLicense) + ) { + registerMlAlerts( + pluginsSetup.triggersActionsUi, + core.getStartServices, + pluginsSetup.alerting + ); + } + if (fullLicense) { registerMlUiActions(pluginsSetup.uiActions, core); @@ -242,18 +255,6 @@ export class MlPlugin implements Plugin { registerCasesAttachments(pluginsSetup.cases, coreStart, pluginStart); } - if ( - pluginsSetup.triggersActionsUi && - mlCapabilities.canUseMlAlerts && - mlCapabilities.canGetJobs - ) { - registerMlAlerts( - pluginsSetup.triggersActionsUi, - core.getStartServices, - pluginsSetup.alerting - ); - } - if (pluginsSetup.maps) { // Pass canGetJobs as minimum permission to show anomalies card in maps layers await registerMapExtension(pluginsSetup.maps, core, { From fbd3601ced7ab4411d3a2d71a3f9fbe137696f48 Mon Sep 17 00:00:00 2001 From: ruhshan <5312918+Ruhshan@users.noreply.github.com> Date: Wed, 20 Dec 2023 18:38:57 +0600 Subject: [PATCH 13/62] [Observability][Infra] Add parent link in host detail's breadcrumb (#170792) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Fixes #170642 Added link to hosts in the breadcrumb for host details page. ![image](https://github.com/elastic/kibana/assets/5312918/273c3b86-bfbd-485c-9bfe-92559caed847) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Cauê Marcondes <55978943+cauemarcondes@users.noreply.github.com> Co-authored-by: jennypavlova Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../metric_detail/asset_detail_page.tsx | 15 +++++ .../hooks/use_parent_breadcrumb_resolver.ts | 59 +++++++++++++++++++ .../pages/metrics/metric_detail/index.tsx | 11 +--- .../metric_detail/metric_detail_page.tsx | 19 ++++-- .../pages/metrics/metric_detail/types.ts | 6 ++ .../test/functional/apps/infra/home_page.ts | 6 +- .../test_suites/observability/infra/infra.ts | 6 +- 7 files changed, 103 insertions(+), 19 deletions(-) create mode 100644 x-pack/plugins/infra/public/pages/metrics/metric_detail/hooks/use_parent_breadcrumb_resolver.ts diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/asset_detail_page.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/asset_detail_page.tsx index e52008e2a90ab..81f577f1d553f 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/asset_detail_page.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/asset_detail_page.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { useRouteMatch } from 'react-router-dom'; import type { InventoryItemType } from '@kbn/metrics-data-access-plugin/common'; +import { useMetricsBreadcrumbs } from '../../../hooks/use_metrics_breadcrumbs'; import { NoRemoteCluster } from '../../../components/empty_states'; import { SourceErrorPage } from '../../../components/source_error_page'; import { SourceLoadingPage } from '../../../components/source_loading_page'; @@ -15,6 +16,7 @@ import { useSourceContext } from '../../../containers/metrics_source'; import { AssetDetails } from '../../../components/asset_details/asset_details'; import { MetricsPageTemplate } from '../page_template'; import { commonFlyoutTabs } from '../../../common/asset_details_config/asset_details_tabs'; +import { useParentBreadcrumbResolver } from './hooks/use_parent_breadcrumb_resolver'; export const AssetDetailPage = () => { const { isLoading, loadSourceFailureMessage, loadSource, source } = useSourceContext(); @@ -24,6 +26,19 @@ export const AssetDetailPage = () => { const { metricIndicesExist, remoteClustersExist } = source?.status ?? {}; + const parentBreadcrumbResolver = useParentBreadcrumbResolver(); + + const breadcrumbOptions = parentBreadcrumbResolver.getBreadcrumbOptions(nodeType); + useMetricsBreadcrumbs([ + { + ...breadcrumbOptions.link, + text: breadcrumbOptions.text, + }, + { + text: nodeId, + }, + ]); + if (isLoading || !source) return ; if (!remoteClustersExist) { diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/hooks/use_parent_breadcrumb_resolver.ts b/x-pack/plugins/infra/public/pages/metrics/metric_detail/hooks/use_parent_breadcrumb_resolver.ts new file mode 100644 index 0000000000000..a0d5160e87472 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/hooks/use_parent_breadcrumb_resolver.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { InventoryItemType } from '@kbn/metrics-data-access-plugin/common/inventory_models/types'; +import { useLinkProps } from '@kbn/observability-shared-plugin/public'; +import { useLocation } from 'react-router-dom'; +import { hostsTitle, inventoryTitle } from '../../../../translations'; +import { BreadcrumbOptions } from '../types'; + +interface LocationStateProps { + originPathname: string; +} + +export function useParentBreadcrumbResolver() { + const hostsLinkProps = useLinkProps({ + app: 'metrics', + pathname: 'hosts', + }); + + const inventoryLinkProps = useLinkProps({ + app: 'metrics', + pathname: 'inventory', + }); + + const breadcrumbMap = new Map([ + ['/hosts', { text: hostsTitle, link: hostsLinkProps }], + ['/inventory', { text: inventoryTitle, link: inventoryLinkProps }], + ]); + + const defaultOption: BreadcrumbOptions = breadcrumbMap.get('/inventory')!; + + const { state } = useLocation(); + const locationState: LocationStateProps = state as LocationStateProps; + + function getOptionsByNodeType(nodeType: InventoryItemType): BreadcrumbOptions { + if (nodeType === 'host') { + return breadcrumbMap.get('/hosts')!; + } + return defaultOption; + } + + function getBreadcrumbOptions(nodeType: InventoryItemType) { + if (locationState === undefined) { + return getOptionsByNodeType(nodeType); + } + + const originalPathBreadcrumb = locationState.originPathname + ? breadcrumbMap.get(locationState.originPathname) + : undefined; + + return originalPathBreadcrumb ?? defaultOption; + } + + return { getBreadcrumbOptions }; +} diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/index.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/index.tsx index f05a5d3d2dc2e..24fb24af5c982 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/index.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/index.tsx @@ -9,21 +9,14 @@ import { EuiErrorBoundary } from '@elastic/eui'; import React from 'react'; import { useRouteMatch } from 'react-router-dom'; import type { InventoryItemType } from '@kbn/metrics-data-access-plugin/common'; -import { useMetricsBreadcrumbs } from '../../../hooks/use_metrics_breadcrumbs'; import { AssetDetailPage } from './asset_detail_page'; import { MetricDetailPage } from './metric_detail_page'; import { MetricsTimeProvider } from './hooks/use_metrics_time'; export const NodeDetail = () => { const { - params: { type: nodeType, node: nodeName }, - } = useRouteMatch<{ type: InventoryItemType; node: string }>(); - - useMetricsBreadcrumbs([ - { - text: nodeName, - }, - ]); + params: { type: nodeType }, + } = useRouteMatch<{ type: InventoryItemType }>(); return ( diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/metric_detail_page.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/metric_detail_page.tsx index 4dd0da57536e2..9e51d316dd0ec 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/metric_detail_page.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/metric_detail_page.tsx @@ -11,6 +11,7 @@ import { useRouteMatch } from 'react-router-dom'; import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common'; import type { InventoryItemType } from '@kbn/metrics-data-access-plugin/common'; import { useMetricsBreadcrumbs } from '../../../hooks/use_metrics_breadcrumbs'; +import { useParentBreadcrumbResolver } from './hooks/use_parent_breadcrumb_resolver'; import { useMetadata } from '../../../components/asset_details/hooks/use_metadata'; import { useSourceContext } from '../../../containers/metrics_source'; import { InfraLoadingPanel } from '../../../components/loading'; @@ -25,6 +26,7 @@ export const MetricDetailPage = () => { } = useRouteMatch<{ type: InventoryItemType; node: string }>(); const inventoryModel = findInventoryModel(nodeType); const { sourceId, metricIndicesExist } = useSourceContext(); + const parentBreadcrumbResolver = useParentBreadcrumbResolver(); const { timeRange, @@ -50,6 +52,17 @@ export const MetricDetailPage = () => { timeRange: parsedTimeRange, }); + const breadcrumbOptions = parentBreadcrumbResolver.getBreadcrumbOptions(nodeType); + useMetricsBreadcrumbs([ + { + ...breadcrumbOptions.link, + text: breadcrumbOptions.text, + }, + { + text: name, + }, + ]); + const [sideNav, setSideNav] = useState([]); const addNavItem = React.useCallback( @@ -61,12 +74,6 @@ export const MetricDetailPage = () => { [sideNav] ); - useMetricsBreadcrumbs([ - { - text: name, - }, - ]); - if (metadataLoading && !filteredRequiredMetrics.length) { return ( diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/types.ts b/x-pack/plugins/infra/public/pages/metrics/metric_detail/types.ts index 2cf5c8844d726..545b09c2fe00e 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/types.ts +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/types.ts @@ -8,6 +8,7 @@ import rt from 'io-ts'; import { EuiTheme } from '@kbn/kibana-react-plugin/common'; import { InventoryFormatterTypeRT } from '@kbn/metrics-data-access-plugin/common'; +import { LinkProps } from '@kbn/observability-shared-plugin/public/hooks/use_link_props'; import { MetricsTimeInput } from './hooks/use_metrics_time'; import { NodeDetailsMetricData } from '../../../../common/http_api/node_details_api'; @@ -61,3 +62,8 @@ export type VisSectionProps = rt.TypeOf & { isLiveStreaming?: boolean; stopLiveStreaming?: () => void; }; + +export interface BreadcrumbOptions { + text: string; + link: LinkProps; +} diff --git a/x-pack/test/functional/apps/infra/home_page.ts b/x-pack/test/functional/apps/infra/home_page.ts index 6637b7d42d222..a41c12e0d833d 100644 --- a/x-pack/test/functional/apps/infra/home_page.ts +++ b/x-pack/test/functional/apps/infra/home_page.ts @@ -331,7 +331,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await retry.try(async () => { const documentTitle = await browser.getTitle(); expect(documentTitle).to.contain( - 'demo-stack-redis-01 - Infrastructure - Observability - Elastic' + 'demo-stack-redis-01 - Inventory - Infrastructure - Observability - Elastic' ); }); @@ -346,7 +346,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await retry.try(async () => { const documentTitle = await browser.getTitle(); - expect(documentTitle).to.contain('pod-0 - Infrastructure - Observability - Elastic'); + expect(documentTitle).to.contain( + 'pod-0 - Inventory - Infrastructure - Observability - Elastic' + ); }); await returnTo(INVENTORY_PATH); diff --git a/x-pack/test_serverless/functional/test_suites/observability/infra/infra.ts b/x-pack/test_serverless/functional/test_suites/observability/infra/infra.ts index 94e9f35393e7f..7b0b7828ec65c 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/infra/infra.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/infra/infra.ts @@ -89,7 +89,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await retry.try(async () => { const documentTitle = await browser.getTitle(); expect(documentTitle).to.contain( - 'demo-stack-redis-01 - Infrastructure - Observability - Elastic' + 'demo-stack-redis-01 - Inventory - Infrastructure - Observability - Elastic' ); }); @@ -104,7 +104,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await retry.try(async () => { const documentTitle = await browser.getTitle(); - expect(documentTitle).to.contain('pod-0 - Infrastructure - Observability - Elastic'); + expect(documentTitle).to.contain( + 'pod-0 - Inventory - Infrastructure - Observability - Elastic' + ); }); await returnTo(INVENTORY_PATH); From 62f873a90ecc270bd3ae1c5bb24c18e25759fd9e Mon Sep 17 00:00:00 2001 From: Luke G <11671118+lgestc@users.noreply.github.com> Date: Wed, 20 Dec 2023 14:13:35 +0100 Subject: [PATCH 14/62] =?UTF-8?q?[Security=20Solution][Serverless]=20Cold?= =?UTF-8?q?=20and=20frozen=20tier=20toggle=20for=20analy=E2=80=A6=20(#1736?= =?UTF-8?q?38)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …zer settings ## Summary This enables missing security solution setting in serverless offering, as per https://github.com/elastic/security-docs/issues/4387 . I did not realize that we have a separate config entry for the SLS listing available options there. --- packages/serverless/settings/security_project/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/serverless/settings/security_project/index.ts b/packages/serverless/settings/security_project/index.ts index 276a1e87e4b7e..c150e764de054 100644 --- a/packages/serverless/settings/security_project/index.ts +++ b/packages/serverless/settings/security_project/index.ts @@ -24,4 +24,5 @@ export const SECURITY_PROJECT_SETTINGS = [ settings.SECURITY_SOLUTION_ENABLE_NEWS_FEED_ID, settings.SECURITY_SOLUTION_DEFAULT_ALERT_TAGS_KEY, settings.SECURITY_SOLUTION_ENABLE_EXPANDABLE_FLYOUT_SETTING, + settings.SECURITY_SOLUTION_EXCLUDE_COLD_AND_FROZEN_TIERS_IN_ANALYZER, ]; From 04adfa2ebbbdc6999c14e9fb6a39cfb447843f2b Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Wed, 20 Dec 2023 14:28:34 +0100 Subject: [PATCH 15/62] [ES|QL] Update grammar based on ES changes (#172789) ## Summary This PR aligns the (new) Kibana grammar to the newer ES grammar changes proposed in https://github.com/elastic/elasticsearch/pull/100740 . `EXPAND` and `INLINESTATS` has been reinstated here (even when not used) to exactly match the ES grammar. Most of the changes are due to `TOKEN` renaming plus few other changes on how identifiers are now parsed. Revisit the validation logic helped also to find a couple of bugs on our validation side, but they were very minimal and limited. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Stratoula Kalafateli Co-authored-by: Abdon Pijpelink --- .../src/antlr/.antlr/esql_lexer.interp | 307 ++ .../kbn-esql/src/antlr/.antlr/esql_lexer.java | 1150 +++++ .../src/antlr/.antlr/esql_lexer.tokens | 98 + .../src/antlr/.antlr/esql_parser.interp | 256 ++ .../src/antlr/.antlr/esql_parser.java | 3914 +++++++++++++++++ .../src/antlr/.antlr/esql_parser.tokens | 117 + .../kbn-monaco/src/esql/antlr/esql_lexer.g4 | 286 +- .../src/esql/antlr/esql_lexer.interp | 167 +- .../src/esql/antlr/esql_lexer.tokens | 202 +- .../kbn-monaco/src/esql/antlr/esql_lexer.ts | 1230 +++--- .../kbn-monaco/src/esql/antlr/esql_parser.g4 | 50 +- .../src/esql/antlr/esql_parser.interp | 77 +- .../src/esql/antlr/esql_parser.tokens | 202 +- .../kbn-monaco/src/esql/antlr/esql_parser.ts | 1913 ++++---- .../src/esql/antlr/esql_parser_listener.ts | 266 +- .../src/esql/lib/ast/ast_helpers.ts | 27 +- .../kbn-monaco/src/esql/lib/ast/ast_walker.ts | 36 +- .../src/esql/lib/ast/definitions/commands.ts | 2 +- .../src/esql/lib/ast/shared/variables.ts | 2 +- .../lib/ast/validation/validation.test.ts | 81 +- 20 files changed, 8695 insertions(+), 1688 deletions(-) create mode 100644 packages/kbn-esql/src/antlr/.antlr/esql_lexer.interp create mode 100644 packages/kbn-esql/src/antlr/.antlr/esql_lexer.java create mode 100644 packages/kbn-esql/src/antlr/.antlr/esql_lexer.tokens create mode 100644 packages/kbn-esql/src/antlr/.antlr/esql_parser.interp create mode 100644 packages/kbn-esql/src/antlr/.antlr/esql_parser.java create mode 100644 packages/kbn-esql/src/antlr/.antlr/esql_parser.tokens diff --git a/packages/kbn-esql/src/antlr/.antlr/esql_lexer.interp b/packages/kbn-esql/src/antlr/.antlr/esql_lexer.interp new file mode 100644 index 0000000000000..8cd048fa4e8c3 --- /dev/null +++ b/packages/kbn-esql/src/antlr/.antlr/esql_lexer.interp @@ -0,0 +1,307 @@ +token literal names: +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +'by' +null +'and' +null +null +'.' +'(' +null +']' +null +null +null +null +null +null +null +'or' +')' +'_' +'info' +'functions' +null +null +'+' +'-' +'*' +'/' +'%' +'10' +null +'nulls' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +DISSECT +GROK +EVAL +EXPLAIN +FROM +ROW +STATS +WHERE +SORT +MV_EXPAND +LIMIT +PROJECT +DROP +RENAME +SHOW +ENRICH +KEEP +LINE_COMMENT +MULTILINE_COMMENT +WS +EXPLAIN_WS +EXPLAIN_LINE_COMMENT +EXPLAIN_MULTILINE_COMMENT +PIPE +STRING +INTEGER_LITERAL +DECIMAL_LITERAL +BY +DATE_LITERAL +AND +ASSIGN +COMMA +DOT +LP +OPENING_BRACKET +CLOSING_BRACKET +NOT +LIKE +RLIKE +IN +IS +AS +NULL +OR +RP +UNDERSCORE +INFO +FUNCTIONS +BOOLEAN_VALUE +COMPARISON_OPERATOR +PLUS +MINUS +ASTERISK +SLASH +PERCENT +TEN +ORDERING +NULLS_ORDERING +NULLS_ORDERING_DIRECTION +MATH_FUNCTION +UNARY_FUNCTION +WHERE_FUNCTIONS +UNQUOTED_IDENTIFIER +QUOTED_IDENTIFIER +EXPR_LINE_COMMENT +EXPR_MULTILINE_COMMENT +EXPR_WS +METADATA +SRC_UNQUOTED_IDENTIFIER +SRC_QUOTED_IDENTIFIER +SRC_LINE_COMMENT +SRC_MULTILINE_COMMENT +SRC_WS +ON +WITH +ENR_UNQUOTED_IDENTIFIER +ENR_QUOTED_IDENTIFIER +ENR_LINE_COMMENT +ENR_MULTILINE_COMMENT +ENR_WS +EXPLAIN_PIPE + +rule names: +DISSECT +GROK +EVAL +EXPLAIN +FROM +ROW +STATS +WHERE +SORT +MV_EXPAND +LIMIT +PROJECT +DROP +RENAME +SHOW +ENRICH +KEEP +LINE_COMMENT +MULTILINE_COMMENT +WS +EXPLAIN_OPENING_BRACKET +EXPLAIN_PIPE +EXPLAIN_WS +EXPLAIN_LINE_COMMENT +EXPLAIN_MULTILINE_COMMENT +PIPE +DIGIT +LETTER +ESCAPE_SEQUENCE +UNESCAPED_CHARS +EXPONENT +STRING +INTEGER_LITERAL +DECIMAL_LITERAL +BY +DATE_LITERAL +AND +ASSIGN +COMMA +DOT +LP +OPENING_BRACKET +CLOSING_BRACKET +NOT +LIKE +RLIKE +IN +IS +AS +NULL +OR +RP +UNDERSCORE +INFO +FUNCTIONS +BOOLEAN_VALUE +COMPARISON_OPERATOR +PLUS +MINUS +ASTERISK +SLASH +PERCENT +TEN +ORDERING +NULLS_ORDERING +NULLS_ORDERING_DIRECTION +MATH_FUNCTION +UNARY_FUNCTION +WHERE_FUNCTIONS +UNQUOTED_IDENTIFIER +QUOTED_IDENTIFIER +EXPR_LINE_COMMENT +EXPR_MULTILINE_COMMENT +EXPR_WS +SRC_PIPE +SRC_OPENING_BRACKET +SRC_CLOSING_BRACKET +SRC_COMMA +SRC_ASSIGN +METADATA +SRC_UNQUOTED_IDENTIFIER +SRC_UNQUOTED_IDENTIFIER_PART +SRC_QUOTED_IDENTIFIER +SRC_LINE_COMMENT +SRC_MULTILINE_COMMENT +SRC_WS +ON +WITH +ENR_PIPE +ENR_CLOSING_BRACKET +ENR_COMMA +ENR_ASSIGN +ENR_UNQUOTED_IDENTIFIER +ENR_UNQUOTED_IDENTIFIER_PART +ENR_QUOTED_IDENTIFIER +ENR_LINE_COMMENT +ENR_MULTILINE_COMMENT +ENR_WS +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE +EXPLAIN_MODE +EXPRESSION +SOURCE_IDENTIFIERS +ENRICH_IDENTIFIERS + +atn: +[4, 0, 81, 1610, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 397, 8, 17, 10, 17, 12, 17, 400, 9, 17, 1, 17, 3, 17, 403, 8, 17, 1, 17, 3, 17, 406, 8, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 415, 8, 18, 10, 18, 12, 18, 418, 9, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 4, 19, 426, 8, 19, 11, 19, 12, 19, 427, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 469, 8, 30, 1, 30, 4, 30, 472, 8, 30, 11, 30, 12, 30, 473, 1, 31, 1, 31, 1, 31, 5, 31, 479, 8, 31, 10, 31, 12, 31, 482, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 490, 8, 31, 10, 31, 12, 31, 493, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 500, 8, 31, 1, 31, 3, 31, 503, 8, 31, 3, 31, 505, 8, 31, 1, 32, 4, 32, 508, 8, 32, 11, 32, 12, 32, 509, 1, 33, 4, 33, 513, 8, 33, 11, 33, 12, 33, 514, 1, 33, 1, 33, 5, 33, 519, 8, 33, 10, 33, 12, 33, 522, 9, 33, 1, 33, 1, 33, 4, 33, 526, 8, 33, 11, 33, 12, 33, 527, 1, 33, 4, 33, 531, 8, 33, 11, 33, 12, 33, 532, 1, 33, 1, 33, 5, 33, 537, 8, 33, 10, 33, 12, 33, 540, 9, 33, 3, 33, 542, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 4, 33, 548, 8, 33, 11, 33, 12, 33, 549, 1, 33, 1, 33, 3, 33, 554, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 653, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 737, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 749, 8, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 771, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 788, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1232, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1385, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 1403, 8, 69, 10, 69, 12, 69, 1406, 9, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 4, 69, 1413, 8, 69, 11, 69, 12, 69, 1414, 3, 69, 1417, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 1423, 8, 70, 10, 70, 12, 70, 1426, 9, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 4, 80, 1477, 8, 80, 11, 80, 12, 80, 1478, 1, 81, 4, 81, 1482, 8, 81, 11, 81, 12, 81, 1483, 1, 81, 1, 81, 3, 81, 1488, 8, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 4, 92, 1532, 8, 92, 11, 92, 12, 92, 1533, 1, 93, 4, 93, 1537, 8, 93, 11, 93, 12, 93, 1538, 1, 93, 1, 93, 3, 93, 1543, 8, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 108, 1, 108, 1, 109, 1, 109, 1, 110, 1, 110, 1, 111, 1, 111, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 2, 416, 491, 0, 124, 5, 1, 7, 2, 9, 3, 11, 4, 13, 5, 15, 6, 17, 7, 19, 8, 21, 9, 23, 10, 25, 11, 27, 12, 29, 13, 31, 14, 33, 15, 35, 16, 37, 17, 39, 18, 41, 19, 43, 20, 45, 0, 47, 81, 49, 21, 51, 22, 53, 23, 55, 24, 57, 0, 59, 0, 61, 0, 63, 0, 65, 0, 67, 25, 69, 26, 71, 27, 73, 28, 75, 29, 77, 30, 79, 31, 81, 32, 83, 33, 85, 34, 87, 35, 89, 36, 91, 37, 93, 38, 95, 39, 97, 40, 99, 41, 101, 42, 103, 43, 105, 44, 107, 45, 109, 46, 111, 47, 113, 48, 115, 49, 117, 50, 119, 51, 121, 52, 123, 53, 125, 54, 127, 55, 129, 56, 131, 57, 133, 58, 135, 59, 137, 60, 139, 61, 141, 62, 143, 63, 145, 64, 147, 65, 149, 66, 151, 67, 153, 0, 155, 0, 157, 0, 159, 0, 161, 0, 163, 68, 165, 69, 167, 0, 169, 70, 171, 71, 173, 72, 175, 73, 177, 74, 179, 75, 181, 0, 183, 0, 185, 0, 187, 0, 189, 76, 191, 0, 193, 77, 195, 78, 197, 79, 199, 80, 201, 0, 203, 0, 205, 0, 207, 0, 209, 0, 211, 0, 213, 0, 215, 0, 217, 0, 219, 0, 221, 0, 223, 0, 225, 0, 227, 0, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 5, 0, 1, 2, 3, 4, 37, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 5, 0, 34, 34, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 2, 0, 64, 64, 95, 95, 1, 0, 96, 96, 10, 0, 9, 10, 13, 13, 32, 32, 44, 44, 47, 47, 61, 61, 91, 91, 93, 93, 96, 96, 124, 124, 2, 0, 42, 42, 47, 47, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 1711, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 1, 45, 1, 0, 0, 0, 1, 47, 1, 0, 0, 0, 1, 49, 1, 0, 0, 0, 1, 51, 1, 0, 0, 0, 1, 53, 1, 0, 0, 0, 2, 55, 1, 0, 0, 0, 2, 67, 1, 0, 0, 0, 2, 69, 1, 0, 0, 0, 2, 71, 1, 0, 0, 0, 2, 73, 1, 0, 0, 0, 2, 75, 1, 0, 0, 0, 2, 77, 1, 0, 0, 0, 2, 79, 1, 0, 0, 0, 2, 81, 1, 0, 0, 0, 2, 83, 1, 0, 0, 0, 2, 85, 1, 0, 0, 0, 2, 87, 1, 0, 0, 0, 2, 89, 1, 0, 0, 0, 2, 91, 1, 0, 0, 0, 2, 93, 1, 0, 0, 0, 2, 95, 1, 0, 0, 0, 2, 97, 1, 0, 0, 0, 2, 99, 1, 0, 0, 0, 2, 101, 1, 0, 0, 0, 2, 103, 1, 0, 0, 0, 2, 105, 1, 0, 0, 0, 2, 107, 1, 0, 0, 0, 2, 109, 1, 0, 0, 0, 2, 111, 1, 0, 0, 0, 2, 113, 1, 0, 0, 0, 2, 115, 1, 0, 0, 0, 2, 117, 1, 0, 0, 0, 2, 119, 1, 0, 0, 0, 2, 121, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 2, 125, 1, 0, 0, 0, 2, 127, 1, 0, 0, 0, 2, 129, 1, 0, 0, 0, 2, 131, 1, 0, 0, 0, 2, 133, 1, 0, 0, 0, 2, 135, 1, 0, 0, 0, 2, 137, 1, 0, 0, 0, 2, 139, 1, 0, 0, 0, 2, 141, 1, 0, 0, 0, 2, 143, 1, 0, 0, 0, 2, 145, 1, 0, 0, 0, 2, 147, 1, 0, 0, 0, 2, 149, 1, 0, 0, 0, 2, 151, 1, 0, 0, 0, 3, 153, 1, 0, 0, 0, 3, 155, 1, 0, 0, 0, 3, 157, 1, 0, 0, 0, 3, 159, 1, 0, 0, 0, 3, 161, 1, 0, 0, 0, 3, 163, 1, 0, 0, 0, 3, 165, 1, 0, 0, 0, 3, 169, 1, 0, 0, 0, 3, 171, 1, 0, 0, 0, 3, 173, 1, 0, 0, 0, 3, 175, 1, 0, 0, 0, 4, 177, 1, 0, 0, 0, 4, 179, 1, 0, 0, 0, 4, 181, 1, 0, 0, 0, 4, 183, 1, 0, 0, 0, 4, 185, 1, 0, 0, 0, 4, 187, 1, 0, 0, 0, 4, 189, 1, 0, 0, 0, 4, 193, 1, 0, 0, 0, 4, 195, 1, 0, 0, 0, 4, 197, 1, 0, 0, 0, 4, 199, 1, 0, 0, 0, 5, 253, 1, 0, 0, 0, 7, 263, 1, 0, 0, 0, 9, 270, 1, 0, 0, 0, 11, 277, 1, 0, 0, 0, 13, 287, 1, 0, 0, 0, 15, 294, 1, 0, 0, 0, 17, 300, 1, 0, 0, 0, 19, 308, 1, 0, 0, 0, 21, 316, 1, 0, 0, 0, 23, 323, 1, 0, 0, 0, 25, 335, 1, 0, 0, 0, 27, 343, 1, 0, 0, 0, 29, 353, 1, 0, 0, 0, 31, 360, 1, 0, 0, 0, 33, 369, 1, 0, 0, 0, 35, 376, 1, 0, 0, 0, 37, 385, 1, 0, 0, 0, 39, 392, 1, 0, 0, 0, 41, 409, 1, 0, 0, 0, 43, 425, 1, 0, 0, 0, 45, 431, 1, 0, 0, 0, 47, 436, 1, 0, 0, 0, 49, 441, 1, 0, 0, 0, 51, 445, 1, 0, 0, 0, 53, 449, 1, 0, 0, 0, 55, 453, 1, 0, 0, 0, 57, 457, 1, 0, 0, 0, 59, 459, 1, 0, 0, 0, 61, 461, 1, 0, 0, 0, 63, 464, 1, 0, 0, 0, 65, 466, 1, 0, 0, 0, 67, 504, 1, 0, 0, 0, 69, 507, 1, 0, 0, 0, 71, 553, 1, 0, 0, 0, 73, 555, 1, 0, 0, 0, 75, 652, 1, 0, 0, 0, 77, 654, 1, 0, 0, 0, 79, 658, 1, 0, 0, 0, 81, 660, 1, 0, 0, 0, 83, 662, 1, 0, 0, 0, 85, 664, 1, 0, 0, 0, 87, 666, 1, 0, 0, 0, 89, 671, 1, 0, 0, 0, 91, 676, 1, 0, 0, 0, 93, 680, 1, 0, 0, 0, 95, 685, 1, 0, 0, 0, 97, 691, 1, 0, 0, 0, 99, 694, 1, 0, 0, 0, 101, 697, 1, 0, 0, 0, 103, 700, 1, 0, 0, 0, 105, 705, 1, 0, 0, 0, 107, 708, 1, 0, 0, 0, 109, 710, 1, 0, 0, 0, 111, 712, 1, 0, 0, 0, 113, 717, 1, 0, 0, 0, 115, 736, 1, 0, 0, 0, 117, 748, 1, 0, 0, 0, 119, 750, 1, 0, 0, 0, 121, 752, 1, 0, 0, 0, 123, 754, 1, 0, 0, 0, 125, 756, 1, 0, 0, 0, 127, 758, 1, 0, 0, 0, 129, 760, 1, 0, 0, 0, 131, 770, 1, 0, 0, 0, 133, 772, 1, 0, 0, 0, 135, 787, 1, 0, 0, 0, 137, 1231, 1, 0, 0, 0, 139, 1384, 1, 0, 0, 0, 141, 1386, 1, 0, 0, 0, 143, 1416, 1, 0, 0, 0, 145, 1418, 1, 0, 0, 0, 147, 1429, 1, 0, 0, 0, 149, 1433, 1, 0, 0, 0, 151, 1437, 1, 0, 0, 0, 153, 1441, 1, 0, 0, 0, 155, 1446, 1, 0, 0, 0, 157, 1452, 1, 0, 0, 0, 159, 1458, 1, 0, 0, 0, 161, 1462, 1, 0, 0, 0, 163, 1466, 1, 0, 0, 0, 165, 1476, 1, 0, 0, 0, 167, 1487, 1, 0, 0, 0, 169, 1489, 1, 0, 0, 0, 171, 1491, 1, 0, 0, 0, 173, 1495, 1, 0, 0, 0, 175, 1499, 1, 0, 0, 0, 177, 1503, 1, 0, 0, 0, 179, 1506, 1, 0, 0, 0, 181, 1511, 1, 0, 0, 0, 183, 1516, 1, 0, 0, 0, 185, 1522, 1, 0, 0, 0, 187, 1526, 1, 0, 0, 0, 189, 1531, 1, 0, 0, 0, 191, 1542, 1, 0, 0, 0, 193, 1544, 1, 0, 0, 0, 195, 1546, 1, 0, 0, 0, 197, 1550, 1, 0, 0, 0, 199, 1554, 1, 0, 0, 0, 201, 1558, 1, 0, 0, 0, 203, 1560, 1, 0, 0, 0, 205, 1562, 1, 0, 0, 0, 207, 1564, 1, 0, 0, 0, 209, 1566, 1, 0, 0, 0, 211, 1568, 1, 0, 0, 0, 213, 1570, 1, 0, 0, 0, 215, 1572, 1, 0, 0, 0, 217, 1574, 1, 0, 0, 0, 219, 1576, 1, 0, 0, 0, 221, 1578, 1, 0, 0, 0, 223, 1580, 1, 0, 0, 0, 225, 1582, 1, 0, 0, 0, 227, 1584, 1, 0, 0, 0, 229, 1586, 1, 0, 0, 0, 231, 1588, 1, 0, 0, 0, 233, 1590, 1, 0, 0, 0, 235, 1592, 1, 0, 0, 0, 237, 1594, 1, 0, 0, 0, 239, 1596, 1, 0, 0, 0, 241, 1598, 1, 0, 0, 0, 243, 1600, 1, 0, 0, 0, 245, 1602, 1, 0, 0, 0, 247, 1604, 1, 0, 0, 0, 249, 1606, 1, 0, 0, 0, 251, 1608, 1, 0, 0, 0, 253, 254, 3, 207, 101, 0, 254, 255, 3, 217, 106, 0, 255, 256, 3, 237, 116, 0, 256, 257, 3, 237, 116, 0, 257, 258, 3, 209, 102, 0, 258, 259, 3, 205, 100, 0, 259, 260, 3, 239, 117, 0, 260, 261, 1, 0, 0, 0, 261, 262, 6, 0, 0, 0, 262, 6, 1, 0, 0, 0, 263, 264, 3, 213, 104, 0, 264, 265, 3, 235, 115, 0, 265, 266, 3, 229, 112, 0, 266, 267, 3, 221, 108, 0, 267, 268, 1, 0, 0, 0, 268, 269, 6, 1, 0, 0, 269, 8, 1, 0, 0, 0, 270, 271, 3, 209, 102, 0, 271, 272, 3, 243, 119, 0, 272, 273, 3, 201, 98, 0, 273, 274, 3, 223, 109, 0, 274, 275, 1, 0, 0, 0, 275, 276, 6, 2, 0, 0, 276, 10, 1, 0, 0, 0, 277, 278, 3, 209, 102, 0, 278, 279, 3, 247, 121, 0, 279, 280, 3, 231, 113, 0, 280, 281, 3, 223, 109, 0, 281, 282, 3, 201, 98, 0, 282, 283, 3, 217, 106, 0, 283, 284, 3, 227, 111, 0, 284, 285, 1, 0, 0, 0, 285, 286, 6, 3, 1, 0, 286, 12, 1, 0, 0, 0, 287, 288, 3, 211, 103, 0, 288, 289, 3, 235, 115, 0, 289, 290, 3, 229, 112, 0, 290, 291, 3, 225, 110, 0, 291, 292, 1, 0, 0, 0, 292, 293, 6, 4, 2, 0, 293, 14, 1, 0, 0, 0, 294, 295, 3, 235, 115, 0, 295, 296, 3, 229, 112, 0, 296, 297, 3, 245, 120, 0, 297, 298, 1, 0, 0, 0, 298, 299, 6, 5, 0, 0, 299, 16, 1, 0, 0, 0, 300, 301, 3, 237, 116, 0, 301, 302, 3, 239, 117, 0, 302, 303, 3, 201, 98, 0, 303, 304, 3, 239, 117, 0, 304, 305, 3, 237, 116, 0, 305, 306, 1, 0, 0, 0, 306, 307, 6, 6, 0, 0, 307, 18, 1, 0, 0, 0, 308, 309, 3, 245, 120, 0, 309, 310, 3, 215, 105, 0, 310, 311, 3, 209, 102, 0, 311, 312, 3, 235, 115, 0, 312, 313, 3, 209, 102, 0, 313, 314, 1, 0, 0, 0, 314, 315, 6, 7, 0, 0, 315, 20, 1, 0, 0, 0, 316, 317, 3, 237, 116, 0, 317, 318, 3, 229, 112, 0, 318, 319, 3, 235, 115, 0, 319, 320, 3, 239, 117, 0, 320, 321, 1, 0, 0, 0, 321, 322, 6, 8, 0, 0, 322, 22, 1, 0, 0, 0, 323, 324, 3, 225, 110, 0, 324, 325, 3, 243, 119, 0, 325, 326, 3, 109, 52, 0, 326, 327, 3, 209, 102, 0, 327, 328, 3, 247, 121, 0, 328, 329, 3, 231, 113, 0, 329, 330, 3, 201, 98, 0, 330, 331, 3, 227, 111, 0, 331, 332, 3, 207, 101, 0, 332, 333, 1, 0, 0, 0, 333, 334, 6, 9, 0, 0, 334, 24, 1, 0, 0, 0, 335, 336, 3, 223, 109, 0, 336, 337, 3, 217, 106, 0, 337, 338, 3, 225, 110, 0, 338, 339, 3, 217, 106, 0, 339, 340, 3, 239, 117, 0, 340, 341, 1, 0, 0, 0, 341, 342, 6, 10, 0, 0, 342, 26, 1, 0, 0, 0, 343, 344, 3, 231, 113, 0, 344, 345, 3, 235, 115, 0, 345, 346, 3, 229, 112, 0, 346, 347, 3, 219, 107, 0, 347, 348, 3, 209, 102, 0, 348, 349, 3, 205, 100, 0, 349, 350, 3, 239, 117, 0, 350, 351, 1, 0, 0, 0, 351, 352, 6, 11, 0, 0, 352, 28, 1, 0, 0, 0, 353, 354, 3, 207, 101, 0, 354, 355, 3, 235, 115, 0, 355, 356, 3, 229, 112, 0, 356, 357, 3, 231, 113, 0, 357, 358, 1, 0, 0, 0, 358, 359, 6, 12, 0, 0, 359, 30, 1, 0, 0, 0, 360, 361, 3, 235, 115, 0, 361, 362, 3, 209, 102, 0, 362, 363, 3, 227, 111, 0, 363, 364, 3, 201, 98, 0, 364, 365, 3, 225, 110, 0, 365, 366, 3, 209, 102, 0, 366, 367, 1, 0, 0, 0, 367, 368, 6, 13, 0, 0, 368, 32, 1, 0, 0, 0, 369, 370, 3, 237, 116, 0, 370, 371, 3, 215, 105, 0, 371, 372, 3, 229, 112, 0, 372, 373, 3, 245, 120, 0, 373, 374, 1, 0, 0, 0, 374, 375, 6, 14, 0, 0, 375, 34, 1, 0, 0, 0, 376, 377, 3, 209, 102, 0, 377, 378, 3, 227, 111, 0, 378, 379, 3, 235, 115, 0, 379, 380, 3, 217, 106, 0, 380, 381, 3, 205, 100, 0, 381, 382, 3, 215, 105, 0, 382, 383, 1, 0, 0, 0, 383, 384, 6, 15, 3, 0, 384, 36, 1, 0, 0, 0, 385, 386, 3, 221, 108, 0, 386, 387, 3, 209, 102, 0, 387, 388, 3, 209, 102, 0, 388, 389, 3, 231, 113, 0, 389, 390, 1, 0, 0, 0, 390, 391, 6, 16, 0, 0, 391, 38, 1, 0, 0, 0, 392, 393, 5, 47, 0, 0, 393, 394, 5, 47, 0, 0, 394, 398, 1, 0, 0, 0, 395, 397, 8, 0, 0, 0, 396, 395, 1, 0, 0, 0, 397, 400, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 402, 1, 0, 0, 0, 400, 398, 1, 0, 0, 0, 401, 403, 5, 13, 0, 0, 402, 401, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 405, 1, 0, 0, 0, 404, 406, 5, 10, 0, 0, 405, 404, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 407, 1, 0, 0, 0, 407, 408, 6, 17, 4, 0, 408, 40, 1, 0, 0, 0, 409, 410, 5, 47, 0, 0, 410, 411, 5, 42, 0, 0, 411, 416, 1, 0, 0, 0, 412, 415, 3, 41, 18, 0, 413, 415, 9, 0, 0, 0, 414, 412, 1, 0, 0, 0, 414, 413, 1, 0, 0, 0, 415, 418, 1, 0, 0, 0, 416, 417, 1, 0, 0, 0, 416, 414, 1, 0, 0, 0, 417, 419, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 419, 420, 5, 42, 0, 0, 420, 421, 5, 47, 0, 0, 421, 422, 1, 0, 0, 0, 422, 423, 6, 18, 4, 0, 423, 42, 1, 0, 0, 0, 424, 426, 7, 1, 0, 0, 425, 424, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 425, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 6, 19, 4, 0, 430, 44, 1, 0, 0, 0, 431, 432, 5, 91, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 6, 20, 5, 0, 434, 435, 6, 20, 6, 0, 435, 46, 1, 0, 0, 0, 436, 437, 5, 124, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 6, 21, 7, 0, 439, 440, 6, 21, 8, 0, 440, 48, 1, 0, 0, 0, 441, 442, 3, 43, 19, 0, 442, 443, 1, 0, 0, 0, 443, 444, 6, 22, 4, 0, 444, 50, 1, 0, 0, 0, 445, 446, 3, 39, 17, 0, 446, 447, 1, 0, 0, 0, 447, 448, 6, 23, 4, 0, 448, 52, 1, 0, 0, 0, 449, 450, 3, 41, 18, 0, 450, 451, 1, 0, 0, 0, 451, 452, 6, 24, 4, 0, 452, 54, 1, 0, 0, 0, 453, 454, 5, 124, 0, 0, 454, 455, 1, 0, 0, 0, 455, 456, 6, 25, 8, 0, 456, 56, 1, 0, 0, 0, 457, 458, 7, 2, 0, 0, 458, 58, 1, 0, 0, 0, 459, 460, 7, 3, 0, 0, 460, 60, 1, 0, 0, 0, 461, 462, 5, 92, 0, 0, 462, 463, 7, 4, 0, 0, 463, 62, 1, 0, 0, 0, 464, 465, 8, 5, 0, 0, 465, 64, 1, 0, 0, 0, 466, 468, 7, 6, 0, 0, 467, 469, 7, 7, 0, 0, 468, 467, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 471, 1, 0, 0, 0, 470, 472, 3, 57, 26, 0, 471, 470, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 471, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 66, 1, 0, 0, 0, 475, 480, 5, 34, 0, 0, 476, 479, 3, 61, 28, 0, 477, 479, 3, 63, 29, 0, 478, 476, 1, 0, 0, 0, 478, 477, 1, 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 483, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 505, 5, 34, 0, 0, 484, 485, 5, 34, 0, 0, 485, 486, 5, 34, 0, 0, 486, 487, 5, 34, 0, 0, 487, 491, 1, 0, 0, 0, 488, 490, 8, 0, 0, 0, 489, 488, 1, 0, 0, 0, 490, 493, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 492, 494, 1, 0, 0, 0, 493, 491, 1, 0, 0, 0, 494, 495, 5, 34, 0, 0, 495, 496, 5, 34, 0, 0, 496, 497, 5, 34, 0, 0, 497, 499, 1, 0, 0, 0, 498, 500, 5, 34, 0, 0, 499, 498, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 502, 1, 0, 0, 0, 501, 503, 5, 34, 0, 0, 502, 501, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 505, 1, 0, 0, 0, 504, 475, 1, 0, 0, 0, 504, 484, 1, 0, 0, 0, 505, 68, 1, 0, 0, 0, 506, 508, 3, 57, 26, 0, 507, 506, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 70, 1, 0, 0, 0, 511, 513, 3, 57, 26, 0, 512, 511, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 514, 512, 1, 0, 0, 0, 514, 515, 1, 0, 0, 0, 515, 516, 1, 0, 0, 0, 516, 520, 3, 83, 39, 0, 517, 519, 3, 57, 26, 0, 518, 517, 1, 0, 0, 0, 519, 522, 1, 0, 0, 0, 520, 518, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 554, 1, 0, 0, 0, 522, 520, 1, 0, 0, 0, 523, 525, 3, 83, 39, 0, 524, 526, 3, 57, 26, 0, 525, 524, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 554, 1, 0, 0, 0, 529, 531, 3, 57, 26, 0, 530, 529, 1, 0, 0, 0, 531, 532, 1, 0, 0, 0, 532, 530, 1, 0, 0, 0, 532, 533, 1, 0, 0, 0, 533, 541, 1, 0, 0, 0, 534, 538, 3, 83, 39, 0, 535, 537, 3, 57, 26, 0, 536, 535, 1, 0, 0, 0, 537, 540, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 542, 1, 0, 0, 0, 540, 538, 1, 0, 0, 0, 541, 534, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 1, 0, 0, 0, 543, 544, 3, 65, 30, 0, 544, 554, 1, 0, 0, 0, 545, 547, 3, 83, 39, 0, 546, 548, 3, 57, 26, 0, 547, 546, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 552, 3, 65, 30, 0, 552, 554, 1, 0, 0, 0, 553, 512, 1, 0, 0, 0, 553, 523, 1, 0, 0, 0, 553, 530, 1, 0, 0, 0, 553, 545, 1, 0, 0, 0, 554, 72, 1, 0, 0, 0, 555, 556, 5, 98, 0, 0, 556, 557, 5, 121, 0, 0, 557, 74, 1, 0, 0, 0, 558, 559, 5, 121, 0, 0, 559, 560, 5, 101, 0, 0, 560, 561, 5, 97, 0, 0, 561, 653, 5, 114, 0, 0, 562, 563, 5, 109, 0, 0, 563, 564, 5, 111, 0, 0, 564, 565, 5, 110, 0, 0, 565, 566, 5, 116, 0, 0, 566, 653, 5, 104, 0, 0, 567, 568, 5, 100, 0, 0, 568, 569, 5, 97, 0, 0, 569, 653, 5, 121, 0, 0, 570, 571, 5, 115, 0, 0, 571, 572, 5, 101, 0, 0, 572, 573, 5, 99, 0, 0, 573, 574, 5, 111, 0, 0, 574, 575, 5, 110, 0, 0, 575, 653, 5, 100, 0, 0, 576, 577, 5, 109, 0, 0, 577, 578, 5, 105, 0, 0, 578, 579, 5, 110, 0, 0, 579, 580, 5, 117, 0, 0, 580, 581, 5, 116, 0, 0, 581, 653, 5, 101, 0, 0, 582, 583, 5, 104, 0, 0, 583, 584, 5, 111, 0, 0, 584, 585, 5, 117, 0, 0, 585, 653, 5, 114, 0, 0, 586, 587, 5, 119, 0, 0, 587, 588, 5, 101, 0, 0, 588, 589, 5, 101, 0, 0, 589, 653, 5, 107, 0, 0, 590, 591, 5, 109, 0, 0, 591, 592, 5, 105, 0, 0, 592, 593, 5, 108, 0, 0, 593, 594, 5, 108, 0, 0, 594, 595, 5, 105, 0, 0, 595, 596, 5, 115, 0, 0, 596, 597, 5, 101, 0, 0, 597, 598, 5, 99, 0, 0, 598, 599, 5, 111, 0, 0, 599, 600, 5, 110, 0, 0, 600, 653, 5, 100, 0, 0, 601, 602, 5, 121, 0, 0, 602, 603, 5, 101, 0, 0, 603, 604, 5, 97, 0, 0, 604, 605, 5, 114, 0, 0, 605, 653, 5, 115, 0, 0, 606, 607, 5, 109, 0, 0, 607, 608, 5, 111, 0, 0, 608, 609, 5, 110, 0, 0, 609, 610, 5, 116, 0, 0, 610, 611, 5, 104, 0, 0, 611, 653, 5, 115, 0, 0, 612, 613, 5, 100, 0, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 121, 0, 0, 615, 653, 5, 115, 0, 0, 616, 617, 5, 115, 0, 0, 617, 618, 5, 101, 0, 0, 618, 619, 5, 99, 0, 0, 619, 620, 5, 111, 0, 0, 620, 621, 5, 110, 0, 0, 621, 622, 5, 100, 0, 0, 622, 653, 5, 115, 0, 0, 623, 624, 5, 109, 0, 0, 624, 625, 5, 105, 0, 0, 625, 626, 5, 110, 0, 0, 626, 627, 5, 117, 0, 0, 627, 628, 5, 116, 0, 0, 628, 629, 5, 101, 0, 0, 629, 653, 5, 115, 0, 0, 630, 631, 5, 104, 0, 0, 631, 632, 5, 111, 0, 0, 632, 633, 5, 117, 0, 0, 633, 634, 5, 114, 0, 0, 634, 653, 5, 115, 0, 0, 635, 636, 5, 119, 0, 0, 636, 637, 5, 101, 0, 0, 637, 638, 5, 101, 0, 0, 638, 639, 5, 107, 0, 0, 639, 653, 5, 115, 0, 0, 640, 641, 5, 109, 0, 0, 641, 642, 5, 105, 0, 0, 642, 643, 5, 108, 0, 0, 643, 644, 5, 108, 0, 0, 644, 645, 5, 105, 0, 0, 645, 646, 5, 115, 0, 0, 646, 647, 5, 101, 0, 0, 647, 648, 5, 99, 0, 0, 648, 649, 5, 111, 0, 0, 649, 650, 5, 110, 0, 0, 650, 651, 5, 100, 0, 0, 651, 653, 5, 115, 0, 0, 652, 558, 1, 0, 0, 0, 652, 562, 1, 0, 0, 0, 652, 567, 1, 0, 0, 0, 652, 570, 1, 0, 0, 0, 652, 576, 1, 0, 0, 0, 652, 582, 1, 0, 0, 0, 652, 586, 1, 0, 0, 0, 652, 590, 1, 0, 0, 0, 652, 601, 1, 0, 0, 0, 652, 606, 1, 0, 0, 0, 652, 612, 1, 0, 0, 0, 652, 616, 1, 0, 0, 0, 652, 623, 1, 0, 0, 0, 652, 630, 1, 0, 0, 0, 652, 635, 1, 0, 0, 0, 652, 640, 1, 0, 0, 0, 653, 76, 1, 0, 0, 0, 654, 655, 5, 97, 0, 0, 655, 656, 5, 110, 0, 0, 656, 657, 5, 100, 0, 0, 657, 78, 1, 0, 0, 0, 658, 659, 5, 61, 0, 0, 659, 80, 1, 0, 0, 0, 660, 661, 5, 44, 0, 0, 661, 82, 1, 0, 0, 0, 662, 663, 5, 46, 0, 0, 663, 84, 1, 0, 0, 0, 664, 665, 5, 40, 0, 0, 665, 86, 1, 0, 0, 0, 666, 667, 5, 91, 0, 0, 667, 668, 1, 0, 0, 0, 668, 669, 6, 41, 0, 0, 669, 670, 6, 41, 0, 0, 670, 88, 1, 0, 0, 0, 671, 672, 5, 93, 0, 0, 672, 673, 1, 0, 0, 0, 673, 674, 6, 42, 8, 0, 674, 675, 6, 42, 8, 0, 675, 90, 1, 0, 0, 0, 676, 677, 3, 227, 111, 0, 677, 678, 3, 229, 112, 0, 678, 679, 3, 239, 117, 0, 679, 92, 1, 0, 0, 0, 680, 681, 3, 223, 109, 0, 681, 682, 3, 217, 106, 0, 682, 683, 3, 221, 108, 0, 683, 684, 3, 209, 102, 0, 684, 94, 1, 0, 0, 0, 685, 686, 3, 235, 115, 0, 686, 687, 3, 223, 109, 0, 687, 688, 3, 217, 106, 0, 688, 689, 3, 221, 108, 0, 689, 690, 3, 209, 102, 0, 690, 96, 1, 0, 0, 0, 691, 692, 3, 217, 106, 0, 692, 693, 3, 227, 111, 0, 693, 98, 1, 0, 0, 0, 694, 695, 3, 217, 106, 0, 695, 696, 3, 237, 116, 0, 696, 100, 1, 0, 0, 0, 697, 698, 3, 201, 98, 0, 698, 699, 3, 237, 116, 0, 699, 102, 1, 0, 0, 0, 700, 701, 3, 227, 111, 0, 701, 702, 3, 241, 118, 0, 702, 703, 3, 223, 109, 0, 703, 704, 3, 223, 109, 0, 704, 104, 1, 0, 0, 0, 705, 706, 5, 111, 0, 0, 706, 707, 5, 114, 0, 0, 707, 106, 1, 0, 0, 0, 708, 709, 5, 41, 0, 0, 709, 108, 1, 0, 0, 0, 710, 711, 5, 95, 0, 0, 711, 110, 1, 0, 0, 0, 712, 713, 5, 105, 0, 0, 713, 714, 5, 110, 0, 0, 714, 715, 5, 102, 0, 0, 715, 716, 5, 111, 0, 0, 716, 112, 1, 0, 0, 0, 717, 718, 5, 102, 0, 0, 718, 719, 5, 117, 0, 0, 719, 720, 5, 110, 0, 0, 720, 721, 5, 99, 0, 0, 721, 722, 5, 116, 0, 0, 722, 723, 5, 105, 0, 0, 723, 724, 5, 111, 0, 0, 724, 725, 5, 110, 0, 0, 725, 726, 5, 115, 0, 0, 726, 114, 1, 0, 0, 0, 727, 728, 5, 116, 0, 0, 728, 729, 5, 114, 0, 0, 729, 730, 5, 117, 0, 0, 730, 737, 5, 101, 0, 0, 731, 732, 5, 102, 0, 0, 732, 733, 5, 97, 0, 0, 733, 734, 5, 108, 0, 0, 734, 735, 5, 115, 0, 0, 735, 737, 5, 101, 0, 0, 736, 727, 1, 0, 0, 0, 736, 731, 1, 0, 0, 0, 737, 116, 1, 0, 0, 0, 738, 739, 5, 61, 0, 0, 739, 749, 5, 61, 0, 0, 740, 741, 5, 33, 0, 0, 741, 749, 5, 61, 0, 0, 742, 749, 5, 60, 0, 0, 743, 744, 5, 60, 0, 0, 744, 749, 5, 61, 0, 0, 745, 749, 5, 62, 0, 0, 746, 747, 5, 62, 0, 0, 747, 749, 5, 61, 0, 0, 748, 738, 1, 0, 0, 0, 748, 740, 1, 0, 0, 0, 748, 742, 1, 0, 0, 0, 748, 743, 1, 0, 0, 0, 748, 745, 1, 0, 0, 0, 748, 746, 1, 0, 0, 0, 749, 118, 1, 0, 0, 0, 750, 751, 5, 43, 0, 0, 751, 120, 1, 0, 0, 0, 752, 753, 5, 45, 0, 0, 753, 122, 1, 0, 0, 0, 754, 755, 5, 42, 0, 0, 755, 124, 1, 0, 0, 0, 756, 757, 5, 47, 0, 0, 757, 126, 1, 0, 0, 0, 758, 759, 5, 37, 0, 0, 759, 128, 1, 0, 0, 0, 760, 761, 5, 49, 0, 0, 761, 762, 5, 48, 0, 0, 762, 130, 1, 0, 0, 0, 763, 764, 5, 97, 0, 0, 764, 765, 5, 115, 0, 0, 765, 771, 5, 99, 0, 0, 766, 767, 5, 100, 0, 0, 767, 768, 5, 101, 0, 0, 768, 769, 5, 115, 0, 0, 769, 771, 5, 99, 0, 0, 770, 763, 1, 0, 0, 0, 770, 766, 1, 0, 0, 0, 771, 132, 1, 0, 0, 0, 772, 773, 5, 110, 0, 0, 773, 774, 5, 117, 0, 0, 774, 775, 5, 108, 0, 0, 775, 776, 5, 108, 0, 0, 776, 777, 5, 115, 0, 0, 777, 134, 1, 0, 0, 0, 778, 779, 5, 102, 0, 0, 779, 780, 5, 105, 0, 0, 780, 781, 5, 114, 0, 0, 781, 782, 5, 115, 0, 0, 782, 788, 5, 116, 0, 0, 783, 784, 5, 108, 0, 0, 784, 785, 5, 97, 0, 0, 785, 786, 5, 115, 0, 0, 786, 788, 5, 116, 0, 0, 787, 778, 1, 0, 0, 0, 787, 783, 1, 0, 0, 0, 788, 136, 1, 0, 0, 0, 789, 790, 3, 235, 115, 0, 790, 791, 3, 229, 112, 0, 791, 792, 3, 241, 118, 0, 792, 793, 3, 227, 111, 0, 793, 794, 3, 207, 101, 0, 794, 1232, 1, 0, 0, 0, 795, 796, 3, 201, 98, 0, 796, 797, 3, 203, 99, 0, 797, 798, 3, 237, 116, 0, 798, 1232, 1, 0, 0, 0, 799, 800, 3, 231, 113, 0, 800, 801, 3, 229, 112, 0, 801, 802, 3, 245, 120, 0, 802, 1232, 1, 0, 0, 0, 803, 804, 3, 223, 109, 0, 804, 805, 3, 229, 112, 0, 805, 806, 3, 213, 104, 0, 806, 807, 3, 129, 62, 0, 807, 1232, 1, 0, 0, 0, 808, 809, 3, 231, 113, 0, 809, 810, 3, 217, 106, 0, 810, 1232, 1, 0, 0, 0, 811, 812, 3, 239, 117, 0, 812, 813, 3, 201, 98, 0, 813, 814, 3, 241, 118, 0, 814, 1232, 1, 0, 0, 0, 815, 1232, 3, 209, 102, 0, 816, 817, 3, 237, 116, 0, 817, 818, 3, 241, 118, 0, 818, 819, 3, 203, 99, 0, 819, 820, 3, 237, 116, 0, 820, 821, 3, 239, 117, 0, 821, 822, 3, 235, 115, 0, 822, 823, 3, 217, 106, 0, 823, 824, 3, 227, 111, 0, 824, 825, 3, 213, 104, 0, 825, 1232, 1, 0, 0, 0, 826, 827, 3, 239, 117, 0, 827, 828, 3, 235, 115, 0, 828, 829, 3, 217, 106, 0, 829, 830, 3, 225, 110, 0, 830, 1232, 1, 0, 0, 0, 831, 832, 3, 205, 100, 0, 832, 833, 3, 229, 112, 0, 833, 834, 3, 227, 111, 0, 834, 835, 3, 205, 100, 0, 835, 836, 3, 201, 98, 0, 836, 837, 3, 239, 117, 0, 837, 1232, 1, 0, 0, 0, 838, 839, 3, 205, 100, 0, 839, 840, 3, 229, 112, 0, 840, 841, 3, 201, 98, 0, 841, 842, 3, 223, 109, 0, 842, 843, 3, 209, 102, 0, 843, 844, 3, 237, 116, 0, 844, 845, 3, 205, 100, 0, 845, 846, 3, 209, 102, 0, 846, 1232, 1, 0, 0, 0, 847, 848, 3, 213, 104, 0, 848, 849, 3, 235, 115, 0, 849, 850, 3, 209, 102, 0, 850, 851, 3, 201, 98, 0, 851, 852, 3, 239, 117, 0, 852, 853, 3, 209, 102, 0, 853, 854, 3, 237, 116, 0, 854, 855, 3, 239, 117, 0, 855, 1232, 1, 0, 0, 0, 856, 857, 3, 223, 109, 0, 857, 858, 3, 209, 102, 0, 858, 859, 3, 211, 103, 0, 859, 860, 3, 239, 117, 0, 860, 1232, 1, 0, 0, 0, 861, 862, 3, 227, 111, 0, 862, 863, 3, 229, 112, 0, 863, 864, 3, 245, 120, 0, 864, 1232, 1, 0, 0, 0, 865, 866, 3, 235, 115, 0, 866, 867, 3, 217, 106, 0, 867, 868, 3, 213, 104, 0, 868, 869, 3, 215, 105, 0, 869, 870, 3, 239, 117, 0, 870, 1232, 1, 0, 0, 0, 871, 872, 3, 237, 116, 0, 872, 873, 3, 239, 117, 0, 873, 874, 3, 201, 98, 0, 874, 875, 3, 235, 115, 0, 875, 876, 3, 239, 117, 0, 876, 877, 3, 237, 116, 0, 877, 878, 3, 109, 52, 0, 878, 879, 3, 245, 120, 0, 879, 880, 3, 217, 106, 0, 880, 881, 3, 239, 117, 0, 881, 882, 3, 215, 105, 0, 882, 1232, 1, 0, 0, 0, 883, 884, 3, 207, 101, 0, 884, 885, 3, 201, 98, 0, 885, 886, 3, 239, 117, 0, 886, 887, 3, 209, 102, 0, 887, 888, 3, 109, 52, 0, 888, 889, 3, 211, 103, 0, 889, 890, 3, 229, 112, 0, 890, 891, 3, 235, 115, 0, 891, 892, 3, 225, 110, 0, 892, 893, 3, 201, 98, 0, 893, 894, 3, 239, 117, 0, 894, 1232, 1, 0, 0, 0, 895, 896, 3, 207, 101, 0, 896, 897, 3, 201, 98, 0, 897, 898, 3, 239, 117, 0, 898, 899, 3, 209, 102, 0, 899, 900, 3, 109, 52, 0, 900, 901, 3, 239, 117, 0, 901, 902, 3, 235, 115, 0, 902, 903, 3, 241, 118, 0, 903, 904, 3, 227, 111, 0, 904, 905, 3, 205, 100, 0, 905, 1232, 1, 0, 0, 0, 906, 907, 3, 207, 101, 0, 907, 908, 3, 201, 98, 0, 908, 909, 3, 239, 117, 0, 909, 910, 3, 209, 102, 0, 910, 911, 3, 109, 52, 0, 911, 912, 3, 231, 113, 0, 912, 913, 3, 201, 98, 0, 913, 914, 3, 235, 115, 0, 914, 915, 3, 237, 116, 0, 915, 916, 3, 209, 102, 0, 916, 1232, 1, 0, 0, 0, 917, 918, 3, 201, 98, 0, 918, 919, 3, 241, 118, 0, 919, 920, 3, 239, 117, 0, 920, 921, 3, 229, 112, 0, 921, 922, 3, 109, 52, 0, 922, 923, 3, 203, 99, 0, 923, 924, 3, 241, 118, 0, 924, 925, 3, 205, 100, 0, 925, 926, 3, 221, 108, 0, 926, 927, 3, 209, 102, 0, 927, 928, 3, 239, 117, 0, 928, 1232, 1, 0, 0, 0, 929, 930, 3, 207, 101, 0, 930, 931, 3, 201, 98, 0, 931, 932, 3, 239, 117, 0, 932, 933, 3, 209, 102, 0, 933, 934, 3, 109, 52, 0, 934, 935, 3, 209, 102, 0, 935, 936, 3, 247, 121, 0, 936, 937, 3, 239, 117, 0, 937, 938, 3, 235, 115, 0, 938, 939, 3, 201, 98, 0, 939, 940, 3, 205, 100, 0, 940, 941, 3, 239, 117, 0, 941, 1232, 1, 0, 0, 0, 942, 943, 3, 217, 106, 0, 943, 944, 3, 237, 116, 0, 944, 945, 3, 109, 52, 0, 945, 946, 3, 211, 103, 0, 946, 947, 3, 217, 106, 0, 947, 948, 3, 227, 111, 0, 948, 949, 3, 217, 106, 0, 949, 950, 3, 239, 117, 0, 950, 951, 3, 209, 102, 0, 951, 1232, 1, 0, 0, 0, 952, 953, 3, 217, 106, 0, 953, 954, 3, 237, 116, 0, 954, 955, 3, 109, 52, 0, 955, 956, 3, 217, 106, 0, 956, 957, 3, 227, 111, 0, 957, 958, 3, 211, 103, 0, 958, 959, 3, 217, 106, 0, 959, 960, 3, 227, 111, 0, 960, 961, 3, 217, 106, 0, 961, 962, 3, 239, 117, 0, 962, 963, 3, 209, 102, 0, 963, 1232, 1, 0, 0, 0, 964, 965, 3, 205, 100, 0, 965, 966, 3, 201, 98, 0, 966, 967, 3, 237, 116, 0, 967, 968, 3, 209, 102, 0, 968, 1232, 1, 0, 0, 0, 969, 970, 3, 223, 109, 0, 970, 971, 3, 209, 102, 0, 971, 972, 3, 227, 111, 0, 972, 973, 3, 213, 104, 0, 973, 974, 3, 239, 117, 0, 974, 975, 3, 215, 105, 0, 975, 1232, 1, 0, 0, 0, 976, 977, 3, 225, 110, 0, 977, 978, 3, 243, 119, 0, 978, 979, 3, 109, 52, 0, 979, 980, 3, 225, 110, 0, 980, 981, 3, 201, 98, 0, 981, 982, 3, 247, 121, 0, 982, 1232, 1, 0, 0, 0, 983, 984, 3, 225, 110, 0, 984, 985, 3, 243, 119, 0, 985, 986, 3, 109, 52, 0, 986, 987, 3, 225, 110, 0, 987, 988, 3, 217, 106, 0, 988, 989, 3, 227, 111, 0, 989, 1232, 1, 0, 0, 0, 990, 991, 3, 225, 110, 0, 991, 992, 3, 243, 119, 0, 992, 993, 3, 109, 52, 0, 993, 994, 3, 201, 98, 0, 994, 995, 3, 243, 119, 0, 995, 996, 3, 213, 104, 0, 996, 1232, 1, 0, 0, 0, 997, 998, 3, 225, 110, 0, 998, 999, 3, 243, 119, 0, 999, 1000, 3, 109, 52, 0, 1000, 1001, 3, 237, 116, 0, 1001, 1002, 3, 241, 118, 0, 1002, 1003, 3, 225, 110, 0, 1003, 1232, 1, 0, 0, 0, 1004, 1005, 3, 225, 110, 0, 1005, 1006, 3, 243, 119, 0, 1006, 1007, 3, 109, 52, 0, 1007, 1008, 3, 205, 100, 0, 1008, 1009, 3, 229, 112, 0, 1009, 1010, 3, 241, 118, 0, 1010, 1011, 3, 227, 111, 0, 1011, 1012, 3, 239, 117, 0, 1012, 1232, 1, 0, 0, 0, 1013, 1014, 3, 225, 110, 0, 1014, 1015, 3, 243, 119, 0, 1015, 1016, 3, 109, 52, 0, 1016, 1017, 3, 205, 100, 0, 1017, 1018, 3, 229, 112, 0, 1018, 1019, 3, 227, 111, 0, 1019, 1020, 3, 205, 100, 0, 1020, 1021, 3, 201, 98, 0, 1021, 1022, 3, 239, 117, 0, 1022, 1232, 1, 0, 0, 0, 1023, 1024, 3, 225, 110, 0, 1024, 1025, 3, 243, 119, 0, 1025, 1026, 3, 109, 52, 0, 1026, 1027, 3, 219, 107, 0, 1027, 1028, 3, 229, 112, 0, 1028, 1029, 3, 217, 106, 0, 1029, 1030, 3, 227, 111, 0, 1030, 1232, 1, 0, 0, 0, 1031, 1032, 3, 225, 110, 0, 1032, 1033, 3, 243, 119, 0, 1033, 1034, 3, 109, 52, 0, 1034, 1035, 3, 225, 110, 0, 1035, 1036, 3, 209, 102, 0, 1036, 1037, 3, 207, 101, 0, 1037, 1038, 3, 217, 106, 0, 1038, 1039, 3, 201, 98, 0, 1039, 1040, 3, 227, 111, 0, 1040, 1232, 1, 0, 0, 0, 1041, 1042, 3, 225, 110, 0, 1042, 1043, 3, 243, 119, 0, 1043, 1044, 3, 109, 52, 0, 1044, 1045, 3, 207, 101, 0, 1045, 1046, 3, 209, 102, 0, 1046, 1047, 3, 207, 101, 0, 1047, 1048, 3, 241, 118, 0, 1048, 1049, 3, 231, 113, 0, 1049, 1050, 3, 209, 102, 0, 1050, 1232, 1, 0, 0, 0, 1051, 1052, 3, 225, 110, 0, 1052, 1053, 3, 209, 102, 0, 1053, 1054, 3, 239, 117, 0, 1054, 1055, 3, 201, 98, 0, 1055, 1056, 3, 207, 101, 0, 1056, 1057, 3, 201, 98, 0, 1057, 1058, 3, 239, 117, 0, 1058, 1059, 3, 201, 98, 0, 1059, 1232, 1, 0, 0, 0, 1060, 1061, 3, 237, 116, 0, 1061, 1062, 3, 231, 113, 0, 1062, 1063, 3, 223, 109, 0, 1063, 1064, 3, 217, 106, 0, 1064, 1065, 3, 239, 117, 0, 1065, 1232, 1, 0, 0, 0, 1066, 1067, 3, 239, 117, 0, 1067, 1068, 3, 229, 112, 0, 1068, 1069, 3, 109, 52, 0, 1069, 1070, 3, 237, 116, 0, 1070, 1071, 3, 239, 117, 0, 1071, 1072, 3, 235, 115, 0, 1072, 1073, 3, 217, 106, 0, 1073, 1074, 3, 227, 111, 0, 1074, 1075, 3, 213, 104, 0, 1075, 1232, 1, 0, 0, 0, 1076, 1077, 3, 239, 117, 0, 1077, 1078, 3, 229, 112, 0, 1078, 1079, 3, 109, 52, 0, 1079, 1080, 3, 237, 116, 0, 1080, 1081, 3, 239, 117, 0, 1081, 1082, 3, 235, 115, 0, 1082, 1232, 1, 0, 0, 0, 1083, 1084, 3, 239, 117, 0, 1084, 1085, 3, 229, 112, 0, 1085, 1086, 3, 109, 52, 0, 1086, 1087, 3, 203, 99, 0, 1087, 1088, 3, 229, 112, 0, 1088, 1089, 3, 229, 112, 0, 1089, 1090, 3, 223, 109, 0, 1090, 1232, 1, 0, 0, 0, 1091, 1092, 3, 239, 117, 0, 1092, 1093, 3, 229, 112, 0, 1093, 1094, 3, 109, 52, 0, 1094, 1095, 3, 203, 99, 0, 1095, 1096, 3, 229, 112, 0, 1096, 1097, 3, 229, 112, 0, 1097, 1098, 3, 223, 109, 0, 1098, 1099, 3, 209, 102, 0, 1099, 1100, 3, 201, 98, 0, 1100, 1101, 3, 227, 111, 0, 1101, 1232, 1, 0, 0, 0, 1102, 1103, 3, 239, 117, 0, 1103, 1104, 3, 229, 112, 0, 1104, 1105, 3, 109, 52, 0, 1105, 1106, 3, 207, 101, 0, 1106, 1107, 3, 201, 98, 0, 1107, 1108, 3, 239, 117, 0, 1108, 1109, 3, 209, 102, 0, 1109, 1110, 3, 239, 117, 0, 1110, 1111, 3, 217, 106, 0, 1111, 1112, 3, 225, 110, 0, 1112, 1113, 3, 209, 102, 0, 1113, 1232, 1, 0, 0, 0, 1114, 1115, 3, 239, 117, 0, 1115, 1116, 3, 229, 112, 0, 1116, 1117, 3, 109, 52, 0, 1117, 1118, 3, 207, 101, 0, 1118, 1119, 3, 239, 117, 0, 1119, 1232, 1, 0, 0, 0, 1120, 1121, 3, 239, 117, 0, 1121, 1122, 3, 229, 112, 0, 1122, 1123, 3, 109, 52, 0, 1123, 1124, 3, 207, 101, 0, 1124, 1125, 3, 203, 99, 0, 1125, 1126, 3, 223, 109, 0, 1126, 1232, 1, 0, 0, 0, 1127, 1128, 3, 239, 117, 0, 1128, 1129, 3, 229, 112, 0, 1129, 1130, 3, 109, 52, 0, 1130, 1131, 3, 207, 101, 0, 1131, 1132, 3, 229, 112, 0, 1132, 1133, 3, 241, 118, 0, 1133, 1134, 3, 203, 99, 0, 1134, 1135, 3, 223, 109, 0, 1135, 1136, 3, 209, 102, 0, 1136, 1232, 1, 0, 0, 0, 1137, 1138, 3, 239, 117, 0, 1138, 1139, 3, 229, 112, 0, 1139, 1140, 3, 109, 52, 0, 1140, 1141, 3, 207, 101, 0, 1141, 1142, 3, 209, 102, 0, 1142, 1143, 3, 213, 104, 0, 1143, 1144, 3, 235, 115, 0, 1144, 1145, 3, 209, 102, 0, 1145, 1146, 3, 209, 102, 0, 1146, 1147, 3, 237, 116, 0, 1147, 1232, 1, 0, 0, 0, 1148, 1149, 3, 239, 117, 0, 1149, 1150, 3, 229, 112, 0, 1150, 1151, 3, 109, 52, 0, 1151, 1152, 3, 217, 106, 0, 1152, 1153, 3, 227, 111, 0, 1153, 1154, 3, 239, 117, 0, 1154, 1232, 1, 0, 0, 0, 1155, 1156, 3, 239, 117, 0, 1156, 1157, 3, 229, 112, 0, 1157, 1158, 3, 109, 52, 0, 1158, 1159, 3, 217, 106, 0, 1159, 1160, 3, 227, 111, 0, 1160, 1161, 3, 239, 117, 0, 1161, 1162, 3, 209, 102, 0, 1162, 1163, 3, 213, 104, 0, 1163, 1164, 3, 209, 102, 0, 1164, 1165, 3, 235, 115, 0, 1165, 1232, 1, 0, 0, 0, 1166, 1167, 3, 239, 117, 0, 1167, 1168, 3, 229, 112, 0, 1168, 1169, 3, 109, 52, 0, 1169, 1170, 3, 217, 106, 0, 1170, 1171, 3, 231, 113, 0, 1171, 1232, 1, 0, 0, 0, 1172, 1173, 3, 239, 117, 0, 1173, 1174, 3, 229, 112, 0, 1174, 1175, 3, 109, 52, 0, 1175, 1176, 3, 223, 109, 0, 1176, 1177, 3, 229, 112, 0, 1177, 1178, 3, 227, 111, 0, 1178, 1179, 3, 213, 104, 0, 1179, 1232, 1, 0, 0, 0, 1180, 1181, 3, 239, 117, 0, 1181, 1182, 3, 229, 112, 0, 1182, 1183, 3, 109, 52, 0, 1183, 1184, 3, 235, 115, 0, 1184, 1185, 3, 201, 98, 0, 1185, 1186, 3, 207, 101, 0, 1186, 1187, 3, 217, 106, 0, 1187, 1188, 3, 201, 98, 0, 1188, 1189, 3, 227, 111, 0, 1189, 1190, 3, 237, 116, 0, 1190, 1232, 1, 0, 0, 0, 1191, 1192, 3, 239, 117, 0, 1192, 1193, 3, 229, 112, 0, 1193, 1194, 3, 109, 52, 0, 1194, 1195, 3, 243, 119, 0, 1195, 1196, 3, 209, 102, 0, 1196, 1197, 3, 235, 115, 0, 1197, 1198, 3, 237, 116, 0, 1198, 1199, 3, 217, 106, 0, 1199, 1200, 3, 229, 112, 0, 1200, 1201, 3, 227, 111, 0, 1201, 1232, 1, 0, 0, 0, 1202, 1203, 3, 239, 117, 0, 1203, 1204, 3, 229, 112, 0, 1204, 1205, 3, 109, 52, 0, 1205, 1206, 3, 241, 118, 0, 1206, 1207, 3, 227, 111, 0, 1207, 1208, 3, 237, 116, 0, 1208, 1209, 3, 217, 106, 0, 1209, 1210, 3, 213, 104, 0, 1210, 1211, 3, 227, 111, 0, 1211, 1212, 3, 209, 102, 0, 1212, 1213, 3, 207, 101, 0, 1213, 1214, 3, 109, 52, 0, 1214, 1215, 3, 223, 109, 0, 1215, 1216, 3, 229, 112, 0, 1216, 1217, 3, 227, 111, 0, 1217, 1218, 3, 213, 104, 0, 1218, 1232, 1, 0, 0, 0, 1219, 1220, 3, 239, 117, 0, 1220, 1221, 3, 229, 112, 0, 1221, 1222, 3, 109, 52, 0, 1222, 1223, 3, 213, 104, 0, 1223, 1224, 3, 209, 102, 0, 1224, 1225, 3, 229, 112, 0, 1225, 1226, 3, 231, 113, 0, 1226, 1227, 3, 229, 112, 0, 1227, 1228, 3, 217, 106, 0, 1228, 1229, 3, 227, 111, 0, 1229, 1230, 3, 239, 117, 0, 1230, 1232, 1, 0, 0, 0, 1231, 789, 1, 0, 0, 0, 1231, 795, 1, 0, 0, 0, 1231, 799, 1, 0, 0, 0, 1231, 803, 1, 0, 0, 0, 1231, 808, 1, 0, 0, 0, 1231, 811, 1, 0, 0, 0, 1231, 815, 1, 0, 0, 0, 1231, 816, 1, 0, 0, 0, 1231, 826, 1, 0, 0, 0, 1231, 831, 1, 0, 0, 0, 1231, 838, 1, 0, 0, 0, 1231, 847, 1, 0, 0, 0, 1231, 856, 1, 0, 0, 0, 1231, 861, 1, 0, 0, 0, 1231, 865, 1, 0, 0, 0, 1231, 871, 1, 0, 0, 0, 1231, 883, 1, 0, 0, 0, 1231, 895, 1, 0, 0, 0, 1231, 906, 1, 0, 0, 0, 1231, 917, 1, 0, 0, 0, 1231, 929, 1, 0, 0, 0, 1231, 942, 1, 0, 0, 0, 1231, 952, 1, 0, 0, 0, 1231, 964, 1, 0, 0, 0, 1231, 969, 1, 0, 0, 0, 1231, 976, 1, 0, 0, 0, 1231, 983, 1, 0, 0, 0, 1231, 990, 1, 0, 0, 0, 1231, 997, 1, 0, 0, 0, 1231, 1004, 1, 0, 0, 0, 1231, 1013, 1, 0, 0, 0, 1231, 1023, 1, 0, 0, 0, 1231, 1031, 1, 0, 0, 0, 1231, 1041, 1, 0, 0, 0, 1231, 1051, 1, 0, 0, 0, 1231, 1060, 1, 0, 0, 0, 1231, 1066, 1, 0, 0, 0, 1231, 1076, 1, 0, 0, 0, 1231, 1083, 1, 0, 0, 0, 1231, 1091, 1, 0, 0, 0, 1231, 1102, 1, 0, 0, 0, 1231, 1114, 1, 0, 0, 0, 1231, 1120, 1, 0, 0, 0, 1231, 1127, 1, 0, 0, 0, 1231, 1137, 1, 0, 0, 0, 1231, 1148, 1, 0, 0, 0, 1231, 1155, 1, 0, 0, 0, 1231, 1166, 1, 0, 0, 0, 1231, 1172, 1, 0, 0, 0, 1231, 1180, 1, 0, 0, 0, 1231, 1191, 1, 0, 0, 0, 1231, 1202, 1, 0, 0, 0, 1231, 1219, 1, 0, 0, 0, 1232, 138, 1, 0, 0, 0, 1233, 1234, 3, 201, 98, 0, 1234, 1235, 3, 243, 119, 0, 1235, 1236, 3, 213, 104, 0, 1236, 1385, 1, 0, 0, 0, 1237, 1238, 3, 225, 110, 0, 1238, 1239, 3, 217, 106, 0, 1239, 1240, 3, 227, 111, 0, 1240, 1385, 1, 0, 0, 0, 1241, 1242, 3, 225, 110, 0, 1242, 1243, 3, 201, 98, 0, 1243, 1244, 3, 247, 121, 0, 1244, 1385, 1, 0, 0, 0, 1245, 1246, 3, 237, 116, 0, 1246, 1247, 3, 241, 118, 0, 1247, 1248, 3, 225, 110, 0, 1248, 1385, 1, 0, 0, 0, 1249, 1250, 3, 205, 100, 0, 1250, 1251, 3, 229, 112, 0, 1251, 1252, 3, 241, 118, 0, 1252, 1253, 3, 227, 111, 0, 1253, 1254, 3, 239, 117, 0, 1254, 1385, 1, 0, 0, 0, 1255, 1256, 3, 205, 100, 0, 1256, 1257, 3, 229, 112, 0, 1257, 1258, 3, 241, 118, 0, 1258, 1259, 3, 227, 111, 0, 1259, 1260, 3, 239, 117, 0, 1260, 1261, 3, 109, 52, 0, 1261, 1262, 3, 207, 101, 0, 1262, 1263, 3, 217, 106, 0, 1263, 1264, 3, 237, 116, 0, 1264, 1265, 3, 239, 117, 0, 1265, 1266, 3, 217, 106, 0, 1266, 1267, 3, 227, 111, 0, 1267, 1268, 3, 205, 100, 0, 1268, 1269, 3, 239, 117, 0, 1269, 1385, 1, 0, 0, 0, 1270, 1271, 3, 231, 113, 0, 1271, 1272, 3, 209, 102, 0, 1272, 1273, 3, 235, 115, 0, 1273, 1274, 3, 205, 100, 0, 1274, 1275, 3, 209, 102, 0, 1275, 1276, 3, 227, 111, 0, 1276, 1277, 3, 239, 117, 0, 1277, 1278, 3, 217, 106, 0, 1278, 1279, 3, 223, 109, 0, 1279, 1280, 3, 209, 102, 0, 1280, 1385, 1, 0, 0, 0, 1281, 1282, 3, 225, 110, 0, 1282, 1283, 3, 209, 102, 0, 1283, 1284, 3, 207, 101, 0, 1284, 1285, 3, 217, 106, 0, 1285, 1286, 3, 201, 98, 0, 1286, 1287, 3, 227, 111, 0, 1287, 1385, 1, 0, 0, 0, 1288, 1289, 3, 225, 110, 0, 1289, 1290, 3, 209, 102, 0, 1290, 1291, 3, 207, 101, 0, 1291, 1292, 3, 217, 106, 0, 1292, 1293, 3, 201, 98, 0, 1293, 1294, 3, 227, 111, 0, 1294, 1295, 3, 109, 52, 0, 1295, 1296, 3, 201, 98, 0, 1296, 1297, 3, 203, 99, 0, 1297, 1298, 3, 237, 116, 0, 1298, 1299, 3, 229, 112, 0, 1299, 1300, 3, 223, 109, 0, 1300, 1301, 3, 241, 118, 0, 1301, 1302, 3, 239, 117, 0, 1302, 1303, 3, 209, 102, 0, 1303, 1304, 3, 109, 52, 0, 1304, 1305, 3, 207, 101, 0, 1305, 1306, 3, 209, 102, 0, 1306, 1307, 3, 243, 119, 0, 1307, 1308, 3, 217, 106, 0, 1308, 1309, 3, 201, 98, 0, 1309, 1310, 3, 239, 117, 0, 1310, 1311, 3, 217, 106, 0, 1311, 1312, 3, 229, 112, 0, 1312, 1313, 3, 227, 111, 0, 1313, 1385, 1, 0, 0, 0, 1314, 1315, 3, 201, 98, 0, 1315, 1316, 3, 205, 100, 0, 1316, 1317, 3, 229, 112, 0, 1317, 1318, 3, 237, 116, 0, 1318, 1385, 1, 0, 0, 0, 1319, 1320, 3, 201, 98, 0, 1320, 1321, 3, 237, 116, 0, 1321, 1322, 3, 217, 106, 0, 1322, 1323, 3, 227, 111, 0, 1323, 1385, 1, 0, 0, 0, 1324, 1325, 3, 201, 98, 0, 1325, 1326, 3, 239, 117, 0, 1326, 1327, 3, 201, 98, 0, 1327, 1328, 3, 227, 111, 0, 1328, 1385, 1, 0, 0, 0, 1329, 1330, 3, 201, 98, 0, 1330, 1331, 3, 239, 117, 0, 1331, 1332, 3, 201, 98, 0, 1332, 1333, 3, 227, 111, 0, 1333, 1334, 5, 50, 0, 0, 1334, 1385, 1, 0, 0, 0, 1335, 1336, 3, 205, 100, 0, 1336, 1337, 3, 209, 102, 0, 1337, 1338, 3, 217, 106, 0, 1338, 1339, 3, 223, 109, 0, 1339, 1385, 1, 0, 0, 0, 1340, 1341, 3, 205, 100, 0, 1341, 1342, 3, 229, 112, 0, 1342, 1343, 3, 237, 116, 0, 1343, 1385, 1, 0, 0, 0, 1344, 1345, 3, 205, 100, 0, 1345, 1346, 3, 229, 112, 0, 1346, 1347, 3, 237, 116, 0, 1347, 1348, 3, 215, 105, 0, 1348, 1385, 1, 0, 0, 0, 1349, 1350, 3, 211, 103, 0, 1350, 1351, 3, 223, 109, 0, 1351, 1352, 3, 229, 112, 0, 1352, 1353, 3, 229, 112, 0, 1353, 1354, 3, 235, 115, 0, 1354, 1385, 1, 0, 0, 0, 1355, 1356, 3, 223, 109, 0, 1356, 1357, 3, 239, 117, 0, 1357, 1358, 3, 235, 115, 0, 1358, 1359, 3, 217, 106, 0, 1359, 1360, 3, 225, 110, 0, 1360, 1385, 1, 0, 0, 0, 1361, 1362, 3, 237, 116, 0, 1362, 1363, 3, 217, 106, 0, 1363, 1364, 3, 227, 111, 0, 1364, 1385, 1, 0, 0, 0, 1365, 1366, 3, 237, 116, 0, 1366, 1367, 3, 217, 106, 0, 1367, 1368, 3, 227, 111, 0, 1368, 1369, 3, 215, 105, 0, 1369, 1385, 1, 0, 0, 0, 1370, 1371, 3, 237, 116, 0, 1371, 1372, 3, 233, 114, 0, 1372, 1373, 3, 235, 115, 0, 1373, 1374, 3, 239, 117, 0, 1374, 1385, 1, 0, 0, 0, 1375, 1376, 3, 239, 117, 0, 1376, 1377, 3, 201, 98, 0, 1377, 1378, 3, 227, 111, 0, 1378, 1385, 1, 0, 0, 0, 1379, 1380, 3, 239, 117, 0, 1380, 1381, 3, 201, 98, 0, 1381, 1382, 3, 227, 111, 0, 1382, 1383, 3, 215, 105, 0, 1383, 1385, 1, 0, 0, 0, 1384, 1233, 1, 0, 0, 0, 1384, 1237, 1, 0, 0, 0, 1384, 1241, 1, 0, 0, 0, 1384, 1245, 1, 0, 0, 0, 1384, 1249, 1, 0, 0, 0, 1384, 1255, 1, 0, 0, 0, 1384, 1270, 1, 0, 0, 0, 1384, 1281, 1, 0, 0, 0, 1384, 1288, 1, 0, 0, 0, 1384, 1314, 1, 0, 0, 0, 1384, 1319, 1, 0, 0, 0, 1384, 1324, 1, 0, 0, 0, 1384, 1329, 1, 0, 0, 0, 1384, 1335, 1, 0, 0, 0, 1384, 1340, 1, 0, 0, 0, 1384, 1344, 1, 0, 0, 0, 1384, 1349, 1, 0, 0, 0, 1384, 1355, 1, 0, 0, 0, 1384, 1361, 1, 0, 0, 0, 1384, 1365, 1, 0, 0, 0, 1384, 1370, 1, 0, 0, 0, 1384, 1375, 1, 0, 0, 0, 1384, 1379, 1, 0, 0, 0, 1385, 140, 1, 0, 0, 0, 1386, 1387, 3, 205, 100, 0, 1387, 1388, 3, 217, 106, 0, 1388, 1389, 3, 207, 101, 0, 1389, 1390, 3, 235, 115, 0, 1390, 1391, 3, 109, 52, 0, 1391, 1392, 3, 225, 110, 0, 1392, 1393, 3, 201, 98, 0, 1393, 1394, 3, 239, 117, 0, 1394, 1395, 3, 205, 100, 0, 1395, 1396, 3, 215, 105, 0, 1396, 142, 1, 0, 0, 0, 1397, 1404, 3, 59, 27, 0, 1398, 1403, 3, 59, 27, 0, 1399, 1403, 3, 57, 26, 0, 1400, 1403, 5, 95, 0, 0, 1401, 1403, 3, 123, 59, 0, 1402, 1398, 1, 0, 0, 0, 1402, 1399, 1, 0, 0, 0, 1402, 1400, 1, 0, 0, 0, 1402, 1401, 1, 0, 0, 0, 1403, 1406, 1, 0, 0, 0, 1404, 1402, 1, 0, 0, 0, 1404, 1405, 1, 0, 0, 0, 1405, 1417, 1, 0, 0, 0, 1406, 1404, 1, 0, 0, 0, 1407, 1412, 7, 8, 0, 0, 1408, 1413, 3, 59, 27, 0, 1409, 1413, 3, 57, 26, 0, 1410, 1413, 5, 95, 0, 0, 1411, 1413, 3, 123, 59, 0, 1412, 1408, 1, 0, 0, 0, 1412, 1409, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1412, 1411, 1, 0, 0, 0, 1413, 1414, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1414, 1415, 1, 0, 0, 0, 1415, 1417, 1, 0, 0, 0, 1416, 1397, 1, 0, 0, 0, 1416, 1407, 1, 0, 0, 0, 1417, 144, 1, 0, 0, 0, 1418, 1424, 5, 96, 0, 0, 1419, 1423, 8, 9, 0, 0, 1420, 1421, 5, 96, 0, 0, 1421, 1423, 5, 96, 0, 0, 1422, 1419, 1, 0, 0, 0, 1422, 1420, 1, 0, 0, 0, 1423, 1426, 1, 0, 0, 0, 1424, 1422, 1, 0, 0, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1427, 1, 0, 0, 0, 1426, 1424, 1, 0, 0, 0, 1427, 1428, 5, 96, 0, 0, 1428, 146, 1, 0, 0, 0, 1429, 1430, 3, 39, 17, 0, 1430, 1431, 1, 0, 0, 0, 1431, 1432, 6, 71, 4, 0, 1432, 148, 1, 0, 0, 0, 1433, 1434, 3, 41, 18, 0, 1434, 1435, 1, 0, 0, 0, 1435, 1436, 6, 72, 4, 0, 1436, 150, 1, 0, 0, 0, 1437, 1438, 3, 43, 19, 0, 1438, 1439, 1, 0, 0, 0, 1439, 1440, 6, 73, 4, 0, 1440, 152, 1, 0, 0, 0, 1441, 1442, 5, 124, 0, 0, 1442, 1443, 1, 0, 0, 0, 1443, 1444, 6, 74, 7, 0, 1444, 1445, 6, 74, 8, 0, 1445, 154, 1, 0, 0, 0, 1446, 1447, 5, 91, 0, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1449, 6, 75, 5, 0, 1449, 1450, 6, 75, 2, 0, 1450, 1451, 6, 75, 2, 0, 1451, 156, 1, 0, 0, 0, 1452, 1453, 5, 93, 0, 0, 1453, 1454, 1, 0, 0, 0, 1454, 1455, 6, 76, 8, 0, 1455, 1456, 6, 76, 8, 0, 1456, 1457, 6, 76, 9, 0, 1457, 158, 1, 0, 0, 0, 1458, 1459, 5, 44, 0, 0, 1459, 1460, 1, 0, 0, 0, 1460, 1461, 6, 77, 10, 0, 1461, 160, 1, 0, 0, 0, 1462, 1463, 5, 61, 0, 0, 1463, 1464, 1, 0, 0, 0, 1464, 1465, 6, 78, 11, 0, 1465, 162, 1, 0, 0, 0, 1466, 1467, 3, 225, 110, 0, 1467, 1468, 3, 209, 102, 0, 1468, 1469, 3, 239, 117, 0, 1469, 1470, 3, 201, 98, 0, 1470, 1471, 3, 207, 101, 0, 1471, 1472, 3, 201, 98, 0, 1472, 1473, 3, 239, 117, 0, 1473, 1474, 3, 201, 98, 0, 1474, 164, 1, 0, 0, 0, 1475, 1477, 3, 167, 81, 0, 1476, 1475, 1, 0, 0, 0, 1477, 1478, 1, 0, 0, 0, 1478, 1476, 1, 0, 0, 0, 1478, 1479, 1, 0, 0, 0, 1479, 166, 1, 0, 0, 0, 1480, 1482, 8, 10, 0, 0, 1481, 1480, 1, 0, 0, 0, 1482, 1483, 1, 0, 0, 0, 1483, 1481, 1, 0, 0, 0, 1483, 1484, 1, 0, 0, 0, 1484, 1488, 1, 0, 0, 0, 1485, 1486, 5, 47, 0, 0, 1486, 1488, 8, 11, 0, 0, 1487, 1481, 1, 0, 0, 0, 1487, 1485, 1, 0, 0, 0, 1488, 168, 1, 0, 0, 0, 1489, 1490, 3, 145, 70, 0, 1490, 170, 1, 0, 0, 0, 1491, 1492, 3, 39, 17, 0, 1492, 1493, 1, 0, 0, 0, 1493, 1494, 6, 83, 4, 0, 1494, 172, 1, 0, 0, 0, 1495, 1496, 3, 41, 18, 0, 1496, 1497, 1, 0, 0, 0, 1497, 1498, 6, 84, 4, 0, 1498, 174, 1, 0, 0, 0, 1499, 1500, 3, 43, 19, 0, 1500, 1501, 1, 0, 0, 0, 1501, 1502, 6, 85, 4, 0, 1502, 176, 1, 0, 0, 0, 1503, 1504, 3, 229, 112, 0, 1504, 1505, 3, 227, 111, 0, 1505, 178, 1, 0, 0, 0, 1506, 1507, 3, 245, 120, 0, 1507, 1508, 3, 217, 106, 0, 1508, 1509, 3, 239, 117, 0, 1509, 1510, 3, 215, 105, 0, 1510, 180, 1, 0, 0, 0, 1511, 1512, 5, 124, 0, 0, 1512, 1513, 1, 0, 0, 0, 1513, 1514, 6, 88, 7, 0, 1514, 1515, 6, 88, 8, 0, 1515, 182, 1, 0, 0, 0, 1516, 1517, 5, 93, 0, 0, 1517, 1518, 1, 0, 0, 0, 1518, 1519, 6, 89, 8, 0, 1519, 1520, 6, 89, 8, 0, 1520, 1521, 6, 89, 9, 0, 1521, 184, 1, 0, 0, 0, 1522, 1523, 5, 44, 0, 0, 1523, 1524, 1, 0, 0, 0, 1524, 1525, 6, 90, 10, 0, 1525, 186, 1, 0, 0, 0, 1526, 1527, 5, 61, 0, 0, 1527, 1528, 1, 0, 0, 0, 1528, 1529, 6, 91, 11, 0, 1529, 188, 1, 0, 0, 0, 1530, 1532, 3, 191, 93, 0, 1531, 1530, 1, 0, 0, 0, 1532, 1533, 1, 0, 0, 0, 1533, 1531, 1, 0, 0, 0, 1533, 1534, 1, 0, 0, 0, 1534, 190, 1, 0, 0, 0, 1535, 1537, 8, 10, 0, 0, 1536, 1535, 1, 0, 0, 0, 1537, 1538, 1, 0, 0, 0, 1538, 1536, 1, 0, 0, 0, 1538, 1539, 1, 0, 0, 0, 1539, 1543, 1, 0, 0, 0, 1540, 1541, 5, 47, 0, 0, 1541, 1543, 8, 11, 0, 0, 1542, 1536, 1, 0, 0, 0, 1542, 1540, 1, 0, 0, 0, 1543, 192, 1, 0, 0, 0, 1544, 1545, 3, 145, 70, 0, 1545, 194, 1, 0, 0, 0, 1546, 1547, 3, 39, 17, 0, 1547, 1548, 1, 0, 0, 0, 1548, 1549, 6, 95, 4, 0, 1549, 196, 1, 0, 0, 0, 1550, 1551, 3, 41, 18, 0, 1551, 1552, 1, 0, 0, 0, 1552, 1553, 6, 96, 4, 0, 1553, 198, 1, 0, 0, 0, 1554, 1555, 3, 43, 19, 0, 1555, 1556, 1, 0, 0, 0, 1556, 1557, 6, 97, 4, 0, 1557, 200, 1, 0, 0, 0, 1558, 1559, 7, 12, 0, 0, 1559, 202, 1, 0, 0, 0, 1560, 1561, 7, 13, 0, 0, 1561, 204, 1, 0, 0, 0, 1562, 1563, 7, 14, 0, 0, 1563, 206, 1, 0, 0, 0, 1564, 1565, 7, 15, 0, 0, 1565, 208, 1, 0, 0, 0, 1566, 1567, 7, 6, 0, 0, 1567, 210, 1, 0, 0, 0, 1568, 1569, 7, 16, 0, 0, 1569, 212, 1, 0, 0, 0, 1570, 1571, 7, 17, 0, 0, 1571, 214, 1, 0, 0, 0, 1572, 1573, 7, 18, 0, 0, 1573, 216, 1, 0, 0, 0, 1574, 1575, 7, 19, 0, 0, 1575, 218, 1, 0, 0, 0, 1576, 1577, 7, 20, 0, 0, 1577, 220, 1, 0, 0, 0, 1578, 1579, 7, 21, 0, 0, 1579, 222, 1, 0, 0, 0, 1580, 1581, 7, 22, 0, 0, 1581, 224, 1, 0, 0, 0, 1582, 1583, 7, 23, 0, 0, 1583, 226, 1, 0, 0, 0, 1584, 1585, 7, 24, 0, 0, 1585, 228, 1, 0, 0, 0, 1586, 1587, 7, 25, 0, 0, 1587, 230, 1, 0, 0, 0, 1588, 1589, 7, 26, 0, 0, 1589, 232, 1, 0, 0, 0, 1590, 1591, 7, 27, 0, 0, 1591, 234, 1, 0, 0, 0, 1592, 1593, 7, 28, 0, 0, 1593, 236, 1, 0, 0, 0, 1594, 1595, 7, 29, 0, 0, 1595, 238, 1, 0, 0, 0, 1596, 1597, 7, 30, 0, 0, 1597, 240, 1, 0, 0, 0, 1598, 1599, 7, 31, 0, 0, 1599, 242, 1, 0, 0, 0, 1600, 1601, 7, 32, 0, 0, 1601, 244, 1, 0, 0, 0, 1602, 1603, 7, 33, 0, 0, 1603, 246, 1, 0, 0, 0, 1604, 1605, 7, 34, 0, 0, 1605, 248, 1, 0, 0, 0, 1606, 1607, 7, 35, 0, 0, 1607, 250, 1, 0, 0, 0, 1608, 1609, 7, 36, 0, 0, 1609, 252, 1, 0, 0, 0, 48, 0, 1, 2, 3, 4, 398, 402, 405, 414, 416, 427, 468, 473, 478, 480, 491, 499, 502, 504, 509, 514, 520, 527, 532, 538, 541, 549, 553, 652, 736, 748, 770, 787, 1231, 1384, 1402, 1404, 1412, 1414, 1416, 1422, 1424, 1478, 1483, 1487, 1533, 1538, 1542, 12, 5, 2, 0, 5, 1, 0, 5, 3, 0, 5, 4, 0, 0, 1, 0, 7, 35, 0, 5, 0, 0, 7, 24, 0, 4, 0, 0, 7, 36, 0, 7, 32, 0, 7, 31, 0] \ No newline at end of file diff --git a/packages/kbn-esql/src/antlr/.antlr/esql_lexer.java b/packages/kbn-esql/src/antlr/.antlr/esql_lexer.java new file mode 100644 index 0000000000000..ac37718a22bcc --- /dev/null +++ b/packages/kbn-esql/src/antlr/.antlr/esql_lexer.java @@ -0,0 +1,1150 @@ +// Generated from /Users/marcoliberati/Work/kibana/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 by ANTLR 4.13.1 +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) +public class esql_lexer extends Lexer { + static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + DISSECT=1, GROK=2, EVAL=3, EXPLAIN=4, FROM=5, ROW=6, STATS=7, WHERE=8, + SORT=9, MV_EXPAND=10, LIMIT=11, PROJECT=12, DROP=13, RENAME=14, SHOW=15, + ENRICH=16, KEEP=17, LINE_COMMENT=18, MULTILINE_COMMENT=19, WS=20, EXPLAIN_WS=21, + EXPLAIN_LINE_COMMENT=22, EXPLAIN_MULTILINE_COMMENT=23, PIPE=24, STRING=25, + INTEGER_LITERAL=26, DECIMAL_LITERAL=27, BY=28, DATE_LITERAL=29, AND=30, + ASSIGN=31, COMMA=32, DOT=33, LP=34, OPENING_BRACKET=35, CLOSING_BRACKET=36, + NOT=37, LIKE=38, RLIKE=39, IN=40, IS=41, AS=42, NULL=43, OR=44, RP=45, + UNDERSCORE=46, INFO=47, FUNCTIONS=48, BOOLEAN_VALUE=49, COMPARISON_OPERATOR=50, + PLUS=51, MINUS=52, ASTERISK=53, SLASH=54, PERCENT=55, TEN=56, ORDERING=57, + NULLS_ORDERING=58, NULLS_ORDERING_DIRECTION=59, MATH_FUNCTION=60, UNARY_FUNCTION=61, + WHERE_FUNCTIONS=62, UNQUOTED_IDENTIFIER=63, QUOTED_IDENTIFIER=64, EXPR_LINE_COMMENT=65, + EXPR_MULTILINE_COMMENT=66, EXPR_WS=67, METADATA=68, SRC_UNQUOTED_IDENTIFIER=69, + SRC_QUOTED_IDENTIFIER=70, SRC_LINE_COMMENT=71, SRC_MULTILINE_COMMENT=72, + SRC_WS=73, ON=74, WITH=75, ENR_UNQUOTED_IDENTIFIER=76, ENR_QUOTED_IDENTIFIER=77, + ENR_LINE_COMMENT=78, ENR_MULTILINE_COMMENT=79, ENR_WS=80, EXPLAIN_PIPE=81; + public static final int + EXPLAIN_MODE=1, EXPRESSION=2, SOURCE_IDENTIFIERS=3, ENRICH_IDENTIFIERS=4; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE", "EXPLAIN_MODE", "EXPRESSION", "SOURCE_IDENTIFIERS", "ENRICH_IDENTIFIERS" + }; + + private static String[] makeRuleNames() { + return new String[] { + "DISSECT", "GROK", "EVAL", "EXPLAIN", "FROM", "ROW", "STATS", "WHERE", + "SORT", "MV_EXPAND", "LIMIT", "PROJECT", "DROP", "RENAME", "SHOW", "ENRICH", + "KEEP", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "EXPLAIN_OPENING_BRACKET", + "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", + "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", + "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "DATE_LITERAL", + "AND", "ASSIGN", "COMMA", "DOT", "LP", "OPENING_BRACKET", "CLOSING_BRACKET", + "NOT", "LIKE", "RLIKE", "IN", "IS", "AS", "NULL", "OR", "RP", "UNDERSCORE", + "INFO", "FUNCTIONS", "BOOLEAN_VALUE", "COMPARISON_OPERATOR", "PLUS", + "MINUS", "ASTERISK", "SLASH", "PERCENT", "TEN", "ORDERING", "NULLS_ORDERING", + "NULLS_ORDERING_DIRECTION", "MATH_FUNCTION", "UNARY_FUNCTION", "WHERE_FUNCTIONS", + "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", + "EXPR_WS", "SRC_PIPE", "SRC_OPENING_BRACKET", "SRC_CLOSING_BRACKET", + "SRC_COMMA", "SRC_ASSIGN", "METADATA", "SRC_UNQUOTED_IDENTIFIER", "SRC_UNQUOTED_IDENTIFIER_PART", + "SRC_QUOTED_IDENTIFIER", "SRC_LINE_COMMENT", "SRC_MULTILINE_COMMENT", + "SRC_WS", "ON", "WITH", "ENR_PIPE", "ENR_CLOSING_BRACKET", "ENR_COMMA", + "ENR_ASSIGN", "ENR_UNQUOTED_IDENTIFIER", "ENR_UNQUOTED_IDENTIFIER_PART", + "ENR_QUOTED_IDENTIFIER", "ENR_LINE_COMMENT", "ENR_MULTILINE_COMMENT", + "ENR_WS", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", + "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, "'by'", null, "'and'", null, null, "'.'", "'('", + null, "']'", null, null, null, null, null, null, null, "'or'", "')'", + "'_'", "'info'", "'functions'", null, null, "'+'", "'-'", "'*'", "'/'", + "'%'", "'10'", null, "'nulls'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "DISSECT", "GROK", "EVAL", "EXPLAIN", "FROM", "ROW", "STATS", "WHERE", + "SORT", "MV_EXPAND", "LIMIT", "PROJECT", "DROP", "RENAME", "SHOW", "ENRICH", + "KEEP", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", + "EXPLAIN_MULTILINE_COMMENT", "PIPE", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", + "BY", "DATE_LITERAL", "AND", "ASSIGN", "COMMA", "DOT", "LP", "OPENING_BRACKET", + "CLOSING_BRACKET", "NOT", "LIKE", "RLIKE", "IN", "IS", "AS", "NULL", + "OR", "RP", "UNDERSCORE", "INFO", "FUNCTIONS", "BOOLEAN_VALUE", "COMPARISON_OPERATOR", + "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "TEN", "ORDERING", "NULLS_ORDERING", + "NULLS_ORDERING_DIRECTION", "MATH_FUNCTION", "UNARY_FUNCTION", "WHERE_FUNCTIONS", + "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", + "EXPR_WS", "METADATA", "SRC_UNQUOTED_IDENTIFIER", "SRC_QUOTED_IDENTIFIER", + "SRC_LINE_COMMENT", "SRC_MULTILINE_COMMENT", "SRC_WS", "ON", "WITH", + "ENR_UNQUOTED_IDENTIFIER", "ENR_QUOTED_IDENTIFIER", "ENR_LINE_COMMENT", + "ENR_MULTILINE_COMMENT", "ENR_WS", "EXPLAIN_PIPE" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public esql_lexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "esql_lexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + public static final String _serializedATN = + "\u0004\u0000Q\u064a\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+ + "\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+ + "\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+ + "\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+ + "\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+ + "\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+ + "\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+ + "\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+ + "\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+ + "\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+ + "\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+ + "!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+ + "&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+ + "+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+ + "0\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u0007"+ + "5\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007"+ + ":\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007"+ + "?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007"+ + "D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007"+ + "I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007"+ + "N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007"+ + "S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007"+ + "X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007"+ + "]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007"+ + "b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007"+ + "g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007"+ + "l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007"+ + "q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002u\u0007u\u0002v\u0007"+ + "v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002z\u0007z\u0002{\u0007"+ + "{\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+ + "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004"+ + "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0005\u0011\u018d\b\u0011\n\u0011\f\u0011"+ + "\u0190\t\u0011\u0001\u0011\u0003\u0011\u0193\b\u0011\u0001\u0011\u0003"+ + "\u0011\u0196\b\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0005\u0012\u019f\b\u0012\n\u0012\f\u0012"+ + "\u01a2\t\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0013\u0004\u0013\u01aa\b\u0013\u000b\u0013\f\u0013\u01ab\u0001"+ + "\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ + "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001"+ + "\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001"+ + "\u001d\u0001\u001e\u0001\u001e\u0003\u001e\u01d5\b\u001e\u0001\u001e\u0004"+ + "\u001e\u01d8\b\u001e\u000b\u001e\f\u001e\u01d9\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0005\u001f\u01df\b\u001f\n\u001f\f\u001f\u01e2\t\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0005"+ + "\u001f\u01ea\b\u001f\n\u001f\f\u001f\u01ed\t\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u01f4\b\u001f\u0001\u001f"+ + "\u0003\u001f\u01f7\b\u001f\u0003\u001f\u01f9\b\u001f\u0001 \u0004 \u01fc"+ + "\b \u000b \f \u01fd\u0001!\u0004!\u0201\b!\u000b!\f!\u0202\u0001!\u0001"+ + "!\u0005!\u0207\b!\n!\f!\u020a\t!\u0001!\u0001!\u0004!\u020e\b!\u000b!"+ + "\f!\u020f\u0001!\u0004!\u0213\b!\u000b!\f!\u0214\u0001!\u0001!\u0005!"+ + "\u0219\b!\n!\f!\u021c\t!\u0003!\u021e\b!\u0001!\u0001!\u0001!\u0001!\u0004"+ + "!\u0224\b!\u000b!\f!\u0225\u0001!\u0001!\u0003!\u022a\b!\u0001\"\u0001"+ + "\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0003#\u028d\b#\u0001$\u0001$\u0001"+ + "$\u0001$\u0001%\u0001%\u0001&\u0001&\u0001\'\u0001\'\u0001(\u0001(\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ + "+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ + "/\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00012\u0001"+ + "2\u00012\u00013\u00013\u00014\u00014\u00015\u00015\u00015\u00015\u0001"+ + "5\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ + "6\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u0003"+ + "7\u02e1\b7\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ + "8\u00018\u00038\u02ed\b8\u00019\u00019\u0001:\u0001:\u0001;\u0001;\u0001"+ + "<\u0001<\u0001=\u0001=\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0003?\u0303\b?\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ + "A\u0003A\u0314\bA\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0003B\u04d0\bB\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0003C\u0569\bC\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001E\u0001E\u0001E\u0001E\u0001E\u0005E\u057b\bE\nE\fE\u057e\tE\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0004E\u0585\bE\u000bE\fE\u0586\u0003E\u0589"+ + "\bE\u0001F\u0001F\u0001F\u0001F\u0005F\u058f\bF\nF\fF\u0592\tF\u0001F"+ + "\u0001F\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001"+ + "I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001"+ + "K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001O\u0001"+ + "O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0004P\u05c5"+ + "\bP\u000bP\fP\u05c6\u0001Q\u0004Q\u05ca\bQ\u000bQ\fQ\u05cb\u0001Q\u0001"+ + "Q\u0003Q\u05d0\bQ\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001T\u0001"+ + "T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "[\u0001[\u0001[\u0001[\u0001\\\u0004\\\u05fc\b\\\u000b\\\f\\\u05fd\u0001"+ + "]\u0004]\u0601\b]\u000b]\f]\u0602\u0001]\u0001]\u0003]\u0607\b]\u0001"+ + "^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001"+ + "a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001c\u0001c\u0001d\u0001d\u0001"+ + "e\u0001e\u0001f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001i\u0001i\u0001"+ + "j\u0001j\u0001k\u0001k\u0001l\u0001l\u0001m\u0001m\u0001n\u0001n\u0001"+ + "o\u0001o\u0001p\u0001p\u0001q\u0001q\u0001r\u0001r\u0001s\u0001s\u0001"+ + "t\u0001t\u0001u\u0001u\u0001v\u0001v\u0001w\u0001w\u0001x\u0001x\u0001"+ + "y\u0001y\u0001z\u0001z\u0001{\u0001{\u0002\u01a0\u01eb\u0000|\u0005\u0001"+ + "\u0007\u0002\t\u0003\u000b\u0004\r\u0005\u000f\u0006\u0011\u0007\u0013"+ + "\b\u0015\t\u0017\n\u0019\u000b\u001b\f\u001d\r\u001f\u000e!\u000f#\u0010"+ + "%\u0011\'\u0012)\u0013+\u0014-\u0000/Q1\u00153\u00165\u00177\u00189\u0000"+ + ";\u0000=\u0000?\u0000A\u0000C\u0019E\u001aG\u001bI\u001cK\u001dM\u001e"+ + "O\u001fQ S!U\"W#Y$[%]&_\'a(c)e*g+i,k-m.o/q0s1u2w3y4{5}6\u007f7\u00818"+ + "\u00839\u0085:\u0087;\u0089<\u008b=\u008d>\u008f?\u0091@\u0093A\u0095"+ + "B\u0097C\u0099\u0000\u009b\u0000\u009d\u0000\u009f\u0000\u00a1\u0000\u00a3"+ + "D\u00a5E\u00a7\u0000\u00a9F\u00abG\u00adH\u00afI\u00b1J\u00b3K\u00b5\u0000"+ + "\u00b7\u0000\u00b9\u0000\u00bb\u0000\u00bdL\u00bf\u0000\u00c1M\u00c3N"+ + "\u00c5O\u00c7P\u00c9\u0000\u00cb\u0000\u00cd\u0000\u00cf\u0000\u00d1\u0000"+ + "\u00d3\u0000\u00d5\u0000\u00d7\u0000\u00d9\u0000\u00db\u0000\u00dd\u0000"+ + "\u00df\u0000\u00e1\u0000\u00e3\u0000\u00e5\u0000\u00e7\u0000\u00e9\u0000"+ + "\u00eb\u0000\u00ed\u0000\u00ef\u0000\u00f1\u0000\u00f3\u0000\u00f5\u0000"+ + "\u00f7\u0000\u00f9\u0000\u00fb\u0000\u0005\u0000\u0001\u0002\u0003\u0004"+ + "%\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r\r \u0001\u000009\u0002\u0000"+ + "AZaz\u0005\u0000\"\"\\\\nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000"+ + "EEee\u0002\u0000++--\u0002\u0000@@__\u0001\u0000``\n\u0000\t\n\r\r ,"+ + ",//==[[]]``||\u0002\u0000**//\u0002\u0000AAaa\u0002\u0000BBbb\u0002\u0000"+ + "CCcc\u0002\u0000DDdd\u0002\u0000FFff\u0002\u0000GGgg\u0002\u0000HHhh\u0002"+ + "\u0000IIii\u0002\u0000JJjj\u0002\u0000KKkk\u0002\u0000LLll\u0002\u0000"+ + "MMmm\u0002\u0000NNnn\u0002\u0000OOoo\u0002\u0000PPpp\u0002\u0000QQqq\u0002"+ + "\u0000RRrr\u0002\u0000SSss\u0002\u0000TTtt\u0002\u0000UUuu\u0002\u0000"+ + "VVvv\u0002\u0000WWww\u0002\u0000XXxx\u0002\u0000YYyy\u0002\u0000ZZzz\u06af"+ + "\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001\u0000\u0000\u0000"+ + "\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000\u0000\u0000\u0000"+ + "\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000\u0000\u0000\u0011"+ + "\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015"+ + "\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019"+ + "\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d"+ + "\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000\u0000\u0000!\u0001"+ + "\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000%\u0001\u0000\u0000"+ + "\u0000\u0000\'\u0001\u0000\u0000\u0000\u0000)\u0001\u0000\u0000\u0000"+ + "\u0000+\u0001\u0000\u0000\u0000\u0001-\u0001\u0000\u0000\u0000\u0001/"+ + "\u0001\u0000\u0000\u0000\u00011\u0001\u0000\u0000\u0000\u00013\u0001\u0000"+ + "\u0000\u0000\u00015\u0001\u0000\u0000\u0000\u00027\u0001\u0000\u0000\u0000"+ + "\u0002C\u0001\u0000\u0000\u0000\u0002E\u0001\u0000\u0000\u0000\u0002G"+ + "\u0001\u0000\u0000\u0000\u0002I\u0001\u0000\u0000\u0000\u0002K\u0001\u0000"+ + "\u0000\u0000\u0002M\u0001\u0000\u0000\u0000\u0002O\u0001\u0000\u0000\u0000"+ + "\u0002Q\u0001\u0000\u0000\u0000\u0002S\u0001\u0000\u0000\u0000\u0002U"+ + "\u0001\u0000\u0000\u0000\u0002W\u0001\u0000\u0000\u0000\u0002Y\u0001\u0000"+ + "\u0000\u0000\u0002[\u0001\u0000\u0000\u0000\u0002]\u0001\u0000\u0000\u0000"+ + "\u0002_\u0001\u0000\u0000\u0000\u0002a\u0001\u0000\u0000\u0000\u0002c"+ + "\u0001\u0000\u0000\u0000\u0002e\u0001\u0000\u0000\u0000\u0002g\u0001\u0000"+ + "\u0000\u0000\u0002i\u0001\u0000\u0000\u0000\u0002k\u0001\u0000\u0000\u0000"+ + "\u0002m\u0001\u0000\u0000\u0000\u0002o\u0001\u0000\u0000\u0000\u0002q"+ + "\u0001\u0000\u0000\u0000\u0002s\u0001\u0000\u0000\u0000\u0002u\u0001\u0000"+ + "\u0000\u0000\u0002w\u0001\u0000\u0000\u0000\u0002y\u0001\u0000\u0000\u0000"+ + "\u0002{\u0001\u0000\u0000\u0000\u0002}\u0001\u0000\u0000\u0000\u0002\u007f"+ + "\u0001\u0000\u0000\u0000\u0002\u0081\u0001\u0000\u0000\u0000\u0002\u0083"+ + "\u0001\u0000\u0000\u0000\u0002\u0085\u0001\u0000\u0000\u0000\u0002\u0087"+ + "\u0001\u0000\u0000\u0000\u0002\u0089\u0001\u0000\u0000\u0000\u0002\u008b"+ + "\u0001\u0000\u0000\u0000\u0002\u008d\u0001\u0000\u0000\u0000\u0002\u008f"+ + "\u0001\u0000\u0000\u0000\u0002\u0091\u0001\u0000\u0000\u0000\u0002\u0093"+ + "\u0001\u0000\u0000\u0000\u0002\u0095\u0001\u0000\u0000\u0000\u0002\u0097"+ + "\u0001\u0000\u0000\u0000\u0003\u0099\u0001\u0000\u0000\u0000\u0003\u009b"+ + "\u0001\u0000\u0000\u0000\u0003\u009d\u0001\u0000\u0000\u0000\u0003\u009f"+ + "\u0001\u0000\u0000\u0000\u0003\u00a1\u0001\u0000\u0000\u0000\u0003\u00a3"+ + "\u0001\u0000\u0000\u0000\u0003\u00a5\u0001\u0000\u0000\u0000\u0003\u00a9"+ + "\u0001\u0000\u0000\u0000\u0003\u00ab\u0001\u0000\u0000\u0000\u0003\u00ad"+ + "\u0001\u0000\u0000\u0000\u0003\u00af\u0001\u0000\u0000\u0000\u0004\u00b1"+ + "\u0001\u0000\u0000\u0000\u0004\u00b3\u0001\u0000\u0000\u0000\u0004\u00b5"+ + "\u0001\u0000\u0000\u0000\u0004\u00b7\u0001\u0000\u0000\u0000\u0004\u00b9"+ + "\u0001\u0000\u0000\u0000\u0004\u00bb\u0001\u0000\u0000\u0000\u0004\u00bd"+ + "\u0001\u0000\u0000\u0000\u0004\u00c1\u0001\u0000\u0000\u0000\u0004\u00c3"+ + "\u0001\u0000\u0000\u0000\u0004\u00c5\u0001\u0000\u0000\u0000\u0004\u00c7"+ + "\u0001\u0000\u0000\u0000\u0005\u00fd\u0001\u0000\u0000\u0000\u0007\u0107"+ + "\u0001\u0000\u0000\u0000\t\u010e\u0001\u0000\u0000\u0000\u000b\u0115\u0001"+ + "\u0000\u0000\u0000\r\u011f\u0001\u0000\u0000\u0000\u000f\u0126\u0001\u0000"+ + "\u0000\u0000\u0011\u012c\u0001\u0000\u0000\u0000\u0013\u0134\u0001\u0000"+ + "\u0000\u0000\u0015\u013c\u0001\u0000\u0000\u0000\u0017\u0143\u0001\u0000"+ + "\u0000\u0000\u0019\u014f\u0001\u0000\u0000\u0000\u001b\u0157\u0001\u0000"+ + "\u0000\u0000\u001d\u0161\u0001\u0000\u0000\u0000\u001f\u0168\u0001\u0000"+ + "\u0000\u0000!\u0171\u0001\u0000\u0000\u0000#\u0178\u0001\u0000\u0000\u0000"+ + "%\u0181\u0001\u0000\u0000\u0000\'\u0188\u0001\u0000\u0000\u0000)\u0199"+ + "\u0001\u0000\u0000\u0000+\u01a9\u0001\u0000\u0000\u0000-\u01af\u0001\u0000"+ + "\u0000\u0000/\u01b4\u0001\u0000\u0000\u00001\u01b9\u0001\u0000\u0000\u0000"+ + "3\u01bd\u0001\u0000\u0000\u00005\u01c1\u0001\u0000\u0000\u00007\u01c5"+ + "\u0001\u0000\u0000\u00009\u01c9\u0001\u0000\u0000\u0000;\u01cb\u0001\u0000"+ + "\u0000\u0000=\u01cd\u0001\u0000\u0000\u0000?\u01d0\u0001\u0000\u0000\u0000"+ + "A\u01d2\u0001\u0000\u0000\u0000C\u01f8\u0001\u0000\u0000\u0000E\u01fb"+ + "\u0001\u0000\u0000\u0000G\u0229\u0001\u0000\u0000\u0000I\u022b\u0001\u0000"+ + "\u0000\u0000K\u028c\u0001\u0000\u0000\u0000M\u028e\u0001\u0000\u0000\u0000"+ + "O\u0292\u0001\u0000\u0000\u0000Q\u0294\u0001\u0000\u0000\u0000S\u0296"+ + "\u0001\u0000\u0000\u0000U\u0298\u0001\u0000\u0000\u0000W\u029a\u0001\u0000"+ + "\u0000\u0000Y\u029f\u0001\u0000\u0000\u0000[\u02a4\u0001\u0000\u0000\u0000"+ + "]\u02a8\u0001\u0000\u0000\u0000_\u02ad\u0001\u0000\u0000\u0000a\u02b3"+ + "\u0001\u0000\u0000\u0000c\u02b6\u0001\u0000\u0000\u0000e\u02b9\u0001\u0000"+ + "\u0000\u0000g\u02bc\u0001\u0000\u0000\u0000i\u02c1\u0001\u0000\u0000\u0000"+ + "k\u02c4\u0001\u0000\u0000\u0000m\u02c6\u0001\u0000\u0000\u0000o\u02c8"+ + "\u0001\u0000\u0000\u0000q\u02cd\u0001\u0000\u0000\u0000s\u02e0\u0001\u0000"+ + "\u0000\u0000u\u02ec\u0001\u0000\u0000\u0000w\u02ee\u0001\u0000\u0000\u0000"+ + "y\u02f0\u0001\u0000\u0000\u0000{\u02f2\u0001\u0000\u0000\u0000}\u02f4"+ + "\u0001\u0000\u0000\u0000\u007f\u02f6\u0001\u0000\u0000\u0000\u0081\u02f8"+ + "\u0001\u0000\u0000\u0000\u0083\u0302\u0001\u0000\u0000\u0000\u0085\u0304"+ + "\u0001\u0000\u0000\u0000\u0087\u0313\u0001\u0000\u0000\u0000\u0089\u04cf"+ + "\u0001\u0000\u0000\u0000\u008b\u0568\u0001\u0000\u0000\u0000\u008d\u056a"+ + "\u0001\u0000\u0000\u0000\u008f\u0588\u0001\u0000\u0000\u0000\u0091\u058a"+ + "\u0001\u0000\u0000\u0000\u0093\u0595\u0001\u0000\u0000\u0000\u0095\u0599"+ + "\u0001\u0000\u0000\u0000\u0097\u059d\u0001\u0000\u0000\u0000\u0099\u05a1"+ + "\u0001\u0000\u0000\u0000\u009b\u05a6\u0001\u0000\u0000\u0000\u009d\u05ac"+ + "\u0001\u0000\u0000\u0000\u009f\u05b2\u0001\u0000\u0000\u0000\u00a1\u05b6"+ + "\u0001\u0000\u0000\u0000\u00a3\u05ba\u0001\u0000\u0000\u0000\u00a5\u05c4"+ + "\u0001\u0000\u0000\u0000\u00a7\u05cf\u0001\u0000\u0000\u0000\u00a9\u05d1"+ + "\u0001\u0000\u0000\u0000\u00ab\u05d3\u0001\u0000\u0000\u0000\u00ad\u05d7"+ + "\u0001\u0000\u0000\u0000\u00af\u05db\u0001\u0000\u0000\u0000\u00b1\u05df"+ + "\u0001\u0000\u0000\u0000\u00b3\u05e2\u0001\u0000\u0000\u0000\u00b5\u05e7"+ + "\u0001\u0000\u0000\u0000\u00b7\u05ec\u0001\u0000\u0000\u0000\u00b9\u05f2"+ + "\u0001\u0000\u0000\u0000\u00bb\u05f6\u0001\u0000\u0000\u0000\u00bd\u05fb"+ + "\u0001\u0000\u0000\u0000\u00bf\u0606\u0001\u0000\u0000\u0000\u00c1\u0608"+ + "\u0001\u0000\u0000\u0000\u00c3\u060a\u0001\u0000\u0000\u0000\u00c5\u060e"+ + "\u0001\u0000\u0000\u0000\u00c7\u0612\u0001\u0000\u0000\u0000\u00c9\u0616"+ + "\u0001\u0000\u0000\u0000\u00cb\u0618\u0001\u0000\u0000\u0000\u00cd\u061a"+ + "\u0001\u0000\u0000\u0000\u00cf\u061c\u0001\u0000\u0000\u0000\u00d1\u061e"+ + "\u0001\u0000\u0000\u0000\u00d3\u0620\u0001\u0000\u0000\u0000\u00d5\u0622"+ + "\u0001\u0000\u0000\u0000\u00d7\u0624\u0001\u0000\u0000\u0000\u00d9\u0626"+ + "\u0001\u0000\u0000\u0000\u00db\u0628\u0001\u0000\u0000\u0000\u00dd\u062a"+ + "\u0001\u0000\u0000\u0000\u00df\u062c\u0001\u0000\u0000\u0000\u00e1\u062e"+ + "\u0001\u0000\u0000\u0000\u00e3\u0630\u0001\u0000\u0000\u0000\u00e5\u0632"+ + "\u0001\u0000\u0000\u0000\u00e7\u0634\u0001\u0000\u0000\u0000\u00e9\u0636"+ + "\u0001\u0000\u0000\u0000\u00eb\u0638\u0001\u0000\u0000\u0000\u00ed\u063a"+ + "\u0001\u0000\u0000\u0000\u00ef\u063c\u0001\u0000\u0000\u0000\u00f1\u063e"+ + "\u0001\u0000\u0000\u0000\u00f3\u0640\u0001\u0000\u0000\u0000\u00f5\u0642"+ + "\u0001\u0000\u0000\u0000\u00f7\u0644\u0001\u0000\u0000\u0000\u00f9\u0646"+ + "\u0001\u0000\u0000\u0000\u00fb\u0648\u0001\u0000\u0000\u0000\u00fd\u00fe"+ + "\u0003\u00cfe\u0000\u00fe\u00ff\u0003\u00d9j\u0000\u00ff\u0100\u0003\u00ed"+ + "t\u0000\u0100\u0101\u0003\u00edt\u0000\u0101\u0102\u0003\u00d1f\u0000"+ + "\u0102\u0103\u0003\u00cdd\u0000\u0103\u0104\u0003\u00efu\u0000\u0104\u0105"+ + "\u0001\u0000\u0000\u0000\u0105\u0106\u0006\u0000\u0000\u0000\u0106\u0006"+ + "\u0001\u0000\u0000\u0000\u0107\u0108\u0003\u00d5h\u0000\u0108\u0109\u0003"+ + "\u00ebs\u0000\u0109\u010a\u0003\u00e5p\u0000\u010a\u010b\u0003\u00ddl"+ + "\u0000\u010b\u010c\u0001\u0000\u0000\u0000\u010c\u010d\u0006\u0001\u0000"+ + "\u0000\u010d\b\u0001\u0000\u0000\u0000\u010e\u010f\u0003\u00d1f\u0000"+ + "\u010f\u0110\u0003\u00f3w\u0000\u0110\u0111\u0003\u00c9b\u0000\u0111\u0112"+ + "\u0003\u00dfm\u0000\u0112\u0113\u0001\u0000\u0000\u0000\u0113\u0114\u0006"+ + "\u0002\u0000\u0000\u0114\n\u0001\u0000\u0000\u0000\u0115\u0116\u0003\u00d1"+ + "f\u0000\u0116\u0117\u0003\u00f7y\u0000\u0117\u0118\u0003\u00e7q\u0000"+ + "\u0118\u0119\u0003\u00dfm\u0000\u0119\u011a\u0003\u00c9b\u0000\u011a\u011b"+ + "\u0003\u00d9j\u0000\u011b\u011c\u0003\u00e3o\u0000\u011c\u011d\u0001\u0000"+ + "\u0000\u0000\u011d\u011e\u0006\u0003\u0001\u0000\u011e\f\u0001\u0000\u0000"+ + "\u0000\u011f\u0120\u0003\u00d3g\u0000\u0120\u0121\u0003\u00ebs\u0000\u0121"+ + "\u0122\u0003\u00e5p\u0000\u0122\u0123\u0003\u00e1n\u0000\u0123\u0124\u0001"+ + "\u0000\u0000\u0000\u0124\u0125\u0006\u0004\u0002\u0000\u0125\u000e\u0001"+ + "\u0000\u0000\u0000\u0126\u0127\u0003\u00ebs\u0000\u0127\u0128\u0003\u00e5"+ + "p\u0000\u0128\u0129\u0003\u00f5x\u0000\u0129\u012a\u0001\u0000\u0000\u0000"+ + "\u012a\u012b\u0006\u0005\u0000\u0000\u012b\u0010\u0001\u0000\u0000\u0000"+ + "\u012c\u012d\u0003\u00edt\u0000\u012d\u012e\u0003\u00efu\u0000\u012e\u012f"+ + "\u0003\u00c9b\u0000\u012f\u0130\u0003\u00efu\u0000\u0130\u0131\u0003\u00ed"+ + "t\u0000\u0131\u0132\u0001\u0000\u0000\u0000\u0132\u0133\u0006\u0006\u0000"+ + "\u0000\u0133\u0012\u0001\u0000\u0000\u0000\u0134\u0135\u0003\u00f5x\u0000"+ + "\u0135\u0136\u0003\u00d7i\u0000\u0136\u0137\u0003\u00d1f\u0000\u0137\u0138"+ + "\u0003\u00ebs\u0000\u0138\u0139\u0003\u00d1f\u0000\u0139\u013a\u0001\u0000"+ + "\u0000\u0000\u013a\u013b\u0006\u0007\u0000\u0000\u013b\u0014\u0001\u0000"+ + "\u0000\u0000\u013c\u013d\u0003\u00edt\u0000\u013d\u013e\u0003\u00e5p\u0000"+ + "\u013e\u013f\u0003\u00ebs\u0000\u013f\u0140\u0003\u00efu\u0000\u0140\u0141"+ + "\u0001\u0000\u0000\u0000\u0141\u0142\u0006\b\u0000\u0000\u0142\u0016\u0001"+ + "\u0000\u0000\u0000\u0143\u0144\u0003\u00e1n\u0000\u0144\u0145\u0003\u00f3"+ + "w\u0000\u0145\u0146\u0003m4\u0000\u0146\u0147\u0003\u00d1f\u0000\u0147"+ + "\u0148\u0003\u00f7y\u0000\u0148\u0149\u0003\u00e7q\u0000\u0149\u014a\u0003"+ + "\u00c9b\u0000\u014a\u014b\u0003\u00e3o\u0000\u014b\u014c\u0003\u00cfe"+ + "\u0000\u014c\u014d\u0001\u0000\u0000\u0000\u014d\u014e\u0006\t\u0000\u0000"+ + "\u014e\u0018\u0001\u0000\u0000\u0000\u014f\u0150\u0003\u00dfm\u0000\u0150"+ + "\u0151\u0003\u00d9j\u0000\u0151\u0152\u0003\u00e1n\u0000\u0152\u0153\u0003"+ + "\u00d9j\u0000\u0153\u0154\u0003\u00efu\u0000\u0154\u0155\u0001\u0000\u0000"+ + "\u0000\u0155\u0156\u0006\n\u0000\u0000\u0156\u001a\u0001\u0000\u0000\u0000"+ + "\u0157\u0158\u0003\u00e7q\u0000\u0158\u0159\u0003\u00ebs\u0000\u0159\u015a"+ + "\u0003\u00e5p\u0000\u015a\u015b\u0003\u00dbk\u0000\u015b\u015c\u0003\u00d1"+ + "f\u0000\u015c\u015d\u0003\u00cdd\u0000\u015d\u015e\u0003\u00efu\u0000"+ + "\u015e\u015f\u0001\u0000\u0000\u0000\u015f\u0160\u0006\u000b\u0000\u0000"+ + "\u0160\u001c\u0001\u0000\u0000\u0000\u0161\u0162\u0003\u00cfe\u0000\u0162"+ + "\u0163\u0003\u00ebs\u0000\u0163\u0164\u0003\u00e5p\u0000\u0164\u0165\u0003"+ + "\u00e7q\u0000\u0165\u0166\u0001\u0000\u0000\u0000\u0166\u0167\u0006\f"+ + "\u0000\u0000\u0167\u001e\u0001\u0000\u0000\u0000\u0168\u0169\u0003\u00eb"+ + "s\u0000\u0169\u016a\u0003\u00d1f\u0000\u016a\u016b\u0003\u00e3o\u0000"+ + "\u016b\u016c\u0003\u00c9b\u0000\u016c\u016d\u0003\u00e1n\u0000\u016d\u016e"+ + "\u0003\u00d1f\u0000\u016e\u016f\u0001\u0000\u0000\u0000\u016f\u0170\u0006"+ + "\r\u0000\u0000\u0170 \u0001\u0000\u0000\u0000\u0171\u0172\u0003\u00ed"+ + "t\u0000\u0172\u0173\u0003\u00d7i\u0000\u0173\u0174\u0003\u00e5p\u0000"+ + "\u0174\u0175\u0003\u00f5x\u0000\u0175\u0176\u0001\u0000\u0000\u0000\u0176"+ + "\u0177\u0006\u000e\u0000\u0000\u0177\"\u0001\u0000\u0000\u0000\u0178\u0179"+ + "\u0003\u00d1f\u0000\u0179\u017a\u0003\u00e3o\u0000\u017a\u017b\u0003\u00eb"+ + "s\u0000\u017b\u017c\u0003\u00d9j\u0000\u017c\u017d\u0003\u00cdd\u0000"+ + "\u017d\u017e\u0003\u00d7i\u0000\u017e\u017f\u0001\u0000\u0000\u0000\u017f"+ + "\u0180\u0006\u000f\u0003\u0000\u0180$\u0001\u0000\u0000\u0000\u0181\u0182"+ + "\u0003\u00ddl\u0000\u0182\u0183\u0003\u00d1f\u0000\u0183\u0184\u0003\u00d1"+ + "f\u0000\u0184\u0185\u0003\u00e7q\u0000\u0185\u0186\u0001\u0000\u0000\u0000"+ + "\u0186\u0187\u0006\u0010\u0000\u0000\u0187&\u0001\u0000\u0000\u0000\u0188"+ + "\u0189\u0005/\u0000\u0000\u0189\u018a\u0005/\u0000\u0000\u018a\u018e\u0001"+ + "\u0000\u0000\u0000\u018b\u018d\b\u0000\u0000\u0000\u018c\u018b\u0001\u0000"+ + "\u0000\u0000\u018d\u0190\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000"+ + "\u0000\u0000\u018e\u018f\u0001\u0000\u0000\u0000\u018f\u0192\u0001\u0000"+ + "\u0000\u0000\u0190\u018e\u0001\u0000\u0000\u0000\u0191\u0193\u0005\r\u0000"+ + "\u0000\u0192\u0191\u0001\u0000\u0000\u0000\u0192\u0193\u0001\u0000\u0000"+ + "\u0000\u0193\u0195\u0001\u0000\u0000\u0000\u0194\u0196\u0005\n\u0000\u0000"+ + "\u0195\u0194\u0001\u0000\u0000\u0000\u0195\u0196\u0001\u0000\u0000\u0000"+ + "\u0196\u0197\u0001\u0000\u0000\u0000\u0197\u0198\u0006\u0011\u0004\u0000"+ + "\u0198(\u0001\u0000\u0000\u0000\u0199\u019a\u0005/\u0000\u0000\u019a\u019b"+ + "\u0005*\u0000\u0000\u019b\u01a0\u0001\u0000\u0000\u0000\u019c\u019f\u0003"+ + ")\u0012\u0000\u019d\u019f\t\u0000\u0000\u0000\u019e\u019c\u0001\u0000"+ + "\u0000\u0000\u019e\u019d\u0001\u0000\u0000\u0000\u019f\u01a2\u0001\u0000"+ + "\u0000\u0000\u01a0\u01a1\u0001\u0000\u0000\u0000\u01a0\u019e\u0001\u0000"+ + "\u0000\u0000\u01a1\u01a3\u0001\u0000\u0000\u0000\u01a2\u01a0\u0001\u0000"+ + "\u0000\u0000\u01a3\u01a4\u0005*\u0000\u0000\u01a4\u01a5\u0005/\u0000\u0000"+ + "\u01a5\u01a6\u0001\u0000\u0000\u0000\u01a6\u01a7\u0006\u0012\u0004\u0000"+ + "\u01a7*\u0001\u0000\u0000\u0000\u01a8\u01aa\u0007\u0001\u0000\u0000\u01a9"+ + "\u01a8\u0001\u0000\u0000\u0000\u01aa\u01ab\u0001\u0000\u0000\u0000\u01ab"+ + "\u01a9\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000\u01ac"+ + "\u01ad\u0001\u0000\u0000\u0000\u01ad\u01ae\u0006\u0013\u0004\u0000\u01ae"+ + ",\u0001\u0000\u0000\u0000\u01af\u01b0\u0005[\u0000\u0000\u01b0\u01b1\u0001"+ + "\u0000\u0000\u0000\u01b1\u01b2\u0006\u0014\u0005\u0000\u01b2\u01b3\u0006"+ + "\u0014\u0006\u0000\u01b3.\u0001\u0000\u0000\u0000\u01b4\u01b5\u0005|\u0000"+ + "\u0000\u01b5\u01b6\u0001\u0000\u0000\u0000\u01b6\u01b7\u0006\u0015\u0007"+ + "\u0000\u01b7\u01b8\u0006\u0015\b\u0000\u01b80\u0001\u0000\u0000\u0000"+ + "\u01b9\u01ba\u0003+\u0013\u0000\u01ba\u01bb\u0001\u0000\u0000\u0000\u01bb"+ + "\u01bc\u0006\u0016\u0004\u0000\u01bc2\u0001\u0000\u0000\u0000\u01bd\u01be"+ + "\u0003\'\u0011\u0000\u01be\u01bf\u0001\u0000\u0000\u0000\u01bf\u01c0\u0006"+ + "\u0017\u0004\u0000\u01c04\u0001\u0000\u0000\u0000\u01c1\u01c2\u0003)\u0012"+ + "\u0000\u01c2\u01c3\u0001\u0000\u0000\u0000\u01c3\u01c4\u0006\u0018\u0004"+ + "\u0000\u01c46\u0001\u0000\u0000\u0000\u01c5\u01c6\u0005|\u0000\u0000\u01c6"+ + "\u01c7\u0001\u0000\u0000\u0000\u01c7\u01c8\u0006\u0019\b\u0000\u01c88"+ + "\u0001\u0000\u0000\u0000\u01c9\u01ca\u0007\u0002\u0000\u0000\u01ca:\u0001"+ + "\u0000\u0000\u0000\u01cb\u01cc\u0007\u0003\u0000\u0000\u01cc<\u0001\u0000"+ + "\u0000\u0000\u01cd\u01ce\u0005\\\u0000\u0000\u01ce\u01cf\u0007\u0004\u0000"+ + "\u0000\u01cf>\u0001\u0000\u0000\u0000\u01d0\u01d1\b\u0005\u0000\u0000"+ + "\u01d1@\u0001\u0000\u0000\u0000\u01d2\u01d4\u0007\u0006\u0000\u0000\u01d3"+ + "\u01d5\u0007\u0007\u0000\u0000\u01d4\u01d3\u0001\u0000\u0000\u0000\u01d4"+ + "\u01d5\u0001\u0000\u0000\u0000\u01d5\u01d7\u0001\u0000\u0000\u0000\u01d6"+ + "\u01d8\u00039\u001a\u0000\u01d7\u01d6\u0001\u0000\u0000\u0000\u01d8\u01d9"+ + "\u0001\u0000\u0000\u0000\u01d9\u01d7\u0001\u0000\u0000\u0000\u01d9\u01da"+ + "\u0001\u0000\u0000\u0000\u01daB\u0001\u0000\u0000\u0000\u01db\u01e0\u0005"+ + "\"\u0000\u0000\u01dc\u01df\u0003=\u001c\u0000\u01dd\u01df\u0003?\u001d"+ + "\u0000\u01de\u01dc\u0001\u0000\u0000\u0000\u01de\u01dd\u0001\u0000\u0000"+ + "\u0000\u01df\u01e2\u0001\u0000\u0000\u0000\u01e0\u01de\u0001\u0000\u0000"+ + "\u0000\u01e0\u01e1\u0001\u0000\u0000\u0000\u01e1\u01e3\u0001\u0000\u0000"+ + "\u0000\u01e2\u01e0\u0001\u0000\u0000\u0000\u01e3\u01f9\u0005\"\u0000\u0000"+ + "\u01e4\u01e5\u0005\"\u0000\u0000\u01e5\u01e6\u0005\"\u0000\u0000\u01e6"+ + "\u01e7\u0005\"\u0000\u0000\u01e7\u01eb\u0001\u0000\u0000\u0000\u01e8\u01ea"+ + "\b\u0000\u0000\u0000\u01e9\u01e8\u0001\u0000\u0000\u0000\u01ea\u01ed\u0001"+ + "\u0000\u0000\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000\u01eb\u01e9\u0001"+ + "\u0000\u0000\u0000\u01ec\u01ee\u0001\u0000\u0000\u0000\u01ed\u01eb\u0001"+ + "\u0000\u0000\u0000\u01ee\u01ef\u0005\"\u0000\u0000\u01ef\u01f0\u0005\""+ + "\u0000\u0000\u01f0\u01f1\u0005\"\u0000\u0000\u01f1\u01f3\u0001\u0000\u0000"+ + "\u0000\u01f2\u01f4\u0005\"\u0000\u0000\u01f3\u01f2\u0001\u0000\u0000\u0000"+ + "\u01f3\u01f4\u0001\u0000\u0000\u0000\u01f4\u01f6\u0001\u0000\u0000\u0000"+ + "\u01f5\u01f7\u0005\"\u0000\u0000\u01f6\u01f5\u0001\u0000\u0000\u0000\u01f6"+ + "\u01f7\u0001\u0000\u0000\u0000\u01f7\u01f9\u0001\u0000\u0000\u0000\u01f8"+ + "\u01db\u0001\u0000\u0000\u0000\u01f8\u01e4\u0001\u0000\u0000\u0000\u01f9"+ + "D\u0001\u0000\u0000\u0000\u01fa\u01fc\u00039\u001a\u0000\u01fb\u01fa\u0001"+ + "\u0000\u0000\u0000\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd\u01fb\u0001"+ + "\u0000\u0000\u0000\u01fd\u01fe\u0001\u0000\u0000\u0000\u01feF\u0001\u0000"+ + "\u0000\u0000\u01ff\u0201\u00039\u001a\u0000\u0200\u01ff\u0001\u0000\u0000"+ + "\u0000\u0201\u0202\u0001\u0000\u0000\u0000\u0202\u0200\u0001\u0000\u0000"+ + "\u0000\u0202\u0203\u0001\u0000\u0000\u0000\u0203\u0204\u0001\u0000\u0000"+ + "\u0000\u0204\u0208\u0003S\'\u0000\u0205\u0207\u00039\u001a\u0000\u0206"+ + "\u0205\u0001\u0000\u0000\u0000\u0207\u020a\u0001\u0000\u0000\u0000\u0208"+ + "\u0206\u0001\u0000\u0000\u0000\u0208\u0209\u0001\u0000\u0000\u0000\u0209"+ + "\u022a\u0001\u0000\u0000\u0000\u020a\u0208\u0001\u0000\u0000\u0000\u020b"+ + "\u020d\u0003S\'\u0000\u020c\u020e\u00039\u001a\u0000\u020d\u020c\u0001"+ + "\u0000\u0000\u0000\u020e\u020f\u0001\u0000\u0000\u0000\u020f\u020d\u0001"+ + "\u0000\u0000\u0000\u020f\u0210\u0001\u0000\u0000\u0000\u0210\u022a\u0001"+ + "\u0000\u0000\u0000\u0211\u0213\u00039\u001a\u0000\u0212\u0211\u0001\u0000"+ + "\u0000\u0000\u0213\u0214\u0001\u0000\u0000\u0000\u0214\u0212\u0001\u0000"+ + "\u0000\u0000\u0214\u0215\u0001\u0000\u0000\u0000\u0215\u021d\u0001\u0000"+ + "\u0000\u0000\u0216\u021a\u0003S\'\u0000\u0217\u0219\u00039\u001a\u0000"+ + "\u0218\u0217\u0001\u0000\u0000\u0000\u0219\u021c\u0001\u0000\u0000\u0000"+ + "\u021a\u0218\u0001\u0000\u0000\u0000\u021a\u021b\u0001\u0000\u0000\u0000"+ + "\u021b\u021e\u0001\u0000\u0000\u0000\u021c\u021a\u0001\u0000\u0000\u0000"+ + "\u021d\u0216\u0001\u0000\u0000\u0000\u021d\u021e\u0001\u0000\u0000\u0000"+ + "\u021e\u021f\u0001\u0000\u0000\u0000\u021f\u0220\u0003A\u001e\u0000\u0220"+ + "\u022a\u0001\u0000\u0000\u0000\u0221\u0223\u0003S\'\u0000\u0222\u0224"+ + "\u00039\u001a\u0000\u0223\u0222\u0001\u0000\u0000\u0000\u0224\u0225\u0001"+ + "\u0000\u0000\u0000\u0225\u0223\u0001\u0000\u0000\u0000\u0225\u0226\u0001"+ + "\u0000\u0000\u0000\u0226\u0227\u0001\u0000\u0000\u0000\u0227\u0228\u0003"+ + "A\u001e\u0000\u0228\u022a\u0001\u0000\u0000\u0000\u0229\u0200\u0001\u0000"+ + "\u0000\u0000\u0229\u020b\u0001\u0000\u0000\u0000\u0229\u0212\u0001\u0000"+ + "\u0000\u0000\u0229\u0221\u0001\u0000\u0000\u0000\u022aH\u0001\u0000\u0000"+ + "\u0000\u022b\u022c\u0005b\u0000\u0000\u022c\u022d\u0005y\u0000\u0000\u022d"+ + "J\u0001\u0000\u0000\u0000\u022e\u022f\u0005y\u0000\u0000\u022f\u0230\u0005"+ + "e\u0000\u0000\u0230\u0231\u0005a\u0000\u0000\u0231\u028d\u0005r\u0000"+ + "\u0000\u0232\u0233\u0005m\u0000\u0000\u0233\u0234\u0005o\u0000\u0000\u0234"+ + "\u0235\u0005n\u0000\u0000\u0235\u0236\u0005t\u0000\u0000\u0236\u028d\u0005"+ + "h\u0000\u0000\u0237\u0238\u0005d\u0000\u0000\u0238\u0239\u0005a\u0000"+ + "\u0000\u0239\u028d\u0005y\u0000\u0000\u023a\u023b\u0005s\u0000\u0000\u023b"+ + "\u023c\u0005e\u0000\u0000\u023c\u023d\u0005c\u0000\u0000\u023d\u023e\u0005"+ + "o\u0000\u0000\u023e\u023f\u0005n\u0000\u0000\u023f\u028d\u0005d\u0000"+ + "\u0000\u0240\u0241\u0005m\u0000\u0000\u0241\u0242\u0005i\u0000\u0000\u0242"+ + "\u0243\u0005n\u0000\u0000\u0243\u0244\u0005u\u0000\u0000\u0244\u0245\u0005"+ + "t\u0000\u0000\u0245\u028d\u0005e\u0000\u0000\u0246\u0247\u0005h\u0000"+ + "\u0000\u0247\u0248\u0005o\u0000\u0000\u0248\u0249\u0005u\u0000\u0000\u0249"+ + "\u028d\u0005r\u0000\u0000\u024a\u024b\u0005w\u0000\u0000\u024b\u024c\u0005"+ + "e\u0000\u0000\u024c\u024d\u0005e\u0000\u0000\u024d\u028d\u0005k\u0000"+ + "\u0000\u024e\u024f\u0005m\u0000\u0000\u024f\u0250\u0005i\u0000\u0000\u0250"+ + "\u0251\u0005l\u0000\u0000\u0251\u0252\u0005l\u0000\u0000\u0252\u0253\u0005"+ + "i\u0000\u0000\u0253\u0254\u0005s\u0000\u0000\u0254\u0255\u0005e\u0000"+ + "\u0000\u0255\u0256\u0005c\u0000\u0000\u0256\u0257\u0005o\u0000\u0000\u0257"+ + "\u0258\u0005n\u0000\u0000\u0258\u028d\u0005d\u0000\u0000\u0259\u025a\u0005"+ + "y\u0000\u0000\u025a\u025b\u0005e\u0000\u0000\u025b\u025c\u0005a\u0000"+ + "\u0000\u025c\u025d\u0005r\u0000\u0000\u025d\u028d\u0005s\u0000\u0000\u025e"+ + "\u025f\u0005m\u0000\u0000\u025f\u0260\u0005o\u0000\u0000\u0260\u0261\u0005"+ + "n\u0000\u0000\u0261\u0262\u0005t\u0000\u0000\u0262\u0263\u0005h\u0000"+ + "\u0000\u0263\u028d\u0005s\u0000\u0000\u0264\u0265\u0005d\u0000\u0000\u0265"+ + "\u0266\u0005a\u0000\u0000\u0266\u0267\u0005y\u0000\u0000\u0267\u028d\u0005"+ + "s\u0000\u0000\u0268\u0269\u0005s\u0000\u0000\u0269\u026a\u0005e\u0000"+ + "\u0000\u026a\u026b\u0005c\u0000\u0000\u026b\u026c\u0005o\u0000\u0000\u026c"+ + "\u026d\u0005n\u0000\u0000\u026d\u026e\u0005d\u0000\u0000\u026e\u028d\u0005"+ + "s\u0000\u0000\u026f\u0270\u0005m\u0000\u0000\u0270\u0271\u0005i\u0000"+ + "\u0000\u0271\u0272\u0005n\u0000\u0000\u0272\u0273\u0005u\u0000\u0000\u0273"+ + "\u0274\u0005t\u0000\u0000\u0274\u0275\u0005e\u0000\u0000\u0275\u028d\u0005"+ + "s\u0000\u0000\u0276\u0277\u0005h\u0000\u0000\u0277\u0278\u0005o\u0000"+ + "\u0000\u0278\u0279\u0005u\u0000\u0000\u0279\u027a\u0005r\u0000\u0000\u027a"+ + "\u028d\u0005s\u0000\u0000\u027b\u027c\u0005w\u0000\u0000\u027c\u027d\u0005"+ + "e\u0000\u0000\u027d\u027e\u0005e\u0000\u0000\u027e\u027f\u0005k\u0000"+ + "\u0000\u027f\u028d\u0005s\u0000\u0000\u0280\u0281\u0005m\u0000\u0000\u0281"+ + "\u0282\u0005i\u0000\u0000\u0282\u0283\u0005l\u0000\u0000\u0283\u0284\u0005"+ + "l\u0000\u0000\u0284\u0285\u0005i\u0000\u0000\u0285\u0286\u0005s\u0000"+ + "\u0000\u0286\u0287\u0005e\u0000\u0000\u0287\u0288\u0005c\u0000\u0000\u0288"+ + "\u0289\u0005o\u0000\u0000\u0289\u028a\u0005n\u0000\u0000\u028a\u028b\u0005"+ + "d\u0000\u0000\u028b\u028d\u0005s\u0000\u0000\u028c\u022e\u0001\u0000\u0000"+ + "\u0000\u028c\u0232\u0001\u0000\u0000\u0000\u028c\u0237\u0001\u0000\u0000"+ + "\u0000\u028c\u023a\u0001\u0000\u0000\u0000\u028c\u0240\u0001\u0000\u0000"+ + "\u0000\u028c\u0246\u0001\u0000\u0000\u0000\u028c\u024a\u0001\u0000\u0000"+ + "\u0000\u028c\u024e\u0001\u0000\u0000\u0000\u028c\u0259\u0001\u0000\u0000"+ + "\u0000\u028c\u025e\u0001\u0000\u0000\u0000\u028c\u0264\u0001\u0000\u0000"+ + "\u0000\u028c\u0268\u0001\u0000\u0000\u0000\u028c\u026f\u0001\u0000\u0000"+ + "\u0000\u028c\u0276\u0001\u0000\u0000\u0000\u028c\u027b\u0001\u0000\u0000"+ + "\u0000\u028c\u0280\u0001\u0000\u0000\u0000\u028dL\u0001\u0000\u0000\u0000"+ + "\u028e\u028f\u0005a\u0000\u0000\u028f\u0290\u0005n\u0000\u0000\u0290\u0291"+ + "\u0005d\u0000\u0000\u0291N\u0001\u0000\u0000\u0000\u0292\u0293\u0005="+ + "\u0000\u0000\u0293P\u0001\u0000\u0000\u0000\u0294\u0295\u0005,\u0000\u0000"+ + "\u0295R\u0001\u0000\u0000\u0000\u0296\u0297\u0005.\u0000\u0000\u0297T"+ + "\u0001\u0000\u0000\u0000\u0298\u0299\u0005(\u0000\u0000\u0299V\u0001\u0000"+ + "\u0000\u0000\u029a\u029b\u0005[\u0000\u0000\u029b\u029c\u0001\u0000\u0000"+ + "\u0000\u029c\u029d\u0006)\u0000\u0000\u029d\u029e\u0006)\u0000\u0000\u029e"+ + "X\u0001\u0000\u0000\u0000\u029f\u02a0\u0005]\u0000\u0000\u02a0\u02a1\u0001"+ + "\u0000\u0000\u0000\u02a1\u02a2\u0006*\b\u0000\u02a2\u02a3\u0006*\b\u0000"+ + "\u02a3Z\u0001\u0000\u0000\u0000\u02a4\u02a5\u0003\u00e3o\u0000\u02a5\u02a6"+ + "\u0003\u00e5p\u0000\u02a6\u02a7\u0003\u00efu\u0000\u02a7\\\u0001\u0000"+ + "\u0000\u0000\u02a8\u02a9\u0003\u00dfm\u0000\u02a9\u02aa\u0003\u00d9j\u0000"+ + "\u02aa\u02ab\u0003\u00ddl\u0000\u02ab\u02ac\u0003\u00d1f\u0000\u02ac^"+ + "\u0001\u0000\u0000\u0000\u02ad\u02ae\u0003\u00ebs\u0000\u02ae\u02af\u0003"+ + "\u00dfm\u0000\u02af\u02b0\u0003\u00d9j\u0000\u02b0\u02b1\u0003\u00ddl"+ + "\u0000\u02b1\u02b2\u0003\u00d1f\u0000\u02b2`\u0001\u0000\u0000\u0000\u02b3"+ + "\u02b4\u0003\u00d9j\u0000\u02b4\u02b5\u0003\u00e3o\u0000\u02b5b\u0001"+ + "\u0000\u0000\u0000\u02b6\u02b7\u0003\u00d9j\u0000\u02b7\u02b8\u0003\u00ed"+ + "t\u0000\u02b8d\u0001\u0000\u0000\u0000\u02b9\u02ba\u0003\u00c9b\u0000"+ + "\u02ba\u02bb\u0003\u00edt\u0000\u02bbf\u0001\u0000\u0000\u0000\u02bc\u02bd"+ + "\u0003\u00e3o\u0000\u02bd\u02be\u0003\u00f1v\u0000\u02be\u02bf\u0003\u00df"+ + "m\u0000\u02bf\u02c0\u0003\u00dfm\u0000\u02c0h\u0001\u0000\u0000\u0000"+ + "\u02c1\u02c2\u0005o\u0000\u0000\u02c2\u02c3\u0005r\u0000\u0000\u02c3j"+ + "\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005)\u0000\u0000\u02c5l\u0001\u0000"+ + "\u0000\u0000\u02c6\u02c7\u0005_\u0000\u0000\u02c7n\u0001\u0000\u0000\u0000"+ + "\u02c8\u02c9\u0005i\u0000\u0000\u02c9\u02ca\u0005n\u0000\u0000\u02ca\u02cb"+ + "\u0005f\u0000\u0000\u02cb\u02cc\u0005o\u0000\u0000\u02ccp\u0001\u0000"+ + "\u0000\u0000\u02cd\u02ce\u0005f\u0000\u0000\u02ce\u02cf\u0005u\u0000\u0000"+ + "\u02cf\u02d0\u0005n\u0000\u0000\u02d0\u02d1\u0005c\u0000\u0000\u02d1\u02d2"+ + "\u0005t\u0000\u0000\u02d2\u02d3\u0005i\u0000\u0000\u02d3\u02d4\u0005o"+ + "\u0000\u0000\u02d4\u02d5\u0005n\u0000\u0000\u02d5\u02d6\u0005s\u0000\u0000"+ + "\u02d6r\u0001\u0000\u0000\u0000\u02d7\u02d8\u0005t\u0000\u0000\u02d8\u02d9"+ + "\u0005r\u0000\u0000\u02d9\u02da\u0005u\u0000\u0000\u02da\u02e1\u0005e"+ + "\u0000\u0000\u02db\u02dc\u0005f\u0000\u0000\u02dc\u02dd\u0005a\u0000\u0000"+ + "\u02dd\u02de\u0005l\u0000\u0000\u02de\u02df\u0005s\u0000\u0000\u02df\u02e1"+ + "\u0005e\u0000\u0000\u02e0\u02d7\u0001\u0000\u0000\u0000\u02e0\u02db\u0001"+ + "\u0000\u0000\u0000\u02e1t\u0001\u0000\u0000\u0000\u02e2\u02e3\u0005=\u0000"+ + "\u0000\u02e3\u02ed\u0005=\u0000\u0000\u02e4\u02e5\u0005!\u0000\u0000\u02e5"+ + "\u02ed\u0005=\u0000\u0000\u02e6\u02ed\u0005<\u0000\u0000\u02e7\u02e8\u0005"+ + "<\u0000\u0000\u02e8\u02ed\u0005=\u0000\u0000\u02e9\u02ed\u0005>\u0000"+ + "\u0000\u02ea\u02eb\u0005>\u0000\u0000\u02eb\u02ed\u0005=\u0000\u0000\u02ec"+ + "\u02e2\u0001\u0000\u0000\u0000\u02ec\u02e4\u0001\u0000\u0000\u0000\u02ec"+ + "\u02e6\u0001\u0000\u0000\u0000\u02ec\u02e7\u0001\u0000\u0000\u0000\u02ec"+ + "\u02e9\u0001\u0000\u0000\u0000\u02ec\u02ea\u0001\u0000\u0000\u0000\u02ed"+ + "v\u0001\u0000\u0000\u0000\u02ee\u02ef\u0005+\u0000\u0000\u02efx\u0001"+ + "\u0000\u0000\u0000\u02f0\u02f1\u0005-\u0000\u0000\u02f1z\u0001\u0000\u0000"+ + "\u0000\u02f2\u02f3\u0005*\u0000\u0000\u02f3|\u0001\u0000\u0000\u0000\u02f4"+ + "\u02f5\u0005/\u0000\u0000\u02f5~\u0001\u0000\u0000\u0000\u02f6\u02f7\u0005"+ + "%\u0000\u0000\u02f7\u0080\u0001\u0000\u0000\u0000\u02f8\u02f9\u00051\u0000"+ + "\u0000\u02f9\u02fa\u00050\u0000\u0000\u02fa\u0082\u0001\u0000\u0000\u0000"+ + "\u02fb\u02fc\u0005a\u0000\u0000\u02fc\u02fd\u0005s\u0000\u0000\u02fd\u0303"+ + "\u0005c\u0000\u0000\u02fe\u02ff\u0005d\u0000\u0000\u02ff\u0300\u0005e"+ + "\u0000\u0000\u0300\u0301\u0005s\u0000\u0000\u0301\u0303\u0005c\u0000\u0000"+ + "\u0302\u02fb\u0001\u0000\u0000\u0000\u0302\u02fe\u0001\u0000\u0000\u0000"+ + "\u0303\u0084\u0001\u0000\u0000\u0000\u0304\u0305\u0005n\u0000\u0000\u0305"+ + "\u0306\u0005u\u0000\u0000\u0306\u0307\u0005l\u0000\u0000\u0307\u0308\u0005"+ + "l\u0000\u0000\u0308\u0309\u0005s\u0000\u0000\u0309\u0086\u0001\u0000\u0000"+ + "\u0000\u030a\u030b\u0005f\u0000\u0000\u030b\u030c\u0005i\u0000\u0000\u030c"+ + "\u030d\u0005r\u0000\u0000\u030d\u030e\u0005s\u0000\u0000\u030e\u0314\u0005"+ + "t\u0000\u0000\u030f\u0310\u0005l\u0000\u0000\u0310\u0311\u0005a\u0000"+ + "\u0000\u0311\u0312\u0005s\u0000\u0000\u0312\u0314\u0005t\u0000\u0000\u0313"+ + "\u030a\u0001\u0000\u0000\u0000\u0313\u030f\u0001\u0000\u0000\u0000\u0314"+ + "\u0088\u0001\u0000\u0000\u0000\u0315\u0316\u0003\u00ebs\u0000\u0316\u0317"+ + "\u0003\u00e5p\u0000\u0317\u0318\u0003\u00f1v\u0000\u0318\u0319\u0003\u00e3"+ + "o\u0000\u0319\u031a\u0003\u00cfe\u0000\u031a\u04d0\u0001\u0000\u0000\u0000"+ + "\u031b\u031c\u0003\u00c9b\u0000\u031c\u031d\u0003\u00cbc\u0000\u031d\u031e"+ + "\u0003\u00edt\u0000\u031e\u04d0\u0001\u0000\u0000\u0000\u031f\u0320\u0003"+ + "\u00e7q\u0000\u0320\u0321\u0003\u00e5p\u0000\u0321\u0322\u0003\u00f5x"+ + "\u0000\u0322\u04d0\u0001\u0000\u0000\u0000\u0323\u0324\u0003\u00dfm\u0000"+ + "\u0324\u0325\u0003\u00e5p\u0000\u0325\u0326\u0003\u00d5h\u0000\u0326\u0327"+ + "\u0003\u0081>\u0000\u0327\u04d0\u0001\u0000\u0000\u0000\u0328\u0329\u0003"+ + "\u00e7q\u0000\u0329\u032a\u0003\u00d9j\u0000\u032a\u04d0\u0001\u0000\u0000"+ + "\u0000\u032b\u032c\u0003\u00efu\u0000\u032c\u032d\u0003\u00c9b\u0000\u032d"+ + "\u032e\u0003\u00f1v\u0000\u032e\u04d0\u0001\u0000\u0000\u0000\u032f\u04d0"+ + "\u0003\u00d1f\u0000\u0330\u0331\u0003\u00edt\u0000\u0331\u0332\u0003\u00f1"+ + "v\u0000\u0332\u0333\u0003\u00cbc\u0000\u0333\u0334\u0003\u00edt\u0000"+ + "\u0334\u0335\u0003\u00efu\u0000\u0335\u0336\u0003\u00ebs\u0000\u0336\u0337"+ + "\u0003\u00d9j\u0000\u0337\u0338\u0003\u00e3o\u0000\u0338\u0339\u0003\u00d5"+ + "h\u0000\u0339\u04d0\u0001\u0000\u0000\u0000\u033a\u033b\u0003\u00efu\u0000"+ + "\u033b\u033c\u0003\u00ebs\u0000\u033c\u033d\u0003\u00d9j\u0000\u033d\u033e"+ + "\u0003\u00e1n\u0000\u033e\u04d0\u0001\u0000\u0000\u0000\u033f\u0340\u0003"+ + "\u00cdd\u0000\u0340\u0341\u0003\u00e5p\u0000\u0341\u0342\u0003\u00e3o"+ + "\u0000\u0342\u0343\u0003\u00cdd\u0000\u0343\u0344\u0003\u00c9b\u0000\u0344"+ + "\u0345\u0003\u00efu\u0000\u0345\u04d0\u0001\u0000\u0000\u0000\u0346\u0347"+ + "\u0003\u00cdd\u0000\u0347\u0348\u0003\u00e5p\u0000\u0348\u0349\u0003\u00c9"+ + "b\u0000\u0349\u034a\u0003\u00dfm\u0000\u034a\u034b\u0003\u00d1f\u0000"+ + "\u034b\u034c\u0003\u00edt\u0000\u034c\u034d\u0003\u00cdd\u0000\u034d\u034e"+ + "\u0003\u00d1f\u0000\u034e\u04d0\u0001\u0000\u0000\u0000\u034f\u0350\u0003"+ + "\u00d5h\u0000\u0350\u0351\u0003\u00ebs\u0000\u0351\u0352\u0003\u00d1f"+ + "\u0000\u0352\u0353\u0003\u00c9b\u0000\u0353\u0354\u0003\u00efu\u0000\u0354"+ + "\u0355\u0003\u00d1f\u0000\u0355\u0356\u0003\u00edt\u0000\u0356\u0357\u0003"+ + "\u00efu\u0000\u0357\u04d0\u0001\u0000\u0000\u0000\u0358\u0359\u0003\u00df"+ + "m\u0000\u0359\u035a\u0003\u00d1f\u0000\u035a\u035b\u0003\u00d3g\u0000"+ + "\u035b\u035c\u0003\u00efu\u0000\u035c\u04d0\u0001\u0000\u0000\u0000\u035d"+ + "\u035e\u0003\u00e3o\u0000\u035e\u035f\u0003\u00e5p\u0000\u035f\u0360\u0003"+ + "\u00f5x\u0000\u0360\u04d0\u0001\u0000\u0000\u0000\u0361\u0362\u0003\u00eb"+ + "s\u0000\u0362\u0363\u0003\u00d9j\u0000\u0363\u0364\u0003\u00d5h\u0000"+ + "\u0364\u0365\u0003\u00d7i\u0000\u0365\u0366\u0003\u00efu\u0000\u0366\u04d0"+ + "\u0001\u0000\u0000\u0000\u0367\u0368\u0003\u00edt\u0000\u0368\u0369\u0003"+ + "\u00efu\u0000\u0369\u036a\u0003\u00c9b\u0000\u036a\u036b\u0003\u00ebs"+ + "\u0000\u036b\u036c\u0003\u00efu\u0000\u036c\u036d\u0003\u00edt\u0000\u036d"+ + "\u036e\u0003m4\u0000\u036e\u036f\u0003\u00f5x\u0000\u036f\u0370\u0003"+ + "\u00d9j\u0000\u0370\u0371\u0003\u00efu\u0000\u0371\u0372\u0003\u00d7i"+ + "\u0000\u0372\u04d0\u0001\u0000\u0000\u0000\u0373\u0374\u0003\u00cfe\u0000"+ + "\u0374\u0375\u0003\u00c9b\u0000\u0375\u0376\u0003\u00efu\u0000\u0376\u0377"+ + "\u0003\u00d1f\u0000\u0377\u0378\u0003m4\u0000\u0378\u0379\u0003\u00d3"+ + "g\u0000\u0379\u037a\u0003\u00e5p\u0000\u037a\u037b\u0003\u00ebs\u0000"+ + "\u037b\u037c\u0003\u00e1n\u0000\u037c\u037d\u0003\u00c9b\u0000\u037d\u037e"+ + "\u0003\u00efu\u0000\u037e\u04d0\u0001\u0000\u0000\u0000\u037f\u0380\u0003"+ + "\u00cfe\u0000\u0380\u0381\u0003\u00c9b\u0000\u0381\u0382\u0003\u00efu"+ + "\u0000\u0382\u0383\u0003\u00d1f\u0000\u0383\u0384\u0003m4\u0000\u0384"+ + "\u0385\u0003\u00efu\u0000\u0385\u0386\u0003\u00ebs\u0000\u0386\u0387\u0003"+ + "\u00f1v\u0000\u0387\u0388\u0003\u00e3o\u0000\u0388\u0389\u0003\u00cdd"+ + "\u0000\u0389\u04d0\u0001\u0000\u0000\u0000\u038a\u038b\u0003\u00cfe\u0000"+ + "\u038b\u038c\u0003\u00c9b\u0000\u038c\u038d\u0003\u00efu\u0000\u038d\u038e"+ + "\u0003\u00d1f\u0000\u038e\u038f\u0003m4\u0000\u038f\u0390\u0003\u00e7"+ + "q\u0000\u0390\u0391\u0003\u00c9b\u0000\u0391\u0392\u0003\u00ebs\u0000"+ + "\u0392\u0393\u0003\u00edt\u0000\u0393\u0394\u0003\u00d1f\u0000\u0394\u04d0"+ + "\u0001\u0000\u0000\u0000\u0395\u0396\u0003\u00c9b\u0000\u0396\u0397\u0003"+ + "\u00f1v\u0000\u0397\u0398\u0003\u00efu\u0000\u0398\u0399\u0003\u00e5p"+ + "\u0000\u0399\u039a\u0003m4\u0000\u039a\u039b\u0003\u00cbc\u0000\u039b"+ + "\u039c\u0003\u00f1v\u0000\u039c\u039d\u0003\u00cdd\u0000\u039d\u039e\u0003"+ + "\u00ddl\u0000\u039e\u039f\u0003\u00d1f\u0000\u039f\u03a0\u0003\u00efu"+ + "\u0000\u03a0\u04d0\u0001\u0000\u0000\u0000\u03a1\u03a2\u0003\u00cfe\u0000"+ + "\u03a2\u03a3\u0003\u00c9b\u0000\u03a3\u03a4\u0003\u00efu\u0000\u03a4\u03a5"+ + "\u0003\u00d1f\u0000\u03a5\u03a6\u0003m4\u0000\u03a6\u03a7\u0003\u00d1"+ + "f\u0000\u03a7\u03a8\u0003\u00f7y\u0000\u03a8\u03a9\u0003\u00efu\u0000"+ + "\u03a9\u03aa\u0003\u00ebs\u0000\u03aa\u03ab\u0003\u00c9b\u0000\u03ab\u03ac"+ + "\u0003\u00cdd\u0000\u03ac\u03ad\u0003\u00efu\u0000\u03ad\u04d0\u0001\u0000"+ + "\u0000\u0000\u03ae\u03af\u0003\u00d9j\u0000\u03af\u03b0\u0003\u00edt\u0000"+ + "\u03b0\u03b1\u0003m4\u0000\u03b1\u03b2\u0003\u00d3g\u0000\u03b2\u03b3"+ + "\u0003\u00d9j\u0000\u03b3\u03b4\u0003\u00e3o\u0000\u03b4\u03b5\u0003\u00d9"+ + "j\u0000\u03b5\u03b6\u0003\u00efu\u0000\u03b6\u03b7\u0003\u00d1f\u0000"+ + "\u03b7\u04d0\u0001\u0000\u0000\u0000\u03b8\u03b9\u0003\u00d9j\u0000\u03b9"+ + "\u03ba\u0003\u00edt\u0000\u03ba\u03bb\u0003m4\u0000\u03bb\u03bc\u0003"+ + "\u00d9j\u0000\u03bc\u03bd\u0003\u00e3o\u0000\u03bd\u03be\u0003\u00d3g"+ + "\u0000\u03be\u03bf\u0003\u00d9j\u0000\u03bf\u03c0\u0003\u00e3o\u0000\u03c0"+ + "\u03c1\u0003\u00d9j\u0000\u03c1\u03c2\u0003\u00efu\u0000\u03c2\u03c3\u0003"+ + "\u00d1f\u0000\u03c3\u04d0\u0001\u0000\u0000\u0000\u03c4\u03c5\u0003\u00cd"+ + "d\u0000\u03c5\u03c6\u0003\u00c9b\u0000\u03c6\u03c7\u0003\u00edt\u0000"+ + "\u03c7\u03c8\u0003\u00d1f\u0000\u03c8\u04d0\u0001\u0000\u0000\u0000\u03c9"+ + "\u03ca\u0003\u00dfm\u0000\u03ca\u03cb\u0003\u00d1f\u0000\u03cb\u03cc\u0003"+ + "\u00e3o\u0000\u03cc\u03cd\u0003\u00d5h\u0000\u03cd\u03ce\u0003\u00efu"+ + "\u0000\u03ce\u03cf\u0003\u00d7i\u0000\u03cf\u04d0\u0001\u0000\u0000\u0000"+ + "\u03d0\u03d1\u0003\u00e1n\u0000\u03d1\u03d2\u0003\u00f3w\u0000\u03d2\u03d3"+ + "\u0003m4\u0000\u03d3\u03d4\u0003\u00e1n\u0000\u03d4\u03d5\u0003\u00c9"+ + "b\u0000\u03d5\u03d6\u0003\u00f7y\u0000\u03d6\u04d0\u0001\u0000\u0000\u0000"+ + "\u03d7\u03d8\u0003\u00e1n\u0000\u03d8\u03d9\u0003\u00f3w\u0000\u03d9\u03da"+ + "\u0003m4\u0000\u03da\u03db\u0003\u00e1n\u0000\u03db\u03dc\u0003\u00d9"+ + "j\u0000\u03dc\u03dd\u0003\u00e3o\u0000\u03dd\u04d0\u0001\u0000\u0000\u0000"+ + "\u03de\u03df\u0003\u00e1n\u0000\u03df\u03e0\u0003\u00f3w\u0000\u03e0\u03e1"+ + "\u0003m4\u0000\u03e1\u03e2\u0003\u00c9b\u0000\u03e2\u03e3\u0003\u00f3"+ + "w\u0000\u03e3\u03e4\u0003\u00d5h\u0000\u03e4\u04d0\u0001\u0000\u0000\u0000"+ + "\u03e5\u03e6\u0003\u00e1n\u0000\u03e6\u03e7\u0003\u00f3w\u0000\u03e7\u03e8"+ + "\u0003m4\u0000\u03e8\u03e9\u0003\u00edt\u0000\u03e9\u03ea\u0003\u00f1"+ + "v\u0000\u03ea\u03eb\u0003\u00e1n\u0000\u03eb\u04d0\u0001\u0000\u0000\u0000"+ + "\u03ec\u03ed\u0003\u00e1n\u0000\u03ed\u03ee\u0003\u00f3w\u0000\u03ee\u03ef"+ + "\u0003m4\u0000\u03ef\u03f0\u0003\u00cdd\u0000\u03f0\u03f1\u0003\u00e5"+ + "p\u0000\u03f1\u03f2\u0003\u00f1v\u0000\u03f2\u03f3\u0003\u00e3o\u0000"+ + "\u03f3\u03f4\u0003\u00efu\u0000\u03f4\u04d0\u0001\u0000\u0000\u0000\u03f5"+ + "\u03f6\u0003\u00e1n\u0000\u03f6\u03f7\u0003\u00f3w\u0000\u03f7\u03f8\u0003"+ + "m4\u0000\u03f8\u03f9\u0003\u00cdd\u0000\u03f9\u03fa\u0003\u00e5p\u0000"+ + "\u03fa\u03fb\u0003\u00e3o\u0000\u03fb\u03fc\u0003\u00cdd\u0000\u03fc\u03fd"+ + "\u0003\u00c9b\u0000\u03fd\u03fe\u0003\u00efu\u0000\u03fe\u04d0\u0001\u0000"+ + "\u0000\u0000\u03ff\u0400\u0003\u00e1n\u0000\u0400\u0401\u0003\u00f3w\u0000"+ + "\u0401\u0402\u0003m4\u0000\u0402\u0403\u0003\u00dbk\u0000\u0403\u0404"+ + "\u0003\u00e5p\u0000\u0404\u0405\u0003\u00d9j\u0000\u0405\u0406\u0003\u00e3"+ + "o\u0000\u0406\u04d0\u0001\u0000\u0000\u0000\u0407\u0408\u0003\u00e1n\u0000"+ + "\u0408\u0409\u0003\u00f3w\u0000\u0409\u040a\u0003m4\u0000\u040a\u040b"+ + "\u0003\u00e1n\u0000\u040b\u040c\u0003\u00d1f\u0000\u040c\u040d\u0003\u00cf"+ + "e\u0000\u040d\u040e\u0003\u00d9j\u0000\u040e\u040f\u0003\u00c9b\u0000"+ + "\u040f\u0410\u0003\u00e3o\u0000\u0410\u04d0\u0001\u0000\u0000\u0000\u0411"+ + "\u0412\u0003\u00e1n\u0000\u0412\u0413\u0003\u00f3w\u0000\u0413\u0414\u0003"+ + "m4\u0000\u0414\u0415\u0003\u00cfe\u0000\u0415\u0416\u0003\u00d1f\u0000"+ + "\u0416\u0417\u0003\u00cfe\u0000\u0417\u0418\u0003\u00f1v\u0000\u0418\u0419"+ + "\u0003\u00e7q\u0000\u0419\u041a\u0003\u00d1f\u0000\u041a\u04d0\u0001\u0000"+ + "\u0000\u0000\u041b\u041c\u0003\u00e1n\u0000\u041c\u041d\u0003\u00d1f\u0000"+ + "\u041d\u041e\u0003\u00efu\u0000\u041e\u041f\u0003\u00c9b\u0000\u041f\u0420"+ + "\u0003\u00cfe\u0000\u0420\u0421\u0003\u00c9b\u0000\u0421\u0422\u0003\u00ef"+ + "u\u0000\u0422\u0423\u0003\u00c9b\u0000\u0423\u04d0\u0001\u0000\u0000\u0000"+ + "\u0424\u0425\u0003\u00edt\u0000\u0425\u0426\u0003\u00e7q\u0000\u0426\u0427"+ + "\u0003\u00dfm\u0000\u0427\u0428\u0003\u00d9j\u0000\u0428\u0429\u0003\u00ef"+ + "u\u0000\u0429\u04d0\u0001\u0000\u0000\u0000\u042a\u042b\u0003\u00efu\u0000"+ + "\u042b\u042c\u0003\u00e5p\u0000\u042c\u042d\u0003m4\u0000\u042d\u042e"+ + "\u0003\u00edt\u0000\u042e\u042f\u0003\u00efu\u0000\u042f\u0430\u0003\u00eb"+ + "s\u0000\u0430\u0431\u0003\u00d9j\u0000\u0431\u0432\u0003\u00e3o\u0000"+ + "\u0432\u0433\u0003\u00d5h\u0000\u0433\u04d0\u0001\u0000\u0000\u0000\u0434"+ + "\u0435\u0003\u00efu\u0000\u0435\u0436\u0003\u00e5p\u0000\u0436\u0437\u0003"+ + "m4\u0000\u0437\u0438\u0003\u00edt\u0000\u0438\u0439\u0003\u00efu\u0000"+ + "\u0439\u043a\u0003\u00ebs\u0000\u043a\u04d0\u0001\u0000\u0000\u0000\u043b"+ + "\u043c\u0003\u00efu\u0000\u043c\u043d\u0003\u00e5p\u0000\u043d\u043e\u0003"+ + "m4\u0000\u043e\u043f\u0003\u00cbc\u0000\u043f\u0440\u0003\u00e5p\u0000"+ + "\u0440\u0441\u0003\u00e5p\u0000\u0441\u0442\u0003\u00dfm\u0000\u0442\u04d0"+ + "\u0001\u0000\u0000\u0000\u0443\u0444\u0003\u00efu\u0000\u0444\u0445\u0003"+ + "\u00e5p\u0000\u0445\u0446\u0003m4\u0000\u0446\u0447\u0003\u00cbc\u0000"+ + "\u0447\u0448\u0003\u00e5p\u0000\u0448\u0449\u0003\u00e5p\u0000\u0449\u044a"+ + "\u0003\u00dfm\u0000\u044a\u044b\u0003\u00d1f\u0000\u044b\u044c\u0003\u00c9"+ + "b\u0000\u044c\u044d\u0003\u00e3o\u0000\u044d\u04d0\u0001\u0000\u0000\u0000"+ + "\u044e\u044f\u0003\u00efu\u0000\u044f\u0450\u0003\u00e5p\u0000\u0450\u0451"+ + "\u0003m4\u0000\u0451\u0452\u0003\u00cfe\u0000\u0452\u0453\u0003\u00c9"+ + "b\u0000\u0453\u0454\u0003\u00efu\u0000\u0454\u0455\u0003\u00d1f\u0000"+ + "\u0455\u0456\u0003\u00efu\u0000\u0456\u0457\u0003\u00d9j\u0000\u0457\u0458"+ + "\u0003\u00e1n\u0000\u0458\u0459\u0003\u00d1f\u0000\u0459\u04d0\u0001\u0000"+ + "\u0000\u0000\u045a\u045b\u0003\u00efu\u0000\u045b\u045c\u0003\u00e5p\u0000"+ + "\u045c\u045d\u0003m4\u0000\u045d\u045e\u0003\u00cfe\u0000\u045e\u045f"+ + "\u0003\u00efu\u0000\u045f\u04d0\u0001\u0000\u0000\u0000\u0460\u0461\u0003"+ + "\u00efu\u0000\u0461\u0462\u0003\u00e5p\u0000\u0462\u0463\u0003m4\u0000"+ + "\u0463\u0464\u0003\u00cfe\u0000\u0464\u0465\u0003\u00cbc\u0000\u0465\u0466"+ + "\u0003\u00dfm\u0000\u0466\u04d0\u0001\u0000\u0000\u0000\u0467\u0468\u0003"+ + "\u00efu\u0000\u0468\u0469\u0003\u00e5p\u0000\u0469\u046a\u0003m4\u0000"+ + "\u046a\u046b\u0003\u00cfe\u0000\u046b\u046c\u0003\u00e5p\u0000\u046c\u046d"+ + "\u0003\u00f1v\u0000\u046d\u046e\u0003\u00cbc\u0000\u046e\u046f\u0003\u00df"+ + "m\u0000\u046f\u0470\u0003\u00d1f\u0000\u0470\u04d0\u0001\u0000\u0000\u0000"+ + "\u0471\u0472\u0003\u00efu\u0000\u0472\u0473\u0003\u00e5p\u0000\u0473\u0474"+ + "\u0003m4\u0000\u0474\u0475\u0003\u00cfe\u0000\u0475\u0476\u0003\u00d1"+ + "f\u0000\u0476\u0477\u0003\u00d5h\u0000\u0477\u0478\u0003\u00ebs\u0000"+ + "\u0478\u0479\u0003\u00d1f\u0000\u0479\u047a\u0003\u00d1f\u0000\u047a\u047b"+ + "\u0003\u00edt\u0000\u047b\u04d0\u0001\u0000\u0000\u0000\u047c\u047d\u0003"+ + "\u00efu\u0000\u047d\u047e\u0003\u00e5p\u0000\u047e\u047f\u0003m4\u0000"+ + "\u047f\u0480\u0003\u00d9j\u0000\u0480\u0481\u0003\u00e3o\u0000\u0481\u0482"+ + "\u0003\u00efu\u0000\u0482\u04d0\u0001\u0000\u0000\u0000\u0483\u0484\u0003"+ + "\u00efu\u0000\u0484\u0485\u0003\u00e5p\u0000\u0485\u0486\u0003m4\u0000"+ + "\u0486\u0487\u0003\u00d9j\u0000\u0487\u0488\u0003\u00e3o\u0000\u0488\u0489"+ + "\u0003\u00efu\u0000\u0489\u048a\u0003\u00d1f\u0000\u048a\u048b\u0003\u00d5"+ + "h\u0000\u048b\u048c\u0003\u00d1f\u0000\u048c\u048d\u0003\u00ebs\u0000"+ + "\u048d\u04d0\u0001\u0000\u0000\u0000\u048e\u048f\u0003\u00efu\u0000\u048f"+ + "\u0490\u0003\u00e5p\u0000\u0490\u0491\u0003m4\u0000\u0491\u0492\u0003"+ + "\u00d9j\u0000\u0492\u0493\u0003\u00e7q\u0000\u0493\u04d0\u0001\u0000\u0000"+ + "\u0000\u0494\u0495\u0003\u00efu\u0000\u0495\u0496\u0003\u00e5p\u0000\u0496"+ + "\u0497\u0003m4\u0000\u0497\u0498\u0003\u00dfm\u0000\u0498\u0499\u0003"+ + "\u00e5p\u0000\u0499\u049a\u0003\u00e3o\u0000\u049a\u049b\u0003\u00d5h"+ + "\u0000\u049b\u04d0\u0001\u0000\u0000\u0000\u049c\u049d\u0003\u00efu\u0000"+ + "\u049d\u049e\u0003\u00e5p\u0000\u049e\u049f\u0003m4\u0000\u049f\u04a0"+ + "\u0003\u00ebs\u0000\u04a0\u04a1\u0003\u00c9b\u0000\u04a1\u04a2\u0003\u00cf"+ + "e\u0000\u04a2\u04a3\u0003\u00d9j\u0000\u04a3\u04a4\u0003\u00c9b\u0000"+ + "\u04a4\u04a5\u0003\u00e3o\u0000\u04a5\u04a6\u0003\u00edt\u0000\u04a6\u04d0"+ + "\u0001\u0000\u0000\u0000\u04a7\u04a8\u0003\u00efu\u0000\u04a8\u04a9\u0003"+ + "\u00e5p\u0000\u04a9\u04aa\u0003m4\u0000\u04aa\u04ab\u0003\u00f3w\u0000"+ + "\u04ab\u04ac\u0003\u00d1f\u0000\u04ac\u04ad\u0003\u00ebs\u0000\u04ad\u04ae"+ + "\u0003\u00edt\u0000\u04ae\u04af\u0003\u00d9j\u0000\u04af\u04b0\u0003\u00e5"+ + "p\u0000\u04b0\u04b1\u0003\u00e3o\u0000\u04b1\u04d0\u0001\u0000\u0000\u0000"+ + "\u04b2\u04b3\u0003\u00efu\u0000\u04b3\u04b4\u0003\u00e5p\u0000\u04b4\u04b5"+ + "\u0003m4\u0000\u04b5\u04b6\u0003\u00f1v\u0000\u04b6\u04b7\u0003\u00e3"+ + "o\u0000\u04b7\u04b8\u0003\u00edt\u0000\u04b8\u04b9\u0003\u00d9j\u0000"+ + "\u04b9\u04ba\u0003\u00d5h\u0000\u04ba\u04bb\u0003\u00e3o\u0000\u04bb\u04bc"+ + "\u0003\u00d1f\u0000\u04bc\u04bd\u0003\u00cfe\u0000\u04bd\u04be\u0003m"+ + "4\u0000\u04be\u04bf\u0003\u00dfm\u0000\u04bf\u04c0\u0003\u00e5p\u0000"+ + "\u04c0\u04c1\u0003\u00e3o\u0000\u04c1\u04c2\u0003\u00d5h\u0000\u04c2\u04d0"+ + "\u0001\u0000\u0000\u0000\u04c3\u04c4\u0003\u00efu\u0000\u04c4\u04c5\u0003"+ + "\u00e5p\u0000\u04c5\u04c6\u0003m4\u0000\u04c6\u04c7\u0003\u00d5h\u0000"+ + "\u04c7\u04c8\u0003\u00d1f\u0000\u04c8\u04c9\u0003\u00e5p\u0000\u04c9\u04ca"+ + "\u0003\u00e7q\u0000\u04ca\u04cb\u0003\u00e5p\u0000\u04cb\u04cc\u0003\u00d9"+ + "j\u0000\u04cc\u04cd\u0003\u00e3o\u0000\u04cd\u04ce\u0003\u00efu\u0000"+ + "\u04ce\u04d0\u0001\u0000\u0000\u0000\u04cf\u0315\u0001\u0000\u0000\u0000"+ + "\u04cf\u031b\u0001\u0000\u0000\u0000\u04cf\u031f\u0001\u0000\u0000\u0000"+ + "\u04cf\u0323\u0001\u0000\u0000\u0000\u04cf\u0328\u0001\u0000\u0000\u0000"+ + "\u04cf\u032b\u0001\u0000\u0000\u0000\u04cf\u032f\u0001\u0000\u0000\u0000"+ + "\u04cf\u0330\u0001\u0000\u0000\u0000\u04cf\u033a\u0001\u0000\u0000\u0000"+ + "\u04cf\u033f\u0001\u0000\u0000\u0000\u04cf\u0346\u0001\u0000\u0000\u0000"+ + "\u04cf\u034f\u0001\u0000\u0000\u0000\u04cf\u0358\u0001\u0000\u0000\u0000"+ + "\u04cf\u035d\u0001\u0000\u0000\u0000\u04cf\u0361\u0001\u0000\u0000\u0000"+ + "\u04cf\u0367\u0001\u0000\u0000\u0000\u04cf\u0373\u0001\u0000\u0000\u0000"+ + "\u04cf\u037f\u0001\u0000\u0000\u0000\u04cf\u038a\u0001\u0000\u0000\u0000"+ + "\u04cf\u0395\u0001\u0000\u0000\u0000\u04cf\u03a1\u0001\u0000\u0000\u0000"+ + "\u04cf\u03ae\u0001\u0000\u0000\u0000\u04cf\u03b8\u0001\u0000\u0000\u0000"+ + "\u04cf\u03c4\u0001\u0000\u0000\u0000\u04cf\u03c9\u0001\u0000\u0000\u0000"+ + "\u04cf\u03d0\u0001\u0000\u0000\u0000\u04cf\u03d7\u0001\u0000\u0000\u0000"+ + "\u04cf\u03de\u0001\u0000\u0000\u0000\u04cf\u03e5\u0001\u0000\u0000\u0000"+ + "\u04cf\u03ec\u0001\u0000\u0000\u0000\u04cf\u03f5\u0001\u0000\u0000\u0000"+ + "\u04cf\u03ff\u0001\u0000\u0000\u0000\u04cf\u0407\u0001\u0000\u0000\u0000"+ + "\u04cf\u0411\u0001\u0000\u0000\u0000\u04cf\u041b\u0001\u0000\u0000\u0000"+ + "\u04cf\u0424\u0001\u0000\u0000\u0000\u04cf\u042a\u0001\u0000\u0000\u0000"+ + "\u04cf\u0434\u0001\u0000\u0000\u0000\u04cf\u043b\u0001\u0000\u0000\u0000"+ + "\u04cf\u0443\u0001\u0000\u0000\u0000\u04cf\u044e\u0001\u0000\u0000\u0000"+ + "\u04cf\u045a\u0001\u0000\u0000\u0000\u04cf\u0460\u0001\u0000\u0000\u0000"+ + "\u04cf\u0467\u0001\u0000\u0000\u0000\u04cf\u0471\u0001\u0000\u0000\u0000"+ + "\u04cf\u047c\u0001\u0000\u0000\u0000\u04cf\u0483\u0001\u0000\u0000\u0000"+ + "\u04cf\u048e\u0001\u0000\u0000\u0000\u04cf\u0494\u0001\u0000\u0000\u0000"+ + "\u04cf\u049c\u0001\u0000\u0000\u0000\u04cf\u04a7\u0001\u0000\u0000\u0000"+ + "\u04cf\u04b2\u0001\u0000\u0000\u0000\u04cf\u04c3\u0001\u0000\u0000\u0000"+ + "\u04d0\u008a\u0001\u0000\u0000\u0000\u04d1\u04d2\u0003\u00c9b\u0000\u04d2"+ + "\u04d3\u0003\u00f3w\u0000\u04d3\u04d4\u0003\u00d5h\u0000\u04d4\u0569\u0001"+ + "\u0000\u0000\u0000\u04d5\u04d6\u0003\u00e1n\u0000\u04d6\u04d7\u0003\u00d9"+ + "j\u0000\u04d7\u04d8\u0003\u00e3o\u0000\u04d8\u0569\u0001\u0000\u0000\u0000"+ + "\u04d9\u04da\u0003\u00e1n\u0000\u04da\u04db\u0003\u00c9b\u0000\u04db\u04dc"+ + "\u0003\u00f7y\u0000\u04dc\u0569\u0001\u0000\u0000\u0000\u04dd\u04de\u0003"+ + "\u00edt\u0000\u04de\u04df\u0003\u00f1v\u0000\u04df\u04e0\u0003\u00e1n"+ + "\u0000\u04e0\u0569\u0001\u0000\u0000\u0000\u04e1\u04e2\u0003\u00cdd\u0000"+ + "\u04e2\u04e3\u0003\u00e5p\u0000\u04e3\u04e4\u0003\u00f1v\u0000\u04e4\u04e5"+ + "\u0003\u00e3o\u0000\u04e5\u04e6\u0003\u00efu\u0000\u04e6\u0569\u0001\u0000"+ + "\u0000\u0000\u04e7\u04e8\u0003\u00cdd\u0000\u04e8\u04e9\u0003\u00e5p\u0000"+ + "\u04e9\u04ea\u0003\u00f1v\u0000\u04ea\u04eb\u0003\u00e3o\u0000\u04eb\u04ec"+ + "\u0003\u00efu\u0000\u04ec\u04ed\u0003m4\u0000\u04ed\u04ee\u0003\u00cf"+ + "e\u0000\u04ee\u04ef\u0003\u00d9j\u0000\u04ef\u04f0\u0003\u00edt\u0000"+ + "\u04f0\u04f1\u0003\u00efu\u0000\u04f1\u04f2\u0003\u00d9j\u0000\u04f2\u04f3"+ + "\u0003\u00e3o\u0000\u04f3\u04f4\u0003\u00cdd\u0000\u04f4\u04f5\u0003\u00ef"+ + "u\u0000\u04f5\u0569\u0001\u0000\u0000\u0000\u04f6\u04f7\u0003\u00e7q\u0000"+ + "\u04f7\u04f8\u0003\u00d1f\u0000\u04f8\u04f9\u0003\u00ebs\u0000\u04f9\u04fa"+ + "\u0003\u00cdd\u0000\u04fa\u04fb\u0003\u00d1f\u0000\u04fb\u04fc\u0003\u00e3"+ + "o\u0000\u04fc\u04fd\u0003\u00efu\u0000\u04fd\u04fe\u0003\u00d9j\u0000"+ + "\u04fe\u04ff\u0003\u00dfm\u0000\u04ff\u0500\u0003\u00d1f\u0000\u0500\u0569"+ + "\u0001\u0000\u0000\u0000\u0501\u0502\u0003\u00e1n\u0000\u0502\u0503\u0003"+ + "\u00d1f\u0000\u0503\u0504\u0003\u00cfe\u0000\u0504\u0505\u0003\u00d9j"+ + "\u0000\u0505\u0506\u0003\u00c9b\u0000\u0506\u0507\u0003\u00e3o\u0000\u0507"+ + "\u0569\u0001\u0000\u0000\u0000\u0508\u0509\u0003\u00e1n\u0000\u0509\u050a"+ + "\u0003\u00d1f\u0000\u050a\u050b\u0003\u00cfe\u0000\u050b\u050c\u0003\u00d9"+ + "j\u0000\u050c\u050d\u0003\u00c9b\u0000\u050d\u050e\u0003\u00e3o\u0000"+ + "\u050e\u050f\u0003m4\u0000\u050f\u0510\u0003\u00c9b\u0000\u0510\u0511"+ + "\u0003\u00cbc\u0000\u0511\u0512\u0003\u00edt\u0000\u0512\u0513\u0003\u00e5"+ + "p\u0000\u0513\u0514\u0003\u00dfm\u0000\u0514\u0515\u0003\u00f1v\u0000"+ + "\u0515\u0516\u0003\u00efu\u0000\u0516\u0517\u0003\u00d1f\u0000\u0517\u0518"+ + "\u0003m4\u0000\u0518\u0519\u0003\u00cfe\u0000\u0519\u051a\u0003\u00d1"+ + "f\u0000\u051a\u051b\u0003\u00f3w\u0000\u051b\u051c\u0003\u00d9j\u0000"+ + "\u051c\u051d\u0003\u00c9b\u0000\u051d\u051e\u0003\u00efu\u0000\u051e\u051f"+ + "\u0003\u00d9j\u0000\u051f\u0520\u0003\u00e5p\u0000\u0520\u0521\u0003\u00e3"+ + "o\u0000\u0521\u0569\u0001\u0000\u0000\u0000\u0522\u0523\u0003\u00c9b\u0000"+ + "\u0523\u0524\u0003\u00cdd\u0000\u0524\u0525\u0003\u00e5p\u0000\u0525\u0526"+ + "\u0003\u00edt\u0000\u0526\u0569\u0001\u0000\u0000\u0000\u0527\u0528\u0003"+ + "\u00c9b\u0000\u0528\u0529\u0003\u00edt\u0000\u0529\u052a\u0003\u00d9j"+ + "\u0000\u052a\u052b\u0003\u00e3o\u0000\u052b\u0569\u0001\u0000\u0000\u0000"+ + "\u052c\u052d\u0003\u00c9b\u0000\u052d\u052e\u0003\u00efu\u0000\u052e\u052f"+ + "\u0003\u00c9b\u0000\u052f\u0530\u0003\u00e3o\u0000\u0530\u0569\u0001\u0000"+ + "\u0000\u0000\u0531\u0532\u0003\u00c9b\u0000\u0532\u0533\u0003\u00efu\u0000"+ + "\u0533\u0534\u0003\u00c9b\u0000\u0534\u0535\u0003\u00e3o\u0000\u0535\u0536"+ + "\u00052\u0000\u0000\u0536\u0569\u0001\u0000\u0000\u0000\u0537\u0538\u0003"+ + "\u00cdd\u0000\u0538\u0539\u0003\u00d1f\u0000\u0539\u053a\u0003\u00d9j"+ + "\u0000\u053a\u053b\u0003\u00dfm\u0000\u053b\u0569\u0001\u0000\u0000\u0000"+ + "\u053c\u053d\u0003\u00cdd\u0000\u053d\u053e\u0003\u00e5p\u0000\u053e\u053f"+ + "\u0003\u00edt\u0000\u053f\u0569\u0001\u0000\u0000\u0000\u0540\u0541\u0003"+ + "\u00cdd\u0000\u0541\u0542\u0003\u00e5p\u0000\u0542\u0543\u0003\u00edt"+ + "\u0000\u0543\u0544\u0003\u00d7i\u0000\u0544\u0569\u0001\u0000\u0000\u0000"+ + "\u0545\u0546\u0003\u00d3g\u0000\u0546\u0547\u0003\u00dfm\u0000\u0547\u0548"+ + "\u0003\u00e5p\u0000\u0548\u0549\u0003\u00e5p\u0000\u0549\u054a\u0003\u00eb"+ + "s\u0000\u054a\u0569\u0001\u0000\u0000\u0000\u054b\u054c\u0003\u00dfm\u0000"+ + "\u054c\u054d\u0003\u00efu\u0000\u054d\u054e\u0003\u00ebs\u0000\u054e\u054f"+ + "\u0003\u00d9j\u0000\u054f\u0550\u0003\u00e1n\u0000\u0550\u0569\u0001\u0000"+ + "\u0000\u0000\u0551\u0552\u0003\u00edt\u0000\u0552\u0553\u0003\u00d9j\u0000"+ + "\u0553\u0554\u0003\u00e3o\u0000\u0554\u0569\u0001\u0000\u0000\u0000\u0555"+ + "\u0556\u0003\u00edt\u0000\u0556\u0557\u0003\u00d9j\u0000\u0557\u0558\u0003"+ + "\u00e3o\u0000\u0558\u0559\u0003\u00d7i\u0000\u0559\u0569\u0001\u0000\u0000"+ + "\u0000\u055a\u055b\u0003\u00edt\u0000\u055b\u055c\u0003\u00e9r\u0000\u055c"+ + "\u055d\u0003\u00ebs\u0000\u055d\u055e\u0003\u00efu\u0000\u055e\u0569\u0001"+ + "\u0000\u0000\u0000\u055f\u0560\u0003\u00efu\u0000\u0560\u0561\u0003\u00c9"+ + "b\u0000\u0561\u0562\u0003\u00e3o\u0000\u0562\u0569\u0001\u0000\u0000\u0000"+ + "\u0563\u0564\u0003\u00efu\u0000\u0564\u0565\u0003\u00c9b\u0000\u0565\u0566"+ + "\u0003\u00e3o\u0000\u0566\u0567\u0003\u00d7i\u0000\u0567\u0569\u0001\u0000"+ + "\u0000\u0000\u0568\u04d1\u0001\u0000\u0000\u0000\u0568\u04d5\u0001\u0000"+ + "\u0000\u0000\u0568\u04d9\u0001\u0000\u0000\u0000\u0568\u04dd\u0001\u0000"+ + "\u0000\u0000\u0568\u04e1\u0001\u0000\u0000\u0000\u0568\u04e7\u0001\u0000"+ + "\u0000\u0000\u0568\u04f6\u0001\u0000\u0000\u0000\u0568\u0501\u0001\u0000"+ + "\u0000\u0000\u0568\u0508\u0001\u0000\u0000\u0000\u0568\u0522\u0001\u0000"+ + "\u0000\u0000\u0568\u0527\u0001\u0000\u0000\u0000\u0568\u052c\u0001\u0000"+ + "\u0000\u0000\u0568\u0531\u0001\u0000\u0000\u0000\u0568\u0537\u0001\u0000"+ + "\u0000\u0000\u0568\u053c\u0001\u0000\u0000\u0000\u0568\u0540\u0001\u0000"+ + "\u0000\u0000\u0568\u0545\u0001\u0000\u0000\u0000\u0568\u054b\u0001\u0000"+ + "\u0000\u0000\u0568\u0551\u0001\u0000\u0000\u0000\u0568\u0555\u0001\u0000"+ + "\u0000\u0000\u0568\u055a\u0001\u0000\u0000\u0000\u0568\u055f\u0001\u0000"+ + "\u0000\u0000\u0568\u0563\u0001\u0000\u0000\u0000\u0569\u008c\u0001\u0000"+ + "\u0000\u0000\u056a\u056b\u0003\u00cdd\u0000\u056b\u056c\u0003\u00d9j\u0000"+ + "\u056c\u056d\u0003\u00cfe\u0000\u056d\u056e\u0003\u00ebs\u0000\u056e\u056f"+ + "\u0003m4\u0000\u056f\u0570\u0003\u00e1n\u0000\u0570\u0571\u0003\u00c9"+ + "b\u0000\u0571\u0572\u0003\u00efu\u0000\u0572\u0573\u0003\u00cdd\u0000"+ + "\u0573\u0574\u0003\u00d7i\u0000\u0574\u008e\u0001\u0000\u0000\u0000\u0575"+ + "\u057c\u0003;\u001b\u0000\u0576\u057b\u0003;\u001b\u0000\u0577\u057b\u0003"+ + "9\u001a\u0000\u0578\u057b\u0005_\u0000\u0000\u0579\u057b\u0003{;\u0000"+ + "\u057a\u0576\u0001\u0000\u0000\u0000\u057a\u0577\u0001\u0000\u0000\u0000"+ + "\u057a\u0578\u0001\u0000\u0000\u0000\u057a\u0579\u0001\u0000\u0000\u0000"+ + "\u057b\u057e\u0001\u0000\u0000\u0000\u057c\u057a\u0001\u0000\u0000\u0000"+ + "\u057c\u057d\u0001\u0000\u0000\u0000\u057d\u0589\u0001\u0000\u0000\u0000"+ + "\u057e\u057c\u0001\u0000\u0000\u0000\u057f\u0584\u0007\b\u0000\u0000\u0580"+ + "\u0585\u0003;\u001b\u0000\u0581\u0585\u00039\u001a\u0000\u0582\u0585\u0005"+ + "_\u0000\u0000\u0583\u0585\u0003{;\u0000\u0584\u0580\u0001\u0000\u0000"+ + "\u0000\u0584\u0581\u0001\u0000\u0000\u0000\u0584\u0582\u0001\u0000\u0000"+ + "\u0000\u0584\u0583\u0001\u0000\u0000\u0000\u0585\u0586\u0001\u0000\u0000"+ + "\u0000\u0586\u0584\u0001\u0000\u0000\u0000\u0586\u0587\u0001\u0000\u0000"+ + "\u0000\u0587\u0589\u0001\u0000\u0000\u0000\u0588\u0575\u0001\u0000\u0000"+ + "\u0000\u0588\u057f\u0001\u0000\u0000\u0000\u0589\u0090\u0001\u0000\u0000"+ + "\u0000\u058a\u0590\u0005`\u0000\u0000\u058b\u058f\b\t\u0000\u0000\u058c"+ + "\u058d\u0005`\u0000\u0000\u058d\u058f\u0005`\u0000\u0000\u058e\u058b\u0001"+ + "\u0000\u0000\u0000\u058e\u058c\u0001\u0000\u0000\u0000\u058f\u0592\u0001"+ + "\u0000\u0000\u0000\u0590\u058e\u0001\u0000\u0000\u0000\u0590\u0591\u0001"+ + "\u0000\u0000\u0000\u0591\u0593\u0001\u0000\u0000\u0000\u0592\u0590\u0001"+ + "\u0000\u0000\u0000\u0593\u0594\u0005`\u0000\u0000\u0594\u0092\u0001\u0000"+ + "\u0000\u0000\u0595\u0596\u0003\'\u0011\u0000\u0596\u0597\u0001\u0000\u0000"+ + "\u0000\u0597\u0598\u0006G\u0004\u0000\u0598\u0094\u0001\u0000\u0000\u0000"+ + "\u0599\u059a\u0003)\u0012\u0000\u059a\u059b\u0001\u0000\u0000\u0000\u059b"+ + "\u059c\u0006H\u0004\u0000\u059c\u0096\u0001\u0000\u0000\u0000\u059d\u059e"+ + "\u0003+\u0013\u0000\u059e\u059f\u0001\u0000\u0000\u0000\u059f\u05a0\u0006"+ + "I\u0004\u0000\u05a0\u0098\u0001\u0000\u0000\u0000\u05a1\u05a2\u0005|\u0000"+ + "\u0000\u05a2\u05a3\u0001\u0000\u0000\u0000\u05a3\u05a4\u0006J\u0007\u0000"+ + "\u05a4\u05a5\u0006J\b\u0000\u05a5\u009a\u0001\u0000\u0000\u0000\u05a6"+ + "\u05a7\u0005[\u0000\u0000\u05a7\u05a8\u0001\u0000\u0000\u0000\u05a8\u05a9"+ + "\u0006K\u0005\u0000\u05a9\u05aa\u0006K\u0002\u0000\u05aa\u05ab\u0006K"+ + "\u0002\u0000\u05ab\u009c\u0001\u0000\u0000\u0000\u05ac\u05ad\u0005]\u0000"+ + "\u0000\u05ad\u05ae\u0001\u0000\u0000\u0000\u05ae\u05af\u0006L\b\u0000"+ + "\u05af\u05b0\u0006L\b\u0000\u05b0\u05b1\u0006L\t\u0000\u05b1\u009e\u0001"+ + "\u0000\u0000\u0000\u05b2\u05b3\u0005,\u0000\u0000\u05b3\u05b4\u0001\u0000"+ + "\u0000\u0000\u05b4\u05b5\u0006M\n\u0000\u05b5\u00a0\u0001\u0000\u0000"+ + "\u0000\u05b6\u05b7\u0005=\u0000\u0000\u05b7\u05b8\u0001\u0000\u0000\u0000"+ + "\u05b8\u05b9\u0006N\u000b\u0000\u05b9\u00a2\u0001\u0000\u0000\u0000\u05ba"+ + "\u05bb\u0003\u00e1n\u0000\u05bb\u05bc\u0003\u00d1f\u0000\u05bc\u05bd\u0003"+ + "\u00efu\u0000\u05bd\u05be\u0003\u00c9b\u0000\u05be\u05bf\u0003\u00cfe"+ + "\u0000\u05bf\u05c0\u0003\u00c9b\u0000\u05c0\u05c1\u0003\u00efu\u0000\u05c1"+ + "\u05c2\u0003\u00c9b\u0000\u05c2\u00a4\u0001\u0000\u0000\u0000\u05c3\u05c5"+ + "\u0003\u00a7Q\u0000\u05c4\u05c3\u0001\u0000\u0000\u0000\u05c5\u05c6\u0001"+ + "\u0000\u0000\u0000\u05c6\u05c4\u0001\u0000\u0000\u0000\u05c6\u05c7\u0001"+ + "\u0000\u0000\u0000\u05c7\u00a6\u0001\u0000\u0000\u0000\u05c8\u05ca\b\n"+ + "\u0000\u0000\u05c9\u05c8\u0001\u0000\u0000\u0000\u05ca\u05cb\u0001\u0000"+ + "\u0000\u0000\u05cb\u05c9\u0001\u0000\u0000\u0000\u05cb\u05cc\u0001\u0000"+ + "\u0000\u0000\u05cc\u05d0\u0001\u0000\u0000\u0000\u05cd\u05ce\u0005/\u0000"+ + "\u0000\u05ce\u05d0\b\u000b\u0000\u0000\u05cf\u05c9\u0001\u0000\u0000\u0000"+ + "\u05cf\u05cd\u0001\u0000\u0000\u0000\u05d0\u00a8\u0001\u0000\u0000\u0000"+ + "\u05d1\u05d2\u0003\u0091F\u0000\u05d2\u00aa\u0001\u0000\u0000\u0000\u05d3"+ + "\u05d4\u0003\'\u0011\u0000\u05d4\u05d5\u0001\u0000\u0000\u0000\u05d5\u05d6"+ + "\u0006S\u0004\u0000\u05d6\u00ac\u0001\u0000\u0000\u0000\u05d7\u05d8\u0003"+ + ")\u0012\u0000\u05d8\u05d9\u0001\u0000\u0000\u0000\u05d9\u05da\u0006T\u0004"+ + "\u0000\u05da\u00ae\u0001\u0000\u0000\u0000\u05db\u05dc\u0003+\u0013\u0000"+ + "\u05dc\u05dd\u0001\u0000\u0000\u0000\u05dd\u05de\u0006U\u0004\u0000\u05de"+ + "\u00b0\u0001\u0000\u0000\u0000\u05df\u05e0\u0003\u00e5p\u0000\u05e0\u05e1"+ + "\u0003\u00e3o\u0000\u05e1\u00b2\u0001\u0000\u0000\u0000\u05e2\u05e3\u0003"+ + "\u00f5x\u0000\u05e3\u05e4\u0003\u00d9j\u0000\u05e4\u05e5\u0003\u00efu"+ + "\u0000\u05e5\u05e6\u0003\u00d7i\u0000\u05e6\u00b4\u0001\u0000\u0000\u0000"+ + "\u05e7\u05e8\u0005|\u0000\u0000\u05e8\u05e9\u0001\u0000\u0000\u0000\u05e9"+ + "\u05ea\u0006X\u0007\u0000\u05ea\u05eb\u0006X\b\u0000\u05eb\u00b6\u0001"+ + "\u0000\u0000\u0000\u05ec\u05ed\u0005]\u0000\u0000\u05ed\u05ee\u0001\u0000"+ + "\u0000\u0000\u05ee\u05ef\u0006Y\b\u0000\u05ef\u05f0\u0006Y\b\u0000\u05f0"+ + "\u05f1\u0006Y\t\u0000\u05f1\u00b8\u0001\u0000\u0000\u0000\u05f2\u05f3"+ + "\u0005,\u0000\u0000\u05f3\u05f4\u0001\u0000\u0000\u0000\u05f4\u05f5\u0006"+ + "Z\n\u0000\u05f5\u00ba\u0001\u0000\u0000\u0000\u05f6\u05f7\u0005=\u0000"+ + "\u0000\u05f7\u05f8\u0001\u0000\u0000\u0000\u05f8\u05f9\u0006[\u000b\u0000"+ + "\u05f9\u00bc\u0001\u0000\u0000\u0000\u05fa\u05fc\u0003\u00bf]\u0000\u05fb"+ + "\u05fa\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000\u0000\u0000\u05fd"+ + "\u05fb\u0001\u0000\u0000\u0000\u05fd\u05fe\u0001\u0000\u0000\u0000\u05fe"+ + "\u00be\u0001\u0000\u0000\u0000\u05ff\u0601\b\n\u0000\u0000\u0600\u05ff"+ + "\u0001\u0000\u0000\u0000\u0601\u0602\u0001\u0000\u0000\u0000\u0602\u0600"+ + "\u0001\u0000\u0000\u0000\u0602\u0603\u0001\u0000\u0000\u0000\u0603\u0607"+ + "\u0001\u0000\u0000\u0000\u0604\u0605\u0005/\u0000\u0000\u0605\u0607\b"+ + "\u000b\u0000\u0000\u0606\u0600\u0001\u0000\u0000\u0000\u0606\u0604\u0001"+ + "\u0000\u0000\u0000\u0607\u00c0\u0001\u0000\u0000\u0000\u0608\u0609\u0003"+ + "\u0091F\u0000\u0609\u00c2\u0001\u0000\u0000\u0000\u060a\u060b\u0003\'"+ + "\u0011\u0000\u060b\u060c\u0001\u0000\u0000\u0000\u060c\u060d\u0006_\u0004"+ + "\u0000\u060d\u00c4\u0001\u0000\u0000\u0000\u060e\u060f\u0003)\u0012\u0000"+ + "\u060f\u0610\u0001\u0000\u0000\u0000\u0610\u0611\u0006`\u0004\u0000\u0611"+ + "\u00c6\u0001\u0000\u0000\u0000\u0612\u0613\u0003+\u0013\u0000\u0613\u0614"+ + "\u0001\u0000\u0000\u0000\u0614\u0615\u0006a\u0004\u0000\u0615\u00c8\u0001"+ + "\u0000\u0000\u0000\u0616\u0617\u0007\f\u0000\u0000\u0617\u00ca\u0001\u0000"+ + "\u0000\u0000\u0618\u0619\u0007\r\u0000\u0000\u0619\u00cc\u0001\u0000\u0000"+ + "\u0000\u061a\u061b\u0007\u000e\u0000\u0000\u061b\u00ce\u0001\u0000\u0000"+ + "\u0000\u061c\u061d\u0007\u000f\u0000\u0000\u061d\u00d0\u0001\u0000\u0000"+ + "\u0000\u061e\u061f\u0007\u0006\u0000\u0000\u061f\u00d2\u0001\u0000\u0000"+ + "\u0000\u0620\u0621\u0007\u0010\u0000\u0000\u0621\u00d4\u0001\u0000\u0000"+ + "\u0000\u0622\u0623\u0007\u0011\u0000\u0000\u0623\u00d6\u0001\u0000\u0000"+ + "\u0000\u0624\u0625\u0007\u0012\u0000\u0000\u0625\u00d8\u0001\u0000\u0000"+ + "\u0000\u0626\u0627\u0007\u0013\u0000\u0000\u0627\u00da\u0001\u0000\u0000"+ + "\u0000\u0628\u0629\u0007\u0014\u0000\u0000\u0629\u00dc\u0001\u0000\u0000"+ + "\u0000\u062a\u062b\u0007\u0015\u0000\u0000\u062b\u00de\u0001\u0000\u0000"+ + "\u0000\u062c\u062d\u0007\u0016\u0000\u0000\u062d\u00e0\u0001\u0000\u0000"+ + "\u0000\u062e\u062f\u0007\u0017\u0000\u0000\u062f\u00e2\u0001\u0000\u0000"+ + "\u0000\u0630\u0631\u0007\u0018\u0000\u0000\u0631\u00e4\u0001\u0000\u0000"+ + "\u0000\u0632\u0633\u0007\u0019\u0000\u0000\u0633\u00e6\u0001\u0000\u0000"+ + "\u0000\u0634\u0635\u0007\u001a\u0000\u0000\u0635\u00e8\u0001\u0000\u0000"+ + "\u0000\u0636\u0637\u0007\u001b\u0000\u0000\u0637\u00ea\u0001\u0000\u0000"+ + "\u0000\u0638\u0639\u0007\u001c\u0000\u0000\u0639\u00ec\u0001\u0000\u0000"+ + "\u0000\u063a\u063b\u0007\u001d\u0000\u0000\u063b\u00ee\u0001\u0000\u0000"+ + "\u0000\u063c\u063d\u0007\u001e\u0000\u0000\u063d\u00f0\u0001\u0000\u0000"+ + "\u0000\u063e\u063f\u0007\u001f\u0000\u0000\u063f\u00f2\u0001\u0000\u0000"+ + "\u0000\u0640\u0641\u0007 \u0000\u0000\u0641\u00f4\u0001\u0000\u0000\u0000"+ + "\u0642\u0643\u0007!\u0000\u0000\u0643\u00f6\u0001\u0000\u0000\u0000\u0644"+ + "\u0645\u0007\"\u0000\u0000\u0645\u00f8\u0001\u0000\u0000\u0000\u0646\u0647"+ + "\u0007#\u0000\u0000\u0647\u00fa\u0001\u0000\u0000\u0000\u0648\u0649\u0007"+ + "$\u0000\u0000\u0649\u00fc\u0001\u0000\u0000\u00000\u0000\u0001\u0002\u0003"+ + "\u0004\u018e\u0192\u0195\u019e\u01a0\u01ab\u01d4\u01d9\u01de\u01e0\u01eb"+ + "\u01f3\u01f6\u01f8\u01fd\u0202\u0208\u020f\u0214\u021a\u021d\u0225\u0229"+ + "\u028c\u02e0\u02ec\u0302\u0313\u04cf\u0568\u057a\u057c\u0584\u0586\u0588"+ + "\u058e\u0590\u05c6\u05cb\u05cf\u05fd\u0602\u0606\f\u0005\u0002\u0000\u0005"+ + "\u0001\u0000\u0005\u0003\u0000\u0005\u0004\u0000\u0000\u0001\u0000\u0007"+ + "#\u0000\u0005\u0000\u0000\u0007\u0018\u0000\u0004\u0000\u0000\u0007$\u0000"+ + "\u0007 \u0000\u0007\u001f\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/packages/kbn-esql/src/antlr/.antlr/esql_lexer.tokens b/packages/kbn-esql/src/antlr/.antlr/esql_lexer.tokens new file mode 100644 index 0000000000000..b72e97b9a2961 --- /dev/null +++ b/packages/kbn-esql/src/antlr/.antlr/esql_lexer.tokens @@ -0,0 +1,98 @@ +DISSECT=1 +GROK=2 +EVAL=3 +EXPLAIN=4 +FROM=5 +ROW=6 +STATS=7 +WHERE=8 +SORT=9 +MV_EXPAND=10 +LIMIT=11 +PROJECT=12 +DROP=13 +RENAME=14 +SHOW=15 +ENRICH=16 +KEEP=17 +LINE_COMMENT=18 +MULTILINE_COMMENT=19 +WS=20 +EXPLAIN_WS=21 +EXPLAIN_LINE_COMMENT=22 +EXPLAIN_MULTILINE_COMMENT=23 +PIPE=24 +STRING=25 +INTEGER_LITERAL=26 +DECIMAL_LITERAL=27 +BY=28 +DATE_LITERAL=29 +AND=30 +ASSIGN=31 +COMMA=32 +DOT=33 +LP=34 +OPENING_BRACKET=35 +CLOSING_BRACKET=36 +NOT=37 +LIKE=38 +RLIKE=39 +IN=40 +IS=41 +AS=42 +NULL=43 +OR=44 +RP=45 +UNDERSCORE=46 +INFO=47 +FUNCTIONS=48 +BOOLEAN_VALUE=49 +COMPARISON_OPERATOR=50 +PLUS=51 +MINUS=52 +ASTERISK=53 +SLASH=54 +PERCENT=55 +TEN=56 +ORDERING=57 +NULLS_ORDERING=58 +NULLS_ORDERING_DIRECTION=59 +MATH_FUNCTION=60 +UNARY_FUNCTION=61 +WHERE_FUNCTIONS=62 +UNQUOTED_IDENTIFIER=63 +QUOTED_IDENTIFIER=64 +EXPR_LINE_COMMENT=65 +EXPR_MULTILINE_COMMENT=66 +EXPR_WS=67 +METADATA=68 +SRC_UNQUOTED_IDENTIFIER=69 +SRC_QUOTED_IDENTIFIER=70 +SRC_LINE_COMMENT=71 +SRC_MULTILINE_COMMENT=72 +SRC_WS=73 +ON=74 +WITH=75 +ENR_UNQUOTED_IDENTIFIER=76 +ENR_QUOTED_IDENTIFIER=77 +ENR_LINE_COMMENT=78 +ENR_MULTILINE_COMMENT=79 +ENR_WS=80 +EXPLAIN_PIPE=81 +'by'=28 +'and'=30 +'.'=33 +'('=34 +']'=36 +'or'=44 +')'=45 +'_'=46 +'info'=47 +'functions'=48 +'+'=51 +'-'=52 +'*'=53 +'/'=54 +'%'=55 +'10'=56 +'nulls'=58 diff --git a/packages/kbn-esql/src/antlr/.antlr/esql_parser.interp b/packages/kbn-esql/src/antlr/.antlr/esql_parser.interp new file mode 100644 index 0000000000000..72a8d73c77d6d --- /dev/null +++ b/packages/kbn-esql/src/antlr/.antlr/esql_parser.interp @@ -0,0 +1,256 @@ +token literal names: +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +'|' +null +null +null +null +null +null +'=' +',' +null +'.' +null +null +null +'(' +null +null +null +null +null +null +null +'?' +null +')' +null +'==' +'!=' +'<' +'<=' +'>' +'>=' +'+' +'-' +'*' +'/' +'%' +null +']' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +DISSECT +DROP +ENRICH +EVAL +EXPLAIN +FROM +GROK +INLINESTATS +KEEP +LIMIT +MV_EXPAND +PROJECT +RENAME +ROW +SHOW +SORT +STATS +WHERE +UNKNOWN_CMD +LINE_COMMENT +MULTILINE_COMMENT +WS +EXPLAIN_WS +EXPLAIN_LINE_COMMENT +EXPLAIN_MULTILINE_COMMENT +PIPE +STRING +INTEGER_LITERAL +DECIMAL_LITERAL +BY +AND +ASC +ASSIGN +COMMA +DESC +DOT +FALSE +FIRST +LAST +LP +IN +IS +LIKE +NOT +NULL +NULLS +OR +PARAM +RLIKE +RP +TRUE +EQ +NEQ +LT +LTE +GT +GTE +PLUS +MINUS +ASTERISK +SLASH +PERCENT +OPENING_BRACKET +CLOSING_BRACKET +UNQUOTED_IDENTIFIER +QUOTED_IDENTIFIER +EXPR_LINE_COMMENT +EXPR_MULTILINE_COMMENT +EXPR_WS +METADATA +FROM_UNQUOTED_IDENTIFIER +FROM_LINE_COMMENT +FROM_MULTILINE_COMMENT +FROM_WS +PROJECT_UNQUOTED_IDENTIFIER +PROJECT_LINE_COMMENT +PROJECT_MULTILINE_COMMENT +PROJECT_WS +AS +RENAME_LINE_COMMENT +RENAME_MULTILINE_COMMENT +RENAME_WS +ON +WITH +ENRICH_LINE_COMMENT +ENRICH_MULTILINE_COMMENT +ENRICH_WS +ENRICH_FIELD_LINE_COMMENT +ENRICH_FIELD_MULTILINE_COMMENT +ENRICH_FIELD_WS +MVEXPAND_LINE_COMMENT +MVEXPAND_MULTILINE_COMMENT +MVEXPAND_WS +INFO +FUNCTIONS +SHOW_LINE_COMMENT +SHOW_MULTILINE_COMMENT +SHOW_WS + +rule names: +singleStatement +query +sourceCommand +processingCommand +whereCommand +booleanExpression +regexBooleanExpression +valueExpression +operatorExpression +primaryExpression +functionExpression +rowCommand +fields +field +fromCommand +metadata +evalCommand +statsCommand +inlinestatsCommand +grouping +fromIdentifier +qualifiedName +qualifiedNamePattern +identifier +identifierPattern +constant +limitCommand +sortCommand +orderExpression +keepCommand +dropCommand +renameCommand +renameClause +dissectCommand +grokCommand +mvExpandCommand +commandOptions +commandOption +booleanValue +numericValue +decimalValue +integerValue +string +comparisonOperator +explainCommand +subqueryExpression +showCommand +enrichCommand +enrichWithClause + + +atn: +[4, 1, 98, 519, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 108, 8, 1, 10, 1, 12, 1, 111, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 117, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 132, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 144, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 151, 8, 5, 10, 5, 12, 5, 154, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 161, 8, 5, 1, 5, 1, 5, 3, 5, 165, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 173, 8, 5, 10, 5, 12, 5, 176, 9, 5, 1, 6, 1, 6, 3, 6, 180, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 187, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 192, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 199, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 205, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 213, 8, 8, 10, 8, 12, 8, 216, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 225, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 233, 8, 10, 10, 10, 12, 10, 236, 9, 10, 3, 10, 238, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 5, 12, 248, 8, 12, 10, 12, 12, 12, 251, 9, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 258, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 264, 8, 14, 10, 14, 12, 14, 267, 9, 14, 1, 14, 3, 14, 270, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 277, 8, 15, 10, 15, 12, 15, 280, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 3, 17, 289, 8, 17, 1, 17, 1, 17, 3, 17, 293, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 299, 8, 18, 1, 19, 1, 19, 1, 19, 5, 19, 304, 8, 19, 10, 19, 12, 19, 307, 9, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 5, 21, 314, 8, 21, 10, 21, 12, 21, 317, 9, 21, 1, 22, 1, 22, 1, 22, 5, 22, 322, 8, 22, 10, 22, 12, 22, 325, 9, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 5, 25, 344, 8, 25, 10, 25, 12, 25, 347, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 5, 25, 355, 8, 25, 10, 25, 12, 25, 358, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 5, 25, 366, 8, 25, 10, 25, 12, 25, 369, 9, 25, 1, 25, 1, 25, 3, 25, 373, 8, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 382, 8, 27, 10, 27, 12, 27, 385, 9, 27, 1, 28, 1, 28, 3, 28, 389, 8, 28, 1, 28, 1, 28, 3, 28, 393, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 399, 8, 29, 10, 29, 12, 29, 402, 9, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 408, 8, 29, 10, 29, 12, 29, 411, 9, 29, 3, 29, 413, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 419, 8, 30, 10, 30, 12, 30, 422, 9, 30, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 428, 8, 31, 10, 31, 12, 31, 431, 9, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 441, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 5, 36, 453, 8, 36, 10, 36, 12, 36, 456, 9, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 3, 39, 466, 8, 39, 1, 40, 3, 40, 469, 8, 40, 1, 40, 1, 40, 1, 41, 3, 41, 474, 8, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 493, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 499, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 505, 8, 47, 10, 47, 12, 47, 508, 9, 47, 3, 47, 510, 8, 47, 1, 48, 1, 48, 1, 48, 3, 48, 515, 8, 48, 1, 48, 1, 48, 1, 48, 0, 3, 2, 10, 16, 49, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 0, 9, 1, 0, 58, 59, 1, 0, 60, 62, 2, 0, 66, 66, 71, 71, 1, 0, 65, 66, 2, 0, 66, 66, 75, 75, 2, 0, 32, 32, 35, 35, 1, 0, 38, 39, 2, 0, 37, 37, 51, 51, 1, 0, 52, 57, 548, 0, 98, 1, 0, 0, 0, 2, 101, 1, 0, 0, 0, 4, 116, 1, 0, 0, 0, 6, 131, 1, 0, 0, 0, 8, 133, 1, 0, 0, 0, 10, 164, 1, 0, 0, 0, 12, 191, 1, 0, 0, 0, 14, 198, 1, 0, 0, 0, 16, 204, 1, 0, 0, 0, 18, 224, 1, 0, 0, 0, 20, 226, 1, 0, 0, 0, 22, 241, 1, 0, 0, 0, 24, 244, 1, 0, 0, 0, 26, 257, 1, 0, 0, 0, 28, 259, 1, 0, 0, 0, 30, 271, 1, 0, 0, 0, 32, 283, 1, 0, 0, 0, 34, 286, 1, 0, 0, 0, 36, 294, 1, 0, 0, 0, 38, 300, 1, 0, 0, 0, 40, 308, 1, 0, 0, 0, 42, 310, 1, 0, 0, 0, 44, 318, 1, 0, 0, 0, 46, 326, 1, 0, 0, 0, 48, 328, 1, 0, 0, 0, 50, 372, 1, 0, 0, 0, 52, 374, 1, 0, 0, 0, 54, 377, 1, 0, 0, 0, 56, 386, 1, 0, 0, 0, 58, 412, 1, 0, 0, 0, 60, 414, 1, 0, 0, 0, 62, 423, 1, 0, 0, 0, 64, 432, 1, 0, 0, 0, 66, 436, 1, 0, 0, 0, 68, 442, 1, 0, 0, 0, 70, 446, 1, 0, 0, 0, 72, 449, 1, 0, 0, 0, 74, 457, 1, 0, 0, 0, 76, 461, 1, 0, 0, 0, 78, 465, 1, 0, 0, 0, 80, 468, 1, 0, 0, 0, 82, 473, 1, 0, 0, 0, 84, 477, 1, 0, 0, 0, 86, 479, 1, 0, 0, 0, 88, 481, 1, 0, 0, 0, 90, 484, 1, 0, 0, 0, 92, 492, 1, 0, 0, 0, 94, 494, 1, 0, 0, 0, 96, 514, 1, 0, 0, 0, 98, 99, 3, 2, 1, 0, 99, 100, 5, 0, 0, 1, 100, 1, 1, 0, 0, 0, 101, 102, 6, 1, -1, 0, 102, 103, 3, 4, 2, 0, 103, 109, 1, 0, 0, 0, 104, 105, 10, 1, 0, 0, 105, 106, 5, 26, 0, 0, 106, 108, 3, 6, 3, 0, 107, 104, 1, 0, 0, 0, 108, 111, 1, 0, 0, 0, 109, 107, 1, 0, 0, 0, 109, 110, 1, 0, 0, 0, 110, 3, 1, 0, 0, 0, 111, 109, 1, 0, 0, 0, 112, 117, 3, 88, 44, 0, 113, 117, 3, 28, 14, 0, 114, 117, 3, 22, 11, 0, 115, 117, 3, 92, 46, 0, 116, 112, 1, 0, 0, 0, 116, 113, 1, 0, 0, 0, 116, 114, 1, 0, 0, 0, 116, 115, 1, 0, 0, 0, 117, 5, 1, 0, 0, 0, 118, 132, 3, 32, 16, 0, 119, 132, 3, 36, 18, 0, 120, 132, 3, 52, 26, 0, 121, 132, 3, 58, 29, 0, 122, 132, 3, 54, 27, 0, 123, 132, 3, 34, 17, 0, 124, 132, 3, 8, 4, 0, 125, 132, 3, 60, 30, 0, 126, 132, 3, 62, 31, 0, 127, 132, 3, 66, 33, 0, 128, 132, 3, 68, 34, 0, 129, 132, 3, 94, 47, 0, 130, 132, 3, 70, 35, 0, 131, 118, 1, 0, 0, 0, 131, 119, 1, 0, 0, 0, 131, 120, 1, 0, 0, 0, 131, 121, 1, 0, 0, 0, 131, 122, 1, 0, 0, 0, 131, 123, 1, 0, 0, 0, 131, 124, 1, 0, 0, 0, 131, 125, 1, 0, 0, 0, 131, 126, 1, 0, 0, 0, 131, 127, 1, 0, 0, 0, 131, 128, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 131, 130, 1, 0, 0, 0, 132, 7, 1, 0, 0, 0, 133, 134, 5, 18, 0, 0, 134, 135, 3, 10, 5, 0, 135, 9, 1, 0, 0, 0, 136, 137, 6, 5, -1, 0, 137, 138, 5, 44, 0, 0, 138, 165, 3, 10, 5, 7, 139, 165, 3, 14, 7, 0, 140, 165, 3, 12, 6, 0, 141, 143, 3, 14, 7, 0, 142, 144, 5, 44, 0, 0, 143, 142, 1, 0, 0, 0, 143, 144, 1, 0, 0, 0, 144, 145, 1, 0, 0, 0, 145, 146, 5, 41, 0, 0, 146, 147, 5, 40, 0, 0, 147, 152, 3, 14, 7, 0, 148, 149, 5, 34, 0, 0, 149, 151, 3, 14, 7, 0, 150, 148, 1, 0, 0, 0, 151, 154, 1, 0, 0, 0, 152, 150, 1, 0, 0, 0, 152, 153, 1, 0, 0, 0, 153, 155, 1, 0, 0, 0, 154, 152, 1, 0, 0, 0, 155, 156, 5, 50, 0, 0, 156, 165, 1, 0, 0, 0, 157, 158, 3, 14, 7, 0, 158, 160, 5, 42, 0, 0, 159, 161, 5, 44, 0, 0, 160, 159, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 163, 5, 45, 0, 0, 163, 165, 1, 0, 0, 0, 164, 136, 1, 0, 0, 0, 164, 139, 1, 0, 0, 0, 164, 140, 1, 0, 0, 0, 164, 141, 1, 0, 0, 0, 164, 157, 1, 0, 0, 0, 165, 174, 1, 0, 0, 0, 166, 167, 10, 4, 0, 0, 167, 168, 5, 31, 0, 0, 168, 173, 3, 10, 5, 5, 169, 170, 10, 3, 0, 0, 170, 171, 5, 47, 0, 0, 171, 173, 3, 10, 5, 4, 172, 166, 1, 0, 0, 0, 172, 169, 1, 0, 0, 0, 173, 176, 1, 0, 0, 0, 174, 172, 1, 0, 0, 0, 174, 175, 1, 0, 0, 0, 175, 11, 1, 0, 0, 0, 176, 174, 1, 0, 0, 0, 177, 179, 3, 14, 7, 0, 178, 180, 5, 44, 0, 0, 179, 178, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 182, 5, 43, 0, 0, 182, 183, 3, 84, 42, 0, 183, 192, 1, 0, 0, 0, 184, 186, 3, 14, 7, 0, 185, 187, 5, 44, 0, 0, 186, 185, 1, 0, 0, 0, 186, 187, 1, 0, 0, 0, 187, 188, 1, 0, 0, 0, 188, 189, 5, 49, 0, 0, 189, 190, 3, 84, 42, 0, 190, 192, 1, 0, 0, 0, 191, 177, 1, 0, 0, 0, 191, 184, 1, 0, 0, 0, 192, 13, 1, 0, 0, 0, 193, 199, 3, 16, 8, 0, 194, 195, 3, 16, 8, 0, 195, 196, 3, 86, 43, 0, 196, 197, 3, 16, 8, 0, 197, 199, 1, 0, 0, 0, 198, 193, 1, 0, 0, 0, 198, 194, 1, 0, 0, 0, 199, 15, 1, 0, 0, 0, 200, 201, 6, 8, -1, 0, 201, 205, 3, 18, 9, 0, 202, 203, 7, 0, 0, 0, 203, 205, 3, 16, 8, 3, 204, 200, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 205, 214, 1, 0, 0, 0, 206, 207, 10, 2, 0, 0, 207, 208, 7, 1, 0, 0, 208, 213, 3, 16, 8, 3, 209, 210, 10, 1, 0, 0, 210, 211, 7, 0, 0, 0, 211, 213, 3, 16, 8, 2, 212, 206, 1, 0, 0, 0, 212, 209, 1, 0, 0, 0, 213, 216, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 214, 215, 1, 0, 0, 0, 215, 17, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 217, 225, 3, 50, 25, 0, 218, 225, 3, 42, 21, 0, 219, 225, 3, 20, 10, 0, 220, 221, 5, 40, 0, 0, 221, 222, 3, 10, 5, 0, 222, 223, 5, 50, 0, 0, 223, 225, 1, 0, 0, 0, 224, 217, 1, 0, 0, 0, 224, 218, 1, 0, 0, 0, 224, 219, 1, 0, 0, 0, 224, 220, 1, 0, 0, 0, 225, 19, 1, 0, 0, 0, 226, 227, 3, 46, 23, 0, 227, 237, 5, 40, 0, 0, 228, 238, 5, 60, 0, 0, 229, 234, 3, 10, 5, 0, 230, 231, 5, 34, 0, 0, 231, 233, 3, 10, 5, 0, 232, 230, 1, 0, 0, 0, 233, 236, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 234, 235, 1, 0, 0, 0, 235, 238, 1, 0, 0, 0, 236, 234, 1, 0, 0, 0, 237, 228, 1, 0, 0, 0, 237, 229, 1, 0, 0, 0, 237, 238, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 240, 5, 50, 0, 0, 240, 21, 1, 0, 0, 0, 241, 242, 5, 14, 0, 0, 242, 243, 3, 24, 12, 0, 243, 23, 1, 0, 0, 0, 244, 249, 3, 26, 13, 0, 245, 246, 5, 34, 0, 0, 246, 248, 3, 26, 13, 0, 247, 245, 1, 0, 0, 0, 248, 251, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 25, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 252, 258, 3, 10, 5, 0, 253, 254, 3, 42, 21, 0, 254, 255, 5, 33, 0, 0, 255, 256, 3, 10, 5, 0, 256, 258, 1, 0, 0, 0, 257, 252, 1, 0, 0, 0, 257, 253, 1, 0, 0, 0, 258, 27, 1, 0, 0, 0, 259, 260, 5, 6, 0, 0, 260, 265, 3, 40, 20, 0, 261, 262, 5, 34, 0, 0, 262, 264, 3, 40, 20, 0, 263, 261, 1, 0, 0, 0, 264, 267, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 265, 266, 1, 0, 0, 0, 266, 269, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 268, 270, 3, 30, 15, 0, 269, 268, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 29, 1, 0, 0, 0, 271, 272, 5, 63, 0, 0, 272, 273, 5, 70, 0, 0, 273, 278, 3, 40, 20, 0, 274, 275, 5, 34, 0, 0, 275, 277, 3, 40, 20, 0, 276, 274, 1, 0, 0, 0, 277, 280, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 281, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 281, 282, 5, 64, 0, 0, 282, 31, 1, 0, 0, 0, 283, 284, 5, 4, 0, 0, 284, 285, 3, 24, 12, 0, 285, 33, 1, 0, 0, 0, 286, 288, 5, 17, 0, 0, 287, 289, 3, 24, 12, 0, 288, 287, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, 291, 5, 30, 0, 0, 291, 293, 3, 38, 19, 0, 292, 290, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 35, 1, 0, 0, 0, 294, 295, 5, 8, 0, 0, 295, 298, 3, 24, 12, 0, 296, 297, 5, 30, 0, 0, 297, 299, 3, 38, 19, 0, 298, 296, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 37, 1, 0, 0, 0, 300, 305, 3, 42, 21, 0, 301, 302, 5, 34, 0, 0, 302, 304, 3, 42, 21, 0, 303, 301, 1, 0, 0, 0, 304, 307, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 39, 1, 0, 0, 0, 307, 305, 1, 0, 0, 0, 308, 309, 7, 2, 0, 0, 309, 41, 1, 0, 0, 0, 310, 315, 3, 46, 23, 0, 311, 312, 5, 36, 0, 0, 312, 314, 3, 46, 23, 0, 313, 311, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 43, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 318, 323, 3, 48, 24, 0, 319, 320, 5, 36, 0, 0, 320, 322, 3, 48, 24, 0, 321, 319, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 45, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 326, 327, 7, 3, 0, 0, 327, 47, 1, 0, 0, 0, 328, 329, 7, 4, 0, 0, 329, 49, 1, 0, 0, 0, 330, 373, 5, 45, 0, 0, 331, 332, 3, 82, 41, 0, 332, 333, 5, 65, 0, 0, 333, 373, 1, 0, 0, 0, 334, 373, 3, 80, 40, 0, 335, 373, 3, 82, 41, 0, 336, 373, 3, 76, 38, 0, 337, 373, 5, 48, 0, 0, 338, 373, 3, 84, 42, 0, 339, 340, 5, 63, 0, 0, 340, 345, 3, 78, 39, 0, 341, 342, 5, 34, 0, 0, 342, 344, 3, 78, 39, 0, 343, 341, 1, 0, 0, 0, 344, 347, 1, 0, 0, 0, 345, 343, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 348, 1, 0, 0, 0, 347, 345, 1, 0, 0, 0, 348, 349, 5, 64, 0, 0, 349, 373, 1, 0, 0, 0, 350, 351, 5, 63, 0, 0, 351, 356, 3, 76, 38, 0, 352, 353, 5, 34, 0, 0, 353, 355, 3, 76, 38, 0, 354, 352, 1, 0, 0, 0, 355, 358, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 359, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 359, 360, 5, 64, 0, 0, 360, 373, 1, 0, 0, 0, 361, 362, 5, 63, 0, 0, 362, 367, 3, 84, 42, 0, 363, 364, 5, 34, 0, 0, 364, 366, 3, 84, 42, 0, 365, 363, 1, 0, 0, 0, 366, 369, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 370, 1, 0, 0, 0, 369, 367, 1, 0, 0, 0, 370, 371, 5, 64, 0, 0, 371, 373, 1, 0, 0, 0, 372, 330, 1, 0, 0, 0, 372, 331, 1, 0, 0, 0, 372, 334, 1, 0, 0, 0, 372, 335, 1, 0, 0, 0, 372, 336, 1, 0, 0, 0, 372, 337, 1, 0, 0, 0, 372, 338, 1, 0, 0, 0, 372, 339, 1, 0, 0, 0, 372, 350, 1, 0, 0, 0, 372, 361, 1, 0, 0, 0, 373, 51, 1, 0, 0, 0, 374, 375, 5, 10, 0, 0, 375, 376, 5, 28, 0, 0, 376, 53, 1, 0, 0, 0, 377, 378, 5, 16, 0, 0, 378, 383, 3, 56, 28, 0, 379, 380, 5, 34, 0, 0, 380, 382, 3, 56, 28, 0, 381, 379, 1, 0, 0, 0, 382, 385, 1, 0, 0, 0, 383, 381, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 55, 1, 0, 0, 0, 385, 383, 1, 0, 0, 0, 386, 388, 3, 10, 5, 0, 387, 389, 7, 5, 0, 0, 388, 387, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 392, 1, 0, 0, 0, 390, 391, 5, 46, 0, 0, 391, 393, 7, 6, 0, 0, 392, 390, 1, 0, 0, 0, 392, 393, 1, 0, 0, 0, 393, 57, 1, 0, 0, 0, 394, 395, 5, 9, 0, 0, 395, 400, 3, 44, 22, 0, 396, 397, 5, 34, 0, 0, 397, 399, 3, 44, 22, 0, 398, 396, 1, 0, 0, 0, 399, 402, 1, 0, 0, 0, 400, 398, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 413, 1, 0, 0, 0, 402, 400, 1, 0, 0, 0, 403, 404, 5, 12, 0, 0, 404, 409, 3, 44, 22, 0, 405, 406, 5, 34, 0, 0, 406, 408, 3, 44, 22, 0, 407, 405, 1, 0, 0, 0, 408, 411, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 412, 394, 1, 0, 0, 0, 412, 403, 1, 0, 0, 0, 413, 59, 1, 0, 0, 0, 414, 415, 5, 2, 0, 0, 415, 420, 3, 44, 22, 0, 416, 417, 5, 34, 0, 0, 417, 419, 3, 44, 22, 0, 418, 416, 1, 0, 0, 0, 419, 422, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 61, 1, 0, 0, 0, 422, 420, 1, 0, 0, 0, 423, 424, 5, 13, 0, 0, 424, 429, 3, 64, 32, 0, 425, 426, 5, 34, 0, 0, 426, 428, 3, 64, 32, 0, 427, 425, 1, 0, 0, 0, 428, 431, 1, 0, 0, 0, 429, 427, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 63, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 432, 433, 3, 44, 22, 0, 433, 434, 5, 79, 0, 0, 434, 435, 3, 44, 22, 0, 435, 65, 1, 0, 0, 0, 436, 437, 5, 1, 0, 0, 437, 438, 3, 18, 9, 0, 438, 440, 3, 84, 42, 0, 439, 441, 3, 72, 36, 0, 440, 439, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 67, 1, 0, 0, 0, 442, 443, 5, 7, 0, 0, 443, 444, 3, 18, 9, 0, 444, 445, 3, 84, 42, 0, 445, 69, 1, 0, 0, 0, 446, 447, 5, 11, 0, 0, 447, 448, 3, 42, 21, 0, 448, 71, 1, 0, 0, 0, 449, 454, 3, 74, 37, 0, 450, 451, 5, 34, 0, 0, 451, 453, 3, 74, 37, 0, 452, 450, 1, 0, 0, 0, 453, 456, 1, 0, 0, 0, 454, 452, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 73, 1, 0, 0, 0, 456, 454, 1, 0, 0, 0, 457, 458, 3, 46, 23, 0, 458, 459, 5, 33, 0, 0, 459, 460, 3, 50, 25, 0, 460, 75, 1, 0, 0, 0, 461, 462, 7, 7, 0, 0, 462, 77, 1, 0, 0, 0, 463, 466, 3, 80, 40, 0, 464, 466, 3, 82, 41, 0, 465, 463, 1, 0, 0, 0, 465, 464, 1, 0, 0, 0, 466, 79, 1, 0, 0, 0, 467, 469, 7, 0, 0, 0, 468, 467, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 5, 29, 0, 0, 471, 81, 1, 0, 0, 0, 472, 474, 7, 0, 0, 0, 473, 472, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 5, 28, 0, 0, 476, 83, 1, 0, 0, 0, 477, 478, 5, 27, 0, 0, 478, 85, 1, 0, 0, 0, 479, 480, 7, 8, 0, 0, 480, 87, 1, 0, 0, 0, 481, 482, 5, 5, 0, 0, 482, 483, 3, 90, 45, 0, 483, 89, 1, 0, 0, 0, 484, 485, 5, 63, 0, 0, 485, 486, 3, 2, 1, 0, 486, 487, 5, 64, 0, 0, 487, 91, 1, 0, 0, 0, 488, 489, 5, 15, 0, 0, 489, 493, 5, 94, 0, 0, 490, 491, 5, 15, 0, 0, 491, 493, 5, 95, 0, 0, 492, 488, 1, 0, 0, 0, 492, 490, 1, 0, 0, 0, 493, 93, 1, 0, 0, 0, 494, 495, 5, 3, 0, 0, 495, 498, 3, 40, 20, 0, 496, 497, 5, 83, 0, 0, 497, 499, 3, 44, 22, 0, 498, 496, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 509, 1, 0, 0, 0, 500, 501, 5, 84, 0, 0, 501, 506, 3, 96, 48, 0, 502, 503, 5, 34, 0, 0, 503, 505, 3, 96, 48, 0, 504, 502, 1, 0, 0, 0, 505, 508, 1, 0, 0, 0, 506, 504, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 510, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 509, 500, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 95, 1, 0, 0, 0, 511, 512, 3, 44, 22, 0, 512, 513, 5, 33, 0, 0, 513, 515, 1, 0, 0, 0, 514, 511, 1, 0, 0, 0, 514, 515, 1, 0, 0, 0, 515, 516, 1, 0, 0, 0, 516, 517, 3, 44, 22, 0, 517, 97, 1, 0, 0, 0, 52, 109, 116, 131, 143, 152, 160, 164, 172, 174, 179, 186, 191, 198, 204, 212, 214, 224, 234, 237, 249, 257, 265, 269, 278, 288, 292, 298, 305, 315, 323, 345, 356, 367, 372, 383, 388, 392, 400, 409, 412, 420, 429, 440, 454, 465, 468, 473, 492, 498, 506, 509, 514] \ No newline at end of file diff --git a/packages/kbn-esql/src/antlr/.antlr/esql_parser.java b/packages/kbn-esql/src/antlr/.antlr/esql_parser.java new file mode 100644 index 0000000000000..c784cc891d6a0 --- /dev/null +++ b/packages/kbn-esql/src/antlr/.antlr/esql_parser.java @@ -0,0 +1,3914 @@ +// Generated from /Users/marcoliberati/Work/kibana/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 by ANTLR 4.13.1 +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class esql_parser extends Parser { + static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, INLINESTATS=8, + KEEP=9, LIMIT=10, MV_EXPAND=11, PROJECT=12, RENAME=13, ROW=14, SHOW=15, + SORT=16, STATS=17, WHERE=18, UNKNOWN_CMD=19, LINE_COMMENT=20, MULTILINE_COMMENT=21, + WS=22, EXPLAIN_WS=23, EXPLAIN_LINE_COMMENT=24, EXPLAIN_MULTILINE_COMMENT=25, + PIPE=26, STRING=27, INTEGER_LITERAL=28, DECIMAL_LITERAL=29, BY=30, AND=31, + ASC=32, ASSIGN=33, COMMA=34, DESC=35, DOT=36, FALSE=37, FIRST=38, LAST=39, + LP=40, IN=41, IS=42, LIKE=43, NOT=44, NULL=45, NULLS=46, OR=47, PARAM=48, + RLIKE=49, RP=50, TRUE=51, EQ=52, NEQ=53, LT=54, LTE=55, GT=56, GTE=57, + PLUS=58, MINUS=59, ASTERISK=60, SLASH=61, PERCENT=62, OPENING_BRACKET=63, + CLOSING_BRACKET=64, UNQUOTED_IDENTIFIER=65, QUOTED_IDENTIFIER=66, EXPR_LINE_COMMENT=67, + EXPR_MULTILINE_COMMENT=68, EXPR_WS=69, METADATA=70, FROM_UNQUOTED_IDENTIFIER=71, + FROM_LINE_COMMENT=72, FROM_MULTILINE_COMMENT=73, FROM_WS=74, PROJECT_UNQUOTED_IDENTIFIER=75, + PROJECT_LINE_COMMENT=76, PROJECT_MULTILINE_COMMENT=77, PROJECT_WS=78, + AS=79, RENAME_LINE_COMMENT=80, RENAME_MULTILINE_COMMENT=81, RENAME_WS=82, + ON=83, WITH=84, ENRICH_LINE_COMMENT=85, ENRICH_MULTILINE_COMMENT=86, ENRICH_WS=87, + ENRICH_FIELD_LINE_COMMENT=88, ENRICH_FIELD_MULTILINE_COMMENT=89, ENRICH_FIELD_WS=90, + MVEXPAND_LINE_COMMENT=91, MVEXPAND_MULTILINE_COMMENT=92, MVEXPAND_WS=93, + INFO=94, FUNCTIONS=95, SHOW_LINE_COMMENT=96, SHOW_MULTILINE_COMMENT=97, + SHOW_WS=98; + public static final int + RULE_singleStatement = 0, RULE_query = 1, RULE_sourceCommand = 2, RULE_processingCommand = 3, + RULE_whereCommand = 4, RULE_booleanExpression = 5, RULE_regexBooleanExpression = 6, + RULE_valueExpression = 7, RULE_operatorExpression = 8, RULE_primaryExpression = 9, + RULE_functionExpression = 10, RULE_rowCommand = 11, RULE_fields = 12, + RULE_field = 13, RULE_fromCommand = 14, RULE_metadata = 15, RULE_evalCommand = 16, + RULE_statsCommand = 17, RULE_inlinestatsCommand = 18, RULE_grouping = 19, + RULE_fromIdentifier = 20, RULE_qualifiedName = 21, RULE_qualifiedNamePattern = 22, + RULE_identifier = 23, RULE_identifierPattern = 24, RULE_constant = 25, + RULE_limitCommand = 26, RULE_sortCommand = 27, RULE_orderExpression = 28, + RULE_keepCommand = 29, RULE_dropCommand = 30, RULE_renameCommand = 31, + RULE_renameClause = 32, RULE_dissectCommand = 33, RULE_grokCommand = 34, + RULE_mvExpandCommand = 35, RULE_commandOptions = 36, RULE_commandOption = 37, + RULE_booleanValue = 38, RULE_numericValue = 39, RULE_decimalValue = 40, + RULE_integerValue = 41, RULE_string = 42, RULE_comparisonOperator = 43, + RULE_explainCommand = 44, RULE_subqueryExpression = 45, RULE_showCommand = 46, + RULE_enrichCommand = 47, RULE_enrichWithClause = 48; + private static String[] makeRuleNames() { + return new String[] { + "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", + "booleanExpression", "regexBooleanExpression", "valueExpression", "operatorExpression", + "primaryExpression", "functionExpression", "rowCommand", "fields", "field", + "fromCommand", "metadata", "evalCommand", "statsCommand", "inlinestatsCommand", + "grouping", "fromIdentifier", "qualifiedName", "qualifiedNamePattern", + "identifier", "identifierPattern", "constant", "limitCommand", "sortCommand", + "orderExpression", "keepCommand", "dropCommand", "renameCommand", "renameClause", + "dissectCommand", "grokCommand", "mvExpandCommand", "commandOptions", + "commandOption", "booleanValue", "numericValue", "decimalValue", "integerValue", + "string", "comparisonOperator", "explainCommand", "subqueryExpression", + "showCommand", "enrichCommand", "enrichWithClause" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, "'|'", null, null, null, null, null, null, "'='", "','", + null, "'.'", null, null, null, "'('", null, null, null, null, null, null, + null, "'?'", null, "')'", null, "'=='", "'!='", "'<'", "'<='", "'>'", + "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", null, "']'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", + "INLINESTATS", "KEEP", "LIMIT", "MV_EXPAND", "PROJECT", "RENAME", "ROW", + "SHOW", "SORT", "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", + "WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", + "PIPE", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", + "ASC", "ASSIGN", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", + "IN", "IS", "LIKE", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", + "TRUE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", + "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", + "METADATA", "FROM_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", + "FROM_WS", "PROJECT_UNQUOTED_IDENTIFIER", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", + "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", + "RENAME_WS", "ON", "WITH", "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", + "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", + "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", + "MVEXPAND_WS", "INFO", "FUNCTIONS", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", + "SHOW_WS" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "esql_parser.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public esql_parser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @SuppressWarnings("CheckReturnValue") + public static class SingleStatementContext extends ParserRuleContext { + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public TerminalNode EOF() { return getToken(esql_parser.EOF, 0); } + public SingleStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleStatement; } + } + + public final SingleStatementContext singleStatement() throws RecognitionException { + SingleStatementContext _localctx = new SingleStatementContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_singleStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(98); + query(0); + setState(99); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class QueryContext extends ParserRuleContext { + public QueryContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_query; } + + public QueryContext() { } + public void copyFrom(QueryContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class CompositeQueryContext extends QueryContext { + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public TerminalNode PIPE() { return getToken(esql_parser.PIPE, 0); } + public ProcessingCommandContext processingCommand() { + return getRuleContext(ProcessingCommandContext.class,0); + } + public CompositeQueryContext(QueryContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class SingleCommandQueryContext extends QueryContext { + public SourceCommandContext sourceCommand() { + return getRuleContext(SourceCommandContext.class,0); + } + public SingleCommandQueryContext(QueryContext ctx) { copyFrom(ctx); } + } + + public final QueryContext query() throws RecognitionException { + return query(0); + } + + private QueryContext query(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + QueryContext _localctx = new QueryContext(_ctx, _parentState); + QueryContext _prevctx = _localctx; + int _startState = 2; + enterRecursionRule(_localctx, 2, RULE_query, _p); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + { + _localctx = new SingleCommandQueryContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(102); + sourceCommand(); + } + _ctx.stop = _input.LT(-1); + setState(109); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,0,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + { + _localctx = new CompositeQueryContext(new QueryContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_query); + setState(104); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); + setState(105); + match(PIPE); + setState(106); + processingCommand(); + } + } + } + setState(111); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,0,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SourceCommandContext extends ParserRuleContext { + public ExplainCommandContext explainCommand() { + return getRuleContext(ExplainCommandContext.class,0); + } + public FromCommandContext fromCommand() { + return getRuleContext(FromCommandContext.class,0); + } + public RowCommandContext rowCommand() { + return getRuleContext(RowCommandContext.class,0); + } + public ShowCommandContext showCommand() { + return getRuleContext(ShowCommandContext.class,0); + } + public SourceCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_sourceCommand; } + } + + public final SourceCommandContext sourceCommand() throws RecognitionException { + SourceCommandContext _localctx = new SourceCommandContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_sourceCommand); + try { + setState(116); + _errHandler.sync(this); + switch (_input.LA(1)) { + case EXPLAIN: + enterOuterAlt(_localctx, 1); + { + setState(112); + explainCommand(); + } + break; + case FROM: + enterOuterAlt(_localctx, 2); + { + setState(113); + fromCommand(); + } + break; + case ROW: + enterOuterAlt(_localctx, 3); + { + setState(114); + rowCommand(); + } + break; + case SHOW: + enterOuterAlt(_localctx, 4); + { + setState(115); + showCommand(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ProcessingCommandContext extends ParserRuleContext { + public EvalCommandContext evalCommand() { + return getRuleContext(EvalCommandContext.class,0); + } + public InlinestatsCommandContext inlinestatsCommand() { + return getRuleContext(InlinestatsCommandContext.class,0); + } + public LimitCommandContext limitCommand() { + return getRuleContext(LimitCommandContext.class,0); + } + public KeepCommandContext keepCommand() { + return getRuleContext(KeepCommandContext.class,0); + } + public SortCommandContext sortCommand() { + return getRuleContext(SortCommandContext.class,0); + } + public StatsCommandContext statsCommand() { + return getRuleContext(StatsCommandContext.class,0); + } + public WhereCommandContext whereCommand() { + return getRuleContext(WhereCommandContext.class,0); + } + public DropCommandContext dropCommand() { + return getRuleContext(DropCommandContext.class,0); + } + public RenameCommandContext renameCommand() { + return getRuleContext(RenameCommandContext.class,0); + } + public DissectCommandContext dissectCommand() { + return getRuleContext(DissectCommandContext.class,0); + } + public GrokCommandContext grokCommand() { + return getRuleContext(GrokCommandContext.class,0); + } + public EnrichCommandContext enrichCommand() { + return getRuleContext(EnrichCommandContext.class,0); + } + public MvExpandCommandContext mvExpandCommand() { + return getRuleContext(MvExpandCommandContext.class,0); + } + public ProcessingCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_processingCommand; } + } + + public final ProcessingCommandContext processingCommand() throws RecognitionException { + ProcessingCommandContext _localctx = new ProcessingCommandContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_processingCommand); + try { + setState(131); + _errHandler.sync(this); + switch (_input.LA(1)) { + case EVAL: + enterOuterAlt(_localctx, 1); + { + setState(118); + evalCommand(); + } + break; + case INLINESTATS: + enterOuterAlt(_localctx, 2); + { + setState(119); + inlinestatsCommand(); + } + break; + case LIMIT: + enterOuterAlt(_localctx, 3); + { + setState(120); + limitCommand(); + } + break; + case KEEP: + case PROJECT: + enterOuterAlt(_localctx, 4); + { + setState(121); + keepCommand(); + } + break; + case SORT: + enterOuterAlt(_localctx, 5); + { + setState(122); + sortCommand(); + } + break; + case STATS: + enterOuterAlt(_localctx, 6); + { + setState(123); + statsCommand(); + } + break; + case WHERE: + enterOuterAlt(_localctx, 7); + { + setState(124); + whereCommand(); + } + break; + case DROP: + enterOuterAlt(_localctx, 8); + { + setState(125); + dropCommand(); + } + break; + case RENAME: + enterOuterAlt(_localctx, 9); + { + setState(126); + renameCommand(); + } + break; + case DISSECT: + enterOuterAlt(_localctx, 10); + { + setState(127); + dissectCommand(); + } + break; + case GROK: + enterOuterAlt(_localctx, 11); + { + setState(128); + grokCommand(); + } + break; + case ENRICH: + enterOuterAlt(_localctx, 12); + { + setState(129); + enrichCommand(); + } + break; + case MV_EXPAND: + enterOuterAlt(_localctx, 13); + { + setState(130); + mvExpandCommand(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class WhereCommandContext extends ParserRuleContext { + public TerminalNode WHERE() { return getToken(esql_parser.WHERE, 0); } + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public WhereCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_whereCommand; } + } + + public final WhereCommandContext whereCommand() throws RecognitionException { + WhereCommandContext _localctx = new WhereCommandContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_whereCommand); + try { + enterOuterAlt(_localctx, 1); + { + setState(133); + match(WHERE); + setState(134); + booleanExpression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BooleanExpressionContext extends ParserRuleContext { + public BooleanExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_booleanExpression; } + + public BooleanExpressionContext() { } + public void copyFrom(BooleanExpressionContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class LogicalNotContext extends BooleanExpressionContext { + public TerminalNode NOT() { return getToken(esql_parser.NOT, 0); } + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public LogicalNotContext(BooleanExpressionContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class BooleanDefaultContext extends BooleanExpressionContext { + public ValueExpressionContext valueExpression() { + return getRuleContext(ValueExpressionContext.class,0); + } + public BooleanDefaultContext(BooleanExpressionContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class IsNullContext extends BooleanExpressionContext { + public ValueExpressionContext valueExpression() { + return getRuleContext(ValueExpressionContext.class,0); + } + public TerminalNode IS() { return getToken(esql_parser.IS, 0); } + public TerminalNode NULL() { return getToken(esql_parser.NULL, 0); } + public TerminalNode NOT() { return getToken(esql_parser.NOT, 0); } + public IsNullContext(BooleanExpressionContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class RegexExpressionContext extends BooleanExpressionContext { + public RegexBooleanExpressionContext regexBooleanExpression() { + return getRuleContext(RegexBooleanExpressionContext.class,0); + } + public RegexExpressionContext(BooleanExpressionContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class LogicalInContext extends BooleanExpressionContext { + public List valueExpression() { + return getRuleContexts(ValueExpressionContext.class); + } + public ValueExpressionContext valueExpression(int i) { + return getRuleContext(ValueExpressionContext.class,i); + } + public TerminalNode IN() { return getToken(esql_parser.IN, 0); } + public TerminalNode LP() { return getToken(esql_parser.LP, 0); } + public TerminalNode RP() { return getToken(esql_parser.RP, 0); } + public TerminalNode NOT() { return getToken(esql_parser.NOT, 0); } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public LogicalInContext(BooleanExpressionContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class LogicalBinaryContext extends BooleanExpressionContext { + public BooleanExpressionContext left; + public Token operator; + public BooleanExpressionContext right; + public List booleanExpression() { + return getRuleContexts(BooleanExpressionContext.class); + } + public BooleanExpressionContext booleanExpression(int i) { + return getRuleContext(BooleanExpressionContext.class,i); + } + public TerminalNode AND() { return getToken(esql_parser.AND, 0); } + public TerminalNode OR() { return getToken(esql_parser.OR, 0); } + public LogicalBinaryContext(BooleanExpressionContext ctx) { copyFrom(ctx); } + } + + public final BooleanExpressionContext booleanExpression() throws RecognitionException { + return booleanExpression(0); + } + + private BooleanExpressionContext booleanExpression(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + BooleanExpressionContext _localctx = new BooleanExpressionContext(_ctx, _parentState); + BooleanExpressionContext _prevctx = _localctx; + int _startState = 10; + enterRecursionRule(_localctx, 10, RULE_booleanExpression, _p); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(164); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { + case 1: + { + _localctx = new LogicalNotContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(137); + match(NOT); + setState(138); + booleanExpression(7); + } + break; + case 2: + { + _localctx = new BooleanDefaultContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(139); + valueExpression(); + } + break; + case 3: + { + _localctx = new RegexExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(140); + regexBooleanExpression(); + } + break; + case 4: + { + _localctx = new LogicalInContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(141); + valueExpression(); + setState(143); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(142); + match(NOT); + } + } + + setState(145); + match(IN); + setState(146); + match(LP); + setState(147); + valueExpression(); + setState(152); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(148); + match(COMMA); + setState(149); + valueExpression(); + } + } + setState(154); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(155); + match(RP); + } + break; + case 5: + { + _localctx = new IsNullContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(157); + valueExpression(); + setState(158); + match(IS); + setState(160); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(159); + match(NOT); + } + } + + setState(162); + match(NULL); + } + break; + } + _ctx.stop = _input.LT(-1); + setState(174); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,8,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + setState(172); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { + case 1: + { + _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); + ((LogicalBinaryContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); + setState(166); + if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); + setState(167); + ((LogicalBinaryContext)_localctx).operator = match(AND); + setState(168); + ((LogicalBinaryContext)_localctx).right = booleanExpression(5); + } + break; + case 2: + { + _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); + ((LogicalBinaryContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); + setState(169); + if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); + setState(170); + ((LogicalBinaryContext)_localctx).operator = match(OR); + setState(171); + ((LogicalBinaryContext)_localctx).right = booleanExpression(4); + } + break; + } + } + } + setState(176); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,8,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RegexBooleanExpressionContext extends ParserRuleContext { + public Token kind; + public StringContext pattern; + public ValueExpressionContext valueExpression() { + return getRuleContext(ValueExpressionContext.class,0); + } + public TerminalNode LIKE() { return getToken(esql_parser.LIKE, 0); } + public StringContext string() { + return getRuleContext(StringContext.class,0); + } + public TerminalNode NOT() { return getToken(esql_parser.NOT, 0); } + public TerminalNode RLIKE() { return getToken(esql_parser.RLIKE, 0); } + public RegexBooleanExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_regexBooleanExpression; } + } + + public final RegexBooleanExpressionContext regexBooleanExpression() throws RecognitionException { + RegexBooleanExpressionContext _localctx = new RegexBooleanExpressionContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_regexBooleanExpression); + int _la; + try { + setState(191); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(177); + valueExpression(); + setState(179); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(178); + match(NOT); + } + } + + setState(181); + ((RegexBooleanExpressionContext)_localctx).kind = match(LIKE); + setState(182); + ((RegexBooleanExpressionContext)_localctx).pattern = string(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(184); + valueExpression(); + setState(186); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NOT) { + { + setState(185); + match(NOT); + } + } + + setState(188); + ((RegexBooleanExpressionContext)_localctx).kind = match(RLIKE); + setState(189); + ((RegexBooleanExpressionContext)_localctx).pattern = string(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ValueExpressionContext extends ParserRuleContext { + public ValueExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_valueExpression; } + + public ValueExpressionContext() { } + public void copyFrom(ValueExpressionContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ValueExpressionDefaultContext extends ValueExpressionContext { + public OperatorExpressionContext operatorExpression() { + return getRuleContext(OperatorExpressionContext.class,0); + } + public ValueExpressionDefaultContext(ValueExpressionContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class ComparisonContext extends ValueExpressionContext { + public OperatorExpressionContext left; + public OperatorExpressionContext right; + public ComparisonOperatorContext comparisonOperator() { + return getRuleContext(ComparisonOperatorContext.class,0); + } + public List operatorExpression() { + return getRuleContexts(OperatorExpressionContext.class); + } + public OperatorExpressionContext operatorExpression(int i) { + return getRuleContext(OperatorExpressionContext.class,i); + } + public ComparisonContext(ValueExpressionContext ctx) { copyFrom(ctx); } + } + + public final ValueExpressionContext valueExpression() throws RecognitionException { + ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_valueExpression); + try { + setState(198); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { + case 1: + _localctx = new ValueExpressionDefaultContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(193); + operatorExpression(0); + } + break; + case 2: + _localctx = new ComparisonContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(194); + ((ComparisonContext)_localctx).left = operatorExpression(0); + setState(195); + comparisonOperator(); + setState(196); + ((ComparisonContext)_localctx).right = operatorExpression(0); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class OperatorExpressionContext extends ParserRuleContext { + public OperatorExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_operatorExpression; } + + public OperatorExpressionContext() { } + public void copyFrom(OperatorExpressionContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class OperatorExpressionDefaultContext extends OperatorExpressionContext { + public PrimaryExpressionContext primaryExpression() { + return getRuleContext(PrimaryExpressionContext.class,0); + } + public OperatorExpressionDefaultContext(OperatorExpressionContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class ArithmeticBinaryContext extends OperatorExpressionContext { + public OperatorExpressionContext left; + public Token operator; + public OperatorExpressionContext right; + public List operatorExpression() { + return getRuleContexts(OperatorExpressionContext.class); + } + public OperatorExpressionContext operatorExpression(int i) { + return getRuleContext(OperatorExpressionContext.class,i); + } + public TerminalNode ASTERISK() { return getToken(esql_parser.ASTERISK, 0); } + public TerminalNode SLASH() { return getToken(esql_parser.SLASH, 0); } + public TerminalNode PERCENT() { return getToken(esql_parser.PERCENT, 0); } + public TerminalNode PLUS() { return getToken(esql_parser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(esql_parser.MINUS, 0); } + public ArithmeticBinaryContext(OperatorExpressionContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class ArithmeticUnaryContext extends OperatorExpressionContext { + public Token operator; + public OperatorExpressionContext operatorExpression() { + return getRuleContext(OperatorExpressionContext.class,0); + } + public TerminalNode MINUS() { return getToken(esql_parser.MINUS, 0); } + public TerminalNode PLUS() { return getToken(esql_parser.PLUS, 0); } + public ArithmeticUnaryContext(OperatorExpressionContext ctx) { copyFrom(ctx); } + } + + public final OperatorExpressionContext operatorExpression() throws RecognitionException { + return operatorExpression(0); + } + + private OperatorExpressionContext operatorExpression(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + OperatorExpressionContext _localctx = new OperatorExpressionContext(_ctx, _parentState); + OperatorExpressionContext _prevctx = _localctx; + int _startState = 16; + enterRecursionRule(_localctx, 16, RULE_operatorExpression, _p); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(204); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { + case 1: + { + _localctx = new OperatorExpressionDefaultContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(201); + primaryExpression(); + } + break; + case 2: + { + _localctx = new ArithmeticUnaryContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(202); + ((ArithmeticUnaryContext)_localctx).operator = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==PLUS || _la==MINUS) ) { + ((ArithmeticUnaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(203); + operatorExpression(3); + } + break; + } + _ctx.stop = _input.LT(-1); + setState(214); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,15,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + setState(212); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { + case 1: + { + _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); + ((ArithmeticBinaryContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); + setState(206); + if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); + setState(207); + ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 8070450532247928832L) != 0)) ) { + ((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(208); + ((ArithmeticBinaryContext)_localctx).right = operatorExpression(3); + } + break; + case 2: + { + _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); + ((ArithmeticBinaryContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); + setState(209); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); + setState(210); + ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==PLUS || _la==MINUS) ) { + ((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(211); + ((ArithmeticBinaryContext)_localctx).right = operatorExpression(2); + } + break; + } + } + } + setState(216); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,15,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PrimaryExpressionContext extends ParserRuleContext { + public PrimaryExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_primaryExpression; } + + public PrimaryExpressionContext() { } + public void copyFrom(PrimaryExpressionContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class DereferenceContext extends PrimaryExpressionContext { + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public DereferenceContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class ConstantDefaultContext extends PrimaryExpressionContext { + public ConstantContext constant() { + return getRuleContext(ConstantContext.class,0); + } + public ConstantDefaultContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class ParenthesizedExpressionContext extends PrimaryExpressionContext { + public TerminalNode LP() { return getToken(esql_parser.LP, 0); } + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public TerminalNode RP() { return getToken(esql_parser.RP, 0); } + public ParenthesizedExpressionContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class FunctionContext extends PrimaryExpressionContext { + public FunctionExpressionContext functionExpression() { + return getRuleContext(FunctionExpressionContext.class,0); + } + public FunctionContext(PrimaryExpressionContext ctx) { copyFrom(ctx); } + } + + public final PrimaryExpressionContext primaryExpression() throws RecognitionException { + PrimaryExpressionContext _localctx = new PrimaryExpressionContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_primaryExpression); + try { + setState(224); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { + case 1: + _localctx = new ConstantDefaultContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(217); + constant(); + } + break; + case 2: + _localctx = new DereferenceContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(218); + qualifiedName(); + } + break; + case 3: + _localctx = new FunctionContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(219); + functionExpression(); + } + break; + case 4: + _localctx = new ParenthesizedExpressionContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(220); + match(LP); + setState(221); + booleanExpression(0); + setState(222); + match(RP); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionExpressionContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode LP() { return getToken(esql_parser.LP, 0); } + public TerminalNode RP() { return getToken(esql_parser.RP, 0); } + public TerminalNode ASTERISK() { return getToken(esql_parser.ASTERISK, 0); } + public List booleanExpression() { + return getRuleContexts(BooleanExpressionContext.class); + } + public BooleanExpressionContext booleanExpression(int i) { + return getRuleContext(BooleanExpressionContext.class,i); + } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public FunctionExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionExpression; } + } + + public final FunctionExpressionContext functionExpression() throws RecognitionException { + FunctionExpressionContext _localctx = new FunctionExpressionContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_functionExpression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(226); + identifier(); + setState(227); + match(LP); + setState(237); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ASTERISK: + { + setState(228); + match(ASTERISK); + } + break; + case STRING: + case INTEGER_LITERAL: + case DECIMAL_LITERAL: + case FALSE: + case LP: + case NOT: + case NULL: + case PARAM: + case TRUE: + case PLUS: + case MINUS: + case OPENING_BRACKET: + case UNQUOTED_IDENTIFIER: + case QUOTED_IDENTIFIER: + { + { + setState(229); + booleanExpression(0); + setState(234); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(230); + match(COMMA); + setState(231); + booleanExpression(0); + } + } + setState(236); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + break; + case RP: + break; + default: + break; + } + setState(239); + match(RP); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RowCommandContext extends ParserRuleContext { + public TerminalNode ROW() { return getToken(esql_parser.ROW, 0); } + public FieldsContext fields() { + return getRuleContext(FieldsContext.class,0); + } + public RowCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_rowCommand; } + } + + public final RowCommandContext rowCommand() throws RecognitionException { + RowCommandContext _localctx = new RowCommandContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_rowCommand); + try { + enterOuterAlt(_localctx, 1); + { + setState(241); + match(ROW); + setState(242); + fields(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FieldsContext extends ParserRuleContext { + public List field() { + return getRuleContexts(FieldContext.class); + } + public FieldContext field(int i) { + return getRuleContext(FieldContext.class,i); + } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public FieldsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fields; } + } + + public final FieldsContext fields() throws RecognitionException { + FieldsContext _localctx = new FieldsContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_fields); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(244); + field(); + setState(249); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,19,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(245); + match(COMMA); + setState(246); + field(); + } + } + } + setState(251); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,19,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FieldContext extends ParserRuleContext { + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public TerminalNode ASSIGN() { return getToken(esql_parser.ASSIGN, 0); } + public FieldContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_field; } + } + + public final FieldContext field() throws RecognitionException { + FieldContext _localctx = new FieldContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_field); + try { + setState(257); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(252); + booleanExpression(0); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(253); + qualifiedName(); + setState(254); + match(ASSIGN); + setState(255); + booleanExpression(0); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FromCommandContext extends ParserRuleContext { + public TerminalNode FROM() { return getToken(esql_parser.FROM, 0); } + public List fromIdentifier() { + return getRuleContexts(FromIdentifierContext.class); + } + public FromIdentifierContext fromIdentifier(int i) { + return getRuleContext(FromIdentifierContext.class,i); + } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public MetadataContext metadata() { + return getRuleContext(MetadataContext.class,0); + } + public FromCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fromCommand; } + } + + public final FromCommandContext fromCommand() throws RecognitionException { + FromCommandContext _localctx = new FromCommandContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_fromCommand); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(259); + match(FROM); + setState(260); + fromIdentifier(); + setState(265); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,21,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(261); + match(COMMA); + setState(262); + fromIdentifier(); + } + } + } + setState(267); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,21,_ctx); + } + setState(269); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { + case 1: + { + setState(268); + metadata(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MetadataContext extends ParserRuleContext { + public TerminalNode OPENING_BRACKET() { return getToken(esql_parser.OPENING_BRACKET, 0); } + public TerminalNode METADATA() { return getToken(esql_parser.METADATA, 0); } + public List fromIdentifier() { + return getRuleContexts(FromIdentifierContext.class); + } + public FromIdentifierContext fromIdentifier(int i) { + return getRuleContext(FromIdentifierContext.class,i); + } + public TerminalNode CLOSING_BRACKET() { return getToken(esql_parser.CLOSING_BRACKET, 0); } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public MetadataContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_metadata; } + } + + public final MetadataContext metadata() throws RecognitionException { + MetadataContext _localctx = new MetadataContext(_ctx, getState()); + enterRule(_localctx, 30, RULE_metadata); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(271); + match(OPENING_BRACKET); + setState(272); + match(METADATA); + setState(273); + fromIdentifier(); + setState(278); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(274); + match(COMMA); + setState(275); + fromIdentifier(); + } + } + setState(280); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(281); + match(CLOSING_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class EvalCommandContext extends ParserRuleContext { + public TerminalNode EVAL() { return getToken(esql_parser.EVAL, 0); } + public FieldsContext fields() { + return getRuleContext(FieldsContext.class,0); + } + public EvalCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_evalCommand; } + } + + public final EvalCommandContext evalCommand() throws RecognitionException { + EvalCommandContext _localctx = new EvalCommandContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_evalCommand); + try { + enterOuterAlt(_localctx, 1); + { + setState(283); + match(EVAL); + setState(284); + fields(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StatsCommandContext extends ParserRuleContext { + public TerminalNode STATS() { return getToken(esql_parser.STATS, 0); } + public FieldsContext fields() { + return getRuleContext(FieldsContext.class,0); + } + public TerminalNode BY() { return getToken(esql_parser.BY, 0); } + public GroupingContext grouping() { + return getRuleContext(GroupingContext.class,0); + } + public StatsCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_statsCommand; } + } + + public final StatsCommandContext statsCommand() throws RecognitionException { + StatsCommandContext _localctx = new StatsCommandContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_statsCommand); + try { + enterOuterAlt(_localctx, 1); + { + setState(286); + match(STATS); + setState(288); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { + case 1: + { + setState(287); + fields(); + } + break; + } + setState(292); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { + case 1: + { + setState(290); + match(BY); + setState(291); + grouping(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InlinestatsCommandContext extends ParserRuleContext { + public TerminalNode INLINESTATS() { return getToken(esql_parser.INLINESTATS, 0); } + public FieldsContext fields() { + return getRuleContext(FieldsContext.class,0); + } + public TerminalNode BY() { return getToken(esql_parser.BY, 0); } + public GroupingContext grouping() { + return getRuleContext(GroupingContext.class,0); + } + public InlinestatsCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inlinestatsCommand; } + } + + public final InlinestatsCommandContext inlinestatsCommand() throws RecognitionException { + InlinestatsCommandContext _localctx = new InlinestatsCommandContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_inlinestatsCommand); + try { + enterOuterAlt(_localctx, 1); + { + setState(294); + match(INLINESTATS); + setState(295); + fields(); + setState(298); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { + case 1: + { + setState(296); + match(BY); + setState(297); + grouping(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class GroupingContext extends ParserRuleContext { + public List qualifiedName() { + return getRuleContexts(QualifiedNameContext.class); + } + public QualifiedNameContext qualifiedName(int i) { + return getRuleContext(QualifiedNameContext.class,i); + } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public GroupingContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_grouping; } + } + + public final GroupingContext grouping() throws RecognitionException { + GroupingContext _localctx = new GroupingContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_grouping); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(300); + qualifiedName(); + setState(305); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,27,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(301); + match(COMMA); + setState(302); + qualifiedName(); + } + } + } + setState(307); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,27,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FromIdentifierContext extends ParserRuleContext { + public TerminalNode FROM_UNQUOTED_IDENTIFIER() { return getToken(esql_parser.FROM_UNQUOTED_IDENTIFIER, 0); } + public TerminalNode QUOTED_IDENTIFIER() { return getToken(esql_parser.QUOTED_IDENTIFIER, 0); } + public FromIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fromIdentifier; } + } + + public final FromIdentifierContext fromIdentifier() throws RecognitionException { + FromIdentifierContext _localctx = new FromIdentifierContext(_ctx, getState()); + enterRule(_localctx, 40, RULE_fromIdentifier); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(308); + _la = _input.LA(1); + if ( !(_la==QUOTED_IDENTIFIER || _la==FROM_UNQUOTED_IDENTIFIER) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class QualifiedNameContext extends ParserRuleContext { + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public List DOT() { return getTokens(esql_parser.DOT); } + public TerminalNode DOT(int i) { + return getToken(esql_parser.DOT, i); + } + public QualifiedNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_qualifiedName; } + } + + public final QualifiedNameContext qualifiedName() throws RecognitionException { + QualifiedNameContext _localctx = new QualifiedNameContext(_ctx, getState()); + enterRule(_localctx, 42, RULE_qualifiedName); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(310); + identifier(); + setState(315); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,28,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(311); + match(DOT); + setState(312); + identifier(); + } + } + } + setState(317); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,28,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class QualifiedNamePatternContext extends ParserRuleContext { + public List identifierPattern() { + return getRuleContexts(IdentifierPatternContext.class); + } + public IdentifierPatternContext identifierPattern(int i) { + return getRuleContext(IdentifierPatternContext.class,i); + } + public List DOT() { return getTokens(esql_parser.DOT); } + public TerminalNode DOT(int i) { + return getToken(esql_parser.DOT, i); + } + public QualifiedNamePatternContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_qualifiedNamePattern; } + } + + public final QualifiedNamePatternContext qualifiedNamePattern() throws RecognitionException { + QualifiedNamePatternContext _localctx = new QualifiedNamePatternContext(_ctx, getState()); + enterRule(_localctx, 44, RULE_qualifiedNamePattern); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(318); + identifierPattern(); + setState(323); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,29,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(319); + match(DOT); + setState(320); + identifierPattern(); + } + } + } + setState(325); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,29,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IdentifierContext extends ParserRuleContext { + public TerminalNode UNQUOTED_IDENTIFIER() { return getToken(esql_parser.UNQUOTED_IDENTIFIER, 0); } + public TerminalNode QUOTED_IDENTIFIER() { return getToken(esql_parser.QUOTED_IDENTIFIER, 0); } + public IdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifier; } + } + + public final IdentifierContext identifier() throws RecognitionException { + IdentifierContext _localctx = new IdentifierContext(_ctx, getState()); + enterRule(_localctx, 46, RULE_identifier); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(326); + _la = _input.LA(1); + if ( !(_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IdentifierPatternContext extends ParserRuleContext { + public TerminalNode PROJECT_UNQUOTED_IDENTIFIER() { return getToken(esql_parser.PROJECT_UNQUOTED_IDENTIFIER, 0); } + public TerminalNode QUOTED_IDENTIFIER() { return getToken(esql_parser.QUOTED_IDENTIFIER, 0); } + public IdentifierPatternContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifierPattern; } + } + + public final IdentifierPatternContext identifierPattern() throws RecognitionException { + IdentifierPatternContext _localctx = new IdentifierPatternContext(_ctx, getState()); + enterRule(_localctx, 48, RULE_identifierPattern); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(328); + _la = _input.LA(1); + if ( !(_la==QUOTED_IDENTIFIER || _la==PROJECT_UNQUOTED_IDENTIFIER) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ConstantContext extends ParserRuleContext { + public ConstantContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constant; } + + public ConstantContext() { } + public void copyFrom(ConstantContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class BooleanArrayLiteralContext extends ConstantContext { + public TerminalNode OPENING_BRACKET() { return getToken(esql_parser.OPENING_BRACKET, 0); } + public List booleanValue() { + return getRuleContexts(BooleanValueContext.class); + } + public BooleanValueContext booleanValue(int i) { + return getRuleContext(BooleanValueContext.class,i); + } + public TerminalNode CLOSING_BRACKET() { return getToken(esql_parser.CLOSING_BRACKET, 0); } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public BooleanArrayLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class DecimalLiteralContext extends ConstantContext { + public DecimalValueContext decimalValue() { + return getRuleContext(DecimalValueContext.class,0); + } + public DecimalLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class NullLiteralContext extends ConstantContext { + public TerminalNode NULL() { return getToken(esql_parser.NULL, 0); } + public NullLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class QualifiedIntegerLiteralContext extends ConstantContext { + public IntegerValueContext integerValue() { + return getRuleContext(IntegerValueContext.class,0); + } + public TerminalNode UNQUOTED_IDENTIFIER() { return getToken(esql_parser.UNQUOTED_IDENTIFIER, 0); } + public QualifiedIntegerLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class StringArrayLiteralContext extends ConstantContext { + public TerminalNode OPENING_BRACKET() { return getToken(esql_parser.OPENING_BRACKET, 0); } + public List string() { + return getRuleContexts(StringContext.class); + } + public StringContext string(int i) { + return getRuleContext(StringContext.class,i); + } + public TerminalNode CLOSING_BRACKET() { return getToken(esql_parser.CLOSING_BRACKET, 0); } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public StringArrayLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class StringLiteralContext extends ConstantContext { + public StringContext string() { + return getRuleContext(StringContext.class,0); + } + public StringLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class NumericArrayLiteralContext extends ConstantContext { + public TerminalNode OPENING_BRACKET() { return getToken(esql_parser.OPENING_BRACKET, 0); } + public List numericValue() { + return getRuleContexts(NumericValueContext.class); + } + public NumericValueContext numericValue(int i) { + return getRuleContext(NumericValueContext.class,i); + } + public TerminalNode CLOSING_BRACKET() { return getToken(esql_parser.CLOSING_BRACKET, 0); } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public NumericArrayLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class InputParamContext extends ConstantContext { + public TerminalNode PARAM() { return getToken(esql_parser.PARAM, 0); } + public InputParamContext(ConstantContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class IntegerLiteralContext extends ConstantContext { + public IntegerValueContext integerValue() { + return getRuleContext(IntegerValueContext.class,0); + } + public IntegerLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class BooleanLiteralContext extends ConstantContext { + public BooleanValueContext booleanValue() { + return getRuleContext(BooleanValueContext.class,0); + } + public BooleanLiteralContext(ConstantContext ctx) { copyFrom(ctx); } + } + + public final ConstantContext constant() throws RecognitionException { + ConstantContext _localctx = new ConstantContext(_ctx, getState()); + enterRule(_localctx, 50, RULE_constant); + int _la; + try { + setState(372); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) { + case 1: + _localctx = new NullLiteralContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(330); + match(NULL); + } + break; + case 2: + _localctx = new QualifiedIntegerLiteralContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(331); + integerValue(); + setState(332); + match(UNQUOTED_IDENTIFIER); + } + break; + case 3: + _localctx = new DecimalLiteralContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(334); + decimalValue(); + } + break; + case 4: + _localctx = new IntegerLiteralContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(335); + integerValue(); + } + break; + case 5: + _localctx = new BooleanLiteralContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(336); + booleanValue(); + } + break; + case 6: + _localctx = new InputParamContext(_localctx); + enterOuterAlt(_localctx, 6); + { + setState(337); + match(PARAM); + } + break; + case 7: + _localctx = new StringLiteralContext(_localctx); + enterOuterAlt(_localctx, 7); + { + setState(338); + string(); + } + break; + case 8: + _localctx = new NumericArrayLiteralContext(_localctx); + enterOuterAlt(_localctx, 8); + { + setState(339); + match(OPENING_BRACKET); + setState(340); + numericValue(); + setState(345); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(341); + match(COMMA); + setState(342); + numericValue(); + } + } + setState(347); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(348); + match(CLOSING_BRACKET); + } + break; + case 9: + _localctx = new BooleanArrayLiteralContext(_localctx); + enterOuterAlt(_localctx, 9); + { + setState(350); + match(OPENING_BRACKET); + setState(351); + booleanValue(); + setState(356); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(352); + match(COMMA); + setState(353); + booleanValue(); + } + } + setState(358); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(359); + match(CLOSING_BRACKET); + } + break; + case 10: + _localctx = new StringArrayLiteralContext(_localctx); + enterOuterAlt(_localctx, 10); + { + setState(361); + match(OPENING_BRACKET); + setState(362); + string(); + setState(367); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(363); + match(COMMA); + setState(364); + string(); + } + } + setState(369); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(370); + match(CLOSING_BRACKET); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class LimitCommandContext extends ParserRuleContext { + public TerminalNode LIMIT() { return getToken(esql_parser.LIMIT, 0); } + public TerminalNode INTEGER_LITERAL() { return getToken(esql_parser.INTEGER_LITERAL, 0); } + public LimitCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_limitCommand; } + } + + public final LimitCommandContext limitCommand() throws RecognitionException { + LimitCommandContext _localctx = new LimitCommandContext(_ctx, getState()); + enterRule(_localctx, 52, RULE_limitCommand); + try { + enterOuterAlt(_localctx, 1); + { + setState(374); + match(LIMIT); + setState(375); + match(INTEGER_LITERAL); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SortCommandContext extends ParserRuleContext { + public TerminalNode SORT() { return getToken(esql_parser.SORT, 0); } + public List orderExpression() { + return getRuleContexts(OrderExpressionContext.class); + } + public OrderExpressionContext orderExpression(int i) { + return getRuleContext(OrderExpressionContext.class,i); + } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public SortCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_sortCommand; } + } + + public final SortCommandContext sortCommand() throws RecognitionException { + SortCommandContext _localctx = new SortCommandContext(_ctx, getState()); + enterRule(_localctx, 54, RULE_sortCommand); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(377); + match(SORT); + setState(378); + orderExpression(); + setState(383); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(379); + match(COMMA); + setState(380); + orderExpression(); + } + } + } + setState(385); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class OrderExpressionContext extends ParserRuleContext { + public Token ordering; + public Token nullOrdering; + public BooleanExpressionContext booleanExpression() { + return getRuleContext(BooleanExpressionContext.class,0); + } + public TerminalNode NULLS() { return getToken(esql_parser.NULLS, 0); } + public TerminalNode ASC() { return getToken(esql_parser.ASC, 0); } + public TerminalNode DESC() { return getToken(esql_parser.DESC, 0); } + public TerminalNode FIRST() { return getToken(esql_parser.FIRST, 0); } + public TerminalNode LAST() { return getToken(esql_parser.LAST, 0); } + public OrderExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_orderExpression; } + } + + public final OrderExpressionContext orderExpression() throws RecognitionException { + OrderExpressionContext _localctx = new OrderExpressionContext(_ctx, getState()); + enterRule(_localctx, 56, RULE_orderExpression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(386); + booleanExpression(0); + setState(388); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { + case 1: + { + setState(387); + ((OrderExpressionContext)_localctx).ordering = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==ASC || _la==DESC) ) { + ((OrderExpressionContext)_localctx).ordering = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + } + setState(392); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { + case 1: + { + setState(390); + match(NULLS); + setState(391); + ((OrderExpressionContext)_localctx).nullOrdering = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==FIRST || _la==LAST) ) { + ((OrderExpressionContext)_localctx).nullOrdering = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class KeepCommandContext extends ParserRuleContext { + public TerminalNode KEEP() { return getToken(esql_parser.KEEP, 0); } + public List qualifiedNamePattern() { + return getRuleContexts(QualifiedNamePatternContext.class); + } + public QualifiedNamePatternContext qualifiedNamePattern(int i) { + return getRuleContext(QualifiedNamePatternContext.class,i); + } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public TerminalNode PROJECT() { return getToken(esql_parser.PROJECT, 0); } + public KeepCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_keepCommand; } + } + + public final KeepCommandContext keepCommand() throws RecognitionException { + KeepCommandContext _localctx = new KeepCommandContext(_ctx, getState()); + enterRule(_localctx, 58, RULE_keepCommand); + try { + int _alt; + setState(412); + _errHandler.sync(this); + switch (_input.LA(1)) { + case KEEP: + enterOuterAlt(_localctx, 1); + { + setState(394); + match(KEEP); + setState(395); + qualifiedNamePattern(); + setState(400); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,37,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(396); + match(COMMA); + setState(397); + qualifiedNamePattern(); + } + } + } + setState(402); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,37,_ctx); + } + } + break; + case PROJECT: + enterOuterAlt(_localctx, 2); + { + setState(403); + match(PROJECT); + setState(404); + qualifiedNamePattern(); + setState(409); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(405); + match(COMMA); + setState(406); + qualifiedNamePattern(); + } + } + } + setState(411); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DropCommandContext extends ParserRuleContext { + public TerminalNode DROP() { return getToken(esql_parser.DROP, 0); } + public List qualifiedNamePattern() { + return getRuleContexts(QualifiedNamePatternContext.class); + } + public QualifiedNamePatternContext qualifiedNamePattern(int i) { + return getRuleContext(QualifiedNamePatternContext.class,i); + } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public DropCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_dropCommand; } + } + + public final DropCommandContext dropCommand() throws RecognitionException { + DropCommandContext _localctx = new DropCommandContext(_ctx, getState()); + enterRule(_localctx, 60, RULE_dropCommand); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(414); + match(DROP); + setState(415); + qualifiedNamePattern(); + setState(420); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,40,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(416); + match(COMMA); + setState(417); + qualifiedNamePattern(); + } + } + } + setState(422); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,40,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RenameCommandContext extends ParserRuleContext { + public TerminalNode RENAME() { return getToken(esql_parser.RENAME, 0); } + public List renameClause() { + return getRuleContexts(RenameClauseContext.class); + } + public RenameClauseContext renameClause(int i) { + return getRuleContext(RenameClauseContext.class,i); + } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public RenameCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_renameCommand; } + } + + public final RenameCommandContext renameCommand() throws RecognitionException { + RenameCommandContext _localctx = new RenameCommandContext(_ctx, getState()); + enterRule(_localctx, 62, RULE_renameCommand); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(423); + match(RENAME); + setState(424); + renameClause(); + setState(429); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,41,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(425); + match(COMMA); + setState(426); + renameClause(); + } + } + } + setState(431); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,41,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class RenameClauseContext extends ParserRuleContext { + public QualifiedNamePatternContext oldName; + public QualifiedNamePatternContext newName; + public TerminalNode AS() { return getToken(esql_parser.AS, 0); } + public List qualifiedNamePattern() { + return getRuleContexts(QualifiedNamePatternContext.class); + } + public QualifiedNamePatternContext qualifiedNamePattern(int i) { + return getRuleContext(QualifiedNamePatternContext.class,i); + } + public RenameClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_renameClause; } + } + + public final RenameClauseContext renameClause() throws RecognitionException { + RenameClauseContext _localctx = new RenameClauseContext(_ctx, getState()); + enterRule(_localctx, 64, RULE_renameClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(432); + ((RenameClauseContext)_localctx).oldName = qualifiedNamePattern(); + setState(433); + match(AS); + setState(434); + ((RenameClauseContext)_localctx).newName = qualifiedNamePattern(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DissectCommandContext extends ParserRuleContext { + public TerminalNode DISSECT() { return getToken(esql_parser.DISSECT, 0); } + public PrimaryExpressionContext primaryExpression() { + return getRuleContext(PrimaryExpressionContext.class,0); + } + public StringContext string() { + return getRuleContext(StringContext.class,0); + } + public CommandOptionsContext commandOptions() { + return getRuleContext(CommandOptionsContext.class,0); + } + public DissectCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_dissectCommand; } + } + + public final DissectCommandContext dissectCommand() throws RecognitionException { + DissectCommandContext _localctx = new DissectCommandContext(_ctx, getState()); + enterRule(_localctx, 66, RULE_dissectCommand); + try { + enterOuterAlt(_localctx, 1); + { + setState(436); + match(DISSECT); + setState(437); + primaryExpression(); + setState(438); + string(); + setState(440); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + case 1: + { + setState(439); + commandOptions(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class GrokCommandContext extends ParserRuleContext { + public TerminalNode GROK() { return getToken(esql_parser.GROK, 0); } + public PrimaryExpressionContext primaryExpression() { + return getRuleContext(PrimaryExpressionContext.class,0); + } + public StringContext string() { + return getRuleContext(StringContext.class,0); + } + public GrokCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_grokCommand; } + } + + public final GrokCommandContext grokCommand() throws RecognitionException { + GrokCommandContext _localctx = new GrokCommandContext(_ctx, getState()); + enterRule(_localctx, 68, RULE_grokCommand); + try { + enterOuterAlt(_localctx, 1); + { + setState(442); + match(GROK); + setState(443); + primaryExpression(); + setState(444); + string(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MvExpandCommandContext extends ParserRuleContext { + public TerminalNode MV_EXPAND() { return getToken(esql_parser.MV_EXPAND, 0); } + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public MvExpandCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_mvExpandCommand; } + } + + public final MvExpandCommandContext mvExpandCommand() throws RecognitionException { + MvExpandCommandContext _localctx = new MvExpandCommandContext(_ctx, getState()); + enterRule(_localctx, 70, RULE_mvExpandCommand); + try { + enterOuterAlt(_localctx, 1); + { + setState(446); + match(MV_EXPAND); + setState(447); + qualifiedName(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CommandOptionsContext extends ParserRuleContext { + public List commandOption() { + return getRuleContexts(CommandOptionContext.class); + } + public CommandOptionContext commandOption(int i) { + return getRuleContext(CommandOptionContext.class,i); + } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public CommandOptionsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_commandOptions; } + } + + public final CommandOptionsContext commandOptions() throws RecognitionException { + CommandOptionsContext _localctx = new CommandOptionsContext(_ctx, getState()); + enterRule(_localctx, 72, RULE_commandOptions); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(449); + commandOption(); + setState(454); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,43,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(450); + match(COMMA); + setState(451); + commandOption(); + } + } + } + setState(456); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,43,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CommandOptionContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode ASSIGN() { return getToken(esql_parser.ASSIGN, 0); } + public ConstantContext constant() { + return getRuleContext(ConstantContext.class,0); + } + public CommandOptionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_commandOption; } + } + + public final CommandOptionContext commandOption() throws RecognitionException { + CommandOptionContext _localctx = new CommandOptionContext(_ctx, getState()); + enterRule(_localctx, 74, RULE_commandOption); + try { + enterOuterAlt(_localctx, 1); + { + setState(457); + identifier(); + setState(458); + match(ASSIGN); + setState(459); + constant(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BooleanValueContext extends ParserRuleContext { + public TerminalNode TRUE() { return getToken(esql_parser.TRUE, 0); } + public TerminalNode FALSE() { return getToken(esql_parser.FALSE, 0); } + public BooleanValueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_booleanValue; } + } + + public final BooleanValueContext booleanValue() throws RecognitionException { + BooleanValueContext _localctx = new BooleanValueContext(_ctx, getState()); + enterRule(_localctx, 76, RULE_booleanValue); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(461); + _la = _input.LA(1); + if ( !(_la==FALSE || _la==TRUE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NumericValueContext extends ParserRuleContext { + public DecimalValueContext decimalValue() { + return getRuleContext(DecimalValueContext.class,0); + } + public IntegerValueContext integerValue() { + return getRuleContext(IntegerValueContext.class,0); + } + public NumericValueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_numericValue; } + } + + public final NumericValueContext numericValue() throws RecognitionException { + NumericValueContext _localctx = new NumericValueContext(_ctx, getState()); + enterRule(_localctx, 78, RULE_numericValue); + try { + setState(465); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(463); + decimalValue(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(464); + integerValue(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DecimalValueContext extends ParserRuleContext { + public TerminalNode DECIMAL_LITERAL() { return getToken(esql_parser.DECIMAL_LITERAL, 0); } + public TerminalNode PLUS() { return getToken(esql_parser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(esql_parser.MINUS, 0); } + public DecimalValueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_decimalValue; } + } + + public final DecimalValueContext decimalValue() throws RecognitionException { + DecimalValueContext _localctx = new DecimalValueContext(_ctx, getState()); + enterRule(_localctx, 80, RULE_decimalValue); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(468); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PLUS || _la==MINUS) { + { + setState(467); + _la = _input.LA(1); + if ( !(_la==PLUS || _la==MINUS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + + setState(470); + match(DECIMAL_LITERAL); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IntegerValueContext extends ParserRuleContext { + public TerminalNode INTEGER_LITERAL() { return getToken(esql_parser.INTEGER_LITERAL, 0); } + public TerminalNode PLUS() { return getToken(esql_parser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(esql_parser.MINUS, 0); } + public IntegerValueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_integerValue; } + } + + public final IntegerValueContext integerValue() throws RecognitionException { + IntegerValueContext _localctx = new IntegerValueContext(_ctx, getState()); + enterRule(_localctx, 82, RULE_integerValue); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(473); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PLUS || _la==MINUS) { + { + setState(472); + _la = _input.LA(1); + if ( !(_la==PLUS || _la==MINUS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + + setState(475); + match(INTEGER_LITERAL); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StringContext extends ParserRuleContext { + public TerminalNode STRING() { return getToken(esql_parser.STRING, 0); } + public StringContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_string; } + } + + public final StringContext string() throws RecognitionException { + StringContext _localctx = new StringContext(_ctx, getState()); + enterRule(_localctx, 84, RULE_string); + try { + enterOuterAlt(_localctx, 1); + { + setState(477); + match(STRING); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ComparisonOperatorContext extends ParserRuleContext { + public TerminalNode EQ() { return getToken(esql_parser.EQ, 0); } + public TerminalNode NEQ() { return getToken(esql_parser.NEQ, 0); } + public TerminalNode LT() { return getToken(esql_parser.LT, 0); } + public TerminalNode LTE() { return getToken(esql_parser.LTE, 0); } + public TerminalNode GT() { return getToken(esql_parser.GT, 0); } + public TerminalNode GTE() { return getToken(esql_parser.GTE, 0); } + public ComparisonOperatorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_comparisonOperator; } + } + + public final ComparisonOperatorContext comparisonOperator() throws RecognitionException { + ComparisonOperatorContext _localctx = new ComparisonOperatorContext(_ctx, getState()); + enterRule(_localctx, 86, RULE_comparisonOperator); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(479); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 283726776524341248L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExplainCommandContext extends ParserRuleContext { + public TerminalNode EXPLAIN() { return getToken(esql_parser.EXPLAIN, 0); } + public SubqueryExpressionContext subqueryExpression() { + return getRuleContext(SubqueryExpressionContext.class,0); + } + public ExplainCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_explainCommand; } + } + + public final ExplainCommandContext explainCommand() throws RecognitionException { + ExplainCommandContext _localctx = new ExplainCommandContext(_ctx, getState()); + enterRule(_localctx, 88, RULE_explainCommand); + try { + enterOuterAlt(_localctx, 1); + { + setState(481); + match(EXPLAIN); + setState(482); + subqueryExpression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SubqueryExpressionContext extends ParserRuleContext { + public TerminalNode OPENING_BRACKET() { return getToken(esql_parser.OPENING_BRACKET, 0); } + public QueryContext query() { + return getRuleContext(QueryContext.class,0); + } + public TerminalNode CLOSING_BRACKET() { return getToken(esql_parser.CLOSING_BRACKET, 0); } + public SubqueryExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_subqueryExpression; } + } + + public final SubqueryExpressionContext subqueryExpression() throws RecognitionException { + SubqueryExpressionContext _localctx = new SubqueryExpressionContext(_ctx, getState()); + enterRule(_localctx, 90, RULE_subqueryExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(484); + match(OPENING_BRACKET); + setState(485); + query(0); + setState(486); + match(CLOSING_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ShowCommandContext extends ParserRuleContext { + public ShowCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_showCommand; } + + public ShowCommandContext() { } + public void copyFrom(ShowCommandContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ShowInfoContext extends ShowCommandContext { + public TerminalNode SHOW() { return getToken(esql_parser.SHOW, 0); } + public TerminalNode INFO() { return getToken(esql_parser.INFO, 0); } + public ShowInfoContext(ShowCommandContext ctx) { copyFrom(ctx); } + } + @SuppressWarnings("CheckReturnValue") + public static class ShowFunctionsContext extends ShowCommandContext { + public TerminalNode SHOW() { return getToken(esql_parser.SHOW, 0); } + public TerminalNode FUNCTIONS() { return getToken(esql_parser.FUNCTIONS, 0); } + public ShowFunctionsContext(ShowCommandContext ctx) { copyFrom(ctx); } + } + + public final ShowCommandContext showCommand() throws RecognitionException { + ShowCommandContext _localctx = new ShowCommandContext(_ctx, getState()); + enterRule(_localctx, 92, RULE_showCommand); + try { + setState(492); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + case 1: + _localctx = new ShowInfoContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(488); + match(SHOW); + setState(489); + match(INFO); + } + break; + case 2: + _localctx = new ShowFunctionsContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(490); + match(SHOW); + setState(491); + match(FUNCTIONS); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class EnrichCommandContext extends ParserRuleContext { + public FromIdentifierContext policyName; + public QualifiedNamePatternContext matchField; + public TerminalNode ENRICH() { return getToken(esql_parser.ENRICH, 0); } + public FromIdentifierContext fromIdentifier() { + return getRuleContext(FromIdentifierContext.class,0); + } + public TerminalNode ON() { return getToken(esql_parser.ON, 0); } + public TerminalNode WITH() { return getToken(esql_parser.WITH, 0); } + public List enrichWithClause() { + return getRuleContexts(EnrichWithClauseContext.class); + } + public EnrichWithClauseContext enrichWithClause(int i) { + return getRuleContext(EnrichWithClauseContext.class,i); + } + public QualifiedNamePatternContext qualifiedNamePattern() { + return getRuleContext(QualifiedNamePatternContext.class,0); + } + public List COMMA() { return getTokens(esql_parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(esql_parser.COMMA, i); + } + public EnrichCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_enrichCommand; } + } + + public final EnrichCommandContext enrichCommand() throws RecognitionException { + EnrichCommandContext _localctx = new EnrichCommandContext(_ctx, getState()); + enterRule(_localctx, 94, RULE_enrichCommand); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(494); + match(ENRICH); + setState(495); + ((EnrichCommandContext)_localctx).policyName = fromIdentifier(); + setState(498); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { + case 1: + { + setState(496); + match(ON); + setState(497); + ((EnrichCommandContext)_localctx).matchField = qualifiedNamePattern(); + } + break; + } + setState(509); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { + case 1: + { + setState(500); + match(WITH); + setState(501); + enrichWithClause(); + setState(506); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,49,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(502); + match(COMMA); + setState(503); + enrichWithClause(); + } + } + } + setState(508); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,49,_ctx); + } + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class EnrichWithClauseContext extends ParserRuleContext { + public QualifiedNamePatternContext newName; + public QualifiedNamePatternContext enrichField; + public List qualifiedNamePattern() { + return getRuleContexts(QualifiedNamePatternContext.class); + } + public QualifiedNamePatternContext qualifiedNamePattern(int i) { + return getRuleContext(QualifiedNamePatternContext.class,i); + } + public TerminalNode ASSIGN() { return getToken(esql_parser.ASSIGN, 0); } + public EnrichWithClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_enrichWithClause; } + } + + public final EnrichWithClauseContext enrichWithClause() throws RecognitionException { + EnrichWithClauseContext _localctx = new EnrichWithClauseContext(_ctx, getState()); + enterRule(_localctx, 96, RULE_enrichWithClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(514); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { + case 1: + { + setState(511); + ((EnrichWithClauseContext)_localctx).newName = qualifiedNamePattern(); + setState(512); + match(ASSIGN); + } + break; + } + setState(516); + ((EnrichWithClauseContext)_localctx).enrichField = qualifiedNamePattern(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 1: + return query_sempred((QueryContext)_localctx, predIndex); + case 5: + return booleanExpression_sempred((BooleanExpressionContext)_localctx, predIndex); + case 8: + return operatorExpression_sempred((OperatorExpressionContext)_localctx, predIndex); + } + return true; + } + private boolean query_sempred(QueryContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return precpred(_ctx, 1); + } + return true; + } + private boolean booleanExpression_sempred(BooleanExpressionContext _localctx, int predIndex) { + switch (predIndex) { + case 1: + return precpred(_ctx, 4); + case 2: + return precpred(_ctx, 3); + } + return true; + } + private boolean operatorExpression_sempred(OperatorExpressionContext _localctx, int predIndex) { + switch (predIndex) { + case 3: + return precpred(_ctx, 2); + case 4: + return precpred(_ctx, 1); + } + return true; + } + + public static final String _serializedATN = + "\u0004\u0001b\u0207\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ + "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ + "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ + "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ + "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ + "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ + "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ + "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ + "\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+ + "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002"+ + "#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002"+ + "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+ + "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u0001\u0000\u0001\u0000"+ + "\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0005\u0001l\b\u0001\n\u0001\f\u0001o\t\u0001\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002u\b\u0002\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0003\u0003\u0084\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0003\u0005\u0090\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0005\u0005\u0097\b\u0005\n\u0005\f\u0005\u009a\t\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00a1"+ + "\b\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00a5\b\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005"+ + "\u00ad\b\u0005\n\u0005\f\u0005\u00b0\t\u0005\u0001\u0006\u0001\u0006\u0003"+ + "\u0006\u00b4\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0003\u0006\u00bb\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ + "\u0006\u00c0\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0003\u0007\u00c7\b\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0003"+ + "\b\u00cd\b\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0005\b\u00d5"+ + "\b\b\n\b\f\b\u00d8\t\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t"+ + "\u0001\t\u0003\t\u00e1\b\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0005\n\u00e9\b\n\n\n\f\n\u00ec\t\n\u0003\n\u00ee\b\n\u0001\n\u0001"+ + "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0005\f"+ + "\u00f8\b\f\n\f\f\f\u00fb\t\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003"+ + "\r\u0102\b\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0005\u000e"+ + "\u0108\b\u000e\n\u000e\f\u000e\u010b\t\u000e\u0001\u000e\u0003\u000e\u010e"+ + "\b\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0005"+ + "\u000f\u0115\b\u000f\n\u000f\f\u000f\u0118\t\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0003\u0011"+ + "\u0121\b\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u0125\b\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u012b\b\u0012\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0005\u0013\u0130\b\u0013\n\u0013\f\u0013"+ + "\u0133\t\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015"+ + "\u0005\u0015\u013a\b\u0015\n\u0015\f\u0015\u013d\t\u0015\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0005\u0016\u0142\b\u0016\n\u0016\f\u0016\u0145\t\u0016"+ + "\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019"+ + "\u0158\b\u0019\n\u0019\f\u0019\u015b\t\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u0163\b\u0019\n"+ + "\u0019\f\u0019\u0166\t\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u016e\b\u0019\n\u0019\f\u0019"+ + "\u0171\t\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u0175\b\u0019\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ + "\u001b\u0005\u001b\u017e\b\u001b\n\u001b\f\u001b\u0181\t\u001b\u0001\u001c"+ + "\u0001\u001c\u0003\u001c\u0185\b\u001c\u0001\u001c\u0001\u001c\u0003\u001c"+ + "\u0189\b\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0005\u001d"+ + "\u018f\b\u001d\n\u001d\f\u001d\u0192\t\u001d\u0001\u001d\u0001\u001d\u0001"+ + "\u001d\u0001\u001d\u0005\u001d\u0198\b\u001d\n\u001d\f\u001d\u019b\t\u001d"+ + "\u0003\u001d\u019d\b\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0005\u001e\u01a3\b\u001e\n\u001e\f\u001e\u01a6\t\u001e\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0005\u001f\u01ac\b\u001f\n\u001f\f\u001f"+ + "\u01af\t\u001f\u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001"+ + "!\u0003!\u01b9\b!\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001"+ + "#\u0001$\u0001$\u0001$\u0005$\u01c5\b$\n$\f$\u01c8\t$\u0001%\u0001%\u0001"+ + "%\u0001%\u0001&\u0001&\u0001\'\u0001\'\u0003\'\u01d2\b\'\u0001(\u0003"+ + "(\u01d5\b(\u0001(\u0001(\u0001)\u0003)\u01da\b)\u0001)\u0001)\u0001*\u0001"+ + "*\u0001+\u0001+\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ + ".\u0001.\u0001.\u0001.\u0003.\u01ed\b.\u0001/\u0001/\u0001/\u0001/\u0003"+ + "/\u01f3\b/\u0001/\u0001/\u0001/\u0001/\u0005/\u01f9\b/\n/\f/\u01fc\t/"+ + "\u0003/\u01fe\b/\u00010\u00010\u00010\u00030\u0203\b0\u00010\u00010\u0001"+ + "0\u0000\u0003\u0002\n\u00101\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+ + "\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPR"+ + "TVXZ\\^`\u0000\t\u0001\u0000:;\u0001\u0000<>\u0002\u0000BBGG\u0001\u0000"+ + "AB\u0002\u0000BBKK\u0002\u0000 ##\u0001\u0000&\'\u0002\u0000%%33\u0001"+ + "\u000049\u0224\u0000b\u0001\u0000\u0000\u0000\u0002e\u0001\u0000\u0000"+ + "\u0000\u0004t\u0001\u0000\u0000\u0000\u0006\u0083\u0001\u0000\u0000\u0000"+ + "\b\u0085\u0001\u0000\u0000\u0000\n\u00a4\u0001\u0000\u0000\u0000\f\u00bf"+ + "\u0001\u0000\u0000\u0000\u000e\u00c6\u0001\u0000\u0000\u0000\u0010\u00cc"+ + "\u0001\u0000\u0000\u0000\u0012\u00e0\u0001\u0000\u0000\u0000\u0014\u00e2"+ + "\u0001\u0000\u0000\u0000\u0016\u00f1\u0001\u0000\u0000\u0000\u0018\u00f4"+ + "\u0001\u0000\u0000\u0000\u001a\u0101\u0001\u0000\u0000\u0000\u001c\u0103"+ + "\u0001\u0000\u0000\u0000\u001e\u010f\u0001\u0000\u0000\u0000 \u011b\u0001"+ + "\u0000\u0000\u0000\"\u011e\u0001\u0000\u0000\u0000$\u0126\u0001\u0000"+ + "\u0000\u0000&\u012c\u0001\u0000\u0000\u0000(\u0134\u0001\u0000\u0000\u0000"+ + "*\u0136\u0001\u0000\u0000\u0000,\u013e\u0001\u0000\u0000\u0000.\u0146"+ + "\u0001\u0000\u0000\u00000\u0148\u0001\u0000\u0000\u00002\u0174\u0001\u0000"+ + "\u0000\u00004\u0176\u0001\u0000\u0000\u00006\u0179\u0001\u0000\u0000\u0000"+ + "8\u0182\u0001\u0000\u0000\u0000:\u019c\u0001\u0000\u0000\u0000<\u019e"+ + "\u0001\u0000\u0000\u0000>\u01a7\u0001\u0000\u0000\u0000@\u01b0\u0001\u0000"+ + "\u0000\u0000B\u01b4\u0001\u0000\u0000\u0000D\u01ba\u0001\u0000\u0000\u0000"+ + "F\u01be\u0001\u0000\u0000\u0000H\u01c1\u0001\u0000\u0000\u0000J\u01c9"+ + "\u0001\u0000\u0000\u0000L\u01cd\u0001\u0000\u0000\u0000N\u01d1\u0001\u0000"+ + "\u0000\u0000P\u01d4\u0001\u0000\u0000\u0000R\u01d9\u0001\u0000\u0000\u0000"+ + "T\u01dd\u0001\u0000\u0000\u0000V\u01df\u0001\u0000\u0000\u0000X\u01e1"+ + "\u0001\u0000\u0000\u0000Z\u01e4\u0001\u0000\u0000\u0000\\\u01ec\u0001"+ + "\u0000\u0000\u0000^\u01ee\u0001\u0000\u0000\u0000`\u0202\u0001\u0000\u0000"+ + "\u0000bc\u0003\u0002\u0001\u0000cd\u0005\u0000\u0000\u0001d\u0001\u0001"+ + "\u0000\u0000\u0000ef\u0006\u0001\uffff\uffff\u0000fg\u0003\u0004\u0002"+ + "\u0000gm\u0001\u0000\u0000\u0000hi\n\u0001\u0000\u0000ij\u0005\u001a\u0000"+ + "\u0000jl\u0003\u0006\u0003\u0000kh\u0001\u0000\u0000\u0000lo\u0001\u0000"+ + "\u0000\u0000mk\u0001\u0000\u0000\u0000mn\u0001\u0000\u0000\u0000n\u0003"+ + "\u0001\u0000\u0000\u0000om\u0001\u0000\u0000\u0000pu\u0003X,\u0000qu\u0003"+ + "\u001c\u000e\u0000ru\u0003\u0016\u000b\u0000su\u0003\\.\u0000tp\u0001"+ + "\u0000\u0000\u0000tq\u0001\u0000\u0000\u0000tr\u0001\u0000\u0000\u0000"+ + "ts\u0001\u0000\u0000\u0000u\u0005\u0001\u0000\u0000\u0000v\u0084\u0003"+ + " \u0010\u0000w\u0084\u0003$\u0012\u0000x\u0084\u00034\u001a\u0000y\u0084"+ + "\u0003:\u001d\u0000z\u0084\u00036\u001b\u0000{\u0084\u0003\"\u0011\u0000"+ + "|\u0084\u0003\b\u0004\u0000}\u0084\u0003<\u001e\u0000~\u0084\u0003>\u001f"+ + "\u0000\u007f\u0084\u0003B!\u0000\u0080\u0084\u0003D\"\u0000\u0081\u0084"+ + "\u0003^/\u0000\u0082\u0084\u0003F#\u0000\u0083v\u0001\u0000\u0000\u0000"+ + "\u0083w\u0001\u0000\u0000\u0000\u0083x\u0001\u0000\u0000\u0000\u0083y"+ + "\u0001\u0000\u0000\u0000\u0083z\u0001\u0000\u0000\u0000\u0083{\u0001\u0000"+ + "\u0000\u0000\u0083|\u0001\u0000\u0000\u0000\u0083}\u0001\u0000\u0000\u0000"+ + "\u0083~\u0001\u0000\u0000\u0000\u0083\u007f\u0001\u0000\u0000\u0000\u0083"+ + "\u0080\u0001\u0000\u0000\u0000\u0083\u0081\u0001\u0000\u0000\u0000\u0083"+ + "\u0082\u0001\u0000\u0000\u0000\u0084\u0007\u0001\u0000\u0000\u0000\u0085"+ + "\u0086\u0005\u0012\u0000\u0000\u0086\u0087\u0003\n\u0005\u0000\u0087\t"+ + "\u0001\u0000\u0000\u0000\u0088\u0089\u0006\u0005\uffff\uffff\u0000\u0089"+ + "\u008a\u0005,\u0000\u0000\u008a\u00a5\u0003\n\u0005\u0007\u008b\u00a5"+ + "\u0003\u000e\u0007\u0000\u008c\u00a5\u0003\f\u0006\u0000\u008d\u008f\u0003"+ + "\u000e\u0007\u0000\u008e\u0090\u0005,\u0000\u0000\u008f\u008e\u0001\u0000"+ + "\u0000\u0000\u008f\u0090\u0001\u0000\u0000\u0000\u0090\u0091\u0001\u0000"+ + "\u0000\u0000\u0091\u0092\u0005)\u0000\u0000\u0092\u0093\u0005(\u0000\u0000"+ + "\u0093\u0098\u0003\u000e\u0007\u0000\u0094\u0095\u0005\"\u0000\u0000\u0095"+ + "\u0097\u0003\u000e\u0007\u0000\u0096\u0094\u0001\u0000\u0000\u0000\u0097"+ + "\u009a\u0001\u0000\u0000\u0000\u0098\u0096\u0001\u0000\u0000\u0000\u0098"+ + "\u0099\u0001\u0000\u0000\u0000\u0099\u009b\u0001\u0000\u0000\u0000\u009a"+ + "\u0098\u0001\u0000\u0000\u0000\u009b\u009c\u00052\u0000\u0000\u009c\u00a5"+ + "\u0001\u0000\u0000\u0000\u009d\u009e\u0003\u000e\u0007\u0000\u009e\u00a0"+ + "\u0005*\u0000\u0000\u009f\u00a1\u0005,\u0000\u0000\u00a0\u009f\u0001\u0000"+ + "\u0000\u0000\u00a0\u00a1\u0001\u0000\u0000\u0000\u00a1\u00a2\u0001\u0000"+ + "\u0000\u0000\u00a2\u00a3\u0005-\u0000\u0000\u00a3\u00a5\u0001\u0000\u0000"+ + "\u0000\u00a4\u0088\u0001\u0000\u0000\u0000\u00a4\u008b\u0001\u0000\u0000"+ + "\u0000\u00a4\u008c\u0001\u0000\u0000\u0000\u00a4\u008d\u0001\u0000\u0000"+ + "\u0000\u00a4\u009d\u0001\u0000\u0000\u0000\u00a5\u00ae\u0001\u0000\u0000"+ + "\u0000\u00a6\u00a7\n\u0004\u0000\u0000\u00a7\u00a8\u0005\u001f\u0000\u0000"+ + "\u00a8\u00ad\u0003\n\u0005\u0005\u00a9\u00aa\n\u0003\u0000\u0000\u00aa"+ + "\u00ab\u0005/\u0000\u0000\u00ab\u00ad\u0003\n\u0005\u0004\u00ac\u00a6"+ + "\u0001\u0000\u0000\u0000\u00ac\u00a9\u0001\u0000\u0000\u0000\u00ad\u00b0"+ + "\u0001\u0000\u0000\u0000\u00ae\u00ac\u0001\u0000\u0000\u0000\u00ae\u00af"+ + "\u0001\u0000\u0000\u0000\u00af\u000b\u0001\u0000\u0000\u0000\u00b0\u00ae"+ + "\u0001\u0000\u0000\u0000\u00b1\u00b3\u0003\u000e\u0007\u0000\u00b2\u00b4"+ + "\u0005,\u0000\u0000\u00b3\u00b2\u0001\u0000\u0000\u0000\u00b3\u00b4\u0001"+ + "\u0000\u0000\u0000\u00b4\u00b5\u0001\u0000\u0000\u0000\u00b5\u00b6\u0005"+ + "+\u0000\u0000\u00b6\u00b7\u0003T*\u0000\u00b7\u00c0\u0001\u0000\u0000"+ + "\u0000\u00b8\u00ba\u0003\u000e\u0007\u0000\u00b9\u00bb\u0005,\u0000\u0000"+ + "\u00ba\u00b9\u0001\u0000\u0000\u0000\u00ba\u00bb\u0001\u0000\u0000\u0000"+ + "\u00bb\u00bc\u0001\u0000\u0000\u0000\u00bc\u00bd\u00051\u0000\u0000\u00bd"+ + "\u00be\u0003T*\u0000\u00be\u00c0\u0001\u0000\u0000\u0000\u00bf\u00b1\u0001"+ + "\u0000\u0000\u0000\u00bf\u00b8\u0001\u0000\u0000\u0000\u00c0\r\u0001\u0000"+ + "\u0000\u0000\u00c1\u00c7\u0003\u0010\b\u0000\u00c2\u00c3\u0003\u0010\b"+ + "\u0000\u00c3\u00c4\u0003V+\u0000\u00c4\u00c5\u0003\u0010\b\u0000\u00c5"+ + "\u00c7\u0001\u0000\u0000\u0000\u00c6\u00c1\u0001\u0000\u0000\u0000\u00c6"+ + "\u00c2\u0001\u0000\u0000\u0000\u00c7\u000f\u0001\u0000\u0000\u0000\u00c8"+ + "\u00c9\u0006\b\uffff\uffff\u0000\u00c9\u00cd\u0003\u0012\t\u0000\u00ca"+ + "\u00cb\u0007\u0000\u0000\u0000\u00cb\u00cd\u0003\u0010\b\u0003\u00cc\u00c8"+ + "\u0001\u0000\u0000\u0000\u00cc\u00ca\u0001\u0000\u0000\u0000\u00cd\u00d6"+ + "\u0001\u0000\u0000\u0000\u00ce\u00cf\n\u0002\u0000\u0000\u00cf\u00d0\u0007"+ + "\u0001\u0000\u0000\u00d0\u00d5\u0003\u0010\b\u0003\u00d1\u00d2\n\u0001"+ + "\u0000\u0000\u00d2\u00d3\u0007\u0000\u0000\u0000\u00d3\u00d5\u0003\u0010"+ + "\b\u0002\u00d4\u00ce\u0001\u0000\u0000\u0000\u00d4\u00d1\u0001\u0000\u0000"+ + "\u0000\u00d5\u00d8\u0001\u0000\u0000\u0000\u00d6\u00d4\u0001\u0000\u0000"+ + "\u0000\u00d6\u00d7\u0001\u0000\u0000\u0000\u00d7\u0011\u0001\u0000\u0000"+ + "\u0000\u00d8\u00d6\u0001\u0000\u0000\u0000\u00d9\u00e1\u00032\u0019\u0000"+ + "\u00da\u00e1\u0003*\u0015\u0000\u00db\u00e1\u0003\u0014\n\u0000\u00dc"+ + "\u00dd\u0005(\u0000\u0000\u00dd\u00de\u0003\n\u0005\u0000\u00de\u00df"+ + "\u00052\u0000\u0000\u00df\u00e1\u0001\u0000\u0000\u0000\u00e0\u00d9\u0001"+ + "\u0000\u0000\u0000\u00e0\u00da\u0001\u0000\u0000\u0000\u00e0\u00db\u0001"+ + "\u0000\u0000\u0000\u00e0\u00dc\u0001\u0000\u0000\u0000\u00e1\u0013\u0001"+ + "\u0000\u0000\u0000\u00e2\u00e3\u0003.\u0017\u0000\u00e3\u00ed\u0005(\u0000"+ + "\u0000\u00e4\u00ee\u0005<\u0000\u0000\u00e5\u00ea\u0003\n\u0005\u0000"+ + "\u00e6\u00e7\u0005\"\u0000\u0000\u00e7\u00e9\u0003\n\u0005\u0000\u00e8"+ + "\u00e6\u0001\u0000\u0000\u0000\u00e9\u00ec\u0001\u0000\u0000\u0000\u00ea"+ + "\u00e8\u0001\u0000\u0000\u0000\u00ea\u00eb\u0001\u0000\u0000\u0000\u00eb"+ + "\u00ee\u0001\u0000\u0000\u0000\u00ec\u00ea\u0001\u0000\u0000\u0000\u00ed"+ + "\u00e4\u0001\u0000\u0000\u0000\u00ed\u00e5\u0001\u0000\u0000\u0000\u00ed"+ + "\u00ee\u0001\u0000\u0000\u0000\u00ee\u00ef\u0001\u0000\u0000\u0000\u00ef"+ + "\u00f0\u00052\u0000\u0000\u00f0\u0015\u0001\u0000\u0000\u0000\u00f1\u00f2"+ + "\u0005\u000e\u0000\u0000\u00f2\u00f3\u0003\u0018\f\u0000\u00f3\u0017\u0001"+ + "\u0000\u0000\u0000\u00f4\u00f9\u0003\u001a\r\u0000\u00f5\u00f6\u0005\""+ + "\u0000\u0000\u00f6\u00f8\u0003\u001a\r\u0000\u00f7\u00f5\u0001\u0000\u0000"+ + "\u0000\u00f8\u00fb\u0001\u0000\u0000\u0000\u00f9\u00f7\u0001\u0000\u0000"+ + "\u0000\u00f9\u00fa\u0001\u0000\u0000\u0000\u00fa\u0019\u0001\u0000\u0000"+ + "\u0000\u00fb\u00f9\u0001\u0000\u0000\u0000\u00fc\u0102\u0003\n\u0005\u0000"+ + "\u00fd\u00fe\u0003*\u0015\u0000\u00fe\u00ff\u0005!\u0000\u0000\u00ff\u0100"+ + "\u0003\n\u0005\u0000\u0100\u0102\u0001\u0000\u0000\u0000\u0101\u00fc\u0001"+ + "\u0000\u0000\u0000\u0101\u00fd\u0001\u0000\u0000\u0000\u0102\u001b\u0001"+ + "\u0000\u0000\u0000\u0103\u0104\u0005\u0006\u0000\u0000\u0104\u0109\u0003"+ + "(\u0014\u0000\u0105\u0106\u0005\"\u0000\u0000\u0106\u0108\u0003(\u0014"+ + "\u0000\u0107\u0105\u0001\u0000\u0000\u0000\u0108\u010b\u0001\u0000\u0000"+ + "\u0000\u0109\u0107\u0001\u0000\u0000\u0000\u0109\u010a\u0001\u0000\u0000"+ + "\u0000\u010a\u010d\u0001\u0000\u0000\u0000\u010b\u0109\u0001\u0000\u0000"+ + "\u0000\u010c\u010e\u0003\u001e\u000f\u0000\u010d\u010c\u0001\u0000\u0000"+ + "\u0000\u010d\u010e\u0001\u0000\u0000\u0000\u010e\u001d\u0001\u0000\u0000"+ + "\u0000\u010f\u0110\u0005?\u0000\u0000\u0110\u0111\u0005F\u0000\u0000\u0111"+ + "\u0116\u0003(\u0014\u0000\u0112\u0113\u0005\"\u0000\u0000\u0113\u0115"+ + "\u0003(\u0014\u0000\u0114\u0112\u0001\u0000\u0000\u0000\u0115\u0118\u0001"+ + "\u0000\u0000\u0000\u0116\u0114\u0001\u0000\u0000\u0000\u0116\u0117\u0001"+ + "\u0000\u0000\u0000\u0117\u0119\u0001\u0000\u0000\u0000\u0118\u0116\u0001"+ + "\u0000\u0000\u0000\u0119\u011a\u0005@\u0000\u0000\u011a\u001f\u0001\u0000"+ + "\u0000\u0000\u011b\u011c\u0005\u0004\u0000\u0000\u011c\u011d\u0003\u0018"+ + "\f\u0000\u011d!\u0001\u0000\u0000\u0000\u011e\u0120\u0005\u0011\u0000"+ + "\u0000\u011f\u0121\u0003\u0018\f\u0000\u0120\u011f\u0001\u0000\u0000\u0000"+ + "\u0120\u0121\u0001\u0000\u0000\u0000\u0121\u0124\u0001\u0000\u0000\u0000"+ + "\u0122\u0123\u0005\u001e\u0000\u0000\u0123\u0125\u0003&\u0013\u0000\u0124"+ + "\u0122\u0001\u0000\u0000\u0000\u0124\u0125\u0001\u0000\u0000\u0000\u0125"+ + "#\u0001\u0000\u0000\u0000\u0126\u0127\u0005\b\u0000\u0000\u0127\u012a"+ + "\u0003\u0018\f\u0000\u0128\u0129\u0005\u001e\u0000\u0000\u0129\u012b\u0003"+ + "&\u0013\u0000\u012a\u0128\u0001\u0000\u0000\u0000\u012a\u012b\u0001\u0000"+ + "\u0000\u0000\u012b%\u0001\u0000\u0000\u0000\u012c\u0131\u0003*\u0015\u0000"+ + "\u012d\u012e\u0005\"\u0000\u0000\u012e\u0130\u0003*\u0015\u0000\u012f"+ + "\u012d\u0001\u0000\u0000\u0000\u0130\u0133\u0001\u0000\u0000\u0000\u0131"+ + "\u012f\u0001\u0000\u0000\u0000\u0131\u0132\u0001\u0000\u0000\u0000\u0132"+ + "\'\u0001\u0000\u0000\u0000\u0133\u0131\u0001\u0000\u0000\u0000\u0134\u0135"+ + "\u0007\u0002\u0000\u0000\u0135)\u0001\u0000\u0000\u0000\u0136\u013b\u0003"+ + ".\u0017\u0000\u0137\u0138\u0005$\u0000\u0000\u0138\u013a\u0003.\u0017"+ + "\u0000\u0139\u0137\u0001\u0000\u0000\u0000\u013a\u013d\u0001\u0000\u0000"+ + "\u0000\u013b\u0139\u0001\u0000\u0000\u0000\u013b\u013c\u0001\u0000\u0000"+ + "\u0000\u013c+\u0001\u0000\u0000\u0000\u013d\u013b\u0001\u0000\u0000\u0000"+ + "\u013e\u0143\u00030\u0018\u0000\u013f\u0140\u0005$\u0000\u0000\u0140\u0142"+ + "\u00030\u0018\u0000\u0141\u013f\u0001\u0000\u0000\u0000\u0142\u0145\u0001"+ + "\u0000\u0000\u0000\u0143\u0141\u0001\u0000\u0000\u0000\u0143\u0144\u0001"+ + "\u0000\u0000\u0000\u0144-\u0001\u0000\u0000\u0000\u0145\u0143\u0001\u0000"+ + "\u0000\u0000\u0146\u0147\u0007\u0003\u0000\u0000\u0147/\u0001\u0000\u0000"+ + "\u0000\u0148\u0149\u0007\u0004\u0000\u0000\u01491\u0001\u0000\u0000\u0000"+ + "\u014a\u0175\u0005-\u0000\u0000\u014b\u014c\u0003R)\u0000\u014c\u014d"+ + "\u0005A\u0000\u0000\u014d\u0175\u0001\u0000\u0000\u0000\u014e\u0175\u0003"+ + "P(\u0000\u014f\u0175\u0003R)\u0000\u0150\u0175\u0003L&\u0000\u0151\u0175"+ + "\u00050\u0000\u0000\u0152\u0175\u0003T*\u0000\u0153\u0154\u0005?\u0000"+ + "\u0000\u0154\u0159\u0003N\'\u0000\u0155\u0156\u0005\"\u0000\u0000\u0156"+ + "\u0158\u0003N\'\u0000\u0157\u0155\u0001\u0000\u0000\u0000\u0158\u015b"+ + "\u0001\u0000\u0000\u0000\u0159\u0157\u0001\u0000\u0000\u0000\u0159\u015a"+ + "\u0001\u0000\u0000\u0000\u015a\u015c\u0001\u0000\u0000\u0000\u015b\u0159"+ + "\u0001\u0000\u0000\u0000\u015c\u015d\u0005@\u0000\u0000\u015d\u0175\u0001"+ + "\u0000\u0000\u0000\u015e\u015f\u0005?\u0000\u0000\u015f\u0164\u0003L&"+ + "\u0000\u0160\u0161\u0005\"\u0000\u0000\u0161\u0163\u0003L&\u0000\u0162"+ + "\u0160\u0001\u0000\u0000\u0000\u0163\u0166\u0001\u0000\u0000\u0000\u0164"+ + "\u0162\u0001\u0000\u0000\u0000\u0164\u0165\u0001\u0000\u0000\u0000\u0165"+ + "\u0167\u0001\u0000\u0000\u0000\u0166\u0164\u0001\u0000\u0000\u0000\u0167"+ + "\u0168\u0005@\u0000\u0000\u0168\u0175\u0001\u0000\u0000\u0000\u0169\u016a"+ + "\u0005?\u0000\u0000\u016a\u016f\u0003T*\u0000\u016b\u016c\u0005\"\u0000"+ + "\u0000\u016c\u016e\u0003T*\u0000\u016d\u016b\u0001\u0000\u0000\u0000\u016e"+ + "\u0171\u0001\u0000\u0000\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u016f"+ + "\u0170\u0001\u0000\u0000\u0000\u0170\u0172\u0001\u0000\u0000\u0000\u0171"+ + "\u016f\u0001\u0000\u0000\u0000\u0172\u0173\u0005@\u0000\u0000\u0173\u0175"+ + "\u0001\u0000\u0000\u0000\u0174\u014a\u0001\u0000\u0000\u0000\u0174\u014b"+ + "\u0001\u0000\u0000\u0000\u0174\u014e\u0001\u0000\u0000\u0000\u0174\u014f"+ + "\u0001\u0000\u0000\u0000\u0174\u0150\u0001\u0000\u0000\u0000\u0174\u0151"+ + "\u0001\u0000\u0000\u0000\u0174\u0152\u0001\u0000\u0000\u0000\u0174\u0153"+ + "\u0001\u0000\u0000\u0000\u0174\u015e\u0001\u0000\u0000\u0000\u0174\u0169"+ + "\u0001\u0000\u0000\u0000\u01753\u0001\u0000\u0000\u0000\u0176\u0177\u0005"+ + "\n\u0000\u0000\u0177\u0178\u0005\u001c\u0000\u0000\u01785\u0001\u0000"+ + "\u0000\u0000\u0179\u017a\u0005\u0010\u0000\u0000\u017a\u017f\u00038\u001c"+ + "\u0000\u017b\u017c\u0005\"\u0000\u0000\u017c\u017e\u00038\u001c\u0000"+ + "\u017d\u017b\u0001\u0000\u0000\u0000\u017e\u0181\u0001\u0000\u0000\u0000"+ + "\u017f\u017d\u0001\u0000\u0000\u0000\u017f\u0180\u0001\u0000\u0000\u0000"+ + "\u01807\u0001\u0000\u0000\u0000\u0181\u017f\u0001\u0000\u0000\u0000\u0182"+ + "\u0184\u0003\n\u0005\u0000\u0183\u0185\u0007\u0005\u0000\u0000\u0184\u0183"+ + "\u0001\u0000\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000\u0185\u0188"+ + "\u0001\u0000\u0000\u0000\u0186\u0187\u0005.\u0000\u0000\u0187\u0189\u0007"+ + "\u0006\u0000\u0000\u0188\u0186\u0001\u0000\u0000\u0000\u0188\u0189\u0001"+ + "\u0000\u0000\u0000\u01899\u0001\u0000\u0000\u0000\u018a\u018b\u0005\t"+ + "\u0000\u0000\u018b\u0190\u0003,\u0016\u0000\u018c\u018d\u0005\"\u0000"+ + "\u0000\u018d\u018f\u0003,\u0016\u0000\u018e\u018c\u0001\u0000\u0000\u0000"+ + "\u018f\u0192\u0001\u0000\u0000\u0000\u0190\u018e\u0001\u0000\u0000\u0000"+ + "\u0190\u0191\u0001\u0000\u0000\u0000\u0191\u019d\u0001\u0000\u0000\u0000"+ + "\u0192\u0190\u0001\u0000\u0000\u0000\u0193\u0194\u0005\f\u0000\u0000\u0194"+ + "\u0199\u0003,\u0016\u0000\u0195\u0196\u0005\"\u0000\u0000\u0196\u0198"+ + "\u0003,\u0016\u0000\u0197\u0195\u0001\u0000\u0000\u0000\u0198\u019b\u0001"+ + "\u0000\u0000\u0000\u0199\u0197\u0001\u0000\u0000\u0000\u0199\u019a\u0001"+ + "\u0000\u0000\u0000\u019a\u019d\u0001\u0000\u0000\u0000\u019b\u0199\u0001"+ + "\u0000\u0000\u0000\u019c\u018a\u0001\u0000\u0000\u0000\u019c\u0193\u0001"+ + "\u0000\u0000\u0000\u019d;\u0001\u0000\u0000\u0000\u019e\u019f\u0005\u0002"+ + "\u0000\u0000\u019f\u01a4\u0003,\u0016\u0000\u01a0\u01a1\u0005\"\u0000"+ + "\u0000\u01a1\u01a3\u0003,\u0016\u0000\u01a2\u01a0\u0001\u0000\u0000\u0000"+ + "\u01a3\u01a6\u0001\u0000\u0000\u0000\u01a4\u01a2\u0001\u0000\u0000\u0000"+ + "\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5=\u0001\u0000\u0000\u0000\u01a6"+ + "\u01a4\u0001\u0000\u0000\u0000\u01a7\u01a8\u0005\r\u0000\u0000\u01a8\u01ad"+ + "\u0003@ \u0000\u01a9\u01aa\u0005\"\u0000\u0000\u01aa\u01ac\u0003@ \u0000"+ + "\u01ab\u01a9\u0001\u0000\u0000\u0000\u01ac\u01af\u0001\u0000\u0000\u0000"+ + "\u01ad\u01ab\u0001\u0000\u0000\u0000\u01ad\u01ae\u0001\u0000\u0000\u0000"+ + "\u01ae?\u0001\u0000\u0000\u0000\u01af\u01ad\u0001\u0000\u0000\u0000\u01b0"+ + "\u01b1\u0003,\u0016\u0000\u01b1\u01b2\u0005O\u0000\u0000\u01b2\u01b3\u0003"+ + ",\u0016\u0000\u01b3A\u0001\u0000\u0000\u0000\u01b4\u01b5\u0005\u0001\u0000"+ + "\u0000\u01b5\u01b6\u0003\u0012\t\u0000\u01b6\u01b8\u0003T*\u0000\u01b7"+ + "\u01b9\u0003H$\u0000\u01b8\u01b7\u0001\u0000\u0000\u0000\u01b8\u01b9\u0001"+ + "\u0000\u0000\u0000\u01b9C\u0001\u0000\u0000\u0000\u01ba\u01bb\u0005\u0007"+ + "\u0000\u0000\u01bb\u01bc\u0003\u0012\t\u0000\u01bc\u01bd\u0003T*\u0000"+ + "\u01bdE\u0001\u0000\u0000\u0000\u01be\u01bf\u0005\u000b\u0000\u0000\u01bf"+ + "\u01c0\u0003*\u0015\u0000\u01c0G\u0001\u0000\u0000\u0000\u01c1\u01c6\u0003"+ + "J%\u0000\u01c2\u01c3\u0005\"\u0000\u0000\u01c3\u01c5\u0003J%\u0000\u01c4"+ + "\u01c2\u0001\u0000\u0000\u0000\u01c5\u01c8\u0001\u0000\u0000\u0000\u01c6"+ + "\u01c4\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7"+ + "I\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9\u01ca"+ + "\u0003.\u0017\u0000\u01ca\u01cb\u0005!\u0000\u0000\u01cb\u01cc\u00032"+ + "\u0019\u0000\u01ccK\u0001\u0000\u0000\u0000\u01cd\u01ce\u0007\u0007\u0000"+ + "\u0000\u01ceM\u0001\u0000\u0000\u0000\u01cf\u01d2\u0003P(\u0000\u01d0"+ + "\u01d2\u0003R)\u0000\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d1\u01d0\u0001"+ + "\u0000\u0000\u0000\u01d2O\u0001\u0000\u0000\u0000\u01d3\u01d5\u0007\u0000"+ + "\u0000\u0000\u01d4\u01d3\u0001\u0000\u0000\u0000\u01d4\u01d5\u0001\u0000"+ + "\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0005\u001d"+ + "\u0000\u0000\u01d7Q\u0001\u0000\u0000\u0000\u01d8\u01da\u0007\u0000\u0000"+ + "\u0000\u01d9\u01d8\u0001\u0000\u0000\u0000\u01d9\u01da\u0001\u0000\u0000"+ + "\u0000\u01da\u01db\u0001\u0000\u0000\u0000\u01db\u01dc\u0005\u001c\u0000"+ + "\u0000\u01dcS\u0001\u0000\u0000\u0000\u01dd\u01de\u0005\u001b\u0000\u0000"+ + "\u01deU\u0001\u0000\u0000\u0000\u01df\u01e0\u0007\b\u0000\u0000\u01e0"+ + "W\u0001\u0000\u0000\u0000\u01e1\u01e2\u0005\u0005\u0000\u0000\u01e2\u01e3"+ + "\u0003Z-\u0000\u01e3Y\u0001\u0000\u0000\u0000\u01e4\u01e5\u0005?\u0000"+ + "\u0000\u01e5\u01e6\u0003\u0002\u0001\u0000\u01e6\u01e7\u0005@\u0000\u0000"+ + "\u01e7[\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005\u000f\u0000\u0000\u01e9"+ + "\u01ed\u0005^\u0000\u0000\u01ea\u01eb\u0005\u000f\u0000\u0000\u01eb\u01ed"+ + "\u0005_\u0000\u0000\u01ec\u01e8\u0001\u0000\u0000\u0000\u01ec\u01ea\u0001"+ + "\u0000\u0000\u0000\u01ed]\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005\u0003"+ + "\u0000\u0000\u01ef\u01f2\u0003(\u0014\u0000\u01f0\u01f1\u0005S\u0000\u0000"+ + "\u01f1\u01f3\u0003,\u0016\u0000\u01f2\u01f0\u0001\u0000\u0000\u0000\u01f2"+ + "\u01f3\u0001\u0000\u0000\u0000\u01f3\u01fd\u0001\u0000\u0000\u0000\u01f4"+ + "\u01f5\u0005T\u0000\u0000\u01f5\u01fa\u0003`0\u0000\u01f6\u01f7\u0005"+ + "\"\u0000\u0000\u01f7\u01f9\u0003`0\u0000\u01f8\u01f6\u0001\u0000\u0000"+ + "\u0000\u01f9\u01fc\u0001\u0000\u0000\u0000\u01fa\u01f8\u0001\u0000\u0000"+ + "\u0000\u01fa\u01fb\u0001\u0000\u0000\u0000\u01fb\u01fe\u0001\u0000\u0000"+ + "\u0000\u01fc\u01fa\u0001\u0000\u0000\u0000\u01fd\u01f4\u0001\u0000\u0000"+ + "\u0000\u01fd\u01fe\u0001\u0000\u0000\u0000\u01fe_\u0001\u0000\u0000\u0000"+ + "\u01ff\u0200\u0003,\u0016\u0000\u0200\u0201\u0005!\u0000\u0000\u0201\u0203"+ + "\u0001\u0000\u0000\u0000\u0202\u01ff\u0001\u0000\u0000\u0000\u0202\u0203"+ + "\u0001\u0000\u0000\u0000\u0203\u0204\u0001\u0000\u0000\u0000\u0204\u0205"+ + "\u0003,\u0016\u0000\u0205a\u0001\u0000\u0000\u00004mt\u0083\u008f\u0098"+ + "\u00a0\u00a4\u00ac\u00ae\u00b3\u00ba\u00bf\u00c6\u00cc\u00d4\u00d6\u00e0"+ + "\u00ea\u00ed\u00f9\u0101\u0109\u010d\u0116\u0120\u0124\u012a\u0131\u013b"+ + "\u0143\u0159\u0164\u016f\u0174\u017f\u0184\u0188\u0190\u0199\u019c\u01a4"+ + "\u01ad\u01b8\u01c6\u01d1\u01d4\u01d9\u01ec\u01f2\u01fa\u01fd\u0202"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/packages/kbn-esql/src/antlr/.antlr/esql_parser.tokens b/packages/kbn-esql/src/antlr/.antlr/esql_parser.tokens new file mode 100644 index 0000000000000..85a98c3a6d268 --- /dev/null +++ b/packages/kbn-esql/src/antlr/.antlr/esql_parser.tokens @@ -0,0 +1,117 @@ +DISSECT=1 +DROP=2 +ENRICH=3 +EVAL=4 +EXPLAIN=5 +FROM=6 +GROK=7 +INLINESTATS=8 +KEEP=9 +LIMIT=10 +MV_EXPAND=11 +PROJECT=12 +RENAME=13 +ROW=14 +SHOW=15 +SORT=16 +STATS=17 +WHERE=18 +UNKNOWN_CMD=19 +LINE_COMMENT=20 +MULTILINE_COMMENT=21 +WS=22 +EXPLAIN_WS=23 +EXPLAIN_LINE_COMMENT=24 +EXPLAIN_MULTILINE_COMMENT=25 +PIPE=26 +STRING=27 +INTEGER_LITERAL=28 +DECIMAL_LITERAL=29 +BY=30 +AND=31 +ASC=32 +ASSIGN=33 +COMMA=34 +DESC=35 +DOT=36 +FALSE=37 +FIRST=38 +LAST=39 +LP=40 +IN=41 +IS=42 +LIKE=43 +NOT=44 +NULL=45 +NULLS=46 +OR=47 +PARAM=48 +RLIKE=49 +RP=50 +TRUE=51 +EQ=52 +NEQ=53 +LT=54 +LTE=55 +GT=56 +GTE=57 +PLUS=58 +MINUS=59 +ASTERISK=60 +SLASH=61 +PERCENT=62 +OPENING_BRACKET=63 +CLOSING_BRACKET=64 +UNQUOTED_IDENTIFIER=65 +QUOTED_IDENTIFIER=66 +EXPR_LINE_COMMENT=67 +EXPR_MULTILINE_COMMENT=68 +EXPR_WS=69 +METADATA=70 +FROM_UNQUOTED_IDENTIFIER=71 +FROM_LINE_COMMENT=72 +FROM_MULTILINE_COMMENT=73 +FROM_WS=74 +PROJECT_UNQUOTED_IDENTIFIER=75 +PROJECT_LINE_COMMENT=76 +PROJECT_MULTILINE_COMMENT=77 +PROJECT_WS=78 +AS=79 +RENAME_LINE_COMMENT=80 +RENAME_MULTILINE_COMMENT=81 +RENAME_WS=82 +ON=83 +WITH=84 +ENRICH_LINE_COMMENT=85 +ENRICH_MULTILINE_COMMENT=86 +ENRICH_WS=87 +ENRICH_FIELD_LINE_COMMENT=88 +ENRICH_FIELD_MULTILINE_COMMENT=89 +ENRICH_FIELD_WS=90 +MVEXPAND_LINE_COMMENT=91 +MVEXPAND_MULTILINE_COMMENT=92 +MVEXPAND_WS=93 +INFO=94 +FUNCTIONS=95 +SHOW_LINE_COMMENT=96 +SHOW_MULTILINE_COMMENT=97 +SHOW_WS=98 +'|'=26 +'='=33 +','=34 +'.'=36 +'('=40 +'?'=48 +')'=50 +'=='=52 +'!='=53 +'<'=54 +'<='=55 +'>'=56 +'>='=57 +'+'=58 +'-'=59 +'*'=60 +'/'=61 +'%'=62 +']'=64 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 b/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 index 90a892d8d1dd6..d22db2818d4e7 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 @@ -8,23 +8,25 @@ lexer grammar esql_lexer; options { } -DISSECT : D I S S E C T -> pushMode(EXPRESSION); -DROP : D R O P -> pushMode(SOURCE_IDENTIFIERS); -ENRICH : E N R I C H -> pushMode(SOURCE_IDENTIFIERS); -EVAL : E V A L -> pushMode(EXPRESSION); -FROM : F R O M -> pushMode(SOURCE_IDENTIFIERS); -GROK : G R O K -> pushMode(EXPRESSION); -KEEP : K E E P -> pushMode(SOURCE_IDENTIFIERS); -LIMIT : L I M I T -> pushMode(EXPRESSION); -MV_EXPAND : M V UNDERSCORE E X P A N D -> pushMode(SOURCE_IDENTIFIERS); -PROJECT : P R O J E C T -> pushMode(SOURCE_IDENTIFIERS); -RENAME : R E N A M E -> pushMode(SOURCE_IDENTIFIERS); -ROW : R O W -> pushMode(EXPRESSION); -SHOW : S H O W -> pushMode(EXPRESSION); -SORT : S O R T -> pushMode(EXPRESSION); -STATS : S T A T S -> pushMode(EXPRESSION); -WHERE : W H E R E -> pushMode(EXPRESSION); -UNKNOWN_CMD : ~[ \r\n\t[\]/]+ -> pushMode(EXPRESSION); +DISSECT : D I S S E C T -> pushMode(EXPRESSION_MODE); +DROP : D R O P -> pushMode(PROJECT_MODE); +ENRICH : E N R I C H -> pushMode(ENRICH_MODE); +EVAL : E V A L -> pushMode(EXPRESSION_MODE); +EXPLAIN : E X P L A I N -> pushMode(EXPLAIN_MODE); +FROM : F R O M -> pushMode(FROM_MODE); +GROK : G R O K -> pushMode(EXPRESSION_MODE); +INLINESTATS : I N L I N E S T A T S -> pushMode(EXPRESSION_MODE); +KEEP : K E E P -> pushMode(PROJECT_MODE); +LIMIT : L I M I T -> pushMode(EXPRESSION_MODE); +MV_EXPAND : M V UNDERSCORE E X P A N D -> pushMode(MVEXPAND_MODE); +PROJECT : P R O J E C T -> pushMode(PROJECT_MODE); +RENAME : R E N A M E -> pushMode(RENAME_MODE); +ROW : R O W -> pushMode(EXPRESSION_MODE); +SHOW : S H O W -> pushMode(SHOW_MODE); +SORT : S O R T -> pushMode(EXPRESSION_MODE); +STATS : S T A T S -> pushMode(EXPRESSION_MODE); +WHERE : W H E R E -> pushMode(EXPRESSION_MODE); +UNKNOWN_CMD : ~[ \r\n\t[\]/]+ -> pushMode(EXPRESSION_MODE); LINE_COMMENT : '//' ~[\r\n]* '\r'? '\n'? -> channel(HIDDEN) @@ -37,8 +39,20 @@ MULTILINE_COMMENT WS : [ \r\n\t]+ -> channel(HIDDEN) ; - -mode EXPRESSION; +// +// Explain +// +mode EXPLAIN_MODE; +EXPLAIN_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(DEFAULT_MODE); +EXPLAIN_PIPE : PIPE -> type(PIPE), popMode; +EXPLAIN_WS : WS -> channel(HIDDEN); +EXPLAIN_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN); +EXPLAIN_MULTILINE_COMMENT : MULTILINE_COMMENT -> channel(HIDDEN); + +// +// Expression - used by most command +// +mode EXPRESSION_MODE; PIPE : '|' -> popMode; @@ -62,6 +76,27 @@ fragment EXPONENT : [Ee] [+-]? DIGIT+ ; +fragment ASPERAND + : '@' + ; + +fragment BACKQUOTE + : '`' + ; + +fragment BACKQUOTE_BLOCK + : ~'`' + | '``' + ; + +fragment UNDERSCORE + : '_' + ; + +fragment UNQUOTED_ID_BODY + : (LETTER | DIGIT | UNDERSCORE) + ; + STRING : '"' (ESCAPE_SEQUENCE | UNESCAPED_CHARS)* '"' | '"""' (~[\r\n])*? '"""' '"'? '"'? @@ -101,9 +136,6 @@ PARAM: '?'; RLIKE: R L I K E; RP : ')'; TRUE : T R U E; -INFO : I N F O; -FUNCTIONS : F U N C T I O N S; -UNDERSCORE: '_'; EQ : '=='; NEQ : '!='; @@ -123,19 +155,18 @@ PERCENT : '%'; // mode. Thus, the two popModes on CLOSING_BRACKET. The other way could as // the start of a multivalued field constant. To line up with the double pop // the explain mode needs, we double push when we see that. -OPENING_BRACKET : '[' -> pushMode(EXPRESSION), pushMode(EXPRESSION); +OPENING_BRACKET : '[' -> pushMode(EXPRESSION_MODE), pushMode(EXPRESSION_MODE); CLOSING_BRACKET : ']' -> popMode, popMode; - UNQUOTED_IDENTIFIER - : LETTER (LETTER | DIGIT | '_')* + : LETTER UNQUOTED_ID_BODY* // only allow @ at beginning of identifier to keep the option to allow @ as infix operator in the future // also, single `_` and `@` characters are not valid identifiers - | ('_' | '@') (LETTER | DIGIT | '_')+ + | (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY+ ; QUOTED_IDENTIFIER - : '`' ( ~'`' | '``' )* '`' + : BACKQUOTE BACKQUOTE_BLOCK+ BACKQUOTE ; EXPR_LINE_COMMENT @@ -149,43 +180,206 @@ EXPR_MULTILINE_COMMENT EXPR_WS : WS -> channel(HIDDEN) ; +// +// FROM command +// +mode FROM_MODE; +FROM_PIPE : PIPE -> type(PIPE), popMode; +FROM_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(FROM_MODE), pushMode(FROM_MODE); +FROM_CLOSING_BRACKET : CLOSING_BRACKET -> type(CLOSING_BRACKET), popMode, popMode; +FROM_COMMA : COMMA -> type(COMMA); +FROM_ASSIGN : ASSIGN -> type(ASSIGN); +METADATA: M E T A D A T A; +fragment FROM_UNQUOTED_IDENTIFIER_PART + : ~[=`|,[\]/ \t\r\n] + | '/' ~[*/] // allow single / but not followed by another / or * which would start a comment + ; -mode SOURCE_IDENTIFIERS; +FROM_UNQUOTED_IDENTIFIER + : FROM_UNQUOTED_IDENTIFIER_PART+ + ; + +FROM_QUOTED_IDENTIFIER + : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) + ; + +FROM_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +FROM_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +FROM_WS + : WS -> channel(HIDDEN) + ; +// +// DROP, KEEP, PROJECT +// +mode PROJECT_MODE; +PROJECT_PIPE : PIPE -> type(PIPE), popMode; +PROJECT_DOT: DOT -> type(DOT); +PROJECT_COMMA : COMMA -> type(COMMA); + +fragment UNQUOTED_ID_BODY_WITH_PATTERN + : (LETTER | DIGIT | UNDERSCORE | ASTERISK) + ; + +PROJECT_UNQUOTED_IDENTIFIER + : (LETTER | ASTERISK) UNQUOTED_ID_BODY_WITH_PATTERN* + | (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY_WITH_PATTERN+ + ; + +PROJECT_QUOTED_IDENTIFIER + : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) + ; + +PROJECT_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +PROJECT_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +PROJECT_WS + : WS -> channel(HIDDEN) + ; +// +// | RENAME a.b AS x, c AS y +// +mode RENAME_MODE; +RENAME_PIPE : PIPE -> type(PIPE), popMode; +RENAME_ASSIGN : ASSIGN -> type(ASSIGN); +RENAME_COMMA : COMMA -> type(COMMA); +RENAME_DOT: DOT -> type(DOT); -SRC_PIPE : '|' -> type(PIPE), popMode; -SRC_OPENING_BRACKET : '[' -> type(OPENING_BRACKET), pushMode(SOURCE_IDENTIFIERS), pushMode(SOURCE_IDENTIFIERS); -SRC_CLOSING_BRACKET : ']' -> popMode, popMode, type(CLOSING_BRACKET); -SRC_COMMA : ',' -> type(COMMA); -SRC_ASSIGN : '=' -> type(ASSIGN); AS : A S; -METADATA: M E T A D A T A; -ON : O N; -WITH : W I T H; -SRC_UNQUOTED_IDENTIFIER - : SRC_UNQUOTED_IDENTIFIER_PART+ +RENAME_QUOTED_IDENTIFIER + : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) ; -fragment SRC_UNQUOTED_IDENTIFIER_PART - : ~[=`|,[\]/ \t\r\n]+ - | '/' ~[*/] // allow single / but not followed by another / or * which would start a comment +// use the unquoted pattern to let the parser invalidate fields with * +RENAME_UNQUOTED_IDENTIFIER + : PROJECT_UNQUOTED_IDENTIFIER -> type(PROJECT_UNQUOTED_IDENTIFIER) ; -SRC_QUOTED_IDENTIFIER - : QUOTED_IDENTIFIER +RENAME_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +RENAME_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) ; -SRC_LINE_COMMENT +RENAME_WS + : WS -> channel(HIDDEN) + ; + +// | ENRICH ON key WITH fields +mode ENRICH_MODE; +ENRICH_PIPE : PIPE -> type(PIPE), popMode; + +ON : O N -> pushMode(ENRICH_FIELD_MODE); +WITH : W I T H -> pushMode(ENRICH_FIELD_MODE); + +// use the unquoted pattern to let the parser invalidate fields with * +ENRICH_POLICY_UNQUOTED_IDENTIFIER + : FROM_UNQUOTED_IDENTIFIER -> type(FROM_UNQUOTED_IDENTIFIER) + ; + +ENRICH_QUOTED_IDENTIFIER + : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) + ; + +ENRICH_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +ENRICH_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +ENRICH_WS + : WS -> channel(HIDDEN) + ; + +// submode for Enrich to allow different lexing between policy identifier (loose) and field identifiers +mode ENRICH_FIELD_MODE; +ENRICH_FIELD_PIPE : PIPE -> type(PIPE), popMode, popMode; +ENRICH_FIELD_ASSIGN : ASSIGN -> type(ASSIGN); +ENRICH_FIELD_COMMA : COMMA -> type(COMMA); +ENRICH_FIELD_DOT: DOT -> type(DOT); + +ENRICH_FIELD_WITH : WITH -> type(WITH) ; + +ENRICH_FIELD_UNQUOTED_IDENTIFIER + : PROJECT_UNQUOTED_IDENTIFIER -> type(PROJECT_UNQUOTED_IDENTIFIER) + ; + +ENRICH_FIELD_QUOTED_IDENTIFIER + : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) + ; + +ENRICH_FIELD_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +ENRICH_FIELD_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +ENRICH_FIELD_WS + : WS -> channel(HIDDEN) + ; + +mode MVEXPAND_MODE; +MVEXPAND_PIPE : PIPE -> type(PIPE), popMode; +MVEXPAND_DOT: DOT -> type(DOT); + +MVEXPAND_QUOTED_IDENTIFIER + : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) + ; + +MVEXPAND_UNQUOTED_IDENTIFIER + : UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER) + ; + + +MVEXPAND_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +MVEXPAND_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +MVEXPAND_WS + : WS -> channel(HIDDEN) + ; + +// +// SHOW INFO +// +mode SHOW_MODE; +SHOW_PIPE : PIPE -> type(PIPE), popMode; + +INFO : I N F O; +FUNCTIONS : F U N C T I O N S; + +SHOW_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN) ; -SRC_MULTILINE_COMMENT +SHOW_MULTILINE_COMMENT : MULTILINE_COMMENT -> channel(HIDDEN) ; -SRC_WS +SHOW_WS : WS -> channel(HIDDEN) ; diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp b/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp index 0ff1f62c47445..d2516b469b29d 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp @@ -25,11 +25,16 @@ null null null null +'|' null null null null null +null +'=' +',' +null '.' null null @@ -46,9 +51,6 @@ null null ')' null -null -null -'_' '==' '!=' '<' @@ -76,6 +78,26 @@ null null null null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null token symbolic names: null @@ -83,8 +105,10 @@ DISSECT DROP ENRICH EVAL +EXPLAIN FROM GROK +INLINESTATS KEEP LIMIT MV_EXPAND @@ -99,6 +123,9 @@ UNKNOWN_CMD LINE_COMMENT MULTILINE_COMMENT WS +EXPLAIN_WS +EXPLAIN_LINE_COMMENT +EXPLAIN_MULTILINE_COMMENT PIPE STRING INTEGER_LITERAL @@ -125,9 +152,6 @@ PARAM RLIKE RP TRUE -INFO -FUNCTIONS -UNDERSCORE EQ NEQ LT @@ -146,23 +170,45 @@ QUOTED_IDENTIFIER EXPR_LINE_COMMENT EXPR_MULTILINE_COMMENT EXPR_WS -AS METADATA +FROM_UNQUOTED_IDENTIFIER +FROM_LINE_COMMENT +FROM_MULTILINE_COMMENT +FROM_WS +PROJECT_UNQUOTED_IDENTIFIER +PROJECT_LINE_COMMENT +PROJECT_MULTILINE_COMMENT +PROJECT_WS +AS +RENAME_LINE_COMMENT +RENAME_MULTILINE_COMMENT +RENAME_WS ON WITH -SRC_UNQUOTED_IDENTIFIER -SRC_QUOTED_IDENTIFIER -SRC_LINE_COMMENT -SRC_MULTILINE_COMMENT -SRC_WS +ENRICH_LINE_COMMENT +ENRICH_MULTILINE_COMMENT +ENRICH_WS +ENRICH_FIELD_LINE_COMMENT +ENRICH_FIELD_MULTILINE_COMMENT +ENRICH_FIELD_WS +MVEXPAND_LINE_COMMENT +MVEXPAND_MULTILINE_COMMENT +MVEXPAND_WS +INFO +FUNCTIONS +SHOW_LINE_COMMENT +SHOW_MULTILINE_COMMENT +SHOW_WS rule names: DISSECT DROP ENRICH EVAL +EXPLAIN FROM GROK +INLINESTATS KEEP LIMIT MV_EXPAND @@ -177,12 +223,22 @@ UNKNOWN_CMD LINE_COMMENT MULTILINE_COMMENT WS +EXPLAIN_OPENING_BRACKET +EXPLAIN_PIPE +EXPLAIN_WS +EXPLAIN_LINE_COMMENT +EXPLAIN_MULTILINE_COMMENT PIPE DIGIT LETTER ESCAPE_SEQUENCE UNESCAPED_CHARS EXPONENT +ASPERAND +BACKQUOTE +BACKQUOTE_BLOCK +UNDERSCORE +UNQUOTED_ID_BODY STRING INTEGER_LITERAL DECIMAL_LITERAL @@ -208,9 +264,6 @@ PARAM RLIKE RP TRUE -INFO -FUNCTIONS -UNDERSCORE EQ NEQ LT @@ -229,21 +282,68 @@ QUOTED_IDENTIFIER EXPR_LINE_COMMENT EXPR_MULTILINE_COMMENT EXPR_WS -SRC_PIPE -SRC_OPENING_BRACKET -SRC_CLOSING_BRACKET -SRC_COMMA -SRC_ASSIGN -AS +FROM_PIPE +FROM_OPENING_BRACKET +FROM_CLOSING_BRACKET +FROM_COMMA +FROM_ASSIGN METADATA +FROM_UNQUOTED_IDENTIFIER_PART +FROM_UNQUOTED_IDENTIFIER +FROM_QUOTED_IDENTIFIER +FROM_LINE_COMMENT +FROM_MULTILINE_COMMENT +FROM_WS +PROJECT_PIPE +PROJECT_DOT +PROJECT_COMMA +UNQUOTED_ID_BODY_WITH_PATTERN +PROJECT_UNQUOTED_IDENTIFIER +PROJECT_QUOTED_IDENTIFIER +PROJECT_LINE_COMMENT +PROJECT_MULTILINE_COMMENT +PROJECT_WS +RENAME_PIPE +RENAME_ASSIGN +RENAME_COMMA +RENAME_DOT +AS +RENAME_QUOTED_IDENTIFIER +RENAME_UNQUOTED_IDENTIFIER +RENAME_LINE_COMMENT +RENAME_MULTILINE_COMMENT +RENAME_WS +ENRICH_PIPE ON WITH -SRC_UNQUOTED_IDENTIFIER -SRC_UNQUOTED_IDENTIFIER_PART -SRC_QUOTED_IDENTIFIER -SRC_LINE_COMMENT -SRC_MULTILINE_COMMENT -SRC_WS +ENRICH_POLICY_UNQUOTED_IDENTIFIER +ENRICH_QUOTED_IDENTIFIER +ENRICH_LINE_COMMENT +ENRICH_MULTILINE_COMMENT +ENRICH_WS +ENRICH_FIELD_PIPE +ENRICH_FIELD_ASSIGN +ENRICH_FIELD_COMMA +ENRICH_FIELD_DOT +ENRICH_FIELD_WITH +ENRICH_FIELD_UNQUOTED_IDENTIFIER +ENRICH_FIELD_QUOTED_IDENTIFIER +ENRICH_FIELD_LINE_COMMENT +ENRICH_FIELD_MULTILINE_COMMENT +ENRICH_FIELD_WS +MVEXPAND_PIPE +MVEXPAND_DOT +MVEXPAND_QUOTED_IDENTIFIER +MVEXPAND_UNQUOTED_IDENTIFIER +MVEXPAND_LINE_COMMENT +MVEXPAND_MULTILINE_COMMENT +MVEXPAND_WS +SHOW_PIPE +INFO +FUNCTIONS +SHOW_LINE_COMMENT +SHOW_MULTILINE_COMMENT +SHOW_WS A B C @@ -277,8 +377,15 @@ HIDDEN mode names: DEFAULT_MODE -EXPRESSION -SOURCE_IDENTIFIERS +EXPLAIN_MODE +EXPRESSION_MODE +FROM_MODE +PROJECT_MODE +RENAME_MODE +ENRICH_MODE +ENRICH_FIELD_MODE +MVEXPAND_MODE +SHOW_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 78, 813, 8, 1, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 6, 18, 362, 10, 18, 13, 18, 14, 18, 363, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 372, 10, 19, 12, 19, 14, 19, 375, 11, 19, 3, 19, 5, 19, 378, 10, 19, 3, 19, 5, 19, 381, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 390, 10, 20, 12, 20, 14, 20, 393, 11, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 6, 21, 401, 10, 21, 13, 21, 14, 21, 402, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 27, 3, 27, 5, 27, 422, 10, 27, 3, 27, 6, 27, 425, 10, 27, 13, 27, 14, 27, 426, 3, 28, 3, 28, 3, 28, 7, 28, 432, 10, 28, 12, 28, 14, 28, 435, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 443, 10, 28, 12, 28, 14, 28, 446, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 453, 10, 28, 3, 28, 5, 28, 456, 10, 28, 5, 28, 458, 10, 28, 3, 29, 6, 29, 461, 10, 29, 13, 29, 14, 29, 462, 3, 30, 6, 30, 466, 10, 30, 13, 30, 14, 30, 467, 3, 30, 3, 30, 7, 30, 472, 10, 30, 12, 30, 14, 30, 475, 11, 30, 3, 30, 3, 30, 6, 30, 479, 10, 30, 13, 30, 14, 30, 480, 3, 30, 6, 30, 484, 10, 30, 13, 30, 14, 30, 485, 3, 30, 3, 30, 7, 30, 490, 10, 30, 12, 30, 14, 30, 493, 11, 30, 5, 30, 495, 10, 30, 3, 30, 3, 30, 3, 30, 3, 30, 6, 30, 501, 10, 30, 13, 30, 14, 30, 502, 3, 30, 3, 30, 5, 30, 507, 10, 30, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 651, 10, 69, 12, 69, 14, 69, 654, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 6, 69, 660, 10, 69, 13, 69, 14, 69, 661, 5, 69, 664, 10, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 670, 10, 70, 12, 70, 14, 70, 673, 11, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 6, 83, 735, 10, 83, 13, 83, 14, 83, 736, 3, 84, 6, 84, 740, 10, 84, 13, 84, 14, 84, 741, 3, 84, 3, 84, 5, 84, 746, 10, 84, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 90, 3, 90, 3, 91, 3, 91, 3, 92, 3, 92, 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 4, 391, 444, 2, 2, 115, 5, 2, 3, 7, 2, 4, 9, 2, 5, 11, 2, 6, 13, 2, 7, 15, 2, 8, 17, 2, 9, 19, 2, 10, 21, 2, 11, 23, 2, 12, 25, 2, 13, 27, 2, 14, 29, 2, 15, 31, 2, 16, 33, 2, 17, 35, 2, 18, 37, 2, 19, 39, 2, 20, 41, 2, 21, 43, 2, 22, 45, 2, 23, 47, 2, 2, 49, 2, 2, 51, 2, 2, 53, 2, 2, 55, 2, 2, 57, 2, 24, 59, 2, 25, 61, 2, 26, 63, 2, 27, 65, 2, 28, 67, 2, 29, 69, 2, 30, 71, 2, 31, 73, 2, 32, 75, 2, 33, 77, 2, 34, 79, 2, 35, 81, 2, 36, 83, 2, 37, 85, 2, 38, 87, 2, 39, 89, 2, 40, 91, 2, 41, 93, 2, 42, 95, 2, 43, 97, 2, 44, 99, 2, 45, 101, 2, 46, 103, 2, 47, 105, 2, 48, 107, 2, 49, 109, 2, 50, 111, 2, 51, 113, 2, 52, 115, 2, 53, 117, 2, 54, 119, 2, 55, 121, 2, 56, 123, 2, 57, 125, 2, 58, 127, 2, 59, 129, 2, 60, 131, 2, 61, 133, 2, 62, 135, 2, 63, 137, 2, 64, 139, 2, 65, 141, 2, 66, 143, 2, 67, 145, 2, 68, 147, 2, 69, 149, 2, 2, 151, 2, 2, 153, 2, 2, 155, 2, 2, 157, 2, 2, 159, 2, 70, 161, 2, 71, 163, 2, 72, 165, 2, 73, 167, 2, 74, 169, 2, 2, 171, 2, 75, 173, 2, 76, 175, 2, 77, 177, 2, 78, 179, 2, 2, 181, 2, 2, 183, 2, 2, 185, 2, 2, 187, 2, 2, 189, 2, 2, 191, 2, 2, 193, 2, 2, 195, 2, 2, 197, 2, 2, 199, 2, 2, 201, 2, 2, 203, 2, 2, 205, 2, 2, 207, 2, 2, 209, 2, 2, 211, 2, 2, 213, 2, 2, 215, 2, 2, 217, 2, 2, 219, 2, 2, 221, 2, 2, 223, 2, 2, 225, 2, 2, 227, 2, 2, 229, 2, 2, 5, 2, 3, 4, 40, 8, 2, 11, 12, 15, 15, 34, 34, 49, 49, 93, 93, 95, 95, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 15, 15, 34, 34, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 7, 2, 36, 36, 94, 94, 112, 112, 116, 116, 118, 118, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 66, 66, 97, 97, 3, 2, 98, 98, 12, 2, 11, 12, 15, 15, 34, 34, 46, 46, 49, 49, 63, 63, 93, 93, 95, 95, 98, 98, 126, 126, 4, 2, 44, 44, 49, 49, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 2, 816, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 3, 45, 3, 2, 2, 2, 3, 57, 3, 2, 2, 2, 3, 59, 3, 2, 2, 2, 3, 61, 3, 2, 2, 2, 3, 63, 3, 2, 2, 2, 3, 65, 3, 2, 2, 2, 3, 67, 3, 2, 2, 2, 3, 69, 3, 2, 2, 2, 3, 71, 3, 2, 2, 2, 3, 73, 3, 2, 2, 2, 3, 75, 3, 2, 2, 2, 3, 77, 3, 2, 2, 2, 3, 79, 3, 2, 2, 2, 3, 81, 3, 2, 2, 2, 3, 83, 3, 2, 2, 2, 3, 85, 3, 2, 2, 2, 3, 87, 3, 2, 2, 2, 3, 89, 3, 2, 2, 2, 3, 91, 3, 2, 2, 2, 3, 93, 3, 2, 2, 2, 3, 95, 3, 2, 2, 2, 3, 97, 3, 2, 2, 2, 3, 99, 3, 2, 2, 2, 3, 101, 3, 2, 2, 2, 3, 103, 3, 2, 2, 2, 3, 105, 3, 2, 2, 2, 3, 107, 3, 2, 2, 2, 3, 109, 3, 2, 2, 2, 3, 111, 3, 2, 2, 2, 3, 113, 3, 2, 2, 2, 3, 115, 3, 2, 2, 2, 3, 117, 3, 2, 2, 2, 3, 119, 3, 2, 2, 2, 3, 121, 3, 2, 2, 2, 3, 123, 3, 2, 2, 2, 3, 125, 3, 2, 2, 2, 3, 127, 3, 2, 2, 2, 3, 129, 3, 2, 2, 2, 3, 131, 3, 2, 2, 2, 3, 133, 3, 2, 2, 2, 3, 135, 3, 2, 2, 2, 3, 137, 3, 2, 2, 2, 3, 139, 3, 2, 2, 2, 3, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 3, 145, 3, 2, 2, 2, 3, 147, 3, 2, 2, 2, 4, 149, 3, 2, 2, 2, 4, 151, 3, 2, 2, 2, 4, 153, 3, 2, 2, 2, 4, 155, 3, 2, 2, 2, 4, 157, 3, 2, 2, 2, 4, 159, 3, 2, 2, 2, 4, 161, 3, 2, 2, 2, 4, 163, 3, 2, 2, 2, 4, 165, 3, 2, 2, 2, 4, 167, 3, 2, 2, 2, 4, 171, 3, 2, 2, 2, 4, 173, 3, 2, 2, 2, 4, 175, 3, 2, 2, 2, 4, 177, 3, 2, 2, 2, 5, 231, 3, 2, 2, 2, 7, 241, 3, 2, 2, 2, 9, 248, 3, 2, 2, 2, 11, 257, 3, 2, 2, 2, 13, 264, 3, 2, 2, 2, 15, 271, 3, 2, 2, 2, 17, 278, 3, 2, 2, 2, 19, 285, 3, 2, 2, 2, 21, 293, 3, 2, 2, 2, 23, 305, 3, 2, 2, 2, 25, 315, 3, 2, 2, 2, 27, 324, 3, 2, 2, 2, 29, 330, 3, 2, 2, 2, 31, 337, 3, 2, 2, 2, 33, 344, 3, 2, 2, 2, 35, 352, 3, 2, 2, 2, 37, 361, 3, 2, 2, 2, 39, 367, 3, 2, 2, 2, 41, 384, 3, 2, 2, 2, 43, 400, 3, 2, 2, 2, 45, 406, 3, 2, 2, 2, 47, 410, 3, 2, 2, 2, 49, 412, 3, 2, 2, 2, 51, 414, 3, 2, 2, 2, 53, 417, 3, 2, 2, 2, 55, 419, 3, 2, 2, 2, 57, 457, 3, 2, 2, 2, 59, 460, 3, 2, 2, 2, 61, 506, 3, 2, 2, 2, 63, 508, 3, 2, 2, 2, 65, 511, 3, 2, 2, 2, 67, 515, 3, 2, 2, 2, 69, 519, 3, 2, 2, 2, 71, 521, 3, 2, 2, 2, 73, 523, 3, 2, 2, 2, 75, 528, 3, 2, 2, 2, 77, 530, 3, 2, 2, 2, 79, 536, 3, 2, 2, 2, 81, 542, 3, 2, 2, 2, 83, 547, 3, 2, 2, 2, 85, 549, 3, 2, 2, 2, 87, 552, 3, 2, 2, 2, 89, 555, 3, 2, 2, 2, 91, 560, 3, 2, 2, 2, 93, 564, 3, 2, 2, 2, 95, 569, 3, 2, 2, 2, 97, 575, 3, 2, 2, 2, 99, 578, 3, 2, 2, 2, 101, 580, 3, 2, 2, 2, 103, 586, 3, 2, 2, 2, 105, 588, 3, 2, 2, 2, 107, 593, 3, 2, 2, 2, 109, 598, 3, 2, 2, 2, 111, 608, 3, 2, 2, 2, 113, 610, 3, 2, 2, 2, 115, 613, 3, 2, 2, 2, 117, 616, 3, 2, 2, 2, 119, 618, 3, 2, 2, 2, 121, 621, 3, 2, 2, 2, 123, 623, 3, 2, 2, 2, 125, 626, 3, 2, 2, 2, 127, 628, 3, 2, 2, 2, 129, 630, 3, 2, 2, 2, 131, 632, 3, 2, 2, 2, 133, 634, 3, 2, 2, 2, 135, 636, 3, 2, 2, 2, 137, 641, 3, 2, 2, 2, 139, 663, 3, 2, 2, 2, 141, 665, 3, 2, 2, 2, 143, 676, 3, 2, 2, 2, 145, 680, 3, 2, 2, 2, 147, 684, 3, 2, 2, 2, 149, 688, 3, 2, 2, 2, 151, 693, 3, 2, 2, 2, 153, 699, 3, 2, 2, 2, 155, 705, 3, 2, 2, 2, 157, 709, 3, 2, 2, 2, 159, 713, 3, 2, 2, 2, 161, 716, 3, 2, 2, 2, 163, 725, 3, 2, 2, 2, 165, 728, 3, 2, 2, 2, 167, 734, 3, 2, 2, 2, 169, 745, 3, 2, 2, 2, 171, 747, 3, 2, 2, 2, 173, 749, 3, 2, 2, 2, 175, 753, 3, 2, 2, 2, 177, 757, 3, 2, 2, 2, 179, 761, 3, 2, 2, 2, 181, 763, 3, 2, 2, 2, 183, 765, 3, 2, 2, 2, 185, 767, 3, 2, 2, 2, 187, 769, 3, 2, 2, 2, 189, 771, 3, 2, 2, 2, 191, 773, 3, 2, 2, 2, 193, 775, 3, 2, 2, 2, 195, 777, 3, 2, 2, 2, 197, 779, 3, 2, 2, 2, 199, 781, 3, 2, 2, 2, 201, 783, 3, 2, 2, 2, 203, 785, 3, 2, 2, 2, 205, 787, 3, 2, 2, 2, 207, 789, 3, 2, 2, 2, 209, 791, 3, 2, 2, 2, 211, 793, 3, 2, 2, 2, 213, 795, 3, 2, 2, 2, 215, 797, 3, 2, 2, 2, 217, 799, 3, 2, 2, 2, 219, 801, 3, 2, 2, 2, 221, 803, 3, 2, 2, 2, 223, 805, 3, 2, 2, 2, 225, 807, 3, 2, 2, 2, 227, 809, 3, 2, 2, 2, 229, 811, 3, 2, 2, 2, 231, 232, 5, 185, 92, 2, 232, 233, 5, 195, 97, 2, 233, 234, 5, 215, 107, 2, 234, 235, 5, 215, 107, 2, 235, 236, 5, 187, 93, 2, 236, 237, 5, 183, 91, 2, 237, 238, 5, 217, 108, 2, 238, 239, 3, 2, 2, 2, 239, 240, 8, 2, 2, 2, 240, 6, 3, 2, 2, 2, 241, 242, 5, 185, 92, 2, 242, 243, 5, 213, 106, 2, 243, 244, 5, 207, 103, 2, 244, 245, 5, 209, 104, 2, 245, 246, 3, 2, 2, 2, 246, 247, 8, 3, 3, 2, 247, 8, 3, 2, 2, 2, 248, 249, 5, 187, 93, 2, 249, 250, 5, 205, 102, 2, 250, 251, 5, 213, 106, 2, 251, 252, 5, 195, 97, 2, 252, 253, 5, 183, 91, 2, 253, 254, 5, 193, 96, 2, 254, 255, 3, 2, 2, 2, 255, 256, 8, 4, 3, 2, 256, 10, 3, 2, 2, 2, 257, 258, 5, 187, 93, 2, 258, 259, 5, 221, 110, 2, 259, 260, 5, 179, 89, 2, 260, 261, 5, 201, 100, 2, 261, 262, 3, 2, 2, 2, 262, 263, 8, 5, 2, 2, 263, 12, 3, 2, 2, 2, 264, 265, 5, 189, 94, 2, 265, 266, 5, 213, 106, 2, 266, 267, 5, 207, 103, 2, 267, 268, 5, 203, 101, 2, 268, 269, 3, 2, 2, 2, 269, 270, 8, 6, 3, 2, 270, 14, 3, 2, 2, 2, 271, 272, 5, 191, 95, 2, 272, 273, 5, 213, 106, 2, 273, 274, 5, 207, 103, 2, 274, 275, 5, 199, 99, 2, 275, 276, 3, 2, 2, 2, 276, 277, 8, 7, 2, 2, 277, 16, 3, 2, 2, 2, 278, 279, 5, 199, 99, 2, 279, 280, 5, 187, 93, 2, 280, 281, 5, 187, 93, 2, 281, 282, 5, 209, 104, 2, 282, 283, 3, 2, 2, 2, 283, 284, 8, 8, 3, 2, 284, 18, 3, 2, 2, 2, 285, 286, 5, 201, 100, 2, 286, 287, 5, 195, 97, 2, 287, 288, 5, 203, 101, 2, 288, 289, 5, 195, 97, 2, 289, 290, 5, 217, 108, 2, 290, 291, 3, 2, 2, 2, 291, 292, 8, 9, 2, 2, 292, 20, 3, 2, 2, 2, 293, 294, 5, 203, 101, 2, 294, 295, 5, 221, 110, 2, 295, 296, 5, 111, 55, 2, 296, 297, 5, 187, 93, 2, 297, 298, 5, 225, 112, 2, 298, 299, 5, 209, 104, 2, 299, 300, 5, 179, 89, 2, 300, 301, 5, 205, 102, 2, 301, 302, 5, 185, 92, 2, 302, 303, 3, 2, 2, 2, 303, 304, 8, 10, 3, 2, 304, 22, 3, 2, 2, 2, 305, 306, 5, 209, 104, 2, 306, 307, 5, 213, 106, 2, 307, 308, 5, 207, 103, 2, 308, 309, 5, 197, 98, 2, 309, 310, 5, 187, 93, 2, 310, 311, 5, 183, 91, 2, 311, 312, 5, 217, 108, 2, 312, 313, 3, 2, 2, 2, 313, 314, 8, 11, 3, 2, 314, 24, 3, 2, 2, 2, 315, 316, 5, 213, 106, 2, 316, 317, 5, 187, 93, 2, 317, 318, 5, 205, 102, 2, 318, 319, 5, 179, 89, 2, 319, 320, 5, 203, 101, 2, 320, 321, 5, 187, 93, 2, 321, 322, 3, 2, 2, 2, 322, 323, 8, 12, 3, 2, 323, 26, 3, 2, 2, 2, 324, 325, 5, 213, 106, 2, 325, 326, 5, 207, 103, 2, 326, 327, 5, 223, 111, 2, 327, 328, 3, 2, 2, 2, 328, 329, 8, 13, 2, 2, 329, 28, 3, 2, 2, 2, 330, 331, 5, 215, 107, 2, 331, 332, 5, 193, 96, 2, 332, 333, 5, 207, 103, 2, 333, 334, 5, 223, 111, 2, 334, 335, 3, 2, 2, 2, 335, 336, 8, 14, 2, 2, 336, 30, 3, 2, 2, 2, 337, 338, 5, 215, 107, 2, 338, 339, 5, 207, 103, 2, 339, 340, 5, 213, 106, 2, 340, 341, 5, 217, 108, 2, 341, 342, 3, 2, 2, 2, 342, 343, 8, 15, 2, 2, 343, 32, 3, 2, 2, 2, 344, 345, 5, 215, 107, 2, 345, 346, 5, 217, 108, 2, 346, 347, 5, 179, 89, 2, 347, 348, 5, 217, 108, 2, 348, 349, 5, 215, 107, 2, 349, 350, 3, 2, 2, 2, 350, 351, 8, 16, 2, 2, 351, 34, 3, 2, 2, 2, 352, 353, 5, 223, 111, 2, 353, 354, 5, 193, 96, 2, 354, 355, 5, 187, 93, 2, 355, 356, 5, 213, 106, 2, 356, 357, 5, 187, 93, 2, 357, 358, 3, 2, 2, 2, 358, 359, 8, 17, 2, 2, 359, 36, 3, 2, 2, 2, 360, 362, 10, 2, 2, 2, 361, 360, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 361, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 3, 2, 2, 2, 365, 366, 8, 18, 2, 2, 366, 38, 3, 2, 2, 2, 367, 368, 7, 49, 2, 2, 368, 369, 7, 49, 2, 2, 369, 373, 3, 2, 2, 2, 370, 372, 10, 3, 2, 2, 371, 370, 3, 2, 2, 2, 372, 375, 3, 2, 2, 2, 373, 371, 3, 2, 2, 2, 373, 374, 3, 2, 2, 2, 374, 377, 3, 2, 2, 2, 375, 373, 3, 2, 2, 2, 376, 378, 7, 15, 2, 2, 377, 376, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 380, 3, 2, 2, 2, 379, 381, 7, 12, 2, 2, 380, 379, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 382, 3, 2, 2, 2, 382, 383, 8, 19, 4, 2, 383, 40, 3, 2, 2, 2, 384, 385, 7, 49, 2, 2, 385, 386, 7, 44, 2, 2, 386, 391, 3, 2, 2, 2, 387, 390, 5, 41, 20, 2, 388, 390, 11, 2, 2, 2, 389, 387, 3, 2, 2, 2, 389, 388, 3, 2, 2, 2, 390, 393, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 392, 394, 3, 2, 2, 2, 393, 391, 3, 2, 2, 2, 394, 395, 7, 44, 2, 2, 395, 396, 7, 49, 2, 2, 396, 397, 3, 2, 2, 2, 397, 398, 8, 20, 4, 2, 398, 42, 3, 2, 2, 2, 399, 401, 9, 4, 2, 2, 400, 399, 3, 2, 2, 2, 401, 402, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 405, 8, 21, 4, 2, 405, 44, 3, 2, 2, 2, 406, 407, 7, 126, 2, 2, 407, 408, 3, 2, 2, 2, 408, 409, 8, 22, 5, 2, 409, 46, 3, 2, 2, 2, 410, 411, 9, 5, 2, 2, 411, 48, 3, 2, 2, 2, 412, 413, 9, 6, 2, 2, 413, 50, 3, 2, 2, 2, 414, 415, 7, 94, 2, 2, 415, 416, 9, 7, 2, 2, 416, 52, 3, 2, 2, 2, 417, 418, 10, 8, 2, 2, 418, 54, 3, 2, 2, 2, 419, 421, 9, 9, 2, 2, 420, 422, 9, 10, 2, 2, 421, 420, 3, 2, 2, 2, 421, 422, 3, 2, 2, 2, 422, 424, 3, 2, 2, 2, 423, 425, 5, 47, 23, 2, 424, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 56, 3, 2, 2, 2, 428, 433, 7, 36, 2, 2, 429, 432, 5, 51, 25, 2, 430, 432, 5, 53, 26, 2, 431, 429, 3, 2, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 436, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 458, 7, 36, 2, 2, 437, 438, 7, 36, 2, 2, 438, 439, 7, 36, 2, 2, 439, 440, 7, 36, 2, 2, 440, 444, 3, 2, 2, 2, 441, 443, 10, 3, 2, 2, 442, 441, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 447, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 447, 448, 7, 36, 2, 2, 448, 449, 7, 36, 2, 2, 449, 450, 7, 36, 2, 2, 450, 452, 3, 2, 2, 2, 451, 453, 7, 36, 2, 2, 452, 451, 3, 2, 2, 2, 452, 453, 3, 2, 2, 2, 453, 455, 3, 2, 2, 2, 454, 456, 7, 36, 2, 2, 455, 454, 3, 2, 2, 2, 455, 456, 3, 2, 2, 2, 456, 458, 3, 2, 2, 2, 457, 428, 3, 2, 2, 2, 457, 437, 3, 2, 2, 2, 458, 58, 3, 2, 2, 2, 459, 461, 5, 47, 23, 2, 460, 459, 3, 2, 2, 2, 461, 462, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 60, 3, 2, 2, 2, 464, 466, 5, 47, 23, 2, 465, 464, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 465, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 473, 5, 75, 37, 2, 470, 472, 5, 47, 23, 2, 471, 470, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 507, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 5, 75, 37, 2, 477, 479, 5, 47, 23, 2, 478, 477, 3, 2, 2, 2, 479, 480, 3, 2, 2, 2, 480, 478, 3, 2, 2, 2, 480, 481, 3, 2, 2, 2, 481, 507, 3, 2, 2, 2, 482, 484, 5, 47, 23, 2, 483, 482, 3, 2, 2, 2, 484, 485, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 494, 3, 2, 2, 2, 487, 491, 5, 75, 37, 2, 488, 490, 5, 47, 23, 2, 489, 488, 3, 2, 2, 2, 490, 493, 3, 2, 2, 2, 491, 489, 3, 2, 2, 2, 491, 492, 3, 2, 2, 2, 492, 495, 3, 2, 2, 2, 493, 491, 3, 2, 2, 2, 494, 487, 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 496, 3, 2, 2, 2, 496, 497, 5, 55, 27, 2, 497, 507, 3, 2, 2, 2, 498, 500, 5, 75, 37, 2, 499, 501, 5, 47, 23, 2, 500, 499, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 500, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 3, 2, 2, 2, 504, 505, 5, 55, 27, 2, 505, 507, 3, 2, 2, 2, 506, 465, 3, 2, 2, 2, 506, 476, 3, 2, 2, 2, 506, 483, 3, 2, 2, 2, 506, 498, 3, 2, 2, 2, 507, 62, 3, 2, 2, 2, 508, 509, 5, 181, 90, 2, 509, 510, 5, 227, 113, 2, 510, 64, 3, 2, 2, 2, 511, 512, 5, 179, 89, 2, 512, 513, 5, 205, 102, 2, 513, 514, 5, 185, 92, 2, 514, 66, 3, 2, 2, 2, 515, 516, 5, 179, 89, 2, 516, 517, 5, 215, 107, 2, 517, 518, 5, 183, 91, 2, 518, 68, 3, 2, 2, 2, 519, 520, 7, 63, 2, 2, 520, 70, 3, 2, 2, 2, 521, 522, 7, 46, 2, 2, 522, 72, 3, 2, 2, 2, 523, 524, 5, 185, 92, 2, 524, 525, 5, 187, 93, 2, 525, 526, 5, 215, 107, 2, 526, 527, 5, 183, 91, 2, 527, 74, 3, 2, 2, 2, 528, 529, 7, 48, 2, 2, 529, 76, 3, 2, 2, 2, 530, 531, 5, 189, 94, 2, 531, 532, 5, 179, 89, 2, 532, 533, 5, 201, 100, 2, 533, 534, 5, 215, 107, 2, 534, 535, 5, 187, 93, 2, 535, 78, 3, 2, 2, 2, 536, 537, 5, 189, 94, 2, 537, 538, 5, 195, 97, 2, 538, 539, 5, 213, 106, 2, 539, 540, 5, 215, 107, 2, 540, 541, 5, 217, 108, 2, 541, 80, 3, 2, 2, 2, 542, 543, 5, 201, 100, 2, 543, 544, 5, 179, 89, 2, 544, 545, 5, 215, 107, 2, 545, 546, 5, 217, 108, 2, 546, 82, 3, 2, 2, 2, 547, 548, 7, 42, 2, 2, 548, 84, 3, 2, 2, 2, 549, 550, 5, 195, 97, 2, 550, 551, 5, 205, 102, 2, 551, 86, 3, 2, 2, 2, 552, 553, 5, 195, 97, 2, 553, 554, 5, 215, 107, 2, 554, 88, 3, 2, 2, 2, 555, 556, 5, 201, 100, 2, 556, 557, 5, 195, 97, 2, 557, 558, 5, 199, 99, 2, 558, 559, 5, 187, 93, 2, 559, 90, 3, 2, 2, 2, 560, 561, 5, 205, 102, 2, 561, 562, 5, 207, 103, 2, 562, 563, 5, 217, 108, 2, 563, 92, 3, 2, 2, 2, 564, 565, 5, 205, 102, 2, 565, 566, 5, 219, 109, 2, 566, 567, 5, 201, 100, 2, 567, 568, 5, 201, 100, 2, 568, 94, 3, 2, 2, 2, 569, 570, 5, 205, 102, 2, 570, 571, 5, 219, 109, 2, 571, 572, 5, 201, 100, 2, 572, 573, 5, 201, 100, 2, 573, 574, 5, 215, 107, 2, 574, 96, 3, 2, 2, 2, 575, 576, 5, 207, 103, 2, 576, 577, 5, 213, 106, 2, 577, 98, 3, 2, 2, 2, 578, 579, 7, 65, 2, 2, 579, 100, 3, 2, 2, 2, 580, 581, 5, 213, 106, 2, 581, 582, 5, 201, 100, 2, 582, 583, 5, 195, 97, 2, 583, 584, 5, 199, 99, 2, 584, 585, 5, 187, 93, 2, 585, 102, 3, 2, 2, 2, 586, 587, 7, 43, 2, 2, 587, 104, 3, 2, 2, 2, 588, 589, 5, 217, 108, 2, 589, 590, 5, 213, 106, 2, 590, 591, 5, 219, 109, 2, 591, 592, 5, 187, 93, 2, 592, 106, 3, 2, 2, 2, 593, 594, 5, 195, 97, 2, 594, 595, 5, 205, 102, 2, 595, 596, 5, 189, 94, 2, 596, 597, 5, 207, 103, 2, 597, 108, 3, 2, 2, 2, 598, 599, 5, 189, 94, 2, 599, 600, 5, 219, 109, 2, 600, 601, 5, 205, 102, 2, 601, 602, 5, 183, 91, 2, 602, 603, 5, 217, 108, 2, 603, 604, 5, 195, 97, 2, 604, 605, 5, 207, 103, 2, 605, 606, 5, 205, 102, 2, 606, 607, 5, 215, 107, 2, 607, 110, 3, 2, 2, 2, 608, 609, 7, 97, 2, 2, 609, 112, 3, 2, 2, 2, 610, 611, 7, 63, 2, 2, 611, 612, 7, 63, 2, 2, 612, 114, 3, 2, 2, 2, 613, 614, 7, 35, 2, 2, 614, 615, 7, 63, 2, 2, 615, 116, 3, 2, 2, 2, 616, 617, 7, 62, 2, 2, 617, 118, 3, 2, 2, 2, 618, 619, 7, 62, 2, 2, 619, 620, 7, 63, 2, 2, 620, 120, 3, 2, 2, 2, 621, 622, 7, 64, 2, 2, 622, 122, 3, 2, 2, 2, 623, 624, 7, 64, 2, 2, 624, 625, 7, 63, 2, 2, 625, 124, 3, 2, 2, 2, 626, 627, 7, 45, 2, 2, 627, 126, 3, 2, 2, 2, 628, 629, 7, 47, 2, 2, 629, 128, 3, 2, 2, 2, 630, 631, 7, 44, 2, 2, 631, 130, 3, 2, 2, 2, 632, 633, 7, 49, 2, 2, 633, 132, 3, 2, 2, 2, 634, 635, 7, 39, 2, 2, 635, 134, 3, 2, 2, 2, 636, 637, 7, 93, 2, 2, 637, 638, 3, 2, 2, 2, 638, 639, 8, 67, 2, 2, 639, 640, 8, 67, 2, 2, 640, 136, 3, 2, 2, 2, 641, 642, 7, 95, 2, 2, 642, 643, 3, 2, 2, 2, 643, 644, 8, 68, 5, 2, 644, 645, 8, 68, 5, 2, 645, 138, 3, 2, 2, 2, 646, 652, 5, 49, 24, 2, 647, 651, 5, 49, 24, 2, 648, 651, 5, 47, 23, 2, 649, 651, 7, 97, 2, 2, 650, 647, 3, 2, 2, 2, 650, 648, 3, 2, 2, 2, 650, 649, 3, 2, 2, 2, 651, 654, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 664, 3, 2, 2, 2, 654, 652, 3, 2, 2, 2, 655, 659, 9, 11, 2, 2, 656, 660, 5, 49, 24, 2, 657, 660, 5, 47, 23, 2, 658, 660, 7, 97, 2, 2, 659, 656, 3, 2, 2, 2, 659, 657, 3, 2, 2, 2, 659, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 664, 3, 2, 2, 2, 663, 646, 3, 2, 2, 2, 663, 655, 3, 2, 2, 2, 664, 140, 3, 2, 2, 2, 665, 671, 7, 98, 2, 2, 666, 670, 10, 12, 2, 2, 667, 668, 7, 98, 2, 2, 668, 670, 7, 98, 2, 2, 669, 666, 3, 2, 2, 2, 669, 667, 3, 2, 2, 2, 670, 673, 3, 2, 2, 2, 671, 669, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 674, 3, 2, 2, 2, 673, 671, 3, 2, 2, 2, 674, 675, 7, 98, 2, 2, 675, 142, 3, 2, 2, 2, 676, 677, 5, 39, 19, 2, 677, 678, 3, 2, 2, 2, 678, 679, 8, 71, 4, 2, 679, 144, 3, 2, 2, 2, 680, 681, 5, 41, 20, 2, 681, 682, 3, 2, 2, 2, 682, 683, 8, 72, 4, 2, 683, 146, 3, 2, 2, 2, 684, 685, 5, 43, 21, 2, 685, 686, 3, 2, 2, 2, 686, 687, 8, 73, 4, 2, 687, 148, 3, 2, 2, 2, 688, 689, 7, 126, 2, 2, 689, 690, 3, 2, 2, 2, 690, 691, 8, 74, 6, 2, 691, 692, 8, 74, 5, 2, 692, 150, 3, 2, 2, 2, 693, 694, 7, 93, 2, 2, 694, 695, 3, 2, 2, 2, 695, 696, 8, 75, 7, 2, 696, 697, 8, 75, 3, 2, 697, 698, 8, 75, 3, 2, 698, 152, 3, 2, 2, 2, 699, 700, 7, 95, 2, 2, 700, 701, 3, 2, 2, 2, 701, 702, 8, 76, 5, 2, 702, 703, 8, 76, 5, 2, 703, 704, 8, 76, 8, 2, 704, 154, 3, 2, 2, 2, 705, 706, 7, 46, 2, 2, 706, 707, 3, 2, 2, 2, 707, 708, 8, 77, 9, 2, 708, 156, 3, 2, 2, 2, 709, 710, 7, 63, 2, 2, 710, 711, 3, 2, 2, 2, 711, 712, 8, 78, 10, 2, 712, 158, 3, 2, 2, 2, 713, 714, 5, 179, 89, 2, 714, 715, 5, 215, 107, 2, 715, 160, 3, 2, 2, 2, 716, 717, 5, 203, 101, 2, 717, 718, 5, 187, 93, 2, 718, 719, 5, 217, 108, 2, 719, 720, 5, 179, 89, 2, 720, 721, 5, 185, 92, 2, 721, 722, 5, 179, 89, 2, 722, 723, 5, 217, 108, 2, 723, 724, 5, 179, 89, 2, 724, 162, 3, 2, 2, 2, 725, 726, 5, 207, 103, 2, 726, 727, 5, 205, 102, 2, 727, 164, 3, 2, 2, 2, 728, 729, 5, 223, 111, 2, 729, 730, 5, 195, 97, 2, 730, 731, 5, 217, 108, 2, 731, 732, 5, 193, 96, 2, 732, 166, 3, 2, 2, 2, 733, 735, 5, 169, 84, 2, 734, 733, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 734, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 168, 3, 2, 2, 2, 738, 740, 10, 13, 2, 2, 739, 738, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 739, 3, 2, 2, 2, 741, 742, 3, 2, 2, 2, 742, 746, 3, 2, 2, 2, 743, 744, 7, 49, 2, 2, 744, 746, 10, 14, 2, 2, 745, 739, 3, 2, 2, 2, 745, 743, 3, 2, 2, 2, 746, 170, 3, 2, 2, 2, 747, 748, 5, 141, 70, 2, 748, 172, 3, 2, 2, 2, 749, 750, 5, 39, 19, 2, 750, 751, 3, 2, 2, 2, 751, 752, 8, 86, 4, 2, 752, 174, 3, 2, 2, 2, 753, 754, 5, 41, 20, 2, 754, 755, 3, 2, 2, 2, 755, 756, 8, 87, 4, 2, 756, 176, 3, 2, 2, 2, 757, 758, 5, 43, 21, 2, 758, 759, 3, 2, 2, 2, 759, 760, 8, 88, 4, 2, 760, 178, 3, 2, 2, 2, 761, 762, 9, 15, 2, 2, 762, 180, 3, 2, 2, 2, 763, 764, 9, 16, 2, 2, 764, 182, 3, 2, 2, 2, 765, 766, 9, 17, 2, 2, 766, 184, 3, 2, 2, 2, 767, 768, 9, 18, 2, 2, 768, 186, 3, 2, 2, 2, 769, 770, 9, 9, 2, 2, 770, 188, 3, 2, 2, 2, 771, 772, 9, 19, 2, 2, 772, 190, 3, 2, 2, 2, 773, 774, 9, 20, 2, 2, 774, 192, 3, 2, 2, 2, 775, 776, 9, 21, 2, 2, 776, 194, 3, 2, 2, 2, 777, 778, 9, 22, 2, 2, 778, 196, 3, 2, 2, 2, 779, 780, 9, 23, 2, 2, 780, 198, 3, 2, 2, 2, 781, 782, 9, 24, 2, 2, 782, 200, 3, 2, 2, 2, 783, 784, 9, 25, 2, 2, 784, 202, 3, 2, 2, 2, 785, 786, 9, 26, 2, 2, 786, 204, 3, 2, 2, 2, 787, 788, 9, 27, 2, 2, 788, 206, 3, 2, 2, 2, 789, 790, 9, 28, 2, 2, 790, 208, 3, 2, 2, 2, 791, 792, 9, 29, 2, 2, 792, 210, 3, 2, 2, 2, 793, 794, 9, 30, 2, 2, 794, 212, 3, 2, 2, 2, 795, 796, 9, 31, 2, 2, 796, 214, 3, 2, 2, 2, 797, 798, 9, 32, 2, 2, 798, 216, 3, 2, 2, 2, 799, 800, 9, 33, 2, 2, 800, 218, 3, 2, 2, 2, 801, 802, 9, 34, 2, 2, 802, 220, 3, 2, 2, 2, 803, 804, 9, 35, 2, 2, 804, 222, 3, 2, 2, 2, 805, 806, 9, 36, 2, 2, 806, 224, 3, 2, 2, 2, 807, 808, 9, 37, 2, 2, 808, 226, 3, 2, 2, 2, 809, 810, 9, 38, 2, 2, 810, 228, 3, 2, 2, 2, 811, 812, 9, 39, 2, 2, 812, 230, 3, 2, 2, 2, 39, 2, 3, 4, 363, 373, 377, 380, 389, 391, 402, 421, 426, 431, 433, 444, 452, 455, 457, 462, 467, 473, 480, 485, 491, 494, 502, 506, 650, 652, 659, 661, 663, 669, 671, 736, 741, 745, 11, 7, 3, 2, 7, 4, 2, 2, 3, 2, 6, 2, 2, 9, 23, 2, 9, 63, 2, 9, 64, 2, 9, 31, 2, 9, 30, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 100, 1196, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 6, 20, 505, 10, 20, 13, 20, 14, 20, 506, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 515, 10, 21, 12, 21, 14, 21, 518, 11, 21, 3, 21, 5, 21, 521, 10, 21, 3, 21, 5, 21, 524, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 533, 10, 22, 12, 22, 14, 22, 536, 11, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 6, 23, 544, 10, 23, 13, 23, 14, 23, 545, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 587, 10, 34, 3, 34, 6, 34, 590, 10, 34, 13, 34, 14, 34, 591, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 5, 37, 601, 10, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 5, 39, 608, 10, 39, 3, 40, 3, 40, 3, 40, 7, 40, 613, 10, 40, 12, 40, 14, 40, 616, 11, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 624, 10, 40, 12, 40, 14, 40, 627, 11, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 634, 10, 40, 3, 40, 5, 40, 637, 10, 40, 5, 40, 639, 10, 40, 3, 41, 6, 41, 642, 10, 41, 13, 41, 14, 41, 643, 3, 42, 6, 42, 647, 10, 42, 13, 42, 14, 42, 648, 3, 42, 3, 42, 7, 42, 653, 10, 42, 12, 42, 14, 42, 656, 11, 42, 3, 42, 3, 42, 6, 42, 660, 10, 42, 13, 42, 14, 42, 661, 3, 42, 6, 42, 665, 10, 42, 13, 42, 14, 42, 666, 3, 42, 3, 42, 7, 42, 671, 10, 42, 12, 42, 14, 42, 674, 11, 42, 5, 42, 676, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 6, 42, 682, 10, 42, 13, 42, 14, 42, 683, 3, 42, 3, 42, 5, 42, 688, 10, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 72, 3, 72, 3, 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 7, 78, 813, 10, 78, 12, 78, 14, 78, 816, 11, 78, 3, 78, 3, 78, 5, 78, 820, 10, 78, 3, 78, 6, 78, 823, 10, 78, 13, 78, 14, 78, 824, 5, 78, 827, 10, 78, 3, 79, 3, 79, 6, 79, 831, 10, 79, 13, 79, 14, 79, 832, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 5, 89, 886, 10, 89, 3, 90, 6, 90, 889, 10, 90, 13, 90, 14, 90, 890, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 5, 98, 926, 10, 98, 3, 99, 3, 99, 5, 99, 930, 10, 99, 3, 99, 7, 99, 933, 10, 99, 12, 99, 14, 99, 936, 11, 99, 3, 99, 3, 99, 5, 99, 940, 10, 99, 3, 99, 6, 99, 943, 10, 99, 13, 99, 14, 99, 944, 5, 99, 947, 10, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 146, 3, 146, 3, 147, 3, 147, 3, 148, 3, 148, 3, 149, 3, 149, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 153, 3, 153, 3, 154, 3, 154, 3, 155, 3, 155, 3, 156, 3, 156, 3, 157, 3, 157, 3, 158, 3, 158, 3, 159, 3, 159, 3, 160, 3, 160, 3, 161, 3, 161, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 165, 3, 165, 3, 166, 3, 166, 3, 167, 3, 167, 3, 168, 3, 168, 3, 169, 3, 169, 3, 170, 3, 170, 4, 534, 625, 2, 2, 171, 12, 2, 3, 14, 2, 4, 16, 2, 5, 18, 2, 6, 20, 2, 7, 22, 2, 8, 24, 2, 9, 26, 2, 10, 28, 2, 11, 30, 2, 12, 32, 2, 13, 34, 2, 14, 36, 2, 15, 38, 2, 16, 40, 2, 17, 42, 2, 18, 44, 2, 19, 46, 2, 20, 48, 2, 21, 50, 2, 22, 52, 2, 23, 54, 2, 24, 56, 2, 2, 58, 2, 2, 60, 2, 25, 62, 2, 26, 64, 2, 27, 66, 2, 28, 68, 2, 2, 70, 2, 2, 72, 2, 2, 74, 2, 2, 76, 2, 2, 78, 2, 2, 80, 2, 2, 82, 2, 2, 84, 2, 2, 86, 2, 2, 88, 2, 29, 90, 2, 30, 92, 2, 31, 94, 2, 32, 96, 2, 33, 98, 2, 34, 100, 2, 35, 102, 2, 36, 104, 2, 37, 106, 2, 38, 108, 2, 39, 110, 2, 40, 112, 2, 41, 114, 2, 42, 116, 2, 43, 118, 2, 44, 120, 2, 45, 122, 2, 46, 124, 2, 47, 126, 2, 48, 128, 2, 49, 130, 2, 50, 132, 2, 51, 134, 2, 52, 136, 2, 53, 138, 2, 54, 140, 2, 55, 142, 2, 56, 144, 2, 57, 146, 2, 58, 148, 2, 59, 150, 2, 60, 152, 2, 61, 154, 2, 62, 156, 2, 63, 158, 2, 64, 160, 2, 65, 162, 2, 66, 164, 2, 67, 166, 2, 68, 168, 2, 69, 170, 2, 70, 172, 2, 71, 174, 2, 2, 176, 2, 2, 178, 2, 2, 180, 2, 2, 182, 2, 2, 184, 2, 72, 186, 2, 2, 188, 2, 73, 190, 2, 2, 192, 2, 74, 194, 2, 75, 196, 2, 76, 198, 2, 2, 200, 2, 2, 202, 2, 2, 204, 2, 2, 206, 2, 77, 208, 2, 2, 210, 2, 78, 212, 2, 79, 214, 2, 80, 216, 2, 2, 218, 2, 2, 220, 2, 2, 222, 2, 2, 224, 2, 81, 226, 2, 2, 228, 2, 2, 230, 2, 82, 232, 2, 83, 234, 2, 84, 236, 2, 2, 238, 2, 85, 240, 2, 86, 242, 2, 2, 244, 2, 2, 246, 2, 87, 248, 2, 88, 250, 2, 89, 252, 2, 2, 254, 2, 2, 256, 2, 2, 258, 2, 2, 260, 2, 2, 262, 2, 2, 264, 2, 2, 266, 2, 90, 268, 2, 91, 270, 2, 92, 272, 2, 2, 274, 2, 2, 276, 2, 2, 278, 2, 2, 280, 2, 93, 282, 2, 94, 284, 2, 95, 286, 2, 2, 288, 2, 96, 290, 2, 97, 292, 2, 98, 294, 2, 99, 296, 2, 100, 298, 2, 2, 300, 2, 2, 302, 2, 2, 304, 2, 2, 306, 2, 2, 308, 2, 2, 310, 2, 2, 312, 2, 2, 314, 2, 2, 316, 2, 2, 318, 2, 2, 320, 2, 2, 322, 2, 2, 324, 2, 2, 326, 2, 2, 328, 2, 2, 330, 2, 2, 332, 2, 2, 334, 2, 2, 336, 2, 2, 338, 2, 2, 340, 2, 2, 342, 2, 2, 344, 2, 2, 346, 2, 2, 348, 2, 2, 12, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 39, 8, 2, 11, 12, 15, 15, 34, 34, 49, 49, 93, 93, 95, 95, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 15, 15, 34, 34, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 7, 2, 36, 36, 94, 94, 112, 112, 116, 116, 118, 118, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 3, 2, 98, 98, 12, 2, 11, 12, 15, 15, 34, 34, 46, 46, 49, 49, 63, 63, 93, 93, 95, 95, 98, 98, 126, 126, 4, 2, 44, 44, 49, 49, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 2, 1192, 2, 12, 3, 2, 2, 2, 2, 14, 3, 2, 2, 2, 2, 16, 3, 2, 2, 2, 2, 18, 3, 2, 2, 2, 2, 20, 3, 2, 2, 2, 2, 22, 3, 2, 2, 2, 2, 24, 3, 2, 2, 2, 2, 26, 3, 2, 2, 2, 2, 28, 3, 2, 2, 2, 2, 30, 3, 2, 2, 2, 2, 32, 3, 2, 2, 2, 2, 34, 3, 2, 2, 2, 2, 36, 3, 2, 2, 2, 2, 38, 3, 2, 2, 2, 2, 40, 3, 2, 2, 2, 2, 42, 3, 2, 2, 2, 2, 44, 3, 2, 2, 2, 2, 46, 3, 2, 2, 2, 2, 48, 3, 2, 2, 2, 2, 50, 3, 2, 2, 2, 2, 52, 3, 2, 2, 2, 2, 54, 3, 2, 2, 2, 3, 56, 3, 2, 2, 2, 3, 58, 3, 2, 2, 2, 3, 60, 3, 2, 2, 2, 3, 62, 3, 2, 2, 2, 3, 64, 3, 2, 2, 2, 4, 66, 3, 2, 2, 2, 4, 88, 3, 2, 2, 2, 4, 90, 3, 2, 2, 2, 4, 92, 3, 2, 2, 2, 4, 94, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 4, 100, 3, 2, 2, 2, 4, 102, 3, 2, 2, 2, 4, 104, 3, 2, 2, 2, 4, 106, 3, 2, 2, 2, 4, 108, 3, 2, 2, 2, 4, 110, 3, 2, 2, 2, 4, 112, 3, 2, 2, 2, 4, 114, 3, 2, 2, 2, 4, 116, 3, 2, 2, 2, 4, 118, 3, 2, 2, 2, 4, 120, 3, 2, 2, 2, 4, 122, 3, 2, 2, 2, 4, 124, 3, 2, 2, 2, 4, 126, 3, 2, 2, 2, 4, 128, 3, 2, 2, 2, 4, 130, 3, 2, 2, 2, 4, 132, 3, 2, 2, 2, 4, 134, 3, 2, 2, 2, 4, 136, 3, 2, 2, 2, 4, 138, 3, 2, 2, 2, 4, 140, 3, 2, 2, 2, 4, 142, 3, 2, 2, 2, 4, 144, 3, 2, 2, 2, 4, 146, 3, 2, 2, 2, 4, 148, 3, 2, 2, 2, 4, 150, 3, 2, 2, 2, 4, 152, 3, 2, 2, 2, 4, 154, 3, 2, 2, 2, 4, 156, 3, 2, 2, 2, 4, 158, 3, 2, 2, 2, 4, 160, 3, 2, 2, 2, 4, 162, 3, 2, 2, 2, 4, 164, 3, 2, 2, 2, 4, 166, 3, 2, 2, 2, 4, 168, 3, 2, 2, 2, 4, 170, 3, 2, 2, 2, 4, 172, 3, 2, 2, 2, 5, 174, 3, 2, 2, 2, 5, 176, 3, 2, 2, 2, 5, 178, 3, 2, 2, 2, 5, 180, 3, 2, 2, 2, 5, 182, 3, 2, 2, 2, 5, 184, 3, 2, 2, 2, 5, 188, 3, 2, 2, 2, 5, 190, 3, 2, 2, 2, 5, 192, 3, 2, 2, 2, 5, 194, 3, 2, 2, 2, 5, 196, 3, 2, 2, 2, 6, 198, 3, 2, 2, 2, 6, 200, 3, 2, 2, 2, 6, 202, 3, 2, 2, 2, 6, 206, 3, 2, 2, 2, 6, 208, 3, 2, 2, 2, 6, 210, 3, 2, 2, 2, 6, 212, 3, 2, 2, 2, 6, 214, 3, 2, 2, 2, 7, 216, 3, 2, 2, 2, 7, 218, 3, 2, 2, 2, 7, 220, 3, 2, 2, 2, 7, 222, 3, 2, 2, 2, 7, 224, 3, 2, 2, 2, 7, 226, 3, 2, 2, 2, 7, 228, 3, 2, 2, 2, 7, 230, 3, 2, 2, 2, 7, 232, 3, 2, 2, 2, 7, 234, 3, 2, 2, 2, 8, 236, 3, 2, 2, 2, 8, 238, 3, 2, 2, 2, 8, 240, 3, 2, 2, 2, 8, 242, 3, 2, 2, 2, 8, 244, 3, 2, 2, 2, 8, 246, 3, 2, 2, 2, 8, 248, 3, 2, 2, 2, 8, 250, 3, 2, 2, 2, 9, 252, 3, 2, 2, 2, 9, 254, 3, 2, 2, 2, 9, 256, 3, 2, 2, 2, 9, 258, 3, 2, 2, 2, 9, 260, 3, 2, 2, 2, 9, 262, 3, 2, 2, 2, 9, 264, 3, 2, 2, 2, 9, 266, 3, 2, 2, 2, 9, 268, 3, 2, 2, 2, 9, 270, 3, 2, 2, 2, 10, 272, 3, 2, 2, 2, 10, 274, 3, 2, 2, 2, 10, 276, 3, 2, 2, 2, 10, 278, 3, 2, 2, 2, 10, 280, 3, 2, 2, 2, 10, 282, 3, 2, 2, 2, 10, 284, 3, 2, 2, 2, 11, 286, 3, 2, 2, 2, 11, 288, 3, 2, 2, 2, 11, 290, 3, 2, 2, 2, 11, 292, 3, 2, 2, 2, 11, 294, 3, 2, 2, 2, 11, 296, 3, 2, 2, 2, 12, 350, 3, 2, 2, 2, 14, 360, 3, 2, 2, 2, 16, 367, 3, 2, 2, 2, 18, 376, 3, 2, 2, 2, 20, 383, 3, 2, 2, 2, 22, 393, 3, 2, 2, 2, 24, 400, 3, 2, 2, 2, 26, 407, 3, 2, 2, 2, 28, 421, 3, 2, 2, 2, 30, 428, 3, 2, 2, 2, 32, 436, 3, 2, 2, 2, 34, 448, 3, 2, 2, 2, 36, 458, 3, 2, 2, 2, 38, 467, 3, 2, 2, 2, 40, 473, 3, 2, 2, 2, 42, 480, 3, 2, 2, 2, 44, 487, 3, 2, 2, 2, 46, 495, 3, 2, 2, 2, 48, 504, 3, 2, 2, 2, 50, 510, 3, 2, 2, 2, 52, 527, 3, 2, 2, 2, 54, 543, 3, 2, 2, 2, 56, 549, 3, 2, 2, 2, 58, 554, 3, 2, 2, 2, 60, 559, 3, 2, 2, 2, 62, 563, 3, 2, 2, 2, 64, 567, 3, 2, 2, 2, 66, 571, 3, 2, 2, 2, 68, 575, 3, 2, 2, 2, 70, 577, 3, 2, 2, 2, 72, 579, 3, 2, 2, 2, 74, 582, 3, 2, 2, 2, 76, 584, 3, 2, 2, 2, 78, 593, 3, 2, 2, 2, 80, 595, 3, 2, 2, 2, 82, 600, 3, 2, 2, 2, 84, 602, 3, 2, 2, 2, 86, 607, 3, 2, 2, 2, 88, 638, 3, 2, 2, 2, 90, 641, 3, 2, 2, 2, 92, 687, 3, 2, 2, 2, 94, 689, 3, 2, 2, 2, 96, 692, 3, 2, 2, 2, 98, 696, 3, 2, 2, 2, 100, 700, 3, 2, 2, 2, 102, 702, 3, 2, 2, 2, 104, 704, 3, 2, 2, 2, 106, 709, 3, 2, 2, 2, 108, 711, 3, 2, 2, 2, 110, 717, 3, 2, 2, 2, 112, 723, 3, 2, 2, 2, 114, 728, 3, 2, 2, 2, 116, 730, 3, 2, 2, 2, 118, 733, 3, 2, 2, 2, 120, 736, 3, 2, 2, 2, 122, 741, 3, 2, 2, 2, 124, 745, 3, 2, 2, 2, 126, 750, 3, 2, 2, 2, 128, 756, 3, 2, 2, 2, 130, 759, 3, 2, 2, 2, 132, 761, 3, 2, 2, 2, 134, 767, 3, 2, 2, 2, 136, 769, 3, 2, 2, 2, 138, 774, 3, 2, 2, 2, 140, 777, 3, 2, 2, 2, 142, 780, 3, 2, 2, 2, 144, 782, 3, 2, 2, 2, 146, 785, 3, 2, 2, 2, 148, 787, 3, 2, 2, 2, 150, 790, 3, 2, 2, 2, 152, 792, 3, 2, 2, 2, 154, 794, 3, 2, 2, 2, 156, 796, 3, 2, 2, 2, 158, 798, 3, 2, 2, 2, 160, 800, 3, 2, 2, 2, 162, 805, 3, 2, 2, 2, 164, 826, 3, 2, 2, 2, 166, 828, 3, 2, 2, 2, 168, 836, 3, 2, 2, 2, 170, 840, 3, 2, 2, 2, 172, 844, 3, 2, 2, 2, 174, 848, 3, 2, 2, 2, 176, 853, 3, 2, 2, 2, 178, 859, 3, 2, 2, 2, 180, 865, 3, 2, 2, 2, 182, 869, 3, 2, 2, 2, 184, 873, 3, 2, 2, 2, 186, 885, 3, 2, 2, 2, 188, 888, 3, 2, 2, 2, 190, 892, 3, 2, 2, 2, 192, 896, 3, 2, 2, 2, 194, 900, 3, 2, 2, 2, 196, 904, 3, 2, 2, 2, 198, 908, 3, 2, 2, 2, 200, 913, 3, 2, 2, 2, 202, 917, 3, 2, 2, 2, 204, 925, 3, 2, 2, 2, 206, 946, 3, 2, 2, 2, 208, 948, 3, 2, 2, 2, 210, 952, 3, 2, 2, 2, 212, 956, 3, 2, 2, 2, 214, 960, 3, 2, 2, 2, 216, 964, 3, 2, 2, 2, 218, 969, 3, 2, 2, 2, 220, 973, 3, 2, 2, 2, 222, 977, 3, 2, 2, 2, 224, 981, 3, 2, 2, 2, 226, 984, 3, 2, 2, 2, 228, 988, 3, 2, 2, 2, 230, 992, 3, 2, 2, 2, 232, 996, 3, 2, 2, 2, 234, 1000, 3, 2, 2, 2, 236, 1004, 3, 2, 2, 2, 238, 1009, 3, 2, 2, 2, 240, 1014, 3, 2, 2, 2, 242, 1021, 3, 2, 2, 2, 244, 1025, 3, 2, 2, 2, 246, 1029, 3, 2, 2, 2, 248, 1033, 3, 2, 2, 2, 250, 1037, 3, 2, 2, 2, 252, 1041, 3, 2, 2, 2, 254, 1047, 3, 2, 2, 2, 256, 1051, 3, 2, 2, 2, 258, 1055, 3, 2, 2, 2, 260, 1059, 3, 2, 2, 2, 262, 1063, 3, 2, 2, 2, 264, 1067, 3, 2, 2, 2, 266, 1071, 3, 2, 2, 2, 268, 1075, 3, 2, 2, 2, 270, 1079, 3, 2, 2, 2, 272, 1083, 3, 2, 2, 2, 274, 1088, 3, 2, 2, 2, 276, 1092, 3, 2, 2, 2, 278, 1096, 3, 2, 2, 2, 280, 1100, 3, 2, 2, 2, 282, 1104, 3, 2, 2, 2, 284, 1108, 3, 2, 2, 2, 286, 1112, 3, 2, 2, 2, 288, 1117, 3, 2, 2, 2, 290, 1122, 3, 2, 2, 2, 292, 1132, 3, 2, 2, 2, 294, 1136, 3, 2, 2, 2, 296, 1140, 3, 2, 2, 2, 298, 1144, 3, 2, 2, 2, 300, 1146, 3, 2, 2, 2, 302, 1148, 3, 2, 2, 2, 304, 1150, 3, 2, 2, 2, 306, 1152, 3, 2, 2, 2, 308, 1154, 3, 2, 2, 2, 310, 1156, 3, 2, 2, 2, 312, 1158, 3, 2, 2, 2, 314, 1160, 3, 2, 2, 2, 316, 1162, 3, 2, 2, 2, 318, 1164, 3, 2, 2, 2, 320, 1166, 3, 2, 2, 2, 322, 1168, 3, 2, 2, 2, 324, 1170, 3, 2, 2, 2, 326, 1172, 3, 2, 2, 2, 328, 1174, 3, 2, 2, 2, 330, 1176, 3, 2, 2, 2, 332, 1178, 3, 2, 2, 2, 334, 1180, 3, 2, 2, 2, 336, 1182, 3, 2, 2, 2, 338, 1184, 3, 2, 2, 2, 340, 1186, 3, 2, 2, 2, 342, 1188, 3, 2, 2, 2, 344, 1190, 3, 2, 2, 2, 346, 1192, 3, 2, 2, 2, 348, 1194, 3, 2, 2, 2, 350, 351, 5, 304, 148, 2, 351, 352, 5, 314, 153, 2, 352, 353, 5, 334, 163, 2, 353, 354, 5, 334, 163, 2, 354, 355, 5, 306, 149, 2, 355, 356, 5, 302, 147, 2, 356, 357, 5, 336, 164, 2, 357, 358, 3, 2, 2, 2, 358, 359, 8, 2, 2, 2, 359, 13, 3, 2, 2, 2, 360, 361, 5, 304, 148, 2, 361, 362, 5, 332, 162, 2, 362, 363, 5, 326, 159, 2, 363, 364, 5, 328, 160, 2, 364, 365, 3, 2, 2, 2, 365, 366, 8, 3, 3, 2, 366, 15, 3, 2, 2, 2, 367, 368, 5, 306, 149, 2, 368, 369, 5, 324, 158, 2, 369, 370, 5, 332, 162, 2, 370, 371, 5, 314, 153, 2, 371, 372, 5, 302, 147, 2, 372, 373, 5, 312, 152, 2, 373, 374, 3, 2, 2, 2, 374, 375, 8, 4, 4, 2, 375, 17, 3, 2, 2, 2, 376, 377, 5, 306, 149, 2, 377, 378, 5, 340, 166, 2, 378, 379, 5, 298, 145, 2, 379, 380, 5, 320, 156, 2, 380, 381, 3, 2, 2, 2, 381, 382, 8, 5, 2, 2, 382, 19, 3, 2, 2, 2, 383, 384, 5, 306, 149, 2, 384, 385, 5, 344, 168, 2, 385, 386, 5, 328, 160, 2, 386, 387, 5, 320, 156, 2, 387, 388, 5, 298, 145, 2, 388, 389, 5, 314, 153, 2, 389, 390, 5, 324, 158, 2, 390, 391, 3, 2, 2, 2, 391, 392, 8, 6, 5, 2, 392, 21, 3, 2, 2, 2, 393, 394, 5, 308, 150, 2, 394, 395, 5, 332, 162, 2, 395, 396, 5, 326, 159, 2, 396, 397, 5, 322, 157, 2, 397, 398, 3, 2, 2, 2, 398, 399, 8, 7, 6, 2, 399, 23, 3, 2, 2, 2, 400, 401, 5, 310, 151, 2, 401, 402, 5, 332, 162, 2, 402, 403, 5, 326, 159, 2, 403, 404, 5, 318, 155, 2, 404, 405, 3, 2, 2, 2, 405, 406, 8, 8, 2, 2, 406, 25, 3, 2, 2, 2, 407, 408, 5, 314, 153, 2, 408, 409, 5, 324, 158, 2, 409, 410, 5, 320, 156, 2, 410, 411, 5, 314, 153, 2, 411, 412, 5, 324, 158, 2, 412, 413, 5, 306, 149, 2, 413, 414, 5, 334, 163, 2, 414, 415, 5, 336, 164, 2, 415, 416, 5, 298, 145, 2, 416, 417, 5, 336, 164, 2, 417, 418, 5, 334, 163, 2, 418, 419, 3, 2, 2, 2, 419, 420, 8, 9, 2, 2, 420, 27, 3, 2, 2, 2, 421, 422, 5, 318, 155, 2, 422, 423, 5, 306, 149, 2, 423, 424, 5, 306, 149, 2, 424, 425, 5, 328, 160, 2, 425, 426, 3, 2, 2, 2, 426, 427, 8, 10, 3, 2, 427, 29, 3, 2, 2, 2, 428, 429, 5, 320, 156, 2, 429, 430, 5, 314, 153, 2, 430, 431, 5, 322, 157, 2, 431, 432, 5, 314, 153, 2, 432, 433, 5, 336, 164, 2, 433, 434, 3, 2, 2, 2, 434, 435, 8, 11, 2, 2, 435, 31, 3, 2, 2, 2, 436, 437, 5, 322, 157, 2, 437, 438, 5, 340, 166, 2, 438, 439, 5, 84, 38, 2, 439, 440, 5, 306, 149, 2, 440, 441, 5, 344, 168, 2, 441, 442, 5, 328, 160, 2, 442, 443, 5, 298, 145, 2, 443, 444, 5, 324, 158, 2, 444, 445, 5, 304, 148, 2, 445, 446, 3, 2, 2, 2, 446, 447, 8, 12, 7, 2, 447, 33, 3, 2, 2, 2, 448, 449, 5, 328, 160, 2, 449, 450, 5, 332, 162, 2, 450, 451, 5, 326, 159, 2, 451, 452, 5, 316, 154, 2, 452, 453, 5, 306, 149, 2, 453, 454, 5, 302, 147, 2, 454, 455, 5, 336, 164, 2, 455, 456, 3, 2, 2, 2, 456, 457, 8, 13, 3, 2, 457, 35, 3, 2, 2, 2, 458, 459, 5, 332, 162, 2, 459, 460, 5, 306, 149, 2, 460, 461, 5, 324, 158, 2, 461, 462, 5, 298, 145, 2, 462, 463, 5, 322, 157, 2, 463, 464, 5, 306, 149, 2, 464, 465, 3, 2, 2, 2, 465, 466, 8, 14, 8, 2, 466, 37, 3, 2, 2, 2, 467, 468, 5, 332, 162, 2, 468, 469, 5, 326, 159, 2, 469, 470, 5, 342, 167, 2, 470, 471, 3, 2, 2, 2, 471, 472, 8, 15, 2, 2, 472, 39, 3, 2, 2, 2, 473, 474, 5, 334, 163, 2, 474, 475, 5, 312, 152, 2, 475, 476, 5, 326, 159, 2, 476, 477, 5, 342, 167, 2, 477, 478, 3, 2, 2, 2, 478, 479, 8, 16, 9, 2, 479, 41, 3, 2, 2, 2, 480, 481, 5, 334, 163, 2, 481, 482, 5, 326, 159, 2, 482, 483, 5, 332, 162, 2, 483, 484, 5, 336, 164, 2, 484, 485, 3, 2, 2, 2, 485, 486, 8, 17, 2, 2, 486, 43, 3, 2, 2, 2, 487, 488, 5, 334, 163, 2, 488, 489, 5, 336, 164, 2, 489, 490, 5, 298, 145, 2, 490, 491, 5, 336, 164, 2, 491, 492, 5, 334, 163, 2, 492, 493, 3, 2, 2, 2, 493, 494, 8, 18, 2, 2, 494, 45, 3, 2, 2, 2, 495, 496, 5, 342, 167, 2, 496, 497, 5, 312, 152, 2, 497, 498, 5, 306, 149, 2, 498, 499, 5, 332, 162, 2, 499, 500, 5, 306, 149, 2, 500, 501, 3, 2, 2, 2, 501, 502, 8, 19, 2, 2, 502, 47, 3, 2, 2, 2, 503, 505, 10, 2, 2, 2, 504, 503, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 504, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 509, 8, 20, 2, 2, 509, 49, 3, 2, 2, 2, 510, 511, 7, 49, 2, 2, 511, 512, 7, 49, 2, 2, 512, 516, 3, 2, 2, 2, 513, 515, 10, 3, 2, 2, 514, 513, 3, 2, 2, 2, 515, 518, 3, 2, 2, 2, 516, 514, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 520, 3, 2, 2, 2, 518, 516, 3, 2, 2, 2, 519, 521, 7, 15, 2, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 523, 3, 2, 2, 2, 522, 524, 7, 12, 2, 2, 523, 522, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 526, 8, 21, 10, 2, 526, 51, 3, 2, 2, 2, 527, 528, 7, 49, 2, 2, 528, 529, 7, 44, 2, 2, 529, 534, 3, 2, 2, 2, 530, 533, 5, 52, 22, 2, 531, 533, 11, 2, 2, 2, 532, 530, 3, 2, 2, 2, 532, 531, 3, 2, 2, 2, 533, 536, 3, 2, 2, 2, 534, 535, 3, 2, 2, 2, 534, 532, 3, 2, 2, 2, 535, 537, 3, 2, 2, 2, 536, 534, 3, 2, 2, 2, 537, 538, 7, 44, 2, 2, 538, 539, 7, 49, 2, 2, 539, 540, 3, 2, 2, 2, 540, 541, 8, 22, 10, 2, 541, 53, 3, 2, 2, 2, 542, 544, 9, 4, 2, 2, 543, 542, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 547, 3, 2, 2, 2, 547, 548, 8, 23, 10, 2, 548, 55, 3, 2, 2, 2, 549, 550, 5, 160, 76, 2, 550, 551, 3, 2, 2, 2, 551, 552, 8, 24, 11, 2, 552, 553, 8, 24, 12, 2, 553, 57, 3, 2, 2, 2, 554, 555, 5, 66, 29, 2, 555, 556, 3, 2, 2, 2, 556, 557, 8, 25, 13, 2, 557, 558, 8, 25, 14, 2, 558, 59, 3, 2, 2, 2, 559, 560, 5, 54, 23, 2, 560, 561, 3, 2, 2, 2, 561, 562, 8, 26, 10, 2, 562, 61, 3, 2, 2, 2, 563, 564, 5, 50, 21, 2, 564, 565, 3, 2, 2, 2, 565, 566, 8, 27, 10, 2, 566, 63, 3, 2, 2, 2, 567, 568, 5, 52, 22, 2, 568, 569, 3, 2, 2, 2, 569, 570, 8, 28, 10, 2, 570, 65, 3, 2, 2, 2, 571, 572, 7, 126, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 8, 29, 14, 2, 574, 67, 3, 2, 2, 2, 575, 576, 9, 5, 2, 2, 576, 69, 3, 2, 2, 2, 577, 578, 9, 6, 2, 2, 578, 71, 3, 2, 2, 2, 579, 580, 7, 94, 2, 2, 580, 581, 9, 7, 2, 2, 581, 73, 3, 2, 2, 2, 582, 583, 10, 8, 2, 2, 583, 75, 3, 2, 2, 2, 584, 586, 9, 9, 2, 2, 585, 587, 9, 10, 2, 2, 586, 585, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 589, 3, 2, 2, 2, 588, 590, 5, 68, 30, 2, 589, 588, 3, 2, 2, 2, 590, 591, 3, 2, 2, 2, 591, 589, 3, 2, 2, 2, 591, 592, 3, 2, 2, 2, 592, 77, 3, 2, 2, 2, 593, 594, 7, 66, 2, 2, 594, 79, 3, 2, 2, 2, 595, 596, 7, 98, 2, 2, 596, 81, 3, 2, 2, 2, 597, 601, 10, 11, 2, 2, 598, 599, 7, 98, 2, 2, 599, 601, 7, 98, 2, 2, 600, 597, 3, 2, 2, 2, 600, 598, 3, 2, 2, 2, 601, 83, 3, 2, 2, 2, 602, 603, 7, 97, 2, 2, 603, 85, 3, 2, 2, 2, 604, 608, 5, 70, 31, 2, 605, 608, 5, 68, 30, 2, 606, 608, 5, 84, 38, 2, 607, 604, 3, 2, 2, 2, 607, 605, 3, 2, 2, 2, 607, 606, 3, 2, 2, 2, 608, 87, 3, 2, 2, 2, 609, 614, 7, 36, 2, 2, 610, 613, 5, 72, 32, 2, 611, 613, 5, 74, 33, 2, 612, 610, 3, 2, 2, 2, 612, 611, 3, 2, 2, 2, 613, 616, 3, 2, 2, 2, 614, 612, 3, 2, 2, 2, 614, 615, 3, 2, 2, 2, 615, 617, 3, 2, 2, 2, 616, 614, 3, 2, 2, 2, 617, 639, 7, 36, 2, 2, 618, 619, 7, 36, 2, 2, 619, 620, 7, 36, 2, 2, 620, 621, 7, 36, 2, 2, 621, 625, 3, 2, 2, 2, 622, 624, 10, 3, 2, 2, 623, 622, 3, 2, 2, 2, 624, 627, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, 625, 623, 3, 2, 2, 2, 626, 628, 3, 2, 2, 2, 627, 625, 3, 2, 2, 2, 628, 629, 7, 36, 2, 2, 629, 630, 7, 36, 2, 2, 630, 631, 7, 36, 2, 2, 631, 633, 3, 2, 2, 2, 632, 634, 7, 36, 2, 2, 633, 632, 3, 2, 2, 2, 633, 634, 3, 2, 2, 2, 634, 636, 3, 2, 2, 2, 635, 637, 7, 36, 2, 2, 636, 635, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 639, 3, 2, 2, 2, 638, 609, 3, 2, 2, 2, 638, 618, 3, 2, 2, 2, 639, 89, 3, 2, 2, 2, 640, 642, 5, 68, 30, 2, 641, 640, 3, 2, 2, 2, 642, 643, 3, 2, 2, 2, 643, 641, 3, 2, 2, 2, 643, 644, 3, 2, 2, 2, 644, 91, 3, 2, 2, 2, 645, 647, 5, 68, 30, 2, 646, 645, 3, 2, 2, 2, 647, 648, 3, 2, 2, 2, 648, 646, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 654, 5, 106, 49, 2, 651, 653, 5, 68, 30, 2, 652, 651, 3, 2, 2, 2, 653, 656, 3, 2, 2, 2, 654, 652, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 688, 3, 2, 2, 2, 656, 654, 3, 2, 2, 2, 657, 659, 5, 106, 49, 2, 658, 660, 5, 68, 30, 2, 659, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 688, 3, 2, 2, 2, 663, 665, 5, 68, 30, 2, 664, 663, 3, 2, 2, 2, 665, 666, 3, 2, 2, 2, 666, 664, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 675, 3, 2, 2, 2, 668, 672, 5, 106, 49, 2, 669, 671, 5, 68, 30, 2, 670, 669, 3, 2, 2, 2, 671, 674, 3, 2, 2, 2, 672, 670, 3, 2, 2, 2, 672, 673, 3, 2, 2, 2, 673, 676, 3, 2, 2, 2, 674, 672, 3, 2, 2, 2, 675, 668, 3, 2, 2, 2, 675, 676, 3, 2, 2, 2, 676, 677, 3, 2, 2, 2, 677, 678, 5, 76, 34, 2, 678, 688, 3, 2, 2, 2, 679, 681, 5, 106, 49, 2, 680, 682, 5, 68, 30, 2, 681, 680, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 681, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 685, 3, 2, 2, 2, 685, 686, 5, 76, 34, 2, 686, 688, 3, 2, 2, 2, 687, 646, 3, 2, 2, 2, 687, 657, 3, 2, 2, 2, 687, 664, 3, 2, 2, 2, 687, 679, 3, 2, 2, 2, 688, 93, 3, 2, 2, 2, 689, 690, 5, 300, 146, 2, 690, 691, 5, 346, 169, 2, 691, 95, 3, 2, 2, 2, 692, 693, 5, 298, 145, 2, 693, 694, 5, 324, 158, 2, 694, 695, 5, 304, 148, 2, 695, 97, 3, 2, 2, 2, 696, 697, 5, 298, 145, 2, 697, 698, 5, 334, 163, 2, 698, 699, 5, 302, 147, 2, 699, 99, 3, 2, 2, 2, 700, 701, 7, 63, 2, 2, 701, 101, 3, 2, 2, 2, 702, 703, 7, 46, 2, 2, 703, 103, 3, 2, 2, 2, 704, 705, 5, 304, 148, 2, 705, 706, 5, 306, 149, 2, 706, 707, 5, 334, 163, 2, 707, 708, 5, 302, 147, 2, 708, 105, 3, 2, 2, 2, 709, 710, 7, 48, 2, 2, 710, 107, 3, 2, 2, 2, 711, 712, 5, 308, 150, 2, 712, 713, 5, 298, 145, 2, 713, 714, 5, 320, 156, 2, 714, 715, 5, 334, 163, 2, 715, 716, 5, 306, 149, 2, 716, 109, 3, 2, 2, 2, 717, 718, 5, 308, 150, 2, 718, 719, 5, 314, 153, 2, 719, 720, 5, 332, 162, 2, 720, 721, 5, 334, 163, 2, 721, 722, 5, 336, 164, 2, 722, 111, 3, 2, 2, 2, 723, 724, 5, 320, 156, 2, 724, 725, 5, 298, 145, 2, 725, 726, 5, 334, 163, 2, 726, 727, 5, 336, 164, 2, 727, 113, 3, 2, 2, 2, 728, 729, 7, 42, 2, 2, 729, 115, 3, 2, 2, 2, 730, 731, 5, 314, 153, 2, 731, 732, 5, 324, 158, 2, 732, 117, 3, 2, 2, 2, 733, 734, 5, 314, 153, 2, 734, 735, 5, 334, 163, 2, 735, 119, 3, 2, 2, 2, 736, 737, 5, 320, 156, 2, 737, 738, 5, 314, 153, 2, 738, 739, 5, 318, 155, 2, 739, 740, 5, 306, 149, 2, 740, 121, 3, 2, 2, 2, 741, 742, 5, 324, 158, 2, 742, 743, 5, 326, 159, 2, 743, 744, 5, 336, 164, 2, 744, 123, 3, 2, 2, 2, 745, 746, 5, 324, 158, 2, 746, 747, 5, 338, 165, 2, 747, 748, 5, 320, 156, 2, 748, 749, 5, 320, 156, 2, 749, 125, 3, 2, 2, 2, 750, 751, 5, 324, 158, 2, 751, 752, 5, 338, 165, 2, 752, 753, 5, 320, 156, 2, 753, 754, 5, 320, 156, 2, 754, 755, 5, 334, 163, 2, 755, 127, 3, 2, 2, 2, 756, 757, 5, 326, 159, 2, 757, 758, 5, 332, 162, 2, 758, 129, 3, 2, 2, 2, 759, 760, 7, 65, 2, 2, 760, 131, 3, 2, 2, 2, 761, 762, 5, 332, 162, 2, 762, 763, 5, 320, 156, 2, 763, 764, 5, 314, 153, 2, 764, 765, 5, 318, 155, 2, 765, 766, 5, 306, 149, 2, 766, 133, 3, 2, 2, 2, 767, 768, 7, 43, 2, 2, 768, 135, 3, 2, 2, 2, 769, 770, 5, 336, 164, 2, 770, 771, 5, 332, 162, 2, 771, 772, 5, 338, 165, 2, 772, 773, 5, 306, 149, 2, 773, 137, 3, 2, 2, 2, 774, 775, 7, 63, 2, 2, 775, 776, 7, 63, 2, 2, 776, 139, 3, 2, 2, 2, 777, 778, 7, 35, 2, 2, 778, 779, 7, 63, 2, 2, 779, 141, 3, 2, 2, 2, 780, 781, 7, 62, 2, 2, 781, 143, 3, 2, 2, 2, 782, 783, 7, 62, 2, 2, 783, 784, 7, 63, 2, 2, 784, 145, 3, 2, 2, 2, 785, 786, 7, 64, 2, 2, 786, 147, 3, 2, 2, 2, 787, 788, 7, 64, 2, 2, 788, 789, 7, 63, 2, 2, 789, 149, 3, 2, 2, 2, 790, 791, 7, 45, 2, 2, 791, 151, 3, 2, 2, 2, 792, 793, 7, 47, 2, 2, 793, 153, 3, 2, 2, 2, 794, 795, 7, 44, 2, 2, 795, 155, 3, 2, 2, 2, 796, 797, 7, 49, 2, 2, 797, 157, 3, 2, 2, 2, 798, 799, 7, 39, 2, 2, 799, 159, 3, 2, 2, 2, 800, 801, 7, 93, 2, 2, 801, 802, 3, 2, 2, 2, 802, 803, 8, 76, 2, 2, 803, 804, 8, 76, 2, 2, 804, 161, 3, 2, 2, 2, 805, 806, 7, 95, 2, 2, 806, 807, 3, 2, 2, 2, 807, 808, 8, 77, 14, 2, 808, 809, 8, 77, 14, 2, 809, 163, 3, 2, 2, 2, 810, 814, 5, 70, 31, 2, 811, 813, 5, 86, 39, 2, 812, 811, 3, 2, 2, 2, 813, 816, 3, 2, 2, 2, 814, 812, 3, 2, 2, 2, 814, 815, 3, 2, 2, 2, 815, 827, 3, 2, 2, 2, 816, 814, 3, 2, 2, 2, 817, 820, 5, 84, 38, 2, 818, 820, 5, 78, 35, 2, 819, 817, 3, 2, 2, 2, 819, 818, 3, 2, 2, 2, 820, 822, 3, 2, 2, 2, 821, 823, 5, 86, 39, 2, 822, 821, 3, 2, 2, 2, 823, 824, 3, 2, 2, 2, 824, 822, 3, 2, 2, 2, 824, 825, 3, 2, 2, 2, 825, 827, 3, 2, 2, 2, 826, 810, 3, 2, 2, 2, 826, 819, 3, 2, 2, 2, 827, 165, 3, 2, 2, 2, 828, 830, 5, 80, 36, 2, 829, 831, 5, 82, 37, 2, 830, 829, 3, 2, 2, 2, 831, 832, 3, 2, 2, 2, 832, 830, 3, 2, 2, 2, 832, 833, 3, 2, 2, 2, 833, 834, 3, 2, 2, 2, 834, 835, 5, 80, 36, 2, 835, 167, 3, 2, 2, 2, 836, 837, 5, 50, 21, 2, 837, 838, 3, 2, 2, 2, 838, 839, 8, 80, 10, 2, 839, 169, 3, 2, 2, 2, 840, 841, 5, 52, 22, 2, 841, 842, 3, 2, 2, 2, 842, 843, 8, 81, 10, 2, 843, 171, 3, 2, 2, 2, 844, 845, 5, 54, 23, 2, 845, 846, 3, 2, 2, 2, 846, 847, 8, 82, 10, 2, 847, 173, 3, 2, 2, 2, 848, 849, 5, 66, 29, 2, 849, 850, 3, 2, 2, 2, 850, 851, 8, 83, 13, 2, 851, 852, 8, 83, 14, 2, 852, 175, 3, 2, 2, 2, 853, 854, 5, 160, 76, 2, 854, 855, 3, 2, 2, 2, 855, 856, 8, 84, 11, 2, 856, 857, 8, 84, 6, 2, 857, 858, 8, 84, 6, 2, 858, 177, 3, 2, 2, 2, 859, 860, 5, 162, 77, 2, 860, 861, 3, 2, 2, 2, 861, 862, 8, 85, 15, 2, 862, 863, 8, 85, 14, 2, 863, 864, 8, 85, 14, 2, 864, 179, 3, 2, 2, 2, 865, 866, 5, 102, 47, 2, 866, 867, 3, 2, 2, 2, 867, 868, 8, 86, 16, 2, 868, 181, 3, 2, 2, 2, 869, 870, 5, 100, 46, 2, 870, 871, 3, 2, 2, 2, 871, 872, 8, 87, 17, 2, 872, 183, 3, 2, 2, 2, 873, 874, 5, 322, 157, 2, 874, 875, 5, 306, 149, 2, 875, 876, 5, 336, 164, 2, 876, 877, 5, 298, 145, 2, 877, 878, 5, 304, 148, 2, 878, 879, 5, 298, 145, 2, 879, 880, 5, 336, 164, 2, 880, 881, 5, 298, 145, 2, 881, 185, 3, 2, 2, 2, 882, 886, 10, 12, 2, 2, 883, 884, 7, 49, 2, 2, 884, 886, 10, 13, 2, 2, 885, 882, 3, 2, 2, 2, 885, 883, 3, 2, 2, 2, 886, 187, 3, 2, 2, 2, 887, 889, 5, 186, 89, 2, 888, 887, 3, 2, 2, 2, 889, 890, 3, 2, 2, 2, 890, 888, 3, 2, 2, 2, 890, 891, 3, 2, 2, 2, 891, 189, 3, 2, 2, 2, 892, 893, 5, 166, 79, 2, 893, 894, 3, 2, 2, 2, 894, 895, 8, 91, 18, 2, 895, 191, 3, 2, 2, 2, 896, 897, 5, 50, 21, 2, 897, 898, 3, 2, 2, 2, 898, 899, 8, 92, 10, 2, 899, 193, 3, 2, 2, 2, 900, 901, 5, 52, 22, 2, 901, 902, 3, 2, 2, 2, 902, 903, 8, 93, 10, 2, 903, 195, 3, 2, 2, 2, 904, 905, 5, 54, 23, 2, 905, 906, 3, 2, 2, 2, 906, 907, 8, 94, 10, 2, 907, 197, 3, 2, 2, 2, 908, 909, 5, 66, 29, 2, 909, 910, 3, 2, 2, 2, 910, 911, 8, 95, 13, 2, 911, 912, 8, 95, 14, 2, 912, 199, 3, 2, 2, 2, 913, 914, 5, 106, 49, 2, 914, 915, 3, 2, 2, 2, 915, 916, 8, 96, 19, 2, 916, 201, 3, 2, 2, 2, 917, 918, 5, 102, 47, 2, 918, 919, 3, 2, 2, 2, 919, 920, 8, 97, 16, 2, 920, 203, 3, 2, 2, 2, 921, 926, 5, 70, 31, 2, 922, 926, 5, 68, 30, 2, 923, 926, 5, 84, 38, 2, 924, 926, 5, 154, 73, 2, 925, 921, 3, 2, 2, 2, 925, 922, 3, 2, 2, 2, 925, 923, 3, 2, 2, 2, 925, 924, 3, 2, 2, 2, 926, 205, 3, 2, 2, 2, 927, 930, 5, 70, 31, 2, 928, 930, 5, 154, 73, 2, 929, 927, 3, 2, 2, 2, 929, 928, 3, 2, 2, 2, 930, 934, 3, 2, 2, 2, 931, 933, 5, 204, 98, 2, 932, 931, 3, 2, 2, 2, 933, 936, 3, 2, 2, 2, 934, 932, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 947, 3, 2, 2, 2, 936, 934, 3, 2, 2, 2, 937, 940, 5, 84, 38, 2, 938, 940, 5, 78, 35, 2, 939, 937, 3, 2, 2, 2, 939, 938, 3, 2, 2, 2, 940, 942, 3, 2, 2, 2, 941, 943, 5, 204, 98, 2, 942, 941, 3, 2, 2, 2, 943, 944, 3, 2, 2, 2, 944, 942, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 947, 3, 2, 2, 2, 946, 929, 3, 2, 2, 2, 946, 939, 3, 2, 2, 2, 947, 207, 3, 2, 2, 2, 948, 949, 5, 166, 79, 2, 949, 950, 3, 2, 2, 2, 950, 951, 8, 100, 18, 2, 951, 209, 3, 2, 2, 2, 952, 953, 5, 50, 21, 2, 953, 954, 3, 2, 2, 2, 954, 955, 8, 101, 10, 2, 955, 211, 3, 2, 2, 2, 956, 957, 5, 52, 22, 2, 957, 958, 3, 2, 2, 2, 958, 959, 8, 102, 10, 2, 959, 213, 3, 2, 2, 2, 960, 961, 5, 54, 23, 2, 961, 962, 3, 2, 2, 2, 962, 963, 8, 103, 10, 2, 963, 215, 3, 2, 2, 2, 964, 965, 5, 66, 29, 2, 965, 966, 3, 2, 2, 2, 966, 967, 8, 104, 13, 2, 967, 968, 8, 104, 14, 2, 968, 217, 3, 2, 2, 2, 969, 970, 5, 100, 46, 2, 970, 971, 3, 2, 2, 2, 971, 972, 8, 105, 17, 2, 972, 219, 3, 2, 2, 2, 973, 974, 5, 102, 47, 2, 974, 975, 3, 2, 2, 2, 975, 976, 8, 106, 16, 2, 976, 221, 3, 2, 2, 2, 977, 978, 5, 106, 49, 2, 978, 979, 3, 2, 2, 2, 979, 980, 8, 107, 19, 2, 980, 223, 3, 2, 2, 2, 981, 982, 5, 298, 145, 2, 982, 983, 5, 334, 163, 2, 983, 225, 3, 2, 2, 2, 984, 985, 5, 166, 79, 2, 985, 986, 3, 2, 2, 2, 986, 987, 8, 109, 18, 2, 987, 227, 3, 2, 2, 2, 988, 989, 5, 206, 99, 2, 989, 990, 3, 2, 2, 2, 990, 991, 8, 110, 20, 2, 991, 229, 3, 2, 2, 2, 992, 993, 5, 50, 21, 2, 993, 994, 3, 2, 2, 2, 994, 995, 8, 111, 10, 2, 995, 231, 3, 2, 2, 2, 996, 997, 5, 52, 22, 2, 997, 998, 3, 2, 2, 2, 998, 999, 8, 112, 10, 2, 999, 233, 3, 2, 2, 2, 1000, 1001, 5, 54, 23, 2, 1001, 1002, 3, 2, 2, 2, 1002, 1003, 8, 113, 10, 2, 1003, 235, 3, 2, 2, 2, 1004, 1005, 5, 66, 29, 2, 1005, 1006, 3, 2, 2, 2, 1006, 1007, 8, 114, 13, 2, 1007, 1008, 8, 114, 14, 2, 1008, 237, 3, 2, 2, 2, 1009, 1010, 5, 326, 159, 2, 1010, 1011, 5, 324, 158, 2, 1011, 1012, 3, 2, 2, 2, 1012, 1013, 8, 115, 21, 2, 1013, 239, 3, 2, 2, 2, 1014, 1015, 5, 342, 167, 2, 1015, 1016, 5, 314, 153, 2, 1016, 1017, 5, 336, 164, 2, 1017, 1018, 5, 312, 152, 2, 1018, 1019, 3, 2, 2, 2, 1019, 1020, 8, 116, 21, 2, 1020, 241, 3, 2, 2, 2, 1021, 1022, 5, 188, 90, 2, 1022, 1023, 3, 2, 2, 2, 1023, 1024, 8, 117, 22, 2, 1024, 243, 3, 2, 2, 2, 1025, 1026, 5, 166, 79, 2, 1026, 1027, 3, 2, 2, 2, 1027, 1028, 8, 118, 18, 2, 1028, 245, 3, 2, 2, 2, 1029, 1030, 5, 50, 21, 2, 1030, 1031, 3, 2, 2, 2, 1031, 1032, 8, 119, 10, 2, 1032, 247, 3, 2, 2, 2, 1033, 1034, 5, 52, 22, 2, 1034, 1035, 3, 2, 2, 2, 1035, 1036, 8, 120, 10, 2, 1036, 249, 3, 2, 2, 2, 1037, 1038, 5, 54, 23, 2, 1038, 1039, 3, 2, 2, 2, 1039, 1040, 8, 121, 10, 2, 1040, 251, 3, 2, 2, 2, 1041, 1042, 5, 66, 29, 2, 1042, 1043, 3, 2, 2, 2, 1043, 1044, 8, 122, 13, 2, 1044, 1045, 8, 122, 14, 2, 1045, 1046, 8, 122, 14, 2, 1046, 253, 3, 2, 2, 2, 1047, 1048, 5, 100, 46, 2, 1048, 1049, 3, 2, 2, 2, 1049, 1050, 8, 123, 17, 2, 1050, 255, 3, 2, 2, 2, 1051, 1052, 5, 102, 47, 2, 1052, 1053, 3, 2, 2, 2, 1053, 1054, 8, 124, 16, 2, 1054, 257, 3, 2, 2, 2, 1055, 1056, 5, 106, 49, 2, 1056, 1057, 3, 2, 2, 2, 1057, 1058, 8, 125, 19, 2, 1058, 259, 3, 2, 2, 2, 1059, 1060, 5, 240, 116, 2, 1060, 1061, 3, 2, 2, 2, 1061, 1062, 8, 126, 23, 2, 1062, 261, 3, 2, 2, 2, 1063, 1064, 5, 206, 99, 2, 1064, 1065, 3, 2, 2, 2, 1065, 1066, 8, 127, 20, 2, 1066, 263, 3, 2, 2, 2, 1067, 1068, 5, 166, 79, 2, 1068, 1069, 3, 2, 2, 2, 1069, 1070, 8, 128, 18, 2, 1070, 265, 3, 2, 2, 2, 1071, 1072, 5, 50, 21, 2, 1072, 1073, 3, 2, 2, 2, 1073, 1074, 8, 129, 10, 2, 1074, 267, 3, 2, 2, 2, 1075, 1076, 5, 52, 22, 2, 1076, 1077, 3, 2, 2, 2, 1077, 1078, 8, 130, 10, 2, 1078, 269, 3, 2, 2, 2, 1079, 1080, 5, 54, 23, 2, 1080, 1081, 3, 2, 2, 2, 1081, 1082, 8, 131, 10, 2, 1082, 271, 3, 2, 2, 2, 1083, 1084, 5, 66, 29, 2, 1084, 1085, 3, 2, 2, 2, 1085, 1086, 8, 132, 13, 2, 1086, 1087, 8, 132, 14, 2, 1087, 273, 3, 2, 2, 2, 1088, 1089, 5, 106, 49, 2, 1089, 1090, 3, 2, 2, 2, 1090, 1091, 8, 133, 19, 2, 1091, 275, 3, 2, 2, 2, 1092, 1093, 5, 166, 79, 2, 1093, 1094, 3, 2, 2, 2, 1094, 1095, 8, 134, 18, 2, 1095, 277, 3, 2, 2, 2, 1096, 1097, 5, 164, 78, 2, 1097, 1098, 3, 2, 2, 2, 1098, 1099, 8, 135, 24, 2, 1099, 279, 3, 2, 2, 2, 1100, 1101, 5, 50, 21, 2, 1101, 1102, 3, 2, 2, 2, 1102, 1103, 8, 136, 10, 2, 1103, 281, 3, 2, 2, 2, 1104, 1105, 5, 52, 22, 2, 1105, 1106, 3, 2, 2, 2, 1106, 1107, 8, 137, 10, 2, 1107, 283, 3, 2, 2, 2, 1108, 1109, 5, 54, 23, 2, 1109, 1110, 3, 2, 2, 2, 1110, 1111, 8, 138, 10, 2, 1111, 285, 3, 2, 2, 2, 1112, 1113, 5, 66, 29, 2, 1113, 1114, 3, 2, 2, 2, 1114, 1115, 8, 139, 13, 2, 1115, 1116, 8, 139, 14, 2, 1116, 287, 3, 2, 2, 2, 1117, 1118, 5, 314, 153, 2, 1118, 1119, 5, 324, 158, 2, 1119, 1120, 5, 308, 150, 2, 1120, 1121, 5, 326, 159, 2, 1121, 289, 3, 2, 2, 2, 1122, 1123, 5, 308, 150, 2, 1123, 1124, 5, 338, 165, 2, 1124, 1125, 5, 324, 158, 2, 1125, 1126, 5, 302, 147, 2, 1126, 1127, 5, 336, 164, 2, 1127, 1128, 5, 314, 153, 2, 1128, 1129, 5, 326, 159, 2, 1129, 1130, 5, 324, 158, 2, 1130, 1131, 5, 334, 163, 2, 1131, 291, 3, 2, 2, 2, 1132, 1133, 5, 50, 21, 2, 1133, 1134, 3, 2, 2, 2, 1134, 1135, 8, 142, 10, 2, 1135, 293, 3, 2, 2, 2, 1136, 1137, 5, 52, 22, 2, 1137, 1138, 3, 2, 2, 2, 1138, 1139, 8, 143, 10, 2, 1139, 295, 3, 2, 2, 2, 1140, 1141, 5, 54, 23, 2, 1141, 1142, 3, 2, 2, 2, 1142, 1143, 8, 144, 10, 2, 1143, 297, 3, 2, 2, 2, 1144, 1145, 9, 14, 2, 2, 1145, 299, 3, 2, 2, 2, 1146, 1147, 9, 15, 2, 2, 1147, 301, 3, 2, 2, 2, 1148, 1149, 9, 16, 2, 2, 1149, 303, 3, 2, 2, 2, 1150, 1151, 9, 17, 2, 2, 1151, 305, 3, 2, 2, 2, 1152, 1153, 9, 9, 2, 2, 1153, 307, 3, 2, 2, 2, 1154, 1155, 9, 18, 2, 2, 1155, 309, 3, 2, 2, 2, 1156, 1157, 9, 19, 2, 2, 1157, 311, 3, 2, 2, 2, 1158, 1159, 9, 20, 2, 2, 1159, 313, 3, 2, 2, 2, 1160, 1161, 9, 21, 2, 2, 1161, 315, 3, 2, 2, 2, 1162, 1163, 9, 22, 2, 2, 1163, 317, 3, 2, 2, 2, 1164, 1165, 9, 23, 2, 2, 1165, 319, 3, 2, 2, 2, 1166, 1167, 9, 24, 2, 2, 1167, 321, 3, 2, 2, 2, 1168, 1169, 9, 25, 2, 2, 1169, 323, 3, 2, 2, 2, 1170, 1171, 9, 26, 2, 2, 1171, 325, 3, 2, 2, 2, 1172, 1173, 9, 27, 2, 2, 1173, 327, 3, 2, 2, 2, 1174, 1175, 9, 28, 2, 2, 1175, 329, 3, 2, 2, 2, 1176, 1177, 9, 29, 2, 2, 1177, 331, 3, 2, 2, 2, 1178, 1179, 9, 30, 2, 2, 1179, 333, 3, 2, 2, 2, 1180, 1181, 9, 31, 2, 2, 1181, 335, 3, 2, 2, 2, 1182, 1183, 9, 32, 2, 2, 1183, 337, 3, 2, 2, 2, 1184, 1185, 9, 33, 2, 2, 1185, 339, 3, 2, 2, 2, 1186, 1187, 9, 34, 2, 2, 1187, 341, 3, 2, 2, 2, 1188, 1189, 9, 35, 2, 2, 1189, 343, 3, 2, 2, 2, 1190, 1191, 9, 36, 2, 2, 1191, 345, 3, 2, 2, 2, 1192, 1193, 9, 37, 2, 2, 1193, 347, 3, 2, 2, 2, 1194, 1195, 9, 38, 2, 2, 1195, 349, 3, 2, 2, 2, 51, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 506, 516, 520, 523, 532, 534, 545, 586, 591, 600, 607, 612, 614, 625, 633, 636, 638, 643, 648, 654, 661, 666, 672, 675, 683, 687, 814, 819, 824, 826, 832, 885, 890, 925, 929, 934, 939, 944, 946, 25, 7, 4, 2, 7, 6, 2, 7, 8, 2, 7, 3, 2, 7, 5, 2, 7, 10, 2, 7, 7, 2, 7, 11, 2, 2, 3, 2, 9, 65, 2, 7, 2, 2, 9, 28, 2, 6, 2, 2, 9, 66, 2, 9, 36, 2, 9, 35, 2, 9, 68, 2, 9, 38, 2, 9, 77, 2, 7, 9, 2, 9, 73, 2, 9, 86, 2, 9, 67, 2] \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens b/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens index c3160ce1f6472..85a98c3a6d268 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens @@ -2,92 +2,116 @@ DISSECT=1 DROP=2 ENRICH=3 EVAL=4 -FROM=5 -GROK=6 -KEEP=7 -LIMIT=8 -MV_EXPAND=9 -PROJECT=10 -RENAME=11 -ROW=12 -SHOW=13 -SORT=14 -STATS=15 -WHERE=16 -UNKNOWN_CMD=17 -LINE_COMMENT=18 -MULTILINE_COMMENT=19 -WS=20 -PIPE=21 -STRING=22 -INTEGER_LITERAL=23 -DECIMAL_LITERAL=24 -BY=25 -AND=26 -ASC=27 -ASSIGN=28 -COMMA=29 -DESC=30 -DOT=31 -FALSE=32 -FIRST=33 -LAST=34 -LP=35 -IN=36 -IS=37 -LIKE=38 -NOT=39 -NULL=40 -NULLS=41 -OR=42 -PARAM=43 -RLIKE=44 -RP=45 -TRUE=46 -INFO=47 -FUNCTIONS=48 -UNDERSCORE=49 -EQ=50 -NEQ=51 -LT=52 -LTE=53 -GT=54 -GTE=55 -PLUS=56 -MINUS=57 -ASTERISK=58 -SLASH=59 -PERCENT=60 -OPENING_BRACKET=61 -CLOSING_BRACKET=62 -UNQUOTED_IDENTIFIER=63 -QUOTED_IDENTIFIER=64 -EXPR_LINE_COMMENT=65 -EXPR_MULTILINE_COMMENT=66 -EXPR_WS=67 -AS=68 -METADATA=69 -ON=70 -WITH=71 -SRC_UNQUOTED_IDENTIFIER=72 -SRC_QUOTED_IDENTIFIER=73 -SRC_LINE_COMMENT=74 -SRC_MULTILINE_COMMENT=75 -SRC_WS=76 -'.'=31 -'('=35 -'?'=43 -')'=45 -'_'=49 -'=='=50 -'!='=51 -'<'=52 -'<='=53 -'>'=54 -'>='=55 -'+'=56 -'-'=57 -'*'=58 -'/'=59 -'%'=60 -']'=62 +EXPLAIN=5 +FROM=6 +GROK=7 +INLINESTATS=8 +KEEP=9 +LIMIT=10 +MV_EXPAND=11 +PROJECT=12 +RENAME=13 +ROW=14 +SHOW=15 +SORT=16 +STATS=17 +WHERE=18 +UNKNOWN_CMD=19 +LINE_COMMENT=20 +MULTILINE_COMMENT=21 +WS=22 +EXPLAIN_WS=23 +EXPLAIN_LINE_COMMENT=24 +EXPLAIN_MULTILINE_COMMENT=25 +PIPE=26 +STRING=27 +INTEGER_LITERAL=28 +DECIMAL_LITERAL=29 +BY=30 +AND=31 +ASC=32 +ASSIGN=33 +COMMA=34 +DESC=35 +DOT=36 +FALSE=37 +FIRST=38 +LAST=39 +LP=40 +IN=41 +IS=42 +LIKE=43 +NOT=44 +NULL=45 +NULLS=46 +OR=47 +PARAM=48 +RLIKE=49 +RP=50 +TRUE=51 +EQ=52 +NEQ=53 +LT=54 +LTE=55 +GT=56 +GTE=57 +PLUS=58 +MINUS=59 +ASTERISK=60 +SLASH=61 +PERCENT=62 +OPENING_BRACKET=63 +CLOSING_BRACKET=64 +UNQUOTED_IDENTIFIER=65 +QUOTED_IDENTIFIER=66 +EXPR_LINE_COMMENT=67 +EXPR_MULTILINE_COMMENT=68 +EXPR_WS=69 +METADATA=70 +FROM_UNQUOTED_IDENTIFIER=71 +FROM_LINE_COMMENT=72 +FROM_MULTILINE_COMMENT=73 +FROM_WS=74 +PROJECT_UNQUOTED_IDENTIFIER=75 +PROJECT_LINE_COMMENT=76 +PROJECT_MULTILINE_COMMENT=77 +PROJECT_WS=78 +AS=79 +RENAME_LINE_COMMENT=80 +RENAME_MULTILINE_COMMENT=81 +RENAME_WS=82 +ON=83 +WITH=84 +ENRICH_LINE_COMMENT=85 +ENRICH_MULTILINE_COMMENT=86 +ENRICH_WS=87 +ENRICH_FIELD_LINE_COMMENT=88 +ENRICH_FIELD_MULTILINE_COMMENT=89 +ENRICH_FIELD_WS=90 +MVEXPAND_LINE_COMMENT=91 +MVEXPAND_MULTILINE_COMMENT=92 +MVEXPAND_WS=93 +INFO=94 +FUNCTIONS=95 +SHOW_LINE_COMMENT=96 +SHOW_MULTILINE_COMMENT=97 +SHOW_WS=98 +'|'=26 +'='=33 +','=34 +'.'=36 +'('=40 +'?'=48 +')'=50 +'=='=52 +'!='=53 +'<'=54 +'<='=55 +'>'=56 +'>='=57 +'+'=58 +'-'=59 +'*'=60 +'/'=61 +'%'=62 +']'=64 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts b/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts index 4bbb3eb4968c3..741ea56ba1408 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts @@ -21,80 +21,109 @@ export class esql_lexer extends Lexer { public static readonly DROP = 2; public static readonly ENRICH = 3; public static readonly EVAL = 4; - public static readonly FROM = 5; - public static readonly GROK = 6; - public static readonly KEEP = 7; - public static readonly LIMIT = 8; - public static readonly MV_EXPAND = 9; - public static readonly PROJECT = 10; - public static readonly RENAME = 11; - public static readonly ROW = 12; - public static readonly SHOW = 13; - public static readonly SORT = 14; - public static readonly STATS = 15; - public static readonly WHERE = 16; - public static readonly UNKNOWN_CMD = 17; - public static readonly LINE_COMMENT = 18; - public static readonly MULTILINE_COMMENT = 19; - public static readonly WS = 20; - public static readonly PIPE = 21; - public static readonly STRING = 22; - public static readonly INTEGER_LITERAL = 23; - public static readonly DECIMAL_LITERAL = 24; - public static readonly BY = 25; - public static readonly AND = 26; - public static readonly ASC = 27; - public static readonly ASSIGN = 28; - public static readonly COMMA = 29; - public static readonly DESC = 30; - public static readonly DOT = 31; - public static readonly FALSE = 32; - public static readonly FIRST = 33; - public static readonly LAST = 34; - public static readonly LP = 35; - public static readonly IN = 36; - public static readonly IS = 37; - public static readonly LIKE = 38; - public static readonly NOT = 39; - public static readonly NULL = 40; - public static readonly NULLS = 41; - public static readonly OR = 42; - public static readonly PARAM = 43; - public static readonly RLIKE = 44; - public static readonly RP = 45; - public static readonly TRUE = 46; - public static readonly INFO = 47; - public static readonly FUNCTIONS = 48; - public static readonly UNDERSCORE = 49; - public static readonly EQ = 50; - public static readonly NEQ = 51; - public static readonly LT = 52; - public static readonly LTE = 53; - public static readonly GT = 54; - public static readonly GTE = 55; - public static readonly PLUS = 56; - public static readonly MINUS = 57; - public static readonly ASTERISK = 58; - public static readonly SLASH = 59; - public static readonly PERCENT = 60; - public static readonly OPENING_BRACKET = 61; - public static readonly CLOSING_BRACKET = 62; - public static readonly UNQUOTED_IDENTIFIER = 63; - public static readonly QUOTED_IDENTIFIER = 64; - public static readonly EXPR_LINE_COMMENT = 65; - public static readonly EXPR_MULTILINE_COMMENT = 66; - public static readonly EXPR_WS = 67; - public static readonly AS = 68; - public static readonly METADATA = 69; - public static readonly ON = 70; - public static readonly WITH = 71; - public static readonly SRC_UNQUOTED_IDENTIFIER = 72; - public static readonly SRC_QUOTED_IDENTIFIER = 73; - public static readonly SRC_LINE_COMMENT = 74; - public static readonly SRC_MULTILINE_COMMENT = 75; - public static readonly SRC_WS = 76; - public static readonly EXPRESSION = 1; - public static readonly SOURCE_IDENTIFIERS = 2; + public static readonly EXPLAIN = 5; + public static readonly FROM = 6; + public static readonly GROK = 7; + public static readonly INLINESTATS = 8; + public static readonly KEEP = 9; + public static readonly LIMIT = 10; + public static readonly MV_EXPAND = 11; + public static readonly PROJECT = 12; + public static readonly RENAME = 13; + public static readonly ROW = 14; + public static readonly SHOW = 15; + public static readonly SORT = 16; + public static readonly STATS = 17; + public static readonly WHERE = 18; + public static readonly UNKNOWN_CMD = 19; + public static readonly LINE_COMMENT = 20; + public static readonly MULTILINE_COMMENT = 21; + public static readonly WS = 22; + public static readonly EXPLAIN_WS = 23; + public static readonly EXPLAIN_LINE_COMMENT = 24; + public static readonly EXPLAIN_MULTILINE_COMMENT = 25; + public static readonly PIPE = 26; + public static readonly STRING = 27; + public static readonly INTEGER_LITERAL = 28; + public static readonly DECIMAL_LITERAL = 29; + public static readonly BY = 30; + public static readonly AND = 31; + public static readonly ASC = 32; + public static readonly ASSIGN = 33; + public static readonly COMMA = 34; + public static readonly DESC = 35; + public static readonly DOT = 36; + public static readonly FALSE = 37; + public static readonly FIRST = 38; + public static readonly LAST = 39; + public static readonly LP = 40; + public static readonly IN = 41; + public static readonly IS = 42; + public static readonly LIKE = 43; + public static readonly NOT = 44; + public static readonly NULL = 45; + public static readonly NULLS = 46; + public static readonly OR = 47; + public static readonly PARAM = 48; + public static readonly RLIKE = 49; + public static readonly RP = 50; + public static readonly TRUE = 51; + public static readonly EQ = 52; + public static readonly NEQ = 53; + public static readonly LT = 54; + public static readonly LTE = 55; + public static readonly GT = 56; + public static readonly GTE = 57; + public static readonly PLUS = 58; + public static readonly MINUS = 59; + public static readonly ASTERISK = 60; + public static readonly SLASH = 61; + public static readonly PERCENT = 62; + public static readonly OPENING_BRACKET = 63; + public static readonly CLOSING_BRACKET = 64; + public static readonly UNQUOTED_IDENTIFIER = 65; + public static readonly QUOTED_IDENTIFIER = 66; + public static readonly EXPR_LINE_COMMENT = 67; + public static readonly EXPR_MULTILINE_COMMENT = 68; + public static readonly EXPR_WS = 69; + public static readonly METADATA = 70; + public static readonly FROM_UNQUOTED_IDENTIFIER = 71; + public static readonly FROM_LINE_COMMENT = 72; + public static readonly FROM_MULTILINE_COMMENT = 73; + public static readonly FROM_WS = 74; + public static readonly PROJECT_UNQUOTED_IDENTIFIER = 75; + public static readonly PROJECT_LINE_COMMENT = 76; + public static readonly PROJECT_MULTILINE_COMMENT = 77; + public static readonly PROJECT_WS = 78; + public static readonly AS = 79; + public static readonly RENAME_LINE_COMMENT = 80; + public static readonly RENAME_MULTILINE_COMMENT = 81; + public static readonly RENAME_WS = 82; + public static readonly ON = 83; + public static readonly WITH = 84; + public static readonly ENRICH_LINE_COMMENT = 85; + public static readonly ENRICH_MULTILINE_COMMENT = 86; + public static readonly ENRICH_WS = 87; + public static readonly ENRICH_FIELD_LINE_COMMENT = 88; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 89; + public static readonly ENRICH_FIELD_WS = 90; + public static readonly MVEXPAND_LINE_COMMENT = 91; + public static readonly MVEXPAND_MULTILINE_COMMENT = 92; + public static readonly MVEXPAND_WS = 93; + public static readonly INFO = 94; + public static readonly FUNCTIONS = 95; + public static readonly SHOW_LINE_COMMENT = 96; + public static readonly SHOW_MULTILINE_COMMENT = 97; + public static readonly SHOW_WS = 98; + public static readonly EXPLAIN_MODE = 1; + public static readonly EXPRESSION_MODE = 2; + public static readonly FROM_MODE = 3; + public static readonly PROJECT_MODE = 4; + public static readonly RENAME_MODE = 5; + public static readonly ENRICH_MODE = 6; + public static readonly ENRICH_FIELD_MODE = 7; + public static readonly MVEXPAND_MODE = 8; + public static readonly SHOW_MODE = 9; // tslint:disable:no-trailing-whitespace public static readonly channelNames: string[] = [ @@ -103,24 +132,40 @@ export class esql_lexer extends Lexer { // tslint:disable:no-trailing-whitespace public static readonly modeNames: string[] = [ - "DEFAULT_MODE", "EXPRESSION", "SOURCE_IDENTIFIERS", + "DEFAULT_MODE", "EXPLAIN_MODE", "EXPRESSION_MODE", "FROM_MODE", "PROJECT_MODE", + "RENAME_MODE", "ENRICH_MODE", "ENRICH_FIELD_MODE", "MVEXPAND_MODE", "SHOW_MODE", ]; public static readonly ruleNames: string[] = [ - "DISSECT", "DROP", "ENRICH", "EVAL", "FROM", "GROK", "KEEP", "LIMIT", - "MV_EXPAND", "PROJECT", "RENAME", "ROW", "SHOW", "SORT", "STATS", "WHERE", - "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "DIGIT", - "LETTER", "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", "STRING", - "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "COMMA", - "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "IN", "IS", "LIKE", "NOT", - "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "INFO", "FUNCTIONS", - "UNDERSCORE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", - "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", + "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "INLINESTATS", + "KEEP", "LIMIT", "MV_EXPAND", "PROJECT", "RENAME", "ROW", "SHOW", "SORT", + "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", + "WS", "EXPLAIN_OPENING_BRACKET", "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", + "EXPLAIN_MULTILINE_COMMENT", "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", + "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", "BACKQUOTE", "BACKQUOTE_BLOCK", + "UNDERSCORE", "UNQUOTED_ID_BODY", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", + "BY", "AND", "ASC", "ASSIGN", "COMMA", "DESC", "DOT", "FALSE", "FIRST", + "LAST", "LP", "IN", "IS", "LIKE", "NOT", "NULL", "NULLS", "OR", "PARAM", + "RLIKE", "RP", "TRUE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", + "MINUS", "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", - "EXPR_WS", "SRC_PIPE", "SRC_OPENING_BRACKET", "SRC_CLOSING_BRACKET", "SRC_COMMA", - "SRC_ASSIGN", "AS", "METADATA", "ON", "WITH", "SRC_UNQUOTED_IDENTIFIER", - "SRC_UNQUOTED_IDENTIFIER_PART", "SRC_QUOTED_IDENTIFIER", "SRC_LINE_COMMENT", - "SRC_MULTILINE_COMMENT", "SRC_WS", "A", "B", "C", "D", "E", "F", "G", + "EXPR_WS", "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", + "FROM_COMMA", "FROM_ASSIGN", "METADATA", "FROM_UNQUOTED_IDENTIFIER_PART", + "FROM_UNQUOTED_IDENTIFIER", "FROM_QUOTED_IDENTIFIER", "FROM_LINE_COMMENT", + "FROM_MULTILINE_COMMENT", "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", + "UNQUOTED_ID_BODY_WITH_PATTERN", "PROJECT_UNQUOTED_IDENTIFIER", "PROJECT_QUOTED_IDENTIFIER", + "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", "RENAME_PIPE", + "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", "AS", "RENAME_QUOTED_IDENTIFIER", + "RENAME_UNQUOTED_IDENTIFIER", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", + "RENAME_WS", "ENRICH_PIPE", "ON", "WITH", "ENRICH_POLICY_UNQUOTED_IDENTIFIER", + "ENRICH_QUOTED_IDENTIFIER", "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", + "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", "ENRICH_FIELD_COMMA", + "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_UNQUOTED_IDENTIFIER", + "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", + "ENRICH_FIELD_WS", "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", + "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", + "MVEXPAND_WS", "SHOW_PIPE", "INFO", "FUNCTIONS", "SHOW_LINE_COMMENT", + "SHOW_MULTILINE_COMMENT", "SHOW_WS", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", ]; @@ -129,26 +174,32 @@ export class esql_lexer extends Lexer { undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, "'.'", undefined, undefined, undefined, - "'('", undefined, undefined, undefined, undefined, undefined, undefined, - undefined, "'?'", undefined, "')'", undefined, undefined, undefined, "'_'", + undefined, undefined, undefined, undefined, undefined, "'|'", undefined, + undefined, undefined, undefined, undefined, undefined, "'='", "','", undefined, + "'.'", undefined, undefined, undefined, "'('", undefined, undefined, undefined, + undefined, undefined, undefined, undefined, "'?'", undefined, "')'", undefined, "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", undefined, "']'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ - undefined, "DISSECT", "DROP", "ENRICH", "EVAL", "FROM", "GROK", "KEEP", - "LIMIT", "MV_EXPAND", "PROJECT", "RENAME", "ROW", "SHOW", "SORT", "STATS", - "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", - "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", - "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "IN", "IS", "LIKE", - "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "INFO", - "FUNCTIONS", "UNDERSCORE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", - "MINUS", "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", - "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", - "EXPR_WS", "AS", "METADATA", "ON", "WITH", "SRC_UNQUOTED_IDENTIFIER", - "SRC_QUOTED_IDENTIFIER", "SRC_LINE_COMMENT", "SRC_MULTILINE_COMMENT", - "SRC_WS", + undefined, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", + "INLINESTATS", "KEEP", "LIMIT", "MV_EXPAND", "PROJECT", "RENAME", "ROW", + "SHOW", "SORT", "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", + "WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", + "PIPE", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", + "ASSIGN", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "IN", + "IS", "LIKE", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", + "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", + "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", + "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", + "METADATA", "FROM_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", + "FROM_WS", "PROJECT_UNQUOTED_IDENTIFIER", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", + "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", + "RENAME_WS", "ON", "WITH", "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", + "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", + "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", + "MVEXPAND_WS", "INFO", "FUNCTIONS", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", + "SHOW_WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(esql_lexer._LITERAL_NAMES, esql_lexer._SYMBOLIC_NAMES, []); @@ -180,400 +231,599 @@ export class esql_lexer extends Lexer { // @Override public get modeNames(): string[] { return esql_lexer.modeNames; } - private static readonly _serializedATNSegments: number = 2; + private static readonly _serializedATNSegments: number = 3; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02N\u032D\b\x01" + - "\b\x01\b\x01\x04\x02\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04" + - "\x06\t\x06\x04\x07\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f" + - "\t\f\x04\r\t\r\x04\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11" + - "\x04\x12\t\x12\x04\x13\t\x13\x04\x14\t\x14\x04\x15\t\x15\x04\x16\t\x16" + - "\x04\x17\t\x17\x04\x18\t\x18\x04\x19\t\x19\x04\x1A\t\x1A\x04\x1B\t\x1B" + - "\x04\x1C\t\x1C\x04\x1D\t\x1D\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!" + - "\t!\x04\"\t\"\x04#\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t" + - ")\x04*\t*\x04+\t+\x04,\t,\x04-\t-\x04.\t.\x04/\t/\x040\t0\x041\t1\x04" + - "2\t2\x043\t3\x044\t4\x045\t5\x046\t6\x047\t7\x048\t8\x049\t9\x04:\t:\x04" + - ";\t;\x04<\t<\x04=\t=\x04>\t>\x04?\t?\x04@\t@\x04A\tA\x04B\tB\x04C\tC\x04" + - "D\tD\x04E\tE\x04F\tF\x04G\tG\x04H\tH\x04I\tI\x04J\tJ\x04K\tK\x04L\tL\x04" + - "M\tM\x04N\tN\x04O\tO\x04P\tP\x04Q\tQ\x04R\tR\x04S\tS\x04T\tT\x04U\tU\x04" + - "V\tV\x04W\tW\x04X\tX\x04Y\tY\x04Z\tZ\x04[\t[\x04\\\t\\\x04]\t]\x04^\t" + - "^\x04_\t_\x04`\t`\x04a\ta\x04b\tb\x04c\tc\x04d\td\x04e\te\x04f\tf\x04" + - "g\tg\x04h\th\x04i\ti\x04j\tj\x04k\tk\x04l\tl\x04m\tm\x04n\tn\x04o\to\x04" + - "p\tp\x04q\tq\x04r\tr\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" + - "\x02\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" + - "\x03\x03\x03\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" + - "\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02d\u04AC\b\x01" + + "\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\x04\x02\t\x02\x04" + + "\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07\t\x07\x04" + + "\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04\x0E\t\x0E" + + "\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04\x13\t\x13" + + "\x04\x14\t\x14\x04\x15\t\x15\x04\x16\t\x16\x04\x17\t\x17\x04\x18\t\x18" + + "\x04\x19\t\x19\x04\x1A\t\x1A\x04\x1B\t\x1B\x04\x1C\t\x1C\x04\x1D\t\x1D" + + "\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!\t!\x04\"\t\"\x04#\t#\x04$\t" + + "$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t)\x04*\t*\x04+\t+\x04,\t,\x04" + + "-\t-\x04.\t.\x04/\t/\x040\t0\x041\t1\x042\t2\x043\t3\x044\t4\x045\t5\x04" + + "6\t6\x047\t7\x048\t8\x049\t9\x04:\t:\x04;\t;\x04<\t<\x04=\t=\x04>\t>\x04" + + "?\t?\x04@\t@\x04A\tA\x04B\tB\x04C\tC\x04D\tD\x04E\tE\x04F\tF\x04G\tG\x04" + + "H\tH\x04I\tI\x04J\tJ\x04K\tK\x04L\tL\x04M\tM\x04N\tN\x04O\tO\x04P\tP\x04" + + "Q\tQ\x04R\tR\x04S\tS\x04T\tT\x04U\tU\x04V\tV\x04W\tW\x04X\tX\x04Y\tY\x04" + + "Z\tZ\x04[\t[\x04\\\t\\\x04]\t]\x04^\t^\x04_\t_\x04`\t`\x04a\ta\x04b\t" + + "b\x04c\tc\x04d\td\x04e\te\x04f\tf\x04g\tg\x04h\th\x04i\ti\x04j\tj\x04" + + "k\tk\x04l\tl\x04m\tm\x04n\tn\x04o\to\x04p\tp\x04q\tq\x04r\tr\x04s\ts\x04" + + "t\tt\x04u\tu\x04v\tv\x04w\tw\x04x\tx\x04y\ty\x04z\tz\x04{\t{\x04|\t|\x04" + + "}\t}\x04~\t~\x04\x7F\t\x7F\x04\x80\t\x80\x04\x81\t\x81\x04\x82\t\x82\x04" + + "\x83\t\x83\x04\x84\t\x84\x04\x85\t\x85\x04\x86\t\x86\x04\x87\t\x87\x04" + + "\x88\t\x88\x04\x89\t\x89\x04\x8A\t\x8A\x04\x8B\t\x8B\x04\x8C\t\x8C\x04" + + "\x8D\t\x8D\x04\x8E\t\x8E\x04\x8F\t\x8F\x04\x90\t\x90\x04\x91\t\x91\x04" + + "\x92\t\x92\x04\x93\t\x93\x04\x94\t\x94\x04\x95\t\x95\x04\x96\t\x96\x04" + + "\x97\t\x97\x04\x98\t\x98\x04\x99\t\x99\x04\x9A\t\x9A\x04\x9B\t\x9B\x04" + + "\x9C\t\x9C\x04\x9D\t\x9D\x04\x9E\t\x9E\x04\x9F\t\x9F\x04\xA0\t\xA0\x04" + + "\xA1\t\xA1\x04\xA2\t\xA2\x04\xA3\t\xA3\x04\xA4\t\xA4\x04\xA5\t\xA5\x04" + + "\xA6\t\xA6\x04\xA7\t\xA7\x04\xA8\t\xA8\x04\xA9\t\xA9\x04\xAA\t\xAA\x03" + + "\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" + + "\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x04\x03" + + "\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x05\x03" + + "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x06\x03\x06\x03\x06\x03" + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x07\x03\x07\x03" + "\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x03" + - "\b\x03\b\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\n\x03\n\x03" + - "\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\v\x03\v\x03" + - "\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\f\x03\f\x03\f\x03\f\x03" + - "\f\x03\f\x03\f\x03\f\x03\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\x0E" + - "\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10" + - "\x03\x10\x03\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11" + - "\x03\x11\x03\x11\x03\x12\x06\x12\u016A\n\x12\r\x12\x0E\x12\u016B\x03\x12" + - "\x03\x12\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u0174\n\x13\f\x13\x0E" + - "\x13\u0177\v\x13\x03\x13\x05\x13\u017A\n\x13\x03\x13\x05\x13\u017D\n\x13" + - "\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0186" + - "\n\x14\f\x14\x0E\x14\u0189\v\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x15\x06\x15\u0191\n\x15\r\x15\x0E\x15\u0192\x03\x15\x03\x15\x03\x16" + - "\x03\x16\x03\x16\x03\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x19\x03\x19" + - "\x03\x19\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x05\x1B\u01A6\n\x1B\x03\x1B\x06" + - "\x1B\u01A9\n\x1B\r\x1B\x0E\x1B\u01AA\x03\x1C\x03\x1C\x03\x1C\x07\x1C\u01B0" + - "\n\x1C\f\x1C\x0E\x1C\u01B3\v\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C" + - "\x03\x1C\x07\x1C\u01BB\n\x1C\f\x1C\x0E\x1C\u01BE\v\x1C\x03\x1C\x03\x1C" + - "\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u01C5\n\x1C\x03\x1C\x05\x1C\u01C8\n\x1C" + - "\x05\x1C\u01CA\n\x1C\x03\x1D\x06\x1D\u01CD\n\x1D\r\x1D\x0E\x1D\u01CE\x03" + - "\x1E\x06\x1E\u01D2\n\x1E\r\x1E\x0E\x1E\u01D3\x03\x1E\x03\x1E\x07\x1E\u01D8" + - "\n\x1E\f\x1E\x0E\x1E\u01DB\v\x1E\x03\x1E\x03\x1E\x06\x1E\u01DF\n\x1E\r" + - "\x1E\x0E\x1E\u01E0\x03\x1E\x06\x1E\u01E4\n\x1E\r\x1E\x0E\x1E\u01E5\x03" + - "\x1E\x03\x1E\x07\x1E\u01EA\n\x1E\f\x1E\x0E\x1E\u01ED\v\x1E\x05\x1E\u01EF" + - "\n\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x06\x1E\u01F5\n\x1E\r\x1E\x0E\x1E" + - "\u01F6\x03\x1E\x03\x1E\x05\x1E\u01FB\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03" + - " \x03 \x03 \x03 \x03!\x03!\x03!\x03!\x03\"\x03\"\x03#\x03#\x03$\x03$\x03" + - "$\x03$\x03$\x03%\x03%\x03&\x03&\x03&\x03&\x03&\x03&\x03\'\x03\'\x03\'" + - "\x03\'\x03\'\x03\'\x03(\x03(\x03(\x03(\x03(\x03)\x03)\x03*\x03*\x03*\x03" + - "+\x03+\x03+\x03,\x03,\x03,\x03,\x03,\x03-\x03-\x03-\x03-\x03.\x03.\x03" + - ".\x03.\x03.\x03/\x03/\x03/\x03/\x03/\x03/\x030\x030\x030\x031\x031\x03" + - "2\x032\x032\x032\x032\x032\x033\x033\x034\x034\x034\x034\x034\x035\x03" + - "5\x035\x035\x035\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x03" + - "7\x037\x038\x038\x038\x039\x039\x039\x03:\x03:\x03;\x03;\x03;\x03<\x03" + - "<\x03=\x03=\x03=\x03>\x03>\x03?\x03?\x03@\x03@\x03A\x03A\x03B\x03B\x03" + - "C\x03C\x03C\x03C\x03C\x03D\x03D\x03D\x03D\x03D\x03E\x03E\x03E\x03E\x07" + - "E\u028B\nE\fE\x0EE\u028E\vE\x03E\x03E\x03E\x03E\x06E\u0294\nE\rE\x0EE" + - "\u0295\x05E\u0298\nE\x03F\x03F\x03F\x03F\x07F\u029E\nF\fF\x0EF\u02A1\v" + - "F\x03F\x03F\x03G\x03G\x03G\x03G\x03H\x03H\x03H\x03H\x03I\x03I\x03I\x03" + - "I\x03J\x03J\x03J\x03J\x03J\x03K\x03K\x03K\x03K\x03K\x03K\x03L\x03L\x03" + - "L\x03L\x03L\x03L\x03M\x03M\x03M\x03M\x03N\x03N\x03N\x03N\x03O\x03O\x03" + - "O\x03P\x03P\x03P\x03P\x03P\x03P\x03P\x03P\x03P\x03Q\x03Q\x03Q\x03R\x03" + - "R\x03R\x03R\x03R\x03S\x06S\u02DF\nS\rS\x0ES\u02E0\x03T\x06T\u02E4\nT\r" + - "T\x0ET\u02E5\x03T\x03T\x05T\u02EA\nT\x03U\x03U\x03V\x03V\x03V\x03V\x03" + - "W\x03W\x03W\x03W\x03X\x03X\x03X\x03X\x03Y\x03Y\x03Z\x03Z\x03[\x03[\x03" + - "\\\x03\\\x03]\x03]\x03^\x03^\x03_\x03_\x03`\x03`\x03a\x03a\x03b\x03b\x03" + - "c\x03c\x03d\x03d\x03e\x03e\x03f\x03f\x03g\x03g\x03h\x03h\x03i\x03i\x03" + - "j\x03j\x03k\x03k\x03l\x03l\x03m\x03m\x03n\x03n\x03o\x03o\x03p\x03p\x03" + - "q\x03q\x03r\x03r\x04\u0187\u01BC\x02\x02s\x05\x02\x03\x07\x02\x04\t\x02" + - "\x05\v\x02\x06\r\x02\x07\x0F\x02\b\x11\x02\t\x13\x02\n\x15\x02\v\x17\x02" + - "\f\x19\x02\r\x1B\x02\x0E\x1D\x02\x0F\x1F\x02\x10!\x02\x11#\x02\x12%\x02" + - "\x13\'\x02\x14)\x02\x15+\x02\x16-\x02\x17/\x02\x021\x02\x023\x02\x025" + - "\x02\x027\x02\x029\x02\x18;\x02\x19=\x02\x1A?\x02\x1BA\x02\x1CC\x02\x1D" + - "E\x02\x1EG\x02\x1FI\x02 K\x02!M\x02\"O\x02#Q\x02$S\x02%U\x02&W\x02\'Y" + - "\x02([\x02)]\x02*_\x02+a\x02,c\x02-e\x02.g\x02/i\x020k\x021m\x022o\x02" + - "3q\x024s\x025u\x026w\x027y\x028{\x029}\x02:\x7F\x02;\x81\x02<\x83\x02" + - "=\x85\x02>\x87\x02?\x89\x02@\x8B\x02A\x8D\x02B\x8F\x02C\x91\x02D\x93\x02" + - "E\x95\x02\x02\x97\x02\x02\x99\x02\x02\x9B\x02\x02\x9D\x02\x02\x9F\x02" + - "F\xA1\x02G\xA3\x02H\xA5\x02I\xA7\x02J\xA9\x02\x02\xAB\x02K\xAD\x02L\xAF" + - "\x02M\xB1\x02N\xB3\x02\x02\xB5\x02\x02\xB7\x02\x02\xB9\x02\x02\xBB\x02" + - "\x02\xBD\x02\x02\xBF\x02\x02\xC1\x02\x02\xC3\x02\x02\xC5\x02\x02\xC7\x02" + - "\x02\xC9\x02\x02\xCB\x02\x02\xCD\x02\x02\xCF\x02\x02\xD1\x02\x02\xD3\x02" + - "\x02\xD5\x02\x02\xD7\x02\x02\xD9\x02\x02\xDB\x02\x02\xDD\x02\x02\xDF\x02" + - "\x02\xE1\x02\x02\xE3\x02\x02\xE5\x02\x02\x05\x02\x03\x04(\b\x02\v\f\x0F" + - "\x0F\"\"11]]__\x04\x02\f\f\x0F\x0F\x05\x02\v\f\x0F\x0F\"\"\x03\x022;\x04" + - "\x02C\\c|\x07\x02$$^^ppttvv\x06\x02\f\f\x0F\x0F$$^^\x04\x02GGgg\x04\x02" + - "--//\x04\x02BBaa\x03\x02bb\f\x02\v\f\x0F\x0F\"\"..11??]]__bb~~\x04\x02" + - ",,11\x04\x02CCcc\x04\x02DDdd\x04\x02EEee\x04\x02FFff\x04\x02HHhh\x04\x02" + - "IIii\x04\x02JJjj\x04\x02KKkk\x04\x02LLll\x04\x02MMmm\x04\x02NNnn\x04\x02" + - "OOoo\x04\x02PPpp\x04\x02QQqq\x04\x02RRrr\x04\x02SSss\x04\x02TTtt\x04\x02" + - "UUuu\x04\x02VVvv\x04\x02WWww\x04\x02XXxx\x04\x02YYyy\x04\x02ZZzz\x04\x02" + - "[[{{\x04\x02\\\\||\x02\u0330\x02\x05\x03\x02\x02\x02\x02\x07\x03\x02\x02" + - "\x02\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03\x02\x02\x02" + - "\x02\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02" + - "\x02\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03\x02\x02\x02" + - "\x02\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03\x02\x02\x02" + - "\x02!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02\x02\x02\'" + - "\x03\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x03-\x03\x02" + - "\x02\x02\x039\x03\x02\x02\x02\x03;\x03\x02\x02\x02\x03=\x03\x02\x02\x02" + - "\x03?\x03\x02\x02\x02\x03A\x03\x02\x02\x02\x03C\x03\x02\x02\x02\x03E\x03" + - "\x02\x02\x02\x03G\x03\x02\x02\x02\x03I\x03\x02\x02\x02\x03K\x03\x02\x02" + - "\x02\x03M\x03\x02\x02\x02\x03O\x03\x02\x02\x02\x03Q\x03\x02\x02\x02\x03" + - "S\x03\x02\x02\x02\x03U\x03\x02\x02\x02\x03W\x03\x02\x02\x02\x03Y\x03\x02" + - "\x02\x02\x03[\x03\x02\x02\x02\x03]\x03\x02\x02\x02\x03_\x03\x02\x02\x02" + - "\x03a\x03\x02\x02\x02\x03c\x03\x02\x02\x02\x03e\x03\x02\x02\x02\x03g\x03" + - "\x02\x02\x02\x03i\x03\x02\x02\x02\x03k\x03\x02\x02\x02\x03m\x03\x02\x02" + - "\x02\x03o\x03\x02\x02\x02\x03q\x03\x02\x02\x02\x03s\x03\x02\x02\x02\x03" + - "u\x03\x02\x02\x02\x03w\x03\x02\x02\x02\x03y\x03\x02\x02\x02\x03{\x03\x02" + - "\x02\x02\x03}\x03\x02\x02\x02\x03\x7F\x03\x02\x02\x02\x03\x81\x03\x02" + - "\x02\x02\x03\x83\x03\x02\x02\x02\x03\x85\x03\x02\x02\x02\x03\x87\x03\x02" + - "\x02\x02\x03\x89\x03\x02\x02\x02\x03\x8B\x03\x02\x02\x02\x03\x8D\x03\x02" + - "\x02\x02\x03\x8F\x03\x02\x02\x02\x03\x91\x03\x02\x02\x02\x03\x93\x03\x02" + - "\x02\x02\x04\x95\x03\x02\x02\x02\x04\x97\x03\x02\x02\x02\x04\x99\x03\x02" + - "\x02\x02\x04\x9B\x03\x02\x02\x02\x04\x9D\x03\x02\x02\x02\x04\x9F\x03\x02" + - "\x02\x02\x04\xA1\x03\x02\x02\x02\x04\xA3\x03\x02\x02\x02\x04\xA5\x03\x02" + - "\x02\x02\x04\xA7\x03\x02\x02\x02\x04\xAB\x03\x02\x02\x02\x04\xAD\x03\x02" + - "\x02\x02\x04\xAF\x03\x02\x02\x02\x04\xB1\x03\x02\x02\x02\x05\xE7\x03\x02" + - "\x02\x02\x07\xF1\x03\x02\x02\x02\t\xF8\x03\x02\x02\x02\v\u0101\x03\x02" + - "\x02\x02\r\u0108\x03\x02\x02\x02\x0F\u010F\x03\x02\x02\x02\x11\u0116\x03" + - "\x02\x02\x02\x13\u011D\x03\x02\x02\x02\x15\u0125\x03\x02\x02\x02\x17\u0131" + - "\x03\x02\x02\x02\x19\u013B\x03\x02\x02\x02\x1B\u0144\x03\x02\x02\x02\x1D" + - "\u014A\x03\x02\x02\x02\x1F\u0151\x03\x02\x02\x02!\u0158\x03\x02\x02\x02" + - "#\u0160\x03\x02\x02\x02%\u0169\x03\x02\x02\x02\'\u016F\x03\x02\x02\x02" + - ")\u0180\x03\x02\x02\x02+\u0190\x03\x02\x02\x02-\u0196\x03\x02\x02\x02" + - "/\u019A\x03\x02\x02\x021\u019C\x03\x02\x02\x023\u019E\x03\x02\x02\x02" + - "5\u01A1\x03\x02\x02\x027\u01A3\x03\x02\x02\x029\u01C9\x03\x02\x02\x02" + - ";\u01CC\x03\x02\x02\x02=\u01FA\x03\x02\x02\x02?\u01FC\x03\x02\x02\x02" + - "A\u01FF\x03\x02\x02\x02C\u0203\x03\x02\x02\x02E\u0207\x03\x02\x02\x02" + - "G\u0209\x03\x02\x02\x02I\u020B\x03\x02\x02\x02K\u0210\x03\x02\x02\x02" + - "M\u0212\x03\x02\x02\x02O\u0218\x03\x02\x02\x02Q\u021E\x03\x02\x02\x02" + - "S\u0223\x03\x02\x02\x02U\u0225\x03\x02\x02\x02W\u0228\x03\x02\x02\x02" + - "Y\u022B\x03\x02\x02\x02[\u0230\x03\x02\x02\x02]\u0234\x03\x02\x02\x02" + - "_\u0239\x03\x02\x02\x02a\u023F\x03\x02\x02\x02c\u0242\x03\x02\x02\x02" + - "e\u0244\x03\x02\x02\x02g\u024A\x03\x02\x02\x02i\u024C\x03\x02\x02\x02" + - "k\u0251\x03\x02\x02\x02m\u0256\x03\x02\x02\x02o\u0260\x03\x02\x02\x02" + - "q\u0262\x03\x02\x02\x02s\u0265\x03\x02\x02\x02u\u0268\x03\x02\x02\x02" + - "w\u026A\x03\x02\x02\x02y\u026D\x03\x02\x02\x02{\u026F\x03\x02\x02\x02" + - "}\u0272\x03\x02\x02\x02\x7F\u0274\x03\x02\x02\x02\x81\u0276\x03\x02\x02" + - "\x02\x83\u0278\x03\x02\x02\x02\x85\u027A\x03\x02\x02\x02\x87\u027C\x03" + - "\x02\x02\x02\x89\u0281\x03\x02\x02\x02\x8B\u0297\x03\x02\x02\x02\x8D\u0299" + - "\x03\x02\x02\x02\x8F\u02A4\x03\x02\x02\x02\x91\u02A8\x03\x02\x02\x02\x93" + - "\u02AC\x03\x02\x02\x02\x95\u02B0\x03\x02\x02\x02\x97\u02B5\x03\x02\x02" + - "\x02\x99\u02BB\x03\x02\x02\x02\x9B\u02C1\x03\x02\x02\x02\x9D\u02C5\x03" + - "\x02\x02\x02\x9F\u02C9\x03\x02\x02\x02\xA1\u02CC\x03\x02\x02\x02\xA3\u02D5" + - "\x03\x02\x02\x02\xA5\u02D8\x03\x02\x02\x02\xA7\u02DE\x03\x02\x02\x02\xA9" + - "\u02E9\x03\x02\x02\x02\xAB\u02EB\x03\x02\x02\x02\xAD\u02ED\x03\x02\x02" + - "\x02\xAF\u02F1\x03\x02\x02\x02\xB1\u02F5\x03\x02\x02\x02\xB3\u02F9\x03" + - "\x02\x02\x02\xB5\u02FB\x03\x02\x02\x02\xB7\u02FD\x03\x02\x02\x02\xB9\u02FF" + - "\x03\x02\x02\x02\xBB\u0301\x03\x02\x02\x02\xBD\u0303\x03\x02\x02\x02\xBF" + - "\u0305\x03\x02\x02\x02\xC1\u0307\x03\x02\x02\x02\xC3\u0309\x03\x02\x02" + - "\x02\xC5\u030B\x03\x02\x02\x02\xC7\u030D\x03\x02\x02\x02\xC9\u030F\x03" + - "\x02\x02\x02\xCB\u0311\x03\x02\x02\x02\xCD\u0313\x03\x02\x02\x02\xCF\u0315" + - "\x03\x02\x02\x02\xD1\u0317\x03\x02\x02\x02\xD3\u0319\x03\x02\x02\x02\xD5" + - "\u031B\x03\x02\x02\x02\xD7\u031D\x03\x02\x02\x02\xD9\u031F\x03\x02\x02" + - "\x02\xDB\u0321\x03\x02\x02\x02\xDD\u0323\x03\x02\x02\x02\xDF\u0325\x03" + - "\x02\x02\x02\xE1\u0327\x03\x02\x02\x02\xE3\u0329\x03\x02\x02\x02\xE5\u032B" + - "\x03\x02\x02\x02\xE7\xE8\x05\xB9\\\x02\xE8\xE9\x05\xC3a\x02\xE9\xEA\x05" + - "\xD7k\x02\xEA\xEB\x05\xD7k\x02\xEB\xEC\x05\xBB]\x02\xEC\xED\x05\xB7[\x02" + - "\xED\xEE\x05\xD9l\x02\xEE\xEF\x03\x02\x02\x02\xEF\xF0\b\x02\x02\x02\xF0" + - "\x06\x03\x02\x02\x02\xF1\xF2\x05\xB9\\\x02\xF2\xF3\x05\xD5j\x02\xF3\xF4" + - "\x05\xCFg\x02\xF4\xF5\x05\xD1h\x02\xF5\xF6\x03\x02\x02\x02\xF6\xF7\b\x03" + - "\x03\x02\xF7\b\x03\x02\x02\x02\xF8\xF9\x05\xBB]\x02\xF9\xFA\x05\xCDf\x02" + - "\xFA\xFB\x05\xD5j\x02\xFB\xFC\x05\xC3a\x02\xFC\xFD\x05\xB7[\x02\xFD\xFE" + - "\x05\xC1`\x02\xFE\xFF\x03\x02\x02\x02\xFF\u0100\b\x04\x03\x02\u0100\n" + - "\x03\x02\x02\x02\u0101\u0102\x05\xBB]\x02\u0102\u0103\x05\xDDn\x02\u0103" + - "\u0104\x05\xB3Y\x02\u0104\u0105\x05\xC9d\x02\u0105\u0106\x03\x02\x02\x02" + - "\u0106\u0107\b\x05\x02\x02\u0107\f\x03\x02\x02\x02\u0108\u0109\x05\xBD" + - "^\x02\u0109\u010A\x05\xD5j\x02\u010A\u010B\x05\xCFg\x02\u010B\u010C\x05" + - "\xCBe\x02\u010C\u010D\x03\x02\x02\x02\u010D\u010E\b\x06\x03\x02\u010E" + - "\x0E\x03\x02\x02\x02\u010F\u0110\x05\xBF_\x02\u0110\u0111\x05\xD5j\x02" + - "\u0111\u0112\x05\xCFg\x02\u0112\u0113\x05\xC7c\x02\u0113\u0114\x03\x02" + - "\x02\x02\u0114\u0115\b\x07\x02\x02\u0115\x10\x03\x02\x02\x02\u0116\u0117" + - "\x05\xC7c\x02\u0117\u0118\x05\xBB]\x02\u0118\u0119\x05\xBB]\x02\u0119" + - "\u011A\x05\xD1h\x02\u011A\u011B\x03\x02\x02\x02\u011B\u011C\b\b\x03\x02" + - "\u011C\x12\x03\x02\x02\x02\u011D\u011E\x05\xC9d\x02\u011E\u011F\x05\xC3" + - "a\x02\u011F\u0120\x05\xCBe\x02\u0120\u0121\x05\xC3a\x02\u0121\u0122\x05" + - "\xD9l\x02\u0122\u0123\x03\x02\x02\x02\u0123\u0124\b\t\x02\x02\u0124\x14" + - "\x03\x02\x02\x02\u0125\u0126\x05\xCBe\x02\u0126\u0127\x05\xDDn\x02\u0127" + - "\u0128\x05o7\x02\u0128\u0129\x05\xBB]\x02\u0129\u012A\x05\xE1p\x02\u012A" + - "\u012B\x05\xD1h\x02\u012B\u012C\x05\xB3Y\x02\u012C\u012D\x05\xCDf\x02" + - "\u012D\u012E\x05\xB9\\\x02\u012E\u012F\x03\x02\x02\x02\u012F\u0130\b\n" + - "\x03\x02\u0130\x16\x03\x02\x02\x02\u0131\u0132\x05\xD1h\x02\u0132\u0133" + - "\x05\xD5j\x02\u0133\u0134\x05\xCFg\x02\u0134\u0135\x05\xC5b\x02\u0135" + - "\u0136\x05\xBB]\x02\u0136\u0137\x05\xB7[\x02\u0137\u0138\x05\xD9l\x02" + - "\u0138\u0139\x03\x02\x02\x02\u0139\u013A\b\v\x03\x02\u013A\x18\x03\x02" + - "\x02\x02\u013B\u013C\x05\xD5j\x02\u013C\u013D\x05\xBB]\x02\u013D\u013E" + - "\x05\xCDf\x02\u013E\u013F\x05\xB3Y\x02\u013F\u0140\x05\xCBe\x02\u0140" + - "\u0141\x05\xBB]\x02\u0141\u0142\x03\x02\x02\x02\u0142\u0143\b\f\x03\x02" + - "\u0143\x1A\x03\x02\x02\x02\u0144\u0145\x05\xD5j\x02\u0145\u0146\x05\xCF" + - "g\x02\u0146\u0147\x05\xDFo\x02\u0147\u0148\x03\x02\x02\x02\u0148\u0149" + - "\b\r\x02\x02\u0149\x1C\x03\x02\x02\x02\u014A\u014B\x05\xD7k\x02\u014B" + - "\u014C\x05\xC1`\x02\u014C\u014D\x05\xCFg\x02\u014D\u014E\x05\xDFo\x02" + - "\u014E\u014F\x03\x02\x02\x02\u014F\u0150\b\x0E\x02\x02\u0150\x1E\x03\x02" + - "\x02\x02\u0151\u0152\x05\xD7k\x02\u0152\u0153\x05\xCFg\x02\u0153\u0154" + - "\x05\xD5j\x02\u0154\u0155\x05\xD9l\x02\u0155\u0156\x03\x02\x02\x02\u0156" + - "\u0157\b\x0F\x02\x02\u0157 \x03\x02\x02\x02\u0158\u0159\x05\xD7k\x02\u0159" + - "\u015A\x05\xD9l\x02\u015A\u015B\x05\xB3Y\x02\u015B\u015C\x05\xD9l\x02" + - "\u015C\u015D\x05\xD7k\x02\u015D\u015E\x03\x02\x02\x02\u015E\u015F\b\x10" + - "\x02\x02\u015F\"\x03\x02\x02\x02\u0160\u0161\x05\xDFo\x02\u0161\u0162" + - "\x05\xC1`\x02\u0162\u0163\x05\xBB]\x02\u0163\u0164\x05\xD5j\x02\u0164" + - "\u0165\x05\xBB]\x02\u0165\u0166\x03\x02\x02\x02\u0166\u0167\b\x11\x02" + - "\x02\u0167$\x03\x02\x02\x02\u0168\u016A\n\x02\x02\x02\u0169\u0168\x03" + - "\x02\x02\x02\u016A\u016B\x03\x02\x02\x02\u016B\u0169\x03\x02\x02\x02\u016B" + - "\u016C\x03\x02\x02\x02\u016C\u016D\x03\x02\x02\x02\u016D\u016E\b\x12\x02" + - "\x02\u016E&\x03\x02\x02\x02\u016F\u0170\x071\x02\x02\u0170\u0171\x071" + - "\x02\x02\u0171\u0175\x03\x02\x02\x02\u0172\u0174\n\x03\x02\x02\u0173\u0172" + - "\x03\x02\x02\x02\u0174\u0177\x03\x02\x02\x02\u0175\u0173\x03\x02\x02\x02" + - "\u0175\u0176\x03\x02\x02\x02\u0176\u0179\x03\x02\x02\x02\u0177\u0175\x03" + - "\x02\x02\x02\u0178\u017A\x07\x0F\x02\x02\u0179\u0178\x03\x02\x02\x02\u0179" + - "\u017A\x03\x02\x02\x02\u017A\u017C\x03\x02\x02\x02\u017B\u017D\x07\f\x02" + - "\x02\u017C\u017B\x03\x02\x02\x02\u017C\u017D\x03\x02\x02\x02\u017D\u017E" + - "\x03\x02\x02\x02\u017E\u017F\b\x13\x04\x02\u017F(\x03\x02\x02\x02\u0180" + - "\u0181\x071\x02\x02\u0181\u0182\x07,\x02\x02\u0182\u0187\x03\x02\x02\x02" + - "\u0183\u0186\x05)\x14\x02\u0184\u0186\v\x02\x02\x02\u0185\u0183\x03\x02" + - "\x02\x02\u0185\u0184\x03\x02\x02\x02\u0186\u0189\x03\x02\x02\x02\u0187" + - "\u0188\x03\x02\x02\x02\u0187\u0185\x03\x02\x02\x02\u0188\u018A\x03\x02" + - "\x02\x02\u0189\u0187\x03\x02\x02\x02\u018A\u018B\x07,\x02\x02\u018B\u018C" + - "\x071\x02\x02\u018C\u018D\x03\x02\x02\x02\u018D\u018E\b\x14\x04\x02\u018E" + - "*\x03\x02\x02\x02\u018F\u0191\t\x04\x02\x02\u0190\u018F\x03\x02\x02\x02" + - "\u0191\u0192\x03\x02\x02\x02\u0192\u0190\x03\x02\x02\x02\u0192\u0193\x03" + - "\x02\x02\x02\u0193\u0194\x03\x02\x02\x02\u0194\u0195\b\x15\x04\x02\u0195" + - ",\x03\x02\x02\x02\u0196\u0197\x07~\x02\x02\u0197\u0198\x03\x02\x02\x02" + - "\u0198\u0199\b\x16\x05\x02\u0199.\x03\x02\x02\x02\u019A\u019B\t\x05\x02" + - "\x02\u019B0\x03\x02\x02\x02\u019C\u019D\t\x06\x02\x02\u019D2\x03\x02\x02" + - "\x02\u019E\u019F\x07^\x02\x02\u019F\u01A0\t\x07\x02\x02\u01A04\x03\x02" + - "\x02\x02\u01A1\u01A2\n\b\x02\x02\u01A26\x03\x02\x02\x02\u01A3\u01A5\t" + - "\t\x02\x02\u01A4\u01A6\t\n\x02\x02\u01A5\u01A4\x03\x02\x02\x02\u01A5\u01A6" + - "\x03\x02\x02\x02\u01A6\u01A8\x03\x02\x02\x02\u01A7\u01A9\x05/\x17\x02" + - "\u01A8\u01A7\x03\x02\x02\x02\u01A9\u01AA\x03\x02\x02\x02\u01AA\u01A8\x03" + - "\x02\x02\x02\u01AA\u01AB\x03\x02\x02\x02\u01AB8\x03\x02\x02\x02\u01AC" + - "\u01B1\x07$\x02\x02\u01AD\u01B0\x053\x19\x02\u01AE\u01B0\x055\x1A\x02" + - "\u01AF\u01AD\x03\x02\x02\x02\u01AF\u01AE\x03\x02\x02\x02\u01B0\u01B3\x03" + - "\x02\x02\x02\u01B1\u01AF\x03\x02\x02\x02\u01B1\u01B2\x03\x02\x02\x02\u01B2" + - "\u01B4\x03\x02\x02\x02\u01B3\u01B1\x03\x02\x02\x02\u01B4\u01CA\x07$\x02" + - "\x02\u01B5\u01B6\x07$\x02\x02\u01B6\u01B7\x07$\x02\x02\u01B7\u01B8\x07" + - "$\x02\x02\u01B8\u01BC\x03\x02\x02\x02\u01B9\u01BB\n\x03\x02\x02\u01BA" + - "\u01B9\x03\x02\x02\x02\u01BB\u01BE\x03\x02\x02\x02\u01BC\u01BD\x03\x02" + - "\x02\x02\u01BC\u01BA\x03\x02\x02\x02\u01BD\u01BF\x03\x02\x02\x02\u01BE" + - "\u01BC\x03\x02\x02\x02\u01BF\u01C0\x07$\x02\x02\u01C0\u01C1\x07$\x02\x02" + - "\u01C1\u01C2\x07$\x02\x02\u01C2\u01C4\x03\x02\x02\x02\u01C3\u01C5\x07" + - "$\x02\x02\u01C4\u01C3\x03\x02\x02\x02\u01C4\u01C5\x03\x02\x02\x02\u01C5" + - "\u01C7\x03\x02\x02\x02\u01C6\u01C8\x07$\x02\x02\u01C7\u01C6\x03\x02\x02" + - "\x02\u01C7\u01C8\x03\x02\x02\x02\u01C8\u01CA\x03\x02\x02\x02\u01C9\u01AC" + - "\x03\x02\x02\x02\u01C9\u01B5\x03\x02\x02\x02\u01CA:\x03\x02\x02\x02\u01CB" + - "\u01CD\x05/\x17\x02\u01CC\u01CB\x03\x02\x02\x02\u01CD\u01CE\x03\x02\x02" + - "\x02\u01CE\u01CC\x03\x02\x02\x02\u01CE\u01CF\x03\x02\x02\x02\u01CF<\x03" + - "\x02\x02\x02\u01D0\u01D2\x05/\x17\x02\u01D1\u01D0\x03\x02\x02\x02\u01D2" + - "\u01D3\x03\x02\x02\x02\u01D3\u01D1\x03\x02\x02\x02\u01D3\u01D4\x03\x02" + - "\x02\x02\u01D4\u01D5\x03\x02\x02\x02\u01D5\u01D9\x05K%\x02\u01D6\u01D8" + - "\x05/\x17\x02"; + "\b\x03\b\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03" + + "\t\x03\t\x03\t\x03\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\v\x03" + + "\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03" + + "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03" + + "\r\x03\r\x03\r\x03\r\x03\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03" + + "\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03\x11\x03" + + "\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03" + + "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03\x13\x03\x13\x03\x13\x03" + + "\x13\x03\x13\x03\x13\x03\x13\x03\x14\x06\x14\u01F9\n\x14\r\x14\x0E\x14" + + "\u01FA\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u0203\n" + + "\x15\f\x15\x0E\x15\u0206\v\x15\x03\x15\x05\x15\u0209\n\x15\x03\x15\x05" + + "\x15\u020C\n\x15\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x07\x16\u0215\n\x16\f\x16\x0E\x16\u0218\v\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x17\x06\x17\u0220\n\x17\r\x17\x0E\x17\u0221\x03\x17" + + "\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19" + + "\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B" + + "\x03\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D" + + "\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03 \x03 \x03 \x03!\x03!\x03\"\x03\"" + + "\x05\"\u024B\n\"\x03\"\x06\"\u024E\n\"\r\"\x0E\"\u024F\x03#\x03#\x03$" + + "\x03$\x03%\x03%\x03%\x05%\u0259\n%\x03&\x03&\x03\'\x03\'\x03\'\x05\'\u0260" + + "\n\'\x03(\x03(\x03(\x07(\u0265\n(\f(\x0E(\u0268\v(\x03(\x03(\x03(\x03" + + "(\x03(\x03(\x07(\u0270\n(\f(\x0E(\u0273\v(\x03(\x03(\x03(\x03(\x03(\x05" + + "(\u027A\n(\x03(\x05(\u027D\n(\x05(\u027F\n(\x03)\x06)\u0282\n)\r)\x0E" + + ")\u0283\x03*\x06*\u0287\n*\r*\x0E*\u0288\x03*\x03*\x07*\u028D\n*\f*\x0E" + + "*\u0290\v*\x03*\x03*\x06*\u0294\n*\r*\x0E*\u0295\x03*\x06*\u0299\n*\r" + + "*\x0E*\u029A\x03*\x03*\x07*\u029F\n*\f*\x0E*\u02A2\v*\x05*\u02A4\n*\x03" + + "*\x03*\x03*\x03*\x06*\u02AA\n*\r*\x0E*\u02AB\x03*\x03*\x05*\u02B0\n*\x03" + + "+\x03+\x03+\x03,\x03,\x03,\x03,\x03-\x03-\x03-\x03-\x03.\x03.\x03/\x03" + + "/\x030\x030\x030\x030\x030\x031\x031\x032\x032\x032\x032\x032\x032\x03" + + "3\x033\x033\x033\x033\x033\x034\x034\x034\x034\x034\x035\x035\x036\x03" + + "6\x036\x037\x037\x037\x038\x038\x038\x038\x038\x039\x039\x039\x039\x03" + + ":\x03:\x03:\x03:\x03:\x03;\x03;\x03;\x03;\x03;\x03;\x03<\x03<\x03<\x03" + + "=\x03=\x03>\x03>\x03>\x03>\x03>\x03>\x03?\x03?\x03@\x03@\x03@\x03@\x03" + + "@\x03A\x03A\x03A\x03B\x03B\x03B\x03C\x03C\x03D\x03D\x03D\x03E\x03E\x03" + + "F\x03F\x03F\x03G\x03G\x03H\x03H\x03I\x03I\x03J\x03J\x03K\x03K\x03L\x03" + + "L\x03L\x03L\x03L\x03M\x03M\x03M\x03M\x03M\x03N\x03N\x07N\u032D\nN\fN\x0E" + + "N\u0330\vN\x03N\x03N\x05N\u0334\nN\x03N\x06N\u0337\nN\rN\x0EN\u0338\x05" + + "N\u033B\nN\x03O\x03O\x06O\u033F\nO\rO\x0EO\u0340\x03O\x03O\x03P\x03P\x03" + + "P\x03P\x03Q\x03Q\x03Q\x03Q\x03R\x03R\x03R\x03R\x03S\x03S\x03S\x03S\x03" + + "S\x03T\x03T\x03T\x03T\x03T\x03T\x03U\x03U\x03U\x03U\x03U\x03U\x03V\x03" + + "V\x03V\x03V\x03W\x03W\x03W\x03W\x03X\x03X\x03X\x03X\x03X\x03X\x03X\x03" + + "X\x03X\x03Y\x03Y\x03Y\x05Y\u0376\nY\x03Z\x06Z\u0379\nZ\rZ\x0EZ\u037A\x03" + + "[\x03[\x03[\x03[\x03\\\x03\\\x03\\\x03\\\x03]\x03]\x03]\x03]\x03^\x03" + + "^\x03^\x03^\x03_\x03_\x03_\x03_\x03_\x03`\x03`\x03`\x03`\x03a\x03a\x03" + + "a\x03a\x03b\x03b\x03b\x03b\x05b\u039E\nb\x03c\x03c\x05c\u03A2\nc\x03c" + + "\x07c\u03A5\nc\fc\x0Ec\u03A8\vc\x03c\x03c\x05c\u03AC\nc\x03c\x06c\u03AF" + + "\nc\rc\x0Ec\u03B0\x05c\u03B3\nc\x03d\x03d\x03d\x03d\x03e\x03e\x03e\x03" + + "e\x03f\x03f\x03f\x03f\x03g\x03g\x03g\x03g\x03h\x03h\x03h\x03h\x03h\x03" + + "i\x03i\x03i\x03i\x03j\x03j\x03j\x03j\x03k\x03k\x03k\x03k\x03l\x03l\x03" + + "l\x03m\x03m\x03m\x03m\x03n\x03n\x03n\x03n\x03o\x03o\x03o\x03o\x03p\x03" + + "p\x03p\x03p\x03q\x03q\x03q\x03q\x03r\x03r\x03r\x03r\x03r\x03s\x03s\x03" + + "s\x03s\x03s\x03t\x03t\x03t\x03t\x03t\x03t\x03t\x03u\x03u\x03u\x03u\x03" + + "v\x03v\x03v\x03v\x03w\x03w\x03w\x03w\x03x\x03x\x03x\x03x\x03y\x03y\x03" + + "y\x03y\x03z\x03z\x03z\x03z\x03z\x03z\x03{\x03{\x03{\x03{\x03|\x03|\x03" + + "|\x03|\x03}\x03}\x03}\x03}\x03~\x03~\x03~\x03~\x03\x7F\x03\x7F\x03\x7F" + + "\x03\x7F\x03\x80\x03\x80\x03\x80\x03\x80\x03\x81\x03\x81\x03\x81\x03\x81" + + "\x03\x82\x03\x82\x03\x82\x03\x82\x03\x83\x03\x83\x03\x83\x03\x83\x03\x84" + + "\x03\x84\x03\x84\x03\x84\x03\x84\x03\x85\x03\x85\x03\x85\x03\x85\x03\x86" + + "\x03\x86\x03\x86\x03\x86\x03\x87\x03\x87\x03\x87\x03\x87\x03\x88\x03\x88" + + "\x03\x88\x03\x88\x03\x89\x03\x89\x03\x89\x03\x89\x03\x8A\x03\x8A\x03\x8A" + + "\x03\x8A\x03\x8B\x03\x8B\x03\x8B\x03\x8B\x03\x8B\x03\x8C\x03\x8C\x03\x8C" + + "\x03\x8C\x03\x8C\x03\x8D\x03\x8D\x03\x8D\x03\x8D\x03\x8D\x03\x8D\x03\x8D" + + "\x03\x8D\x03\x8D\x03\x8D\x03\x8E\x03\x8E\x03\x8E\x03\x8E\x03\x8F\x03\x8F" + + "\x03\x8F\x03\x8F\x03\x90\x03\x90\x03\x90\x03\x90\x03\x91\x03\x91\x03\x92" + + "\x03\x92\x03\x93\x03\x93\x03\x94\x03\x94\x03\x95\x03\x95\x03\x96\x03\x96" + + "\x03\x97\x03\x97\x03\x98\x03\x98\x03\x99\x03\x99\x03\x9A\x03\x9A\x03\x9B" + + "\x03\x9B\x03\x9C\x03\x9C\x03\x9D\x03\x9D\x03\x9E\x03\x9E\x03\x9F\x03\x9F" + + "\x03\xA0\x03\xA0\x03\xA1\x03\xA1\x03\xA2\x03\xA2\x03\xA3\x03\xA3\x03\xA4" + + "\x03\xA4\x03\xA5\x03\xA5\x03\xA6\x03\xA6\x03\xA7\x03\xA7\x03\xA8\x03\xA8" + + "\x03\xA9\x03\xA9\x03\xAA\x03\xAA\x04\u0216\u0271\x02\x02\xAB\f\x02\x03" + + "\x0E\x02\x04\x10\x02\x05\x12\x02\x06\x14\x02\x07\x16\x02\b\x18\x02\t\x1A" + + "\x02\n\x1C\x02\v\x1E\x02\f \x02\r\"\x02\x0E$\x02\x0F&\x02\x10(\x02\x11" + + "*\x02\x12,\x02\x13.\x02\x140\x02\x152\x02\x164\x02\x176\x02\x188\x02\x02" + + ":\x02\x02<\x02\x19>\x02\x1A@\x02\x1BB\x02\x1CD\x02\x02F\x02\x02H\x02\x02" + + "J\x02\x02L\x02\x02N\x02\x02P\x02\x02R\x02\x02T\x02\x02V\x02\x02X\x02\x1D" + + "Z\x02\x1E\\\x02\x1F^\x02 `\x02!b\x02\"d\x02#f\x02$h\x02%j\x02&l\x02\'" + + "n\x02(p\x02)r\x02*t\x02+v\x02,x\x02-z\x02.|\x02/~\x020\x80\x021\x82\x02" + + "2\x84\x023\x86\x024\x88\x025\x8A\x026\x8C\x027\x8E\x028\x90\x029\x92\x02" + + ":\x94\x02;\x96\x02<\x98\x02=\x9A\x02>\x9C\x02?\x9E\x02@\xA0\x02A\xA2\x02" + + "B\xA4\x02C\xA6\x02D\xA8\x02E\xAA\x02F\xAC\x02G\xAE\x02\x02\xB0\x02\x02" + + "\xB2\x02\x02\xB4\x02\x02\xB6\x02\x02\xB8\x02H\xBA\x02\x02\xBC\x02I\xBE" + + "\x02\x02\xC0\x02J\xC2\x02K\xC4\x02L\xC6\x02\x02\xC8\x02\x02\xCA\x02\x02" + + "\xCC\x02\x02\xCE\x02M\xD0\x02\x02\xD2\x02N\xD4\x02O\xD6\x02P\xD8\x02\x02" + + "\xDA\x02\x02\xDC\x02\x02\xDE\x02\x02\xE0\x02Q\xE2\x02\x02\xE4\x02\x02" + + "\xE6\x02R\xE8\x02S\xEA\x02T\xEC\x02\x02\xEE\x02U\xF0\x02V\xF2\x02\x02" + + "\xF4\x02\x02\xF6\x02W\xF8\x02X\xFA\x02Y\xFC\x02\x02\xFE\x02\x02\u0100" + + "\x02\x02\u0102\x02\x02\u0104\x02\x02\u0106\x02\x02\u0108\x02\x02\u010A" + + "\x02Z\u010C\x02[\u010E\x02\\\u0110\x02\x02\u0112\x02\x02\u0114\x02\x02" + + "\u0116\x02\x02\u0118\x02]\u011A\x02^\u011C\x02_\u011E\x02\x02\u0120\x02" + + "`\u0122\x02a\u0124\x02b\u0126\x02c\u0128\x02d\u012A\x02\x02\u012C\x02" + + "\x02\u012E\x02\x02\u0130\x02\x02\u0132\x02\x02\u0134\x02\x02\u0136\x02" + + "\x02\u0138\x02\x02\u013A\x02\x02\u013C\x02\x02\u013E\x02\x02\u0140\x02" + + "\x02\u0142\x02\x02\u0144\x02\x02\u0146\x02\x02\u0148\x02\x02\u014A\x02" + + "\x02\u014C\x02\x02\u014E\x02\x02\u0150\x02\x02\u0152\x02\x02\u0154\x02" + + "\x02\u0156\x02\x02\u0158\x02\x02\u015A\x02\x02\u015C\x02\x02\f\x02\x03" + + "\x04\x05\x06\x07\b\t\n\v\'\b\x02\v\f\x0F\x0F\"\"11]]__\x04\x02\f\f\x0F" + + "\x0F\x05\x02\v\f\x0F\x0F\"\"\x03\x022;\x04\x02C\\c|\x07\x02$$^^ppttvv" + + "\x06\x02\f\f\x0F\x0F$$^^\x04\x02GGgg\x04\x02--//\x03\x02bb\f\x02\v\f\x0F" + + "\x0F\"\"..11??]]__bb~~\x04\x02,,11\x04\x02CCcc\x04\x02DDdd\x04\x02EEe" + + "e\x04\x02FFff\x04\x02HHhh\x04\x02IIii\x04\x02JJjj\x04\x02KKkk\x04\x02" + + "LLll\x04\x02MMmm\x04\x02NNnn\x04\x02OOoo\x04\x02PPpp\x04\x02QQqq\x04\x02" + + "RRrr\x04\x02SSss\x04\x02TTtt\x04\x02UUuu\x04\x02VVvv\x04\x02WWww\x04\x02" + + "XXxx\x04\x02YYyy\x04\x02ZZzz\x04\x02[[{{\x04\x02\\\\||\x02\u04A8\x02\f" + + "\x03\x02\x02\x02\x02\x0E\x03\x02\x02\x02\x02\x10\x03\x02\x02\x02\x02\x12" + + "\x03\x02\x02\x02\x02\x14\x03\x02\x02\x02\x02\x16\x03\x02\x02\x02\x02\x18" + + "\x03\x02\x02\x02\x02\x1A\x03\x02\x02\x02\x02\x1C\x03\x02\x02\x02\x02\x1E" + + "\x03\x02\x02\x02\x02 \x03\x02\x02\x02\x02\"\x03\x02\x02\x02\x02$\x03\x02" + + "\x02\x02\x02&\x03\x02\x02\x02\x02(\x03\x02\x02\x02\x02*\x03\x02\x02\x02" + + "\x02,\x03\x02\x02\x02\x02.\x03\x02\x02\x02\x020\x03\x02\x02\x02\x022\x03" + + "\x02\x02\x02\x024\x03\x02\x02\x02\x026\x03\x02\x02\x02\x038\x03\x02\x02" + + "\x02\x03:\x03\x02\x02\x02\x03<\x03\x02\x02\x02\x03>\x03\x02\x02\x02\x03" + + "@\x03\x02\x02\x02\x04B\x03\x02\x02\x02\x04X\x03\x02\x02\x02\x04Z\x03\x02" + + "\x02\x02\x04\\\x03\x02\x02\x02\x04^\x03\x02\x02\x02\x04`\x03\x02\x02\x02" + + "\x04b\x03\x02\x02\x02\x04d\x03\x02\x02\x02\x04f\x03\x02\x02\x02\x04h\x03" + + "\x02\x02\x02\x04j\x03\x02\x02\x02\x04l\x03\x02\x02\x02\x04n\x03\x02\x02" + + "\x02\x04p\x03\x02\x02\x02\x04r\x03\x02\x02\x02\x04t\x03\x02\x02\x02\x04" + + "v\x03\x02\x02\x02\x04x\x03\x02\x02\x02\x04z\x03\x02\x02\x02\x04|\x03\x02" + + "\x02\x02\x04~\x03\x02\x02\x02\x04\x80\x03\x02\x02\x02\x04\x82\x03\x02" + + "\x02\x02\x04\x84\x03\x02\x02\x02\x04\x86\x03\x02\x02\x02\x04\x88\x03\x02" + + "\x02\x02\x04\x8A\x03\x02\x02\x02\x04\x8C\x03\x02\x02\x02\x04\x8E\x03\x02" + + "\x02\x02\x04\x90\x03\x02\x02\x02\x04\x92\x03\x02\x02\x02\x04\x94\x03\x02" + + "\x02\x02\x04\x96\x03\x02\x02\x02\x04\x98\x03\x02\x02\x02\x04\x9A\x03\x02" + + "\x02\x02\x04\x9C\x03\x02\x02\x02\x04\x9E\x03\x02\x02\x02\x04\xA0\x03\x02" + + "\x02\x02\x04\xA2\x03\x02\x02\x02\x04\xA4\x03\x02\x02\x02\x04\xA6\x03\x02" + + "\x02\x02\x04\xA8\x03\x02\x02\x02\x04\xAA\x03\x02\x02\x02\x04\xAC\x03\x02" + + "\x02\x02\x05\xAE\x03\x02\x02\x02\x05\xB0\x03\x02\x02\x02\x05\xB2\x03\x02" + + "\x02\x02\x05\xB4\x03\x02\x02\x02\x05\xB6\x03\x02\x02\x02\x05\xB8\x03\x02" + + "\x02\x02\x05\xBC\x03\x02\x02\x02\x05\xBE\x03\x02\x02\x02\x05\xC0\x03\x02" + + "\x02\x02\x05\xC2\x03\x02\x02\x02\x05\xC4\x03\x02\x02\x02\x06\xC6\x03\x02" + + "\x02\x02\x06\xC8\x03\x02\x02\x02\x06\xCA\x03\x02\x02\x02\x06\xCE\x03\x02" + + "\x02\x02\x06\xD0\x03\x02\x02\x02\x06\xD2\x03\x02\x02\x02\x06\xD4\x03\x02" + + "\x02\x02\x06\xD6\x03\x02\x02\x02\x07\xD8\x03\x02\x02\x02\x07\xDA\x03\x02" + + "\x02\x02\x07\xDC\x03\x02\x02\x02\x07\xDE\x03\x02\x02\x02\x07\xE0\x03\x02" + + "\x02\x02\x07\xE2\x03\x02\x02\x02\x07\xE4\x03\x02\x02\x02\x07\xE6\x03\x02" + + "\x02\x02\x07\xE8\x03\x02\x02\x02\x07\xEA\x03\x02\x02\x02\b\xEC\x03\x02" + + "\x02\x02\b\xEE\x03\x02\x02\x02\b\xF0\x03\x02\x02\x02\b\xF2\x03\x02\x02" + + "\x02\b\xF4\x03\x02\x02\x02\b\xF6\x03\x02\x02\x02\b\xF8\x03\x02\x02\x02" + + "\b\xFA\x03\x02\x02\x02\t\xFC\x03\x02\x02\x02\t\xFE\x03\x02\x02\x02\t\u0100" + + "\x03\x02\x02\x02\t\u0102\x03\x02\x02\x02\t\u0104\x03\x02\x02\x02\t\u0106" + + "\x03\x02\x02\x02\t\u0108\x03\x02\x02\x02\t\u010A\x03\x02\x02\x02\t\u010C" + + "\x03\x02\x02\x02\t\u010E\x03\x02\x02\x02\n\u0110\x03\x02\x02\x02\n\u0112" + + "\x03\x02\x02\x02\n\u0114\x03\x02\x02\x02\n\u0116\x03\x02\x02\x02\n\u0118" + + "\x03\x02\x02\x02\n\u011A\x03\x02\x02\x02\n\u011C\x03\x02\x02\x02\v\u011E" + + "\x03\x02\x02\x02\v\u0120\x03\x02\x02\x02\v\u0122\x03\x02\x02\x02\v\u0124" + + "\x03\x02\x02\x02\v\u0126\x03\x02\x02\x02\v\u0128\x03\x02\x02\x02\f\u015E" + + "\x03\x02\x02\x02\x0E\u0168\x03\x02\x02\x02\x10\u016F\x03\x02\x02\x02\x12" + + "\u0178\x03\x02\x02\x02\x14\u017F\x03\x02\x02\x02\x16\u0189\x03\x02\x02" + + "\x02\x18\u0190\x03\x02\x02\x02\x1A\u0197\x03\x02\x02\x02\x1C\u01A5\x03" + + "\x02\x02\x02\x1E\u01AC\x03\x02\x02\x02 \u01B4\x03\x02\x02\x02\"\u01C0" + + "\x03\x02\x02\x02$\u01CA\x03\x02\x02\x02&\u01D3\x03\x02\x02\x02(\u01D9" + + "\x03\x02\x02\x02*\u01E0\x03\x02\x02\x02,\u01E7\x03\x02\x02\x02.\u01EF" + + "\x03\x02\x02\x020\u01F8\x03\x02\x02\x022\u01FE\x03\x02\x02\x024\u020F" + + "\x03\x02\x02\x026\u021F\x03\x02\x02\x028\u0225\x03\x02\x02\x02:\u022A" + + "\x03\x02\x02\x02<\u022F\x03\x02\x02\x02>\u0233\x03\x02\x02\x02@\u0237" + + "\x03\x02\x02\x02B\u023B\x03\x02\x02\x02D\u023F\x03\x02\x02\x02F\u0241" + + "\x03\x02\x02\x02H\u0243\x03\x02\x02\x02J\u0246\x03\x02\x02\x02L\u0248" + + "\x03\x02\x02\x02N\u0251\x03\x02\x02\x02P\u0253\x03\x02\x02\x02R\u0258" + + "\x03\x02\x02\x02T\u025A\x03\x02\x02\x02V\u025F\x03\x02\x02\x02X\u027E" + + "\x03\x02\x02\x02Z\u0281\x03\x02\x02\x02\\\u02AF\x03\x02\x02\x02^\u02B1" + + "\x03\x02\x02\x02`\u02B4\x03\x02\x02\x02b\u02B8\x03\x02\x02\x02d\u02BC" + + "\x03\x02\x02\x02f\u02BE\x03\x02\x02\x02h\u02C0\x03\x02\x02\x02j\u02C5" + + "\x03\x02\x02\x02l\u02C7\x03\x02\x02\x02n\u02CD\x03\x02\x02\x02p\u02D3" + + "\x03\x02\x02\x02r\u02D8\x03\x02\x02\x02t\u02DA\x03\x02\x02\x02v\u02DD" + + "\x03\x02\x02\x02x\u02E0\x03\x02\x02\x02z\u02E5\x03\x02\x02\x02|\u02E9" + + "\x03\x02\x02\x02~\u02EE\x03\x02\x02\x02\x80\u02F4\x03\x02\x02\x02\x82" + + "\u02F7\x03\x02\x02\x02\x84\u02F9\x03\x02\x02\x02\x86\u02FF\x03\x02\x02" + + "\x02\x88\u0301\x03\x02\x02\x02\x8A\u0306\x03\x02\x02\x02\x8C\u0309\x03" + + "\x02\x02\x02\x8E\u030C\x03\x02\x02\x02\x90\u030E\x03\x02\x02\x02\x92\u0311" + + "\x03\x02\x02\x02\x94\u0313\x03\x02\x02\x02\x96\u0316\x03\x02\x02\x02\x98" + + "\u0318\x03\x02\x02\x02\x9A\u031A\x03\x02\x02\x02\x9C\u031C\x03\x02\x02" + + "\x02\x9E\u031E\x03\x02\x02\x02\xA0\u0320\x03\x02\x02\x02\xA2\u0325\x03" + + "\x02\x02\x02\xA4\u033A\x03\x02\x02\x02\xA6\u033C\x03\x02\x02\x02\xA8\u0344" + + "\x03\x02\x02\x02\xAA\u0348\x03\x02\x02\x02\xAC\u034C\x03\x02\x02\x02\xAE" + + "\u0350\x03\x02\x02\x02\xB0\u0355\x03\x02\x02\x02\xB2\u035B\x03\x02\x02" + + "\x02\xB4\u0361\x03\x02\x02\x02\xB6\u0365\x03\x02\x02\x02\xB8\u0369\x03" + + "\x02\x02\x02\xBA\u0375\x03\x02\x02\x02\xBC\u0378\x03\x02\x02\x02\xBE\u037C" + + "\x03\x02\x02\x02\xC0\u0380\x03\x02\x02\x02\xC2\u0384\x03\x02\x02\x02\xC4" + + "\u0388\x03\x02\x02\x02\xC6\u038C\x03\x02\x02\x02\xC8\u0391\x03\x02\x02" + + "\x02\xCA\u0395\x03\x02\x02\x02\xCC\u039D\x03\x02\x02\x02\xCE\u03B2\x03" + + "\x02\x02\x02\xD0\u03B4\x03\x02\x02\x02\xD2\u03B8\x03\x02\x02\x02\xD4\u03BC" + + "\x03\x02\x02\x02\xD6\u03C0\x03\x02\x02\x02\xD8\u03C4\x03\x02\x02\x02\xDA" + + "\u03C9\x03\x02\x02\x02\xDC\u03CD\x03\x02\x02\x02\xDE\u03D1\x03\x02\x02" + + "\x02\xE0\u03D5\x03\x02\x02\x02\xE2\u03D8\x03\x02\x02\x02\xE4\u03DC\x03" + + "\x02\x02\x02\xE6\u03E0\x03\x02\x02\x02\xE8\u03E4\x03\x02\x02\x02\xEA\u03E8" + + "\x03\x02\x02\x02\xEC\u03EC\x03\x02\x02\x02\xEE\u03F1\x03\x02\x02\x02\xF0" + + "\u03F6\x03\x02\x02\x02\xF2\u03FD\x03\x02\x02\x02\xF4\u0401\x03\x02\x02" + + "\x02\xF6\u0405\x03\x02\x02\x02\xF8\u0409\x03\x02\x02\x02\xFA\u040D\x03" + + "\x02\x02\x02\xFC\u0411\x03\x02\x02\x02\xFE\u0417\x03\x02\x02\x02\u0100" + + "\u041B\x03\x02\x02\x02\u0102\u041F\x03\x02\x02\x02\u0104\u0423\x03\x02" + + "\x02\x02\u0106\u0427\x03\x02\x02\x02\u0108\u042B\x03\x02\x02\x02\u010A" + + "\u042F\x03\x02\x02\x02\u010C\u0433\x03\x02\x02\x02\u010E\u0437\x03\x02" + + "\x02\x02\u0110\u043B\x03\x02\x02\x02\u0112\u0440\x03\x02\x02\x02\u0114" + + "\u0444\x03\x02\x02\x02\u0116\u0448\x03\x02\x02\x02\u0118\u044C\x03\x02" + + "\x02\x02\u011A\u0450\x03\x02\x02\x02\u011C\u0454\x03\x02\x02\x02\u011E" + + "\u0458\x03\x02\x02\x02\u0120\u045D\x03\x02\x02\x02\u0122\u0462\x03\x02" + + "\x02\x02\u0124\u046C\x03\x02\x02\x02\u0126\u0470\x03\x02\x02\x02\u0128" + + "\u0474\x03\x02\x02\x02\u012A\u0478\x03\x02\x02\x02\u012C\u047A\x03\x02" + + "\x02\x02\u012E\u047C\x03\x02\x02\x02\u0130\u047E\x03\x02\x02\x02\u0132" + + "\u0480\x03\x02\x02\x02\u0134\u0482\x03\x02\x02\x02\u0136\u0484\x03\x02" + + "\x02\x02\u0138\u0486\x03\x02\x02\x02\u013A\u0488\x03\x02\x02\x02\u013C" + + "\u048A\x03\x02\x02\x02\u013E\u048C\x03\x02\x02\x02\u0140\u048E\x03\x02" + + "\x02\x02\u0142\u0490\x03\x02\x02\x02\u0144\u0492\x03\x02\x02\x02\u0146" + + "\u0494\x03\x02\x02\x02\u0148\u0496\x03\x02\x02\x02\u014A\u0498\x03\x02" + + "\x02\x02\u014C\u049A\x03\x02\x02\x02\u014E\u049C\x03\x02\x02\x02\u0150" + + "\u049E\x03\x02"; private static readonly _serializedATNSegment1: string = - "\u01D7\u01D6\x03\x02\x02\x02\u01D8\u01DB\x03\x02\x02\x02\u01D9\u01D7\x03" + - "\x02\x02\x02\u01D9\u01DA\x03\x02\x02\x02\u01DA\u01FB\x03\x02\x02\x02\u01DB" + - "\u01D9\x03\x02\x02\x02\u01DC\u01DE\x05K%\x02\u01DD\u01DF\x05/\x17\x02" + - "\u01DE\u01DD\x03\x02\x02\x02\u01DF\u01E0\x03\x02\x02\x02\u01E0\u01DE\x03" + - "\x02\x02\x02\u01E0\u01E1\x03\x02\x02\x02\u01E1\u01FB\x03\x02\x02\x02\u01E2" + - "\u01E4\x05/\x17\x02\u01E3\u01E2\x03\x02\x02\x02\u01E4\u01E5\x03\x02\x02" + - "\x02\u01E5\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02\x02\u01E6\u01EE" + - "\x03\x02\x02\x02\u01E7\u01EB\x05K%\x02\u01E8\u01EA\x05/\x17\x02\u01E9" + - "\u01E8\x03\x02\x02\x02\u01EA\u01ED\x03\x02\x02\x02\u01EB\u01E9\x03\x02" + - "\x02\x02\u01EB\u01EC\x03\x02\x02\x02\u01EC\u01EF\x03\x02\x02\x02\u01ED" + - "\u01EB\x03\x02\x02\x02\u01EE\u01E7\x03\x02\x02\x02\u01EE\u01EF\x03\x02" + - "\x02\x02\u01EF\u01F0\x03\x02\x02\x02\u01F0\u01F1\x057\x1B\x02\u01F1\u01FB" + - "\x03\x02\x02\x02\u01F2\u01F4\x05K%\x02\u01F3\u01F5\x05/\x17\x02\u01F4" + - "\u01F3\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F4\x03\x02" + - "\x02\x02\u01F6\u01F7\x03\x02\x02\x02\u01F7\u01F8\x03\x02\x02\x02\u01F8" + - "\u01F9\x057\x1B\x02\u01F9\u01FB\x03\x02\x02\x02\u01FA\u01D1\x03\x02\x02" + - "\x02\u01FA\u01DC\x03\x02\x02\x02\u01FA\u01E3\x03\x02\x02\x02\u01FA\u01F2" + - "\x03\x02\x02\x02\u01FB>\x03\x02\x02\x02\u01FC\u01FD\x05\xB5Z\x02\u01FD" + - "\u01FE\x05\xE3q\x02\u01FE@\x03\x02\x02\x02\u01FF\u0200\x05\xB3Y\x02\u0200" + - "\u0201\x05\xCDf\x02\u0201\u0202\x05\xB9\\\x02\u0202B\x03\x02\x02\x02\u0203" + - "\u0204\x05\xB3Y\x02\u0204\u0205\x05\xD7k\x02\u0205\u0206\x05\xB7[\x02" + - "\u0206D\x03\x02\x02\x02\u0207\u0208\x07?\x02\x02\u0208F\x03\x02\x02\x02" + - "\u0209\u020A\x07.\x02\x02\u020AH\x03\x02\x02\x02\u020B\u020C\x05\xB9\\" + - "\x02\u020C\u020D\x05\xBB]\x02\u020D\u020E\x05\xD7k\x02\u020E\u020F\x05" + - "\xB7[\x02\u020FJ\x03\x02\x02\x02\u0210\u0211\x070\x02\x02\u0211L\x03\x02" + - "\x02\x02\u0212\u0213\x05\xBD^\x02\u0213\u0214\x05\xB3Y\x02\u0214\u0215" + - "\x05\xC9d\x02\u0215\u0216\x05\xD7k\x02\u0216\u0217\x05\xBB]\x02\u0217" + - "N\x03\x02\x02\x02\u0218\u0219\x05\xBD^\x02\u0219\u021A\x05\xC3a\x02\u021A" + - "\u021B\x05\xD5j\x02\u021B\u021C\x05\xD7k\x02\u021C\u021D\x05\xD9l\x02" + - "\u021DP\x03\x02\x02\x02\u021E\u021F\x05\xC9d\x02\u021F\u0220\x05\xB3Y" + - "\x02\u0220\u0221\x05\xD7k\x02\u0221\u0222\x05\xD9l\x02\u0222R\x03\x02" + - "\x02\x02\u0223\u0224\x07*\x02\x02\u0224T\x03\x02\x02\x02\u0225\u0226\x05" + - "\xC3a\x02\u0226\u0227\x05\xCDf\x02\u0227V\x03\x02\x02\x02\u0228\u0229" + - "\x05\xC3a\x02\u0229\u022A\x05\xD7k\x02\u022AX\x03\x02\x02\x02\u022B\u022C" + - "\x05\xC9d\x02\u022C\u022D\x05\xC3a\x02\u022D\u022E\x05\xC7c\x02\u022E" + - "\u022F\x05\xBB]\x02\u022FZ\x03\x02\x02\x02\u0230\u0231\x05\xCDf\x02\u0231" + - "\u0232\x05\xCFg\x02\u0232\u0233\x05\xD9l\x02\u0233\\\x03\x02\x02\x02\u0234" + - "\u0235\x05\xCDf\x02\u0235\u0236\x05\xDBm\x02\u0236\u0237\x05\xC9d\x02" + - "\u0237\u0238\x05\xC9d\x02\u0238^\x03\x02\x02\x02\u0239\u023A\x05\xCDf" + - "\x02\u023A\u023B\x05\xDBm\x02\u023B\u023C\x05\xC9d\x02\u023C\u023D\x05" + - "\xC9d\x02\u023D\u023E\x05\xD7k\x02\u023E`\x03\x02\x02\x02\u023F\u0240" + - "\x05\xCFg\x02\u0240\u0241\x05\xD5j\x02\u0241b\x03\x02\x02\x02\u0242\u0243" + - "\x07A\x02\x02\u0243d\x03\x02\x02\x02\u0244\u0245\x05\xD5j\x02\u0245\u0246" + - "\x05\xC9d\x02\u0246\u0247\x05\xC3a\x02\u0247\u0248\x05\xC7c\x02\u0248" + - "\u0249\x05\xBB]\x02\u0249f\x03\x02\x02\x02\u024A\u024B\x07+\x02\x02\u024B" + - "h\x03\x02\x02\x02\u024C\u024D\x05\xD9l\x02\u024D\u024E\x05\xD5j\x02\u024E" + - "\u024F\x05\xDBm\x02\u024F\u0250\x05\xBB]\x02\u0250j\x03\x02\x02\x02\u0251" + - "\u0252\x05\xC3a\x02\u0252\u0253\x05\xCDf\x02\u0253\u0254\x05\xBD^\x02" + - "\u0254\u0255\x05\xCFg\x02\u0255l\x03\x02\x02\x02\u0256\u0257\x05\xBD^" + - "\x02\u0257\u0258\x05\xDBm\x02\u0258\u0259\x05\xCDf\x02\u0259\u025A\x05" + - "\xB7[\x02\u025A\u025B\x05\xD9l\x02\u025B\u025C\x05\xC3a\x02\u025C\u025D" + - "\x05\xCFg\x02\u025D\u025E\x05\xCDf\x02\u025E\u025F\x05\xD7k\x02\u025F" + - "n\x03\x02\x02\x02\u0260\u0261\x07a\x02\x02\u0261p\x03\x02\x02\x02\u0262" + - "\u0263\x07?\x02\x02\u0263\u0264\x07?\x02\x02\u0264r\x03\x02\x02\x02\u0265" + - "\u0266\x07#\x02\x02\u0266\u0267\x07?\x02\x02\u0267t\x03\x02\x02\x02\u0268" + - "\u0269\x07>\x02\x02\u0269v\x03\x02\x02\x02\u026A\u026B\x07>\x02\x02\u026B" + - "\u026C\x07?\x02\x02\u026Cx\x03\x02\x02\x02\u026D\u026E\x07@\x02\x02\u026E" + - "z\x03\x02\x02\x02\u026F\u0270\x07@\x02\x02\u0270\u0271\x07?\x02\x02\u0271" + - "|\x03\x02\x02\x02\u0272\u0273\x07-\x02\x02\u0273~\x03\x02\x02\x02\u0274" + - "\u0275\x07/\x02\x02\u0275\x80\x03\x02\x02\x02\u0276\u0277\x07,\x02\x02" + - "\u0277\x82\x03\x02\x02\x02\u0278\u0279\x071\x02\x02\u0279\x84\x03\x02" + - "\x02\x02\u027A\u027B\x07\'\x02\x02\u027B\x86\x03\x02\x02\x02\u027C\u027D" + - "\x07]\x02\x02\u027D\u027E\x03\x02\x02\x02\u027E\u027F\bC\x02\x02\u027F" + - "\u0280\bC\x02\x02\u0280\x88\x03\x02\x02\x02\u0281\u0282\x07_\x02\x02\u0282" + - "\u0283\x03\x02\x02\x02\u0283\u0284\bD\x05\x02\u0284\u0285\bD\x05\x02\u0285" + - "\x8A\x03\x02\x02\x02\u0286\u028C\x051\x18\x02\u0287\u028B\x051\x18\x02" + - "\u0288\u028B\x05/\x17\x02\u0289\u028B\x07a\x02\x02\u028A\u0287\x03\x02" + - "\x02\x02\u028A\u0288\x03\x02\x02\x02\u028A\u0289\x03\x02\x02\x02\u028B" + - "\u028E\x03\x02\x02\x02\u028C\u028A\x03\x02\x02\x02\u028C\u028D\x03\x02" + - "\x02\x02\u028D\u0298\x03\x02\x02\x02\u028E\u028C\x03\x02\x02\x02\u028F" + - "\u0293\t\v\x02\x02\u0290\u0294\x051\x18\x02\u0291\u0294\x05/\x17\x02\u0292" + - "\u0294\x07a\x02\x02\u0293\u0290\x03\x02\x02\x02\u0293\u0291\x03\x02\x02" + - "\x02\u0293\u0292\x03\x02\x02\x02\u0294\u0295\x03\x02\x02\x02\u0295\u0293" + - "\x03\x02\x02\x02\u0295\u0296\x03\x02\x02\x02\u0296\u0298\x03\x02\x02\x02" + - "\u0297\u0286\x03\x02\x02\x02\u0297\u028F\x03\x02\x02\x02\u0298\x8C\x03" + - "\x02\x02\x02\u0299\u029F\x07b\x02\x02\u029A\u029E\n\f\x02\x02\u029B\u029C" + - "\x07b\x02\x02\u029C\u029E\x07b\x02\x02\u029D\u029A\x03\x02\x02\x02\u029D" + - "\u029B\x03\x02\x02\x02\u029E\u02A1\x03\x02\x02\x02\u029F\u029D\x03\x02" + - "\x02\x02\u029F\u02A0\x03\x02\x02\x02\u02A0\u02A2\x03\x02\x02\x02\u02A1" + - "\u029F\x03\x02\x02\x02\u02A2\u02A3\x07b\x02\x02\u02A3\x8E\x03\x02\x02" + - "\x02\u02A4\u02A5\x05\'\x13\x02\u02A5\u02A6\x03\x02\x02\x02\u02A6\u02A7" + - "\bG\x04\x02\u02A7\x90\x03\x02\x02\x02\u02A8\u02A9\x05)\x14\x02\u02A9\u02AA" + - "\x03\x02\x02\x02\u02AA\u02AB\bH\x04\x02\u02AB\x92\x03\x02\x02\x02\u02AC" + - "\u02AD\x05+\x15\x02\u02AD\u02AE\x03\x02\x02\x02\u02AE\u02AF\bI\x04\x02" + - "\u02AF\x94\x03\x02\x02\x02\u02B0\u02B1\x07~\x02\x02\u02B1\u02B2\x03\x02" + - "\x02\x02\u02B2\u02B3\bJ\x06\x02\u02B3\u02B4\bJ\x05\x02\u02B4\x96\x03\x02" + - "\x02\x02\u02B5\u02B6\x07]\x02\x02\u02B6\u02B7\x03\x02\x02\x02\u02B7\u02B8" + - "\bK\x07\x02\u02B8\u02B9\bK\x03\x02\u02B9\u02BA\bK\x03\x02\u02BA\x98\x03" + - "\x02\x02\x02\u02BB\u02BC\x07_\x02\x02\u02BC\u02BD\x03\x02\x02\x02\u02BD" + - "\u02BE\bL\x05\x02\u02BE\u02BF\bL\x05\x02\u02BF\u02C0\bL\b\x02\u02C0\x9A" + - "\x03\x02\x02\x02\u02C1\u02C2\x07.\x02\x02\u02C2\u02C3\x03\x02\x02\x02" + - "\u02C3\u02C4\bM\t\x02\u02C4\x9C\x03\x02\x02\x02\u02C5\u02C6\x07?\x02\x02" + - "\u02C6\u02C7\x03\x02\x02\x02\u02C7\u02C8\bN\n\x02\u02C8\x9E\x03\x02\x02" + - "\x02\u02C9\u02CA\x05\xB3Y\x02\u02CA\u02CB\x05\xD7k\x02\u02CB\xA0\x03\x02" + - "\x02\x02\u02CC\u02CD\x05\xCBe\x02\u02CD\u02CE\x05\xBB]\x02\u02CE\u02CF" + - "\x05\xD9l\x02\u02CF\u02D0\x05\xB3Y\x02\u02D0\u02D1\x05\xB9\\\x02\u02D1" + - "\u02D2\x05\xB3Y\x02\u02D2\u02D3\x05\xD9l\x02\u02D3\u02D4\x05\xB3Y\x02" + - "\u02D4\xA2\x03\x02\x02\x02\u02D5\u02D6\x05\xCFg\x02\u02D6\u02D7\x05\xCD" + - "f\x02\u02D7\xA4\x03\x02\x02\x02\u02D8\u02D9\x05\xDFo\x02\u02D9\u02DA\x05" + - "\xC3a\x02\u02DA\u02DB\x05\xD9l\x02\u02DB\u02DC\x05\xC1`\x02\u02DC\xA6" + - "\x03\x02\x02\x02\u02DD\u02DF\x05\xA9T\x02\u02DE\u02DD\x03\x02\x02\x02" + - "\u02DF\u02E0\x03\x02\x02\x02\u02E0\u02DE\x03\x02\x02\x02\u02E0\u02E1\x03" + - "\x02\x02\x02\u02E1\xA8\x03\x02\x02\x02\u02E2\u02E4\n\r\x02\x02\u02E3\u02E2" + - "\x03\x02\x02\x02\u02E4\u02E5\x03\x02\x02\x02\u02E5\u02E3\x03\x02\x02\x02" + - "\u02E5\u02E6\x03\x02\x02\x02\u02E6\u02EA\x03\x02\x02\x02\u02E7\u02E8\x07" + - "1\x02\x02\u02E8\u02EA\n\x0E\x02\x02\u02E9\u02E3\x03\x02\x02\x02\u02E9" + - "\u02E7\x03\x02\x02\x02\u02EA\xAA\x03\x02\x02\x02\u02EB\u02EC\x05\x8DF" + - "\x02\u02EC\xAC\x03\x02\x02\x02\u02ED\u02EE\x05\'\x13\x02\u02EE\u02EF\x03" + - "\x02\x02\x02\u02EF\u02F0\bV\x04\x02\u02F0\xAE\x03\x02\x02\x02\u02F1\u02F2" + - "\x05)\x14\x02\u02F2\u02F3\x03\x02\x02\x02\u02F3\u02F4\bW\x04\x02\u02F4" + - "\xB0\x03\x02\x02\x02\u02F5\u02F6\x05+\x15\x02\u02F6\u02F7\x03\x02\x02" + - "\x02\u02F7\u02F8\bX\x04\x02\u02F8\xB2\x03\x02\x02\x02\u02F9\u02FA\t\x0F" + - "\x02\x02\u02FA\xB4\x03\x02\x02\x02\u02FB\u02FC\t\x10\x02\x02\u02FC\xB6" + - "\x03\x02\x02\x02\u02FD\u02FE\t\x11\x02\x02\u02FE\xB8\x03\x02\x02\x02\u02FF" + - "\u0300\t\x12\x02\x02\u0300\xBA\x03\x02\x02\x02\u0301\u0302\t\t\x02\x02" + - "\u0302\xBC\x03\x02\x02\x02\u0303\u0304\t\x13\x02\x02\u0304\xBE\x03\x02" + - "\x02\x02\u0305\u0306\t\x14\x02\x02\u0306\xC0\x03\x02\x02\x02\u0307\u0308" + - "\t\x15\x02\x02\u0308\xC2\x03\x02\x02\x02\u0309\u030A\t\x16\x02\x02\u030A" + - "\xC4\x03\x02\x02\x02\u030B\u030C\t\x17\x02\x02\u030C\xC6\x03\x02\x02\x02" + - "\u030D\u030E\t\x18\x02\x02\u030E\xC8\x03\x02\x02\x02\u030F\u0310\t\x19" + - "\x02\x02\u0310\xCA\x03\x02\x02\x02\u0311\u0312\t\x1A\x02\x02\u0312\xCC" + - "\x03\x02\x02\x02\u0313\u0314\t\x1B\x02\x02\u0314\xCE\x03\x02\x02\x02\u0315" + - "\u0316\t\x1C\x02\x02\u0316\xD0\x03\x02\x02\x02\u0317\u0318\t\x1D\x02\x02" + - "\u0318\xD2\x03\x02\x02\x02\u0319\u031A\t\x1E\x02\x02\u031A\xD4\x03\x02" + - "\x02\x02\u031B\u031C\t\x1F\x02\x02\u031C\xD6\x03\x02\x02\x02\u031D\u031E" + - "\t \x02\x02\u031E\xD8\x03\x02\x02\x02\u031F\u0320\t!\x02\x02\u0320\xDA" + - "\x03\x02\x02\x02\u0321\u0322\t\"\x02\x02\u0322\xDC\x03\x02\x02\x02\u0323" + - "\u0324\t#\x02\x02\u0324\xDE\x03\x02\x02\x02\u0325\u0326\t$\x02\x02\u0326" + - "\xE0\x03\x02\x02\x02\u0327\u0328\t%\x02\x02\u0328\xE2\x03\x02\x02\x02" + - "\u0329\u032A\t&\x02\x02\u032A\xE4\x03\x02\x02\x02\u032B\u032C\t\'\x02" + - "\x02\u032C\xE6\x03\x02\x02\x02\'\x02\x03\x04\u016B\u0175\u0179\u017C\u0185" + - "\u0187\u0192\u01A5\u01AA\u01AF\u01B1\u01BC\u01C4\u01C7\u01C9\u01CE\u01D3" + - "\u01D9\u01E0\u01E5\u01EB\u01EE\u01F6\u01FA\u028A\u028C\u0293\u0295\u0297" + - "\u029D\u029F\u02E0\u02E5\u02E9\v\x07\x03\x02\x07\x04\x02\x02\x03\x02\x06" + - "\x02\x02\t\x17\x02\t?\x02\t@\x02\t\x1F\x02\t\x1E\x02"; + "\x02\x02\u0152\u04A0\x03\x02\x02\x02\u0154\u04A2\x03\x02\x02\x02\u0156" + + "\u04A4\x03\x02\x02\x02\u0158\u04A6\x03\x02\x02\x02\u015A\u04A8\x03\x02" + + "\x02\x02\u015C\u04AA\x03\x02\x02\x02\u015E\u015F\x05\u0130\x94\x02\u015F" + + "\u0160\x05\u013A\x99\x02\u0160\u0161\x05\u014E\xA3\x02\u0161\u0162\x05" + + "\u014E\xA3\x02\u0162\u0163\x05\u0132\x95\x02\u0163\u0164\x05\u012E\x93" + + "\x02\u0164\u0165\x05\u0150\xA4\x02\u0165\u0166\x03\x02\x02\x02\u0166\u0167" + + "\b\x02\x02\x02\u0167\r\x03\x02\x02\x02\u0168\u0169\x05\u0130\x94\x02\u0169" + + "\u016A\x05\u014C\xA2\x02\u016A\u016B\x05\u0146\x9F\x02\u016B\u016C\x05" + + "\u0148\xA0\x02\u016C\u016D\x03\x02\x02\x02\u016D\u016E\b\x03\x03\x02\u016E" + + "\x0F\x03\x02\x02\x02\u016F\u0170\x05\u0132\x95\x02\u0170\u0171\x05\u0144" + + "\x9E\x02\u0171\u0172\x05\u014C\xA2\x02\u0172\u0173\x05\u013A\x99\x02\u0173" + + "\u0174\x05\u012E\x93\x02\u0174\u0175\x05\u0138\x98\x02\u0175\u0176\x03" + + "\x02\x02\x02\u0176\u0177\b\x04\x04\x02\u0177\x11\x03\x02\x02\x02\u0178" + + "\u0179\x05\u0132\x95\x02\u0179\u017A\x05\u0154\xA6\x02\u017A\u017B\x05" + + "\u012A\x91\x02\u017B\u017C\x05\u0140\x9C\x02\u017C\u017D\x03\x02\x02\x02" + + "\u017D\u017E\b\x05\x02\x02\u017E\x13\x03\x02\x02\x02\u017F\u0180\x05\u0132" + + "\x95\x02\u0180\u0181\x05\u0158\xA8\x02\u0181\u0182\x05\u0148\xA0\x02\u0182" + + "\u0183\x05\u0140\x9C\x02\u0183\u0184\x05\u012A\x91\x02\u0184\u0185\x05" + + "\u013A\x99\x02\u0185\u0186\x05\u0144\x9E\x02\u0186\u0187\x03\x02\x02\x02" + + "\u0187\u0188\b\x06\x05\x02\u0188\x15\x03\x02\x02\x02\u0189\u018A\x05\u0134" + + "\x96\x02\u018A\u018B\x05\u014C\xA2\x02\u018B\u018C\x05\u0146\x9F\x02\u018C" + + "\u018D\x05\u0142\x9D\x02\u018D\u018E\x03\x02\x02\x02\u018E\u018F\b\x07" + + "\x06\x02\u018F\x17\x03\x02\x02\x02\u0190\u0191\x05\u0136\x97\x02\u0191" + + "\u0192\x05\u014C\xA2\x02\u0192\u0193\x05\u0146\x9F\x02\u0193\u0194\x05" + + "\u013E\x9B\x02\u0194\u0195\x03\x02\x02\x02\u0195\u0196\b\b\x02\x02\u0196" + + "\x19\x03\x02\x02\x02\u0197\u0198\x05\u013A\x99\x02\u0198\u0199\x05\u0144" + + "\x9E\x02\u0199\u019A\x05\u0140\x9C\x02\u019A\u019B\x05\u013A\x99\x02\u019B" + + "\u019C\x05\u0144\x9E\x02\u019C\u019D\x05\u0132\x95\x02\u019D\u019E\x05" + + "\u014E\xA3\x02\u019E\u019F\x05\u0150\xA4\x02\u019F\u01A0\x05\u012A\x91" + + "\x02\u01A0\u01A1\x05\u0150\xA4\x02\u01A1\u01A2\x05\u014E\xA3\x02\u01A2" + + "\u01A3\x03\x02\x02\x02\u01A3\u01A4\b\t\x02\x02\u01A4\x1B\x03\x02\x02\x02" + + "\u01A5\u01A6\x05\u013E\x9B\x02\u01A6\u01A7\x05\u0132\x95\x02\u01A7\u01A8" + + "\x05\u0132\x95\x02\u01A8\u01A9\x05\u0148\xA0\x02\u01A9\u01AA\x03\x02\x02" + + "\x02\u01AA\u01AB\b\n\x03\x02\u01AB\x1D\x03\x02\x02\x02\u01AC\u01AD\x05" + + "\u0140\x9C\x02\u01AD\u01AE\x05\u013A\x99\x02\u01AE\u01AF\x05\u0142\x9D" + + "\x02\u01AF\u01B0\x05\u013A\x99\x02\u01B0\u01B1\x05\u0150\xA4\x02\u01B1" + + "\u01B2\x03\x02\x02\x02\u01B2\u01B3\b\v\x02\x02\u01B3\x1F\x03\x02\x02\x02" + + "\u01B4\u01B5\x05\u0142\x9D\x02\u01B5\u01B6\x05\u0154\xA6\x02\u01B6\u01B7" + + "\x05T&\x02\u01B7\u01B8\x05\u0132\x95\x02\u01B8\u01B9\x05\u0158\xA8\x02" + + "\u01B9\u01BA\x05\u0148\xA0\x02\u01BA\u01BB\x05\u012A\x91\x02\u01BB\u01BC" + + "\x05\u0144\x9E\x02\u01BC\u01BD\x05\u0130\x94\x02\u01BD\u01BE\x03\x02\x02" + + "\x02\u01BE\u01BF\b\f\x07\x02\u01BF!\x03\x02\x02\x02\u01C0\u01C1\x05\u0148" + + "\xA0\x02\u01C1\u01C2\x05\u014C\xA2\x02\u01C2\u01C3\x05\u0146\x9F\x02\u01C3" + + "\u01C4\x05\u013C\x9A\x02\u01C4\u01C5\x05\u0132\x95\x02\u01C5\u01C6\x05" + + "\u012E\x93\x02\u01C6\u01C7\x05\u0150\xA4\x02\u01C7\u01C8\x03\x02\x02\x02" + + "\u01C8\u01C9\b\r\x03\x02\u01C9#\x03\x02\x02\x02\u01CA\u01CB\x05\u014C" + + "\xA2\x02\u01CB\u01CC\x05\u0132\x95\x02\u01CC\u01CD\x05\u0144\x9E\x02\u01CD" + + "\u01CE\x05\u012A\x91\x02\u01CE\u01CF\x05\u0142\x9D\x02\u01CF\u01D0\x05" + + "\u0132\x95\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2\b\x0E\b\x02\u01D2" + + "%\x03\x02\x02\x02\u01D3\u01D4\x05\u014C\xA2\x02\u01D4\u01D5\x05\u0146" + + "\x9F\x02\u01D5\u01D6\x05\u0156\xA7\x02\u01D6\u01D7\x03\x02\x02\x02\u01D7" + + "\u01D8\b\x0F\x02\x02\u01D8\'\x03\x02\x02\x02\u01D9\u01DA\x05\u014E\xA3" + + "\x02\u01DA\u01DB\x05\u0138\x98\x02\u01DB\u01DC\x05\u0146\x9F\x02\u01DC" + + "\u01DD\x05\u0156\xA7\x02\u01DD\u01DE\x03\x02\x02\x02\u01DE\u01DF\b\x10" + + "\t\x02\u01DF)\x03\x02\x02\x02\u01E0\u01E1\x05\u014E\xA3\x02\u01E1\u01E2" + + "\x05\u0146\x9F\x02\u01E2\u01E3\x05\u014C\xA2\x02\u01E3\u01E4\x05\u0150" + + "\xA4\x02\u01E4\u01E5\x03\x02\x02\x02\u01E5\u01E6\b\x11\x02\x02\u01E6+" + + "\x03\x02\x02\x02\u01E7\u01E8\x05\u014E\xA3\x02\u01E8\u01E9\x05\u0150\xA4" + + "\x02\u01E9\u01EA\x05\u012A\x91\x02\u01EA\u01EB\x05\u0150\xA4\x02\u01EB" + + "\u01EC\x05\u014E\xA3\x02\u01EC\u01ED\x03\x02\x02\x02\u01ED\u01EE\b\x12" + + "\x02\x02\u01EE-\x03\x02\x02\x02\u01EF\u01F0\x05\u0156\xA7\x02\u01F0\u01F1" + + "\x05\u0138\x98\x02\u01F1\u01F2\x05\u0132\x95\x02\u01F2\u01F3\x05\u014C" + + "\xA2\x02\u01F3\u01F4\x05\u0132\x95\x02\u01F4\u01F5\x03\x02\x02\x02\u01F5" + + "\u01F6\b\x13\x02\x02\u01F6/\x03\x02\x02\x02\u01F7\u01F9\n\x02\x02\x02" + + "\u01F8\u01F7\x03\x02\x02\x02\u01F9\u01FA\x03\x02\x02\x02\u01FA\u01F8\x03" + + "\x02\x02\x02\u01FA\u01FB\x03\x02\x02\x02\u01FB\u01FC\x03\x02\x02\x02\u01FC" + + "\u01FD\b\x14\x02\x02\u01FD1\x03\x02\x02\x02\u01FE\u01FF\x071\x02\x02\u01FF" + + "\u0200\x071\x02\x02\u0200\u0204\x03\x02\x02\x02\u0201\u0203\n\x03\x02" + + "\x02\u0202\u0201\x03\x02\x02\x02\u0203\u0206\x03\x02\x02\x02\u0204\u0202" + + "\x03\x02\x02\x02\u0204\u0205\x03\x02\x02\x02\u0205\u0208\x03\x02\x02\x02" + + "\u0206\u0204\x03\x02\x02\x02\u0207\u0209\x07\x0F\x02\x02\u0208\u0207\x03" + + "\x02\x02\x02\u0208\u0209\x03\x02\x02\x02\u0209\u020B\x03\x02\x02\x02\u020A" + + "\u020C\x07\f\x02\x02\u020B\u020A\x03\x02\x02\x02\u020B\u020C\x03\x02\x02" + + "\x02\u020C\u020D\x03\x02\x02\x02\u020D\u020E\b\x15\n\x02\u020E3\x03\x02" + + "\x02\x02\u020F\u0210\x071\x02\x02\u0210\u0211\x07,\x02\x02\u0211\u0216" + + "\x03\x02\x02\x02\u0212\u0215\x054\x16\x02\u0213\u0215\v\x02\x02\x02\u0214" + + "\u0212\x03\x02\x02\x02\u0214\u0213\x03\x02\x02\x02\u0215\u0218\x03\x02" + + "\x02\x02\u0216\u0217\x03\x02\x02\x02\u0216\u0214\x03\x02\x02\x02\u0217" + + "\u0219\x03\x02\x02\x02\u0218\u0216\x03\x02\x02\x02\u0219\u021A\x07,\x02" + + "\x02\u021A\u021B\x071\x02\x02\u021B\u021C\x03\x02\x02\x02\u021C\u021D" + + "\b\x16\n\x02\u021D5\x03\x02\x02\x02\u021E\u0220\t\x04\x02\x02\u021F\u021E" + + "\x03\x02\x02\x02\u0220\u0221\x03\x02\x02\x02\u0221\u021F\x03\x02\x02\x02" + + "\u0221\u0222\x03\x02\x02\x02\u0222\u0223\x03\x02\x02\x02\u0223\u0224\b" + + "\x17\n\x02\u02247\x03\x02\x02\x02\u0225\u0226\x05\xA0L\x02\u0226\u0227" + + "\x03\x02\x02\x02\u0227\u0228\b\x18\v\x02\u0228\u0229\b\x18\f\x02\u0229" + + "9\x03\x02\x02\x02\u022A\u022B\x05B\x1D\x02\u022B\u022C\x03\x02\x02\x02" + + "\u022C\u022D\b\x19\r\x02\u022D\u022E\b\x19\x0E\x02\u022E;\x03\x02\x02" + + "\x02\u022F\u0230\x056\x17\x02\u0230\u0231\x03\x02\x02\x02\u0231\u0232" + + "\b\x1A\n\x02\u0232=\x03\x02\x02\x02\u0233\u0234\x052\x15\x02\u0234\u0235" + + "\x03\x02\x02\x02\u0235\u0236\b\x1B\n\x02\u0236?\x03\x02\x02\x02\u0237" + + "\u0238\x054\x16\x02\u0238\u0239\x03\x02\x02\x02\u0239\u023A\b\x1C\n\x02" + + "\u023AA\x03\x02\x02\x02\u023B\u023C\x07~\x02\x02\u023C\u023D\x03\x02\x02" + + "\x02\u023D\u023E\b\x1D\x0E\x02\u023EC\x03\x02\x02\x02\u023F\u0240\t\x05" + + "\x02\x02\u0240E\x03\x02\x02\x02\u0241\u0242\t\x06\x02\x02\u0242G\x03\x02" + + "\x02\x02\u0243\u0244\x07^\x02\x02\u0244\u0245\t\x07\x02\x02\u0245I\x03" + + "\x02\x02\x02\u0246\u0247\n\b\x02\x02\u0247K\x03\x02\x02\x02\u0248\u024A" + + "\t\t\x02\x02\u0249\u024B\t\n\x02\x02\u024A\u0249\x03\x02\x02\x02\u024A" + + "\u024B\x03\x02\x02\x02\u024B\u024D\x03\x02\x02\x02\u024C\u024E\x05D\x1E" + + "\x02\u024D\u024C\x03\x02\x02\x02\u024E\u024F\x03\x02\x02\x02\u024F\u024D" + + "\x03\x02\x02\x02\u024F\u0250\x03\x02\x02\x02\u0250M\x03\x02\x02\x02\u0251" + + "\u0252\x07B\x02\x02\u0252O\x03\x02\x02\x02\u0253\u0254\x07b\x02\x02\u0254" + + "Q\x03\x02\x02\x02\u0255\u0259\n\v\x02\x02\u0256\u0257\x07b\x02\x02\u0257" + + "\u0259\x07b\x02\x02\u0258\u0255\x03\x02\x02\x02\u0258\u0256\x03\x02\x02" + + "\x02\u0259S\x03\x02\x02\x02\u025A\u025B\x07a\x02\x02\u025BU\x03\x02\x02" + + "\x02\u025C\u0260\x05F\x1F\x02\u025D\u0260\x05D\x1E\x02\u025E\u0260\x05" + + "T&\x02\u025F\u025C\x03\x02\x02\x02\u025F\u025D\x03\x02\x02\x02\u025F\u025E" + + "\x03\x02\x02\x02\u0260W\x03\x02\x02\x02\u0261\u0266\x07$\x02\x02\u0262" + + "\u0265\x05H \x02\u0263\u0265\x05J!\x02\u0264\u0262\x03\x02\x02\x02\u0264" + + "\u0263\x03\x02\x02\x02\u0265\u0268\x03\x02\x02\x02\u0266\u0264\x03\x02" + + "\x02\x02\u0266\u0267\x03\x02\x02\x02\u0267\u0269\x03\x02\x02\x02\u0268" + + "\u0266\x03\x02\x02\x02\u0269\u027F\x07$\x02\x02\u026A\u026B\x07$\x02\x02" + + "\u026B\u026C\x07$\x02\x02\u026C\u026D\x07$\x02\x02\u026D\u0271\x03\x02" + + "\x02\x02\u026E\u0270\n\x03\x02\x02\u026F\u026E\x03\x02\x02\x02\u0270\u0273" + + "\x03\x02\x02\x02\u0271\u0272\x03\x02\x02\x02\u0271\u026F\x03\x02\x02\x02" + + "\u0272\u0274\x03\x02\x02\x02\u0273\u0271\x03\x02\x02\x02\u0274\u0275\x07" + + "$\x02\x02\u0275\u0276\x07$\x02\x02\u0276\u0277\x07$\x02\x02\u0277\u0279" + + "\x03\x02\x02\x02\u0278\u027A\x07$\x02\x02\u0279\u0278\x03\x02\x02\x02" + + "\u0279\u027A\x03\x02\x02\x02\u027A\u027C\x03\x02\x02\x02\u027B\u027D\x07" + + "$\x02\x02\u027C\u027B\x03\x02\x02\x02\u027C\u027D\x03\x02\x02\x02\u027D" + + "\u027F\x03\x02\x02\x02\u027E\u0261\x03\x02\x02\x02\u027E\u026A\x03\x02" + + "\x02\x02\u027FY\x03\x02\x02\x02\u0280\u0282\x05D\x1E\x02\u0281\u0280\x03" + + "\x02\x02\x02\u0282\u0283\x03\x02\x02\x02\u0283\u0281\x03\x02\x02\x02\u0283" + + "\u0284\x03\x02\x02\x02\u0284[\x03\x02\x02\x02\u0285\u0287\x05D\x1E\x02" + + "\u0286\u0285\x03\x02\x02\x02\u0287\u0288\x03\x02\x02\x02\u0288\u0286\x03" + + "\x02\x02\x02\u0288\u0289\x03\x02\x02\x02\u0289\u028A\x03\x02\x02\x02\u028A" + + "\u028E\x05j1\x02\u028B\u028D\x05D\x1E\x02\u028C\u028B\x03\x02\x02\x02" + + "\u028D\u0290\x03\x02\x02\x02\u028E\u028C\x03\x02\x02\x02\u028E\u028F\x03" + + "\x02\x02\x02\u028F\u02B0\x03\x02\x02\x02\u0290\u028E\x03\x02\x02\x02\u0291" + + "\u0293\x05j1\x02\u0292\u0294\x05D\x1E\x02\u0293\u0292\x03\x02\x02\x02" + + "\u0294\u0295\x03\x02\x02\x02\u0295\u0293\x03\x02\x02\x02\u0295\u0296\x03" + + "\x02\x02\x02\u0296\u02B0\x03\x02\x02\x02\u0297\u0299\x05D\x1E\x02\u0298" + + "\u0297\x03\x02\x02\x02\u0299\u029A\x03\x02\x02\x02\u029A\u0298\x03\x02" + + "\x02\x02\u029A\u029B\x03\x02\x02\x02\u029B\u02A3\x03\x02\x02\x02\u029C" + + "\u02A0\x05j1\x02\u029D\u029F\x05D\x1E\x02\u029E\u029D\x03\x02\x02\x02" + + "\u029F\u02A2\x03\x02\x02\x02\u02A0\u029E\x03\x02\x02\x02\u02A0\u02A1\x03" + + "\x02\x02\x02\u02A1\u02A4\x03\x02\x02\x02\u02A2\u02A0\x03\x02\x02\x02\u02A3" + + "\u029C\x03\x02\x02\x02\u02A3\u02A4\x03\x02\x02\x02\u02A4\u02A5\x03\x02" + + "\x02\x02\u02A5\u02A6\x05L\"\x02\u02A6\u02B0\x03\x02\x02\x02\u02A7\u02A9" + + "\x05j1\x02\u02A8\u02AA\x05D\x1E\x02\u02A9\u02A8\x03\x02\x02\x02\u02AA" + + "\u02AB\x03\x02\x02\x02\u02AB\u02A9\x03\x02\x02\x02\u02AB\u02AC\x03\x02" + + "\x02\x02\u02AC\u02AD\x03\x02\x02\x02\u02AD\u02AE\x05L\"\x02\u02AE\u02B0" + + "\x03\x02\x02\x02\u02AF\u0286\x03\x02\x02\x02\u02AF\u0291\x03\x02\x02\x02" + + "\u02AF\u0298\x03\x02\x02\x02\u02AF\u02A7\x03\x02\x02\x02\u02B0]\x03\x02" + + "\x02\x02\u02B1\u02B2\x05\u012C\x92\x02\u02B2\u02B3\x05\u015A\xA9\x02\u02B3" + + "_\x03\x02\x02\x02\u02B4\u02B5\x05\u012A\x91\x02\u02B5\u02B6\x05\u0144" + + "\x9E\x02\u02B6\u02B7\x05\u0130\x94\x02\u02B7a\x03\x02\x02\x02\u02B8\u02B9" + + "\x05\u012A\x91\x02\u02B9\u02BA\x05\u014E\xA3\x02\u02BA\u02BB\x05\u012E" + + "\x93\x02\u02BBc\x03\x02\x02\x02\u02BC\u02BD\x07?\x02\x02\u02BDe\x03\x02" + + "\x02\x02\u02BE\u02BF\x07.\x02\x02\u02BFg\x03\x02\x02\x02\u02C0\u02C1\x05" + + "\u0130\x94\x02\u02C1\u02C2\x05\u0132\x95\x02\u02C2\u02C3\x05\u014E\xA3" + + "\x02\u02C3\u02C4\x05\u012E\x93\x02\u02C4i\x03\x02\x02\x02\u02C5\u02C6" + + "\x070\x02\x02\u02C6k\x03\x02\x02\x02\u02C7\u02C8\x05\u0134\x96\x02\u02C8" + + "\u02C9\x05\u012A\x91\x02\u02C9\u02CA\x05\u0140\x9C\x02\u02CA\u02CB\x05" + + "\u014E\xA3\x02\u02CB\u02CC\x05\u0132\x95\x02\u02CCm\x03\x02\x02\x02\u02CD" + + "\u02CE\x05\u0134\x96\x02\u02CE\u02CF\x05\u013A\x99\x02\u02CF\u02D0\x05" + + "\u014C\xA2\x02\u02D0\u02D1\x05\u014E\xA3\x02\u02D1\u02D2\x05\u0150\xA4" + + "\x02\u02D2o\x03\x02\x02\x02\u02D3\u02D4\x05\u0140\x9C\x02\u02D4\u02D5" + + "\x05\u012A\x91\x02\u02D5\u02D6\x05\u014E\xA3\x02\u02D6\u02D7\x05\u0150" + + "\xA4\x02\u02D7q\x03\x02\x02\x02\u02D8\u02D9\x07*\x02\x02\u02D9s\x03\x02" + + "\x02\x02\u02DA\u02DB\x05\u013A\x99\x02\u02DB\u02DC\x05\u0144\x9E\x02\u02DC" + + "u\x03\x02\x02\x02\u02DD\u02DE\x05\u013A\x99\x02\u02DE\u02DF\x05\u014E" + + "\xA3\x02\u02DFw\x03\x02\x02\x02\u02E0\u02E1\x05\u0140\x9C\x02\u02E1\u02E2" + + "\x05\u013A\x99\x02\u02E2\u02E3\x05\u013E\x9B\x02\u02E3\u02E4\x05\u0132" + + "\x95\x02\u02E4y\x03\x02\x02\x02\u02E5\u02E6\x05\u0144\x9E\x02\u02E6\u02E7" + + "\x05\u0146\x9F\x02\u02E7\u02E8\x05\u0150\xA4\x02\u02E8{\x03\x02\x02\x02" + + "\u02E9\u02EA\x05\u0144\x9E\x02\u02EA\u02EB\x05\u0152\xA5\x02\u02EB\u02EC" + + "\x05\u0140\x9C\x02\u02EC\u02ED\x05\u0140\x9C\x02\u02ED}\x03\x02\x02\x02" + + "\u02EE\u02EF\x05\u0144\x9E\x02\u02EF\u02F0\x05\u0152\xA5\x02\u02F0\u02F1" + + "\x05\u0140\x9C\x02\u02F1\u02F2\x05\u0140\x9C\x02\u02F2\u02F3\x05\u014E" + + "\xA3\x02\u02F3\x7F\x03\x02\x02\x02\u02F4\u02F5\x05\u0146\x9F\x02\u02F5" + + "\u02F6\x05\u014C\xA2\x02\u02F6\x81\x03\x02\x02\x02\u02F7\u02F8\x07A\x02" + + "\x02\u02F8\x83\x03\x02\x02\x02\u02F9\u02FA\x05\u014C\xA2\x02\u02FA\u02FB" + + "\x05\u0140\x9C\x02\u02FB\u02FC\x05\u013A\x99\x02\u02FC\u02FD\x05\u013E" + + "\x9B\x02\u02FD\u02FE\x05\u0132\x95\x02\u02FE\x85\x03\x02\x02\x02\u02FF" + + "\u0300\x07+\x02\x02\u0300\x87\x03\x02\x02\x02\u0301\u0302\x05\u0150\xA4" + + "\x02\u0302\u0303\x05\u014C\xA2\x02\u0303\u0304\x05\u0152\xA5\x02\u0304" + + "\u0305\x05\u0132\x95\x02\u0305\x89\x03\x02\x02\x02\u0306\u0307\x07?\x02" + + "\x02\u0307\u0308\x07?\x02\x02\u0308\x8B\x03\x02\x02\x02\u0309\u030A\x07" + + "#\x02\x02\u030A\u030B\x07?\x02\x02\u030B\x8D\x03\x02\x02\x02\u030C\u030D" + + "\x07>\x02\x02\u030D\x8F\x03\x02\x02\x02\u030E\u030F\x07>\x02\x02\u030F" + + "\u0310\x07?\x02\x02\u0310\x91\x03\x02\x02\x02\u0311\u0312\x07@\x02\x02" + + "\u0312\x93\x03\x02\x02\x02\u0313\u0314\x07@\x02\x02\u0314\u0315\x07?\x02" + + "\x02\u0315\x95\x03\x02\x02\x02\u0316\u0317\x07-\x02\x02\u0317\x97\x03" + + "\x02\x02\x02\u0318\u0319\x07/\x02\x02\u0319\x99\x03\x02\x02\x02\u031A" + + "\u031B\x07,\x02\x02\u031B\x9B\x03\x02\x02\x02\u031C\u031D\x071\x02\x02" + + "\u031D\x9D\x03\x02\x02\x02\u031E\u031F\x07\'\x02\x02\u031F\x9F\x03\x02" + + "\x02\x02\u0320\u0321\x07]\x02\x02\u0321\u0322\x03\x02\x02\x02\u0322\u0323" + + "\bL\x02\x02\u0323\u0324\bL\x02\x02\u0324\xA1\x03\x02\x02\x02\u0325\u0326" + + "\x07_\x02\x02\u0326\u0327\x03\x02\x02\x02\u0327\u0328\bM\x0E\x02\u0328" + + "\u0329\bM\x0E\x02\u0329\xA3\x03\x02\x02\x02\u032A\u032E\x05F\x1F\x02\u032B" + + "\u032D\x05V\'\x02\u032C\u032B\x03\x02\x02\x02\u032D\u0330\x03\x02\x02" + + "\x02\u032E\u032C\x03\x02\x02\x02\u032E\u032F\x03\x02\x02\x02\u032F\u033B" + + "\x03\x02\x02\x02\u0330\u032E\x03\x02\x02\x02\u0331\u0334\x05T&\x02\u0332" + + "\u0334\x05N#\x02\u0333\u0331\x03\x02\x02\x02\u0333\u0332\x03\x02\x02\x02" + + "\u0334\u0336\x03\x02\x02\x02\u0335\u0337\x05V\'\x02\u0336\u0335\x03\x02" + + "\x02\x02\u0337\u0338\x03\x02\x02\x02\u0338\u0336\x03\x02\x02\x02\u0338" + + "\u0339\x03\x02\x02\x02\u0339\u033B\x03\x02\x02\x02\u033A\u032A\x03\x02" + + "\x02\x02\u033A\u0333\x03\x02\x02\x02\u033B\xA5\x03\x02\x02\x02\u033C\u033E" + + "\x05P$\x02\u033D\u033F\x05R%\x02\u033E\u033D\x03\x02\x02\x02\u033F\u0340" + + "\x03\x02\x02\x02\u0340\u033E\x03\x02\x02\x02\u0340\u0341\x03\x02\x02\x02" + + "\u0341\u0342\x03\x02\x02\x02\u0342\u0343\x05P$\x02\u0343\xA7\x03\x02\x02" + + "\x02\u0344\u0345\x052\x15\x02\u0345\u0346\x03\x02\x02\x02\u0346\u0347" + + "\bP\n\x02\u0347\xA9\x03\x02\x02\x02\u0348\u0349\x054\x16\x02\u0349\u034A" + + "\x03\x02\x02\x02\u034A\u034B\bQ\n\x02\u034B\xAB\x03\x02\x02\x02\u034C" + + "\u034D\x056\x17\x02\u034D\u034E\x03\x02\x02\x02\u034E\u034F\bR\n\x02\u034F" + + "\xAD\x03\x02\x02\x02\u0350\u0351\x05B\x1D\x02\u0351\u0352\x03\x02\x02" + + "\x02\u0352\u0353\bS\r\x02\u0353\u0354\bS\x0E\x02\u0354\xAF\x03\x02\x02" + + "\x02\u0355\u0356\x05\xA0L\x02\u0356\u0357\x03\x02\x02\x02\u0357\u0358" + + "\bT\v\x02\u0358\u0359\bT\x06\x02\u0359\u035A\bT\x06\x02\u035A\xB1\x03" + + "\x02\x02\x02\u035B\u035C\x05\xA2M\x02\u035C\u035D\x03\x02\x02\x02\u035D" + + "\u035E\bU\x0F\x02\u035E\u035F\bU\x0E\x02\u035F\u0360\bU\x0E\x02\u0360" + + "\xB3\x03\x02\x02\x02\u0361\u0362\x05f/\x02\u0362\u0363\x03\x02\x02\x02" + + "\u0363\u0364\bV\x10\x02\u0364\xB5\x03\x02\x02\x02\u0365\u0366\x05d.\x02" + + "\u0366\u0367\x03\x02\x02\x02\u0367\u0368\bW\x11\x02\u0368\xB7\x03\x02" + + "\x02\x02\u0369\u036A\x05\u0142\x9D\x02\u036A\u036B\x05\u0132\x95\x02\u036B" + + "\u036C\x05\u0150\xA4\x02\u036C\u036D\x05\u012A\x91\x02\u036D\u036E\x05" + + "\u0130\x94\x02\u036E\u036F\x05\u012A\x91\x02\u036F\u0370\x05\u0150\xA4" + + "\x02\u0370\u0371\x05\u012A\x91\x02\u0371\xB9\x03\x02\x02\x02\u0372\u0376" + + "\n\f\x02\x02\u0373\u0374\x071\x02\x02\u0374\u0376\n\r\x02\x02\u0375\u0372" + + "\x03\x02\x02\x02\u0375\u0373\x03\x02\x02\x02\u0376\xBB\x03\x02\x02\x02" + + "\u0377\u0379\x05\xBAY\x02\u0378\u0377\x03\x02\x02\x02\u0379\u037A\x03" + + "\x02\x02\x02\u037A\u0378\x03\x02\x02\x02\u037A\u037B\x03\x02\x02\x02\u037B" + + "\xBD\x03\x02\x02\x02\u037C\u037D\x05\xA6O\x02\u037D\u037E\x03\x02\x02" + + "\x02\u037E\u037F\b[\x12\x02\u037F\xBF\x03\x02\x02\x02\u0380\u0381\x05" + + "2\x15\x02\u0381\u0382\x03\x02\x02\x02\u0382\u0383\b\\\n\x02\u0383\xC1" + + "\x03\x02\x02\x02\u0384\u0385\x054\x16\x02\u0385\u0386\x03\x02\x02\x02" + + "\u0386\u0387\b]\n\x02\u0387\xC3\x03\x02\x02\x02\u0388\u0389\x056\x17\x02" + + "\u0389\u038A\x03\x02\x02\x02\u038A\u038B\b^\n\x02\u038B\xC5\x03\x02\x02" + + "\x02\u038C\u038D\x05B\x1D\x02\u038D\u038E\x03\x02\x02\x02\u038E\u038F" + + "\b_\r\x02\u038F\u0390\b_\x0E\x02\u0390\xC7\x03\x02\x02\x02\u0391\u0392" + + "\x05j1\x02\u0392\u0393\x03\x02\x02\x02\u0393\u0394\b`\x13\x02\u0394\xC9" + + "\x03\x02\x02\x02\u0395\u0396\x05f/\x02\u0396\u0397\x03\x02\x02\x02\u0397" + + "\u0398\ba\x10\x02\u0398\xCB\x03\x02\x02\x02\u0399\u039E\x05F\x1F\x02\u039A" + + "\u039E\x05D\x1E\x02\u039B\u039E\x05T&\x02\u039C\u039E\x05\x9AI\x02\u039D" + + "\u0399\x03\x02\x02\x02\u039D\u039A\x03\x02\x02\x02\u039D\u039B\x03\x02" + + "\x02\x02\u039D\u039C\x03\x02\x02\x02\u039E\xCD\x03\x02\x02\x02\u039F\u03A2" + + "\x05F\x1F\x02\u03A0\u03A2\x05\x9AI\x02\u03A1\u039F\x03\x02\x02\x02\u03A1" + + "\u03A0\x03\x02\x02\x02\u03A2\u03A6\x03\x02\x02\x02\u03A3\u03A5\x05\xCC" + + "b\x02\u03A4\u03A3\x03\x02\x02\x02\u03A5\u03A8\x03\x02\x02\x02\u03A6\u03A4" + + "\x03\x02\x02\x02\u03A6\u03A7\x03\x02\x02\x02\u03A7\u03B3\x03\x02\x02\x02" + + "\u03A8\u03A6\x03\x02\x02\x02\u03A9\u03AC\x05T&\x02\u03AA\u03AC\x05N#\x02" + + "\u03AB\u03A9\x03\x02\x02\x02\u03AB\u03AA\x03\x02\x02\x02\u03AC\u03AE\x03" + + "\x02\x02\x02\u03AD\u03AF\x05\xCCb\x02\u03AE\u03AD\x03\x02\x02\x02\u03AF" + + "\u03B0\x03\x02\x02\x02\u03B0\u03AE\x03\x02\x02\x02\u03B0\u03B1\x03\x02" + + "\x02\x02\u03B1\u03B3\x03\x02\x02\x02\u03B2\u03A1\x03\x02\x02\x02\u03B2" + + "\u03AB\x03\x02\x02\x02\u03B3\xCF\x03\x02\x02\x02\u03B4\u03B5\x05\xA6O" + + "\x02\u03B5\u03B6\x03\x02\x02\x02\u03B6\u03B7\bd\x12\x02\u03B7\xD1\x03" + + "\x02\x02\x02\u03B8\u03B9\x052\x15\x02\u03B9\u03BA\x03\x02\x02\x02\u03BA" + + "\u03BB\be\n\x02\u03BB\xD3\x03\x02\x02\x02\u03BC\u03BD\x054\x16\x02\u03BD" + + "\u03BE\x03\x02\x02\x02\u03BE\u03BF\bf\n\x02\u03BF\xD5\x03\x02\x02\x02" + + "\u03C0\u03C1\x056\x17\x02\u03C1\u03C2\x03\x02\x02\x02\u03C2\u03C3\bg\n" + + "\x02\u03C3\xD7\x03\x02\x02\x02\u03C4\u03C5\x05B\x1D\x02\u03C5\u03C6\x03" + + "\x02\x02\x02\u03C6\u03C7\bh\r\x02\u03C7\u03C8\bh\x0E\x02\u03C8\xD9\x03" + + "\x02\x02\x02\u03C9\u03CA\x05d.\x02\u03CA\u03CB\x03\x02\x02\x02\u03CB\u03CC" + + "\bi\x11\x02\u03CC\xDB\x03\x02\x02\x02\u03CD\u03CE\x05f/\x02\u03CE\u03CF" + + "\x03\x02\x02\x02\u03CF\u03D0\bj\x10\x02\u03D0\xDD\x03\x02\x02\x02\u03D1" + + "\u03D2\x05j1\x02\u03D2\u03D3\x03\x02\x02\x02\u03D3\u03D4\bk\x13\x02\u03D4" + + "\xDF\x03\x02\x02\x02\u03D5\u03D6\x05\u012A\x91\x02\u03D6\u03D7\x05\u014E" + + "\xA3\x02\u03D7\xE1\x03\x02\x02\x02\u03D8\u03D9\x05\xA6O\x02\u03D9\u03DA" + + "\x03\x02\x02\x02\u03DA\u03DB\bm\x12\x02\u03DB\xE3\x03\x02\x02\x02\u03DC" + + "\u03DD\x05\xCEc\x02\u03DD\u03DE\x03\x02\x02\x02\u03DE\u03DF\bn\x14\x02" + + "\u03DF\xE5\x03\x02\x02\x02\u03E0\u03E1\x052\x15\x02\u03E1\u03E2\x03\x02" + + "\x02\x02\u03E2\u03E3\bo\n\x02\u03E3\xE7\x03\x02\x02\x02\u03E4\u03E5\x05" + + "4\x16\x02\u03E5\u03E6\x03\x02\x02\x02\u03E6\u03E7\bp\n\x02\u03E7\xE9\x03" + + "\x02\x02\x02\u03E8\u03E9\x056\x17\x02\u03E9\u03EA\x03\x02\x02\x02\u03EA" + + "\u03EB\bq\n\x02\u03EB\xEB\x03\x02\x02\x02\u03EC\u03ED\x05B\x1D\x02\u03ED" + + "\u03EE\x03\x02\x02\x02\u03EE\u03EF\br\r\x02\u03EF\u03F0\br\x0E\x02\u03F0" + + "\xED\x03\x02\x02\x02\u03F1\u03F2\x05\u0146\x9F\x02\u03F2\u03F3\x05\u0144" + + "\x9E\x02\u03F3\u03F4\x03\x02\x02\x02\u03F4\u03F5\bs\x15\x02\u03F5\xEF" + + "\x03\x02\x02\x02\u03F6\u03F7\x05\u0156\xA7\x02\u03F7\u03F8\x05\u013A\x99" + + "\x02\u03F8\u03F9\x05\u0150\xA4\x02\u03F9\u03FA\x05\u0138\x98\x02\u03FA" + + "\u03FB\x03\x02\x02\x02\u03FB\u03FC\bt\x15\x02\u03FC\xF1\x03\x02\x02\x02" + + "\u03FD\u03FE\x05\xBCZ\x02\u03FE\u03FF\x03\x02\x02\x02\u03FF\u0400\bu\x16" + + "\x02\u0400\xF3\x03\x02\x02\x02\u0401\u0402\x05\xA6O\x02\u0402\u0403\x03" + + "\x02\x02\x02\u0403\u0404\bv\x12\x02\u0404\xF5\x03\x02\x02\x02\u0405\u0406" + + "\x052\x15\x02\u0406\u0407\x03\x02\x02\x02\u0407\u0408\bw\n\x02\u0408\xF7" + + "\x03\x02\x02\x02\u0409\u040A\x054\x16\x02\u040A\u040B\x03\x02\x02\x02" + + "\u040B\u040C\bx\n\x02\u040C\xF9\x03\x02\x02\x02\u040D\u040E\x056\x17\x02" + + "\u040E\u040F\x03\x02\x02\x02\u040F\u0410\by\n\x02\u0410\xFB\x03\x02\x02" + + "\x02\u0411\u0412\x05B\x1D\x02\u0412\u0413\x03\x02\x02\x02\u0413\u0414" + + "\bz\r\x02\u0414\u0415\bz\x0E\x02\u0415\u0416\bz\x0E\x02\u0416\xFD\x03" + + "\x02\x02\x02\u0417\u0418\x05d.\x02\u0418\u0419\x03\x02\x02\x02\u0419\u041A" + + "\b{\x11\x02\u041A\xFF\x03\x02\x02\x02\u041B\u041C\x05f/\x02\u041C\u041D" + + "\x03\x02\x02\x02\u041D\u041E\b|\x10\x02\u041E\u0101\x03\x02\x02\x02\u041F" + + "\u0420\x05j1\x02\u0420\u0421\x03\x02\x02\x02\u0421\u0422\b}\x13\x02\u0422" + + "\u0103\x03\x02\x02\x02\u0423\u0424\x05\xF0t\x02\u0424\u0425\x03\x02\x02" + + "\x02\u0425\u0426\b~\x17\x02\u0426\u0105\x03\x02\x02\x02\u0427\u0428\x05" + + "\xCEc\x02\u0428\u0429\x03\x02\x02\x02\u0429\u042A\b\x7F\x14\x02\u042A" + + "\u0107\x03\x02\x02\x02\u042B\u042C\x05\xA6O\x02\u042C\u042D\x03\x02\x02" + + "\x02\u042D\u042E\b\x80\x12\x02\u042E\u0109\x03\x02\x02\x02\u042F\u0430" + + "\x052\x15\x02\u0430\u0431\x03\x02\x02\x02\u0431\u0432\b\x81\n\x02\u0432" + + "\u010B\x03\x02\x02\x02\u0433\u0434\x054\x16\x02\u0434\u0435\x03\x02\x02" + + "\x02\u0435\u0436\b\x82\n\x02\u0436\u010D\x03\x02\x02\x02\u0437\u0438\x05" + + "6\x17\x02\u0438\u0439\x03\x02\x02\x02\u0439\u043A\b\x83\n\x02\u043A\u010F" + + "\x03\x02\x02\x02\u043B\u043C\x05B\x1D\x02\u043C\u043D\x03\x02\x02\x02" + + "\u043D\u043E\b\x84\r\x02\u043E\u043F\b\x84\x0E\x02\u043F\u0111\x03\x02" + + "\x02\x02\u0440\u0441\x05j1\x02\u0441\u0442\x03\x02\x02\x02\u0442\u0443" + + "\b\x85\x13\x02\u0443\u0113\x03\x02\x02\x02\u0444\u0445\x05\xA6O\x02\u0445" + + "\u0446\x03\x02\x02\x02\u0446\u0447\b\x86\x12\x02\u0447\u0115\x03\x02\x02" + + "\x02\u0448\u0449\x05\xA4N\x02\u0449\u044A\x03\x02\x02\x02\u044A\u044B" + + "\b\x87\x18\x02\u044B\u0117\x03\x02\x02\x02\u044C\u044D\x052\x15\x02\u044D" + + "\u044E\x03\x02\x02\x02\u044E\u044F\b\x88\n\x02\u044F\u0119\x03\x02\x02" + + "\x02\u0450\u0451\x054\x16\x02\u0451\u0452\x03\x02\x02\x02\u0452\u0453" + + "\b\x89\n\x02\u0453\u011B\x03\x02\x02\x02\u0454\u0455\x056\x17\x02\u0455" + + "\u0456\x03\x02\x02\x02\u0456\u0457\b\x8A\n\x02\u0457\u011D\x03\x02\x02" + + "\x02\u0458\u0459\x05B\x1D\x02\u0459\u045A\x03\x02\x02\x02\u045A\u045B" + + "\b\x8B\r\x02\u045B\u045C\b\x8B\x0E\x02\u045C\u011F\x03\x02\x02\x02\u045D" + + "\u045E\x05\u013A\x99\x02\u045E\u045F\x05\u0144\x9E\x02\u045F\u0460\x05" + + "\u0134\x96\x02\u0460\u0461\x05\u0146\x9F\x02\u0461\u0121\x03\x02\x02\x02" + + "\u0462\u0463\x05\u0134\x96\x02\u0463\u0464\x05\u0152\xA5\x02\u0464\u0465" + + "\x05\u0144\x9E\x02\u0465\u0466\x05\u012E\x93\x02\u0466\u0467\x05\u0150" + + "\xA4\x02\u0467\u0468\x05\u013A\x99\x02\u0468\u0469\x05\u0146\x9F\x02\u0469" + + "\u046A\x05\u0144\x9E\x02\u046A\u046B\x05\u014E\xA3\x02\u046B\u0123\x03" + + "\x02\x02\x02\u046C\u046D\x052\x15\x02"; + private static readonly _serializedATNSegment2: string = + "\u046D\u046E\x03\x02\x02\x02\u046E\u046F\b\x8E\n\x02\u046F\u0125\x03\x02" + + "\x02\x02\u0470\u0471\x054\x16\x02\u0471\u0472\x03\x02\x02\x02\u0472\u0473" + + "\b\x8F\n\x02\u0473\u0127\x03\x02\x02\x02\u0474\u0475\x056\x17\x02\u0475" + + "\u0476\x03\x02\x02\x02\u0476\u0477\b\x90\n\x02\u0477\u0129\x03\x02\x02" + + "\x02\u0478\u0479\t\x0E\x02\x02\u0479\u012B\x03\x02\x02\x02\u047A\u047B" + + "\t\x0F\x02\x02\u047B\u012D\x03\x02\x02\x02\u047C\u047D\t\x10\x02\x02\u047D" + + "\u012F\x03\x02\x02\x02\u047E\u047F\t\x11\x02\x02\u047F\u0131\x03\x02\x02" + + "\x02\u0480\u0481\t\t\x02\x02\u0481\u0133\x03\x02\x02\x02\u0482\u0483\t" + + "\x12\x02\x02\u0483\u0135\x03\x02\x02\x02\u0484\u0485\t\x13\x02\x02\u0485" + + "\u0137\x03\x02\x02\x02\u0486\u0487\t\x14\x02\x02\u0487\u0139\x03\x02\x02" + + "\x02\u0488\u0489\t\x15\x02\x02\u0489\u013B\x03\x02\x02\x02\u048A\u048B" + + "\t\x16\x02\x02\u048B\u013D\x03\x02\x02\x02\u048C\u048D\t\x17\x02\x02\u048D" + + "\u013F\x03\x02\x02\x02\u048E\u048F\t\x18\x02\x02\u048F\u0141\x03\x02\x02" + + "\x02\u0490\u0491\t\x19\x02\x02\u0491\u0143\x03\x02\x02\x02\u0492\u0493" + + "\t\x1A\x02\x02\u0493\u0145\x03\x02\x02\x02\u0494\u0495\t\x1B\x02\x02\u0495" + + "\u0147\x03\x02\x02\x02\u0496\u0497\t\x1C\x02\x02\u0497\u0149\x03\x02\x02" + + "\x02\u0498\u0499\t\x1D\x02\x02\u0499\u014B\x03\x02\x02\x02\u049A\u049B" + + "\t\x1E\x02\x02\u049B\u014D\x03\x02\x02\x02\u049C\u049D\t\x1F\x02\x02\u049D" + + "\u014F\x03\x02\x02\x02\u049E\u049F\t \x02\x02\u049F\u0151\x03\x02\x02" + + "\x02\u04A0\u04A1\t!\x02\x02\u04A1\u0153\x03\x02\x02\x02\u04A2\u04A3\t" + + "\"\x02\x02\u04A3\u0155\x03\x02\x02\x02\u04A4\u04A5\t#\x02\x02\u04A5\u0157" + + "\x03\x02\x02\x02\u04A6\u04A7\t$\x02\x02\u04A7\u0159\x03\x02\x02\x02\u04A8" + + "\u04A9\t%\x02\x02\u04A9\u015B\x03\x02\x02\x02\u04AA\u04AB\t&\x02\x02\u04AB" + + "\u015D\x03\x02\x02\x023\x02\x03\x04\x05\x06\x07\b\t\n\v\u01FA\u0204\u0208" + + "\u020B\u0214\u0216\u0221\u024A\u024F\u0258\u025F\u0264\u0266\u0271\u0279" + + "\u027C\u027E\u0283\u0288\u028E\u0295\u029A\u02A0\u02A3\u02AB\u02AF\u032E" + + "\u0333\u0338\u033A\u0340\u0375\u037A\u039D\u03A1\u03A6\u03AB\u03B0\u03B2" + + "\x19\x07\x04\x02\x07\x06\x02\x07\b\x02\x07\x03\x02\x07\x05\x02\x07\n\x02" + + "\x07\x07\x02\x07\v\x02\x02\x03\x02\tA\x02\x07\x02\x02\t\x1C\x02\x06\x02" + + "\x02\tB\x02\t$\x02\t#\x02\tD\x02\t&\x02\tM\x02\x07\t\x02\tI\x02\tV\x02" + + "\tC\x02"; public static readonly _serializedATN: string = Utils.join( [ esql_lexer._serializedATNSegment0, esql_lexer._serializedATNSegment1, + esql_lexer._serializedATNSegment2, ], "", ); diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 b/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 index aa2e86b6979e1..9577d28e90254 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 @@ -20,13 +20,15 @@ query ; sourceCommand - : fromCommand + : explainCommand + | fromCommand | rowCommand | showCommand ; processingCommand : evalCommand + | inlinestatsCommand | limitCommand | keepCommand | sortCommand @@ -96,13 +98,14 @@ field ; fromCommand - : FROM sourceIdentifier (COMMA sourceIdentifier)* metadata? + : FROM fromIdentifier (COMMA fromIdentifier)* metadata? ; metadata - : OPENING_BRACKET METADATA sourceIdentifier (COMMA sourceIdentifier)* CLOSING_BRACKET + : OPENING_BRACKET METADATA fromIdentifier (COMMA fromIdentifier)* CLOSING_BRACKET ; + evalCommand : EVAL fields ; @@ -111,24 +114,37 @@ statsCommand : STATS fields? (BY grouping)? ; +inlinestatsCommand + : INLINESTATS fields (BY grouping)? + ; + grouping : qualifiedName (COMMA qualifiedName)* ; -sourceIdentifier - : SRC_UNQUOTED_IDENTIFIER - | SRC_QUOTED_IDENTIFIER +fromIdentifier + : FROM_UNQUOTED_IDENTIFIER + | QUOTED_IDENTIFIER ; qualifiedName : identifier (DOT identifier)* ; +qualifiedNamePattern + : identifierPattern (DOT identifierPattern)* + ; + identifier : UNQUOTED_IDENTIFIER | QUOTED_IDENTIFIER ; +identifierPattern + : PROJECT_UNQUOTED_IDENTIFIER + | QUOTED_IDENTIFIER + ; + constant : NULL #nullLiteral | integerValue UNQUOTED_IDENTIFIER #qualifiedIntegerLiteral @@ -155,12 +171,12 @@ orderExpression ; keepCommand - : KEEP sourceIdentifier (COMMA sourceIdentifier)* - | PROJECT sourceIdentifier (COMMA sourceIdentifier)* + : KEEP qualifiedNamePattern (COMMA qualifiedNamePattern)* + | PROJECT qualifiedNamePattern (COMMA qualifiedNamePattern)* ; dropCommand - : DROP sourceIdentifier (COMMA sourceIdentifier)* + : DROP qualifiedNamePattern (COMMA qualifiedNamePattern)* ; renameCommand @@ -168,7 +184,7 @@ renameCommand ; renameClause: - oldName=sourceIdentifier AS newName=sourceIdentifier + oldName=qualifiedNamePattern AS newName=qualifiedNamePattern ; dissectCommand @@ -180,7 +196,7 @@ grokCommand ; mvExpandCommand - : MV_EXPAND sourceIdentifier + : MV_EXPAND qualifiedName ; commandOptions @@ -216,15 +232,23 @@ comparisonOperator : EQ | NEQ | LT | LTE | GT | GTE ; +explainCommand + : EXPLAIN subqueryExpression + ; + +subqueryExpression + : OPENING_BRACKET query CLOSING_BRACKET + ; + showCommand : SHOW INFO #showInfo | SHOW FUNCTIONS #showFunctions ; enrichCommand - : ENRICH policyName=sourceIdentifier (ON matchField=sourceIdentifier)? (WITH enrichWithClause (COMMA enrichWithClause)*)? + : ENRICH policyName=fromIdentifier (ON matchField=qualifiedNamePattern)? (WITH enrichWithClause (COMMA enrichWithClause)*)? ; enrichWithClause - : (newName=sourceIdentifier ASSIGN)? enrichField=sourceIdentifier + : (newName=qualifiedNamePattern ASSIGN)? enrichField=qualifiedNamePattern ; \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp b/packages/kbn-monaco/src/esql/antlr/esql_parser.interp index 649902a25536b..6c8870cecd9cd 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.interp @@ -25,11 +25,16 @@ null null null null +'|' null null null null null +null +'=' +',' +null '.' null null @@ -46,9 +51,6 @@ null null ')' null -null -null -'_' '==' '!=' '<' @@ -76,6 +78,26 @@ null null null null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null token symbolic names: null @@ -83,8 +105,10 @@ DISSECT DROP ENRICH EVAL +EXPLAIN FROM GROK +INLINESTATS KEEP LIMIT MV_EXPAND @@ -99,6 +123,9 @@ UNKNOWN_CMD LINE_COMMENT MULTILINE_COMMENT WS +EXPLAIN_WS +EXPLAIN_LINE_COMMENT +EXPLAIN_MULTILINE_COMMENT PIPE STRING INTEGER_LITERAL @@ -125,9 +152,6 @@ PARAM RLIKE RP TRUE -INFO -FUNCTIONS -UNDERSCORE EQ NEQ LT @@ -146,15 +170,35 @@ QUOTED_IDENTIFIER EXPR_LINE_COMMENT EXPR_MULTILINE_COMMENT EXPR_WS -AS METADATA +FROM_UNQUOTED_IDENTIFIER +FROM_LINE_COMMENT +FROM_MULTILINE_COMMENT +FROM_WS +PROJECT_UNQUOTED_IDENTIFIER +PROJECT_LINE_COMMENT +PROJECT_MULTILINE_COMMENT +PROJECT_WS +AS +RENAME_LINE_COMMENT +RENAME_MULTILINE_COMMENT +RENAME_WS ON WITH -SRC_UNQUOTED_IDENTIFIER -SRC_QUOTED_IDENTIFIER -SRC_LINE_COMMENT -SRC_MULTILINE_COMMENT -SRC_WS +ENRICH_LINE_COMMENT +ENRICH_MULTILINE_COMMENT +ENRICH_WS +ENRICH_FIELD_LINE_COMMENT +ENRICH_FIELD_MULTILINE_COMMENT +ENRICH_FIELD_WS +MVEXPAND_LINE_COMMENT +MVEXPAND_MULTILINE_COMMENT +MVEXPAND_WS +INFO +FUNCTIONS +SHOW_LINE_COMMENT +SHOW_MULTILINE_COMMENT +SHOW_WS rule names: singleStatement @@ -175,10 +219,13 @@ fromCommand metadata evalCommand statsCommand +inlinestatsCommand grouping -sourceIdentifier +fromIdentifier qualifiedName +qualifiedNamePattern identifier +identifierPattern constant limitCommand sortCommand @@ -198,10 +245,12 @@ decimalValue integerValue string comparisonOperator +explainCommand +subqueryExpression showCommand enrichCommand enrichWithClause atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 78, 486, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 100, 10, 3, 12, 3, 14, 3, 103, 11, 3, 3, 4, 3, 4, 3, 4, 5, 4, 108, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 122, 10, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 134, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 141, 10, 7, 12, 7, 14, 7, 144, 11, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 151, 10, 7, 3, 7, 3, 7, 5, 7, 155, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 163, 10, 7, 12, 7, 14, 7, 166, 11, 7, 3, 8, 3, 8, 5, 8, 170, 10, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 177, 10, 8, 3, 8, 3, 8, 3, 8, 5, 8, 182, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 189, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 195, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 203, 10, 10, 12, 10, 14, 10, 206, 11, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 215, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 223, 10, 12, 12, 12, 14, 12, 226, 11, 12, 5, 12, 228, 10, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 7, 14, 238, 10, 14, 12, 14, 14, 14, 241, 11, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 248, 10, 15, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 254, 10, 16, 12, 16, 14, 16, 257, 11, 16, 3, 16, 5, 16, 260, 10, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 267, 10, 17, 12, 17, 14, 17, 270, 11, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 5, 19, 279, 10, 19, 3, 19, 3, 19, 5, 19, 283, 10, 19, 3, 20, 3, 20, 3, 20, 7, 20, 288, 10, 20, 12, 20, 14, 20, 291, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 298, 10, 22, 12, 22, 14, 22, 301, 11, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 318, 10, 24, 12, 24, 14, 24, 321, 11, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 329, 10, 24, 12, 24, 14, 24, 332, 11, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 340, 10, 24, 12, 24, 14, 24, 343, 11, 24, 3, 24, 3, 24, 5, 24, 347, 10, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 356, 10, 26, 12, 26, 14, 26, 359, 11, 26, 3, 27, 3, 27, 5, 27, 363, 10, 27, 3, 27, 3, 27, 5, 27, 367, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 373, 10, 28, 12, 28, 14, 28, 376, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 382, 10, 28, 12, 28, 14, 28, 385, 11, 28, 5, 28, 387, 10, 28, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 393, 10, 29, 12, 29, 14, 29, 396, 11, 29, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 402, 10, 30, 12, 30, 14, 30, 405, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 415, 10, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 7, 35, 427, 10, 35, 12, 35, 14, 35, 430, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 5, 38, 440, 10, 38, 3, 39, 5, 39, 443, 10, 39, 3, 39, 3, 39, 3, 40, 5, 40, 448, 10, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 460, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 466, 10, 44, 3, 44, 3, 44, 3, 44, 3, 44, 7, 44, 472, 10, 44, 12, 44, 14, 44, 475, 11, 44, 5, 44, 477, 10, 44, 3, 45, 3, 45, 3, 45, 5, 45, 482, 10, 45, 3, 45, 3, 45, 3, 45, 2, 2, 5, 4, 12, 18, 46, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 88, 2, 2, 10, 3, 2, 58, 59, 3, 2, 60, 62, 3, 2, 74, 75, 3, 2, 65, 66, 4, 2, 29, 29, 32, 32, 3, 2, 35, 36, 4, 2, 34, 34, 48, 48, 3, 2, 52, 57, 2, 516, 2, 90, 3, 2, 2, 2, 4, 93, 3, 2, 2, 2, 6, 107, 3, 2, 2, 2, 8, 121, 3, 2, 2, 2, 10, 123, 3, 2, 2, 2, 12, 154, 3, 2, 2, 2, 14, 181, 3, 2, 2, 2, 16, 188, 3, 2, 2, 2, 18, 194, 3, 2, 2, 2, 20, 214, 3, 2, 2, 2, 22, 216, 3, 2, 2, 2, 24, 231, 3, 2, 2, 2, 26, 234, 3, 2, 2, 2, 28, 247, 3, 2, 2, 2, 30, 249, 3, 2, 2, 2, 32, 261, 3, 2, 2, 2, 34, 273, 3, 2, 2, 2, 36, 276, 3, 2, 2, 2, 38, 284, 3, 2, 2, 2, 40, 292, 3, 2, 2, 2, 42, 294, 3, 2, 2, 2, 44, 302, 3, 2, 2, 2, 46, 346, 3, 2, 2, 2, 48, 348, 3, 2, 2, 2, 50, 351, 3, 2, 2, 2, 52, 360, 3, 2, 2, 2, 54, 386, 3, 2, 2, 2, 56, 388, 3, 2, 2, 2, 58, 397, 3, 2, 2, 2, 60, 406, 3, 2, 2, 2, 62, 410, 3, 2, 2, 2, 64, 416, 3, 2, 2, 2, 66, 420, 3, 2, 2, 2, 68, 423, 3, 2, 2, 2, 70, 431, 3, 2, 2, 2, 72, 435, 3, 2, 2, 2, 74, 439, 3, 2, 2, 2, 76, 442, 3, 2, 2, 2, 78, 447, 3, 2, 2, 2, 80, 451, 3, 2, 2, 2, 82, 453, 3, 2, 2, 2, 84, 459, 3, 2, 2, 2, 86, 461, 3, 2, 2, 2, 88, 481, 3, 2, 2, 2, 90, 91, 5, 4, 3, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 94, 8, 3, 1, 2, 94, 95, 5, 6, 4, 2, 95, 101, 3, 2, 2, 2, 96, 97, 12, 3, 2, 2, 97, 98, 7, 23, 2, 2, 98, 100, 5, 8, 5, 2, 99, 96, 3, 2, 2, 2, 100, 103, 3, 2, 2, 2, 101, 99, 3, 2, 2, 2, 101, 102, 3, 2, 2, 2, 102, 5, 3, 2, 2, 2, 103, 101, 3, 2, 2, 2, 104, 108, 5, 30, 16, 2, 105, 108, 5, 24, 13, 2, 106, 108, 5, 84, 43, 2, 107, 104, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 106, 3, 2, 2, 2, 108, 7, 3, 2, 2, 2, 109, 122, 5, 34, 18, 2, 110, 122, 5, 48, 25, 2, 111, 122, 5, 54, 28, 2, 112, 122, 5, 50, 26, 2, 113, 122, 5, 36, 19, 2, 114, 122, 5, 10, 6, 2, 115, 122, 5, 56, 29, 2, 116, 122, 5, 58, 30, 2, 117, 122, 5, 62, 32, 2, 118, 122, 5, 64, 33, 2, 119, 122, 5, 86, 44, 2, 120, 122, 5, 66, 34, 2, 121, 109, 3, 2, 2, 2, 121, 110, 3, 2, 2, 2, 121, 111, 3, 2, 2, 2, 121, 112, 3, 2, 2, 2, 121, 113, 3, 2, 2, 2, 121, 114, 3, 2, 2, 2, 121, 115, 3, 2, 2, 2, 121, 116, 3, 2, 2, 2, 121, 117, 3, 2, 2, 2, 121, 118, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 121, 120, 3, 2, 2, 2, 122, 9, 3, 2, 2, 2, 123, 124, 7, 18, 2, 2, 124, 125, 5, 12, 7, 2, 125, 11, 3, 2, 2, 2, 126, 127, 8, 7, 1, 2, 127, 128, 7, 41, 2, 2, 128, 155, 5, 12, 7, 9, 129, 155, 5, 16, 9, 2, 130, 155, 5, 14, 8, 2, 131, 133, 5, 16, 9, 2, 132, 134, 7, 41, 2, 2, 133, 132, 3, 2, 2, 2, 133, 134, 3, 2, 2, 2, 134, 135, 3, 2, 2, 2, 135, 136, 7, 38, 2, 2, 136, 137, 7, 37, 2, 2, 137, 142, 5, 16, 9, 2, 138, 139, 7, 31, 2, 2, 139, 141, 5, 16, 9, 2, 140, 138, 3, 2, 2, 2, 141, 144, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 145, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 145, 146, 7, 47, 2, 2, 146, 155, 3, 2, 2, 2, 147, 148, 5, 16, 9, 2, 148, 150, 7, 39, 2, 2, 149, 151, 7, 41, 2, 2, 150, 149, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 152, 3, 2, 2, 2, 152, 153, 7, 42, 2, 2, 153, 155, 3, 2, 2, 2, 154, 126, 3, 2, 2, 2, 154, 129, 3, 2, 2, 2, 154, 130, 3, 2, 2, 2, 154, 131, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 155, 164, 3, 2, 2, 2, 156, 157, 12, 6, 2, 2, 157, 158, 7, 28, 2, 2, 158, 163, 5, 12, 7, 7, 159, 160, 12, 5, 2, 2, 160, 161, 7, 44, 2, 2, 161, 163, 5, 12, 7, 6, 162, 156, 3, 2, 2, 2, 162, 159, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 13, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 169, 5, 16, 9, 2, 168, 170, 7, 41, 2, 2, 169, 168, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 171, 3, 2, 2, 2, 171, 172, 7, 40, 2, 2, 172, 173, 5, 80, 41, 2, 173, 182, 3, 2, 2, 2, 174, 176, 5, 16, 9, 2, 175, 177, 7, 41, 2, 2, 176, 175, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 179, 7, 46, 2, 2, 179, 180, 5, 80, 41, 2, 180, 182, 3, 2, 2, 2, 181, 167, 3, 2, 2, 2, 181, 174, 3, 2, 2, 2, 182, 15, 3, 2, 2, 2, 183, 189, 5, 18, 10, 2, 184, 185, 5, 18, 10, 2, 185, 186, 5, 82, 42, 2, 186, 187, 5, 18, 10, 2, 187, 189, 3, 2, 2, 2, 188, 183, 3, 2, 2, 2, 188, 184, 3, 2, 2, 2, 189, 17, 3, 2, 2, 2, 190, 191, 8, 10, 1, 2, 191, 195, 5, 20, 11, 2, 192, 193, 9, 2, 2, 2, 193, 195, 5, 18, 10, 5, 194, 190, 3, 2, 2, 2, 194, 192, 3, 2, 2, 2, 195, 204, 3, 2, 2, 2, 196, 197, 12, 4, 2, 2, 197, 198, 9, 3, 2, 2, 198, 203, 5, 18, 10, 5, 199, 200, 12, 3, 2, 2, 200, 201, 9, 2, 2, 2, 201, 203, 5, 18, 10, 4, 202, 196, 3, 2, 2, 2, 202, 199, 3, 2, 2, 2, 203, 206, 3, 2, 2, 2, 204, 202, 3, 2, 2, 2, 204, 205, 3, 2, 2, 2, 205, 19, 3, 2, 2, 2, 206, 204, 3, 2, 2, 2, 207, 215, 5, 46, 24, 2, 208, 215, 5, 42, 22, 2, 209, 215, 5, 22, 12, 2, 210, 211, 7, 37, 2, 2, 211, 212, 5, 12, 7, 2, 212, 213, 7, 47, 2, 2, 213, 215, 3, 2, 2, 2, 214, 207, 3, 2, 2, 2, 214, 208, 3, 2, 2, 2, 214, 209, 3, 2, 2, 2, 214, 210, 3, 2, 2, 2, 215, 21, 3, 2, 2, 2, 216, 217, 5, 44, 23, 2, 217, 227, 7, 37, 2, 2, 218, 228, 7, 60, 2, 2, 219, 224, 5, 12, 7, 2, 220, 221, 7, 31, 2, 2, 221, 223, 5, 12, 7, 2, 222, 220, 3, 2, 2, 2, 223, 226, 3, 2, 2, 2, 224, 222, 3, 2, 2, 2, 224, 225, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 227, 218, 3, 2, 2, 2, 227, 219, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 230, 7, 47, 2, 2, 230, 23, 3, 2, 2, 2, 231, 232, 7, 14, 2, 2, 232, 233, 5, 26, 14, 2, 233, 25, 3, 2, 2, 2, 234, 239, 5, 28, 15, 2, 235, 236, 7, 31, 2, 2, 236, 238, 5, 28, 15, 2, 237, 235, 3, 2, 2, 2, 238, 241, 3, 2, 2, 2, 239, 237, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 27, 3, 2, 2, 2, 241, 239, 3, 2, 2, 2, 242, 248, 5, 12, 7, 2, 243, 244, 5, 42, 22, 2, 244, 245, 7, 30, 2, 2, 245, 246, 5, 12, 7, 2, 246, 248, 3, 2, 2, 2, 247, 242, 3, 2, 2, 2, 247, 243, 3, 2, 2, 2, 248, 29, 3, 2, 2, 2, 249, 250, 7, 7, 2, 2, 250, 255, 5, 40, 21, 2, 251, 252, 7, 31, 2, 2, 252, 254, 5, 40, 21, 2, 253, 251, 3, 2, 2, 2, 254, 257, 3, 2, 2, 2, 255, 253, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 259, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 258, 260, 5, 32, 17, 2, 259, 258, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 31, 3, 2, 2, 2, 261, 262, 7, 63, 2, 2, 262, 263, 7, 71, 2, 2, 263, 268, 5, 40, 21, 2, 264, 265, 7, 31, 2, 2, 265, 267, 5, 40, 21, 2, 266, 264, 3, 2, 2, 2, 267, 270, 3, 2, 2, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 268, 3, 2, 2, 2, 271, 272, 7, 64, 2, 2, 272, 33, 3, 2, 2, 2, 273, 274, 7, 6, 2, 2, 274, 275, 5, 26, 14, 2, 275, 35, 3, 2, 2, 2, 276, 278, 7, 17, 2, 2, 277, 279, 5, 26, 14, 2, 278, 277, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 283, 5, 38, 20, 2, 282, 280, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 37, 3, 2, 2, 2, 284, 289, 5, 42, 22, 2, 285, 286, 7, 31, 2, 2, 286, 288, 5, 42, 22, 2, 287, 285, 3, 2, 2, 2, 288, 291, 3, 2, 2, 2, 289, 287, 3, 2, 2, 2, 289, 290, 3, 2, 2, 2, 290, 39, 3, 2, 2, 2, 291, 289, 3, 2, 2, 2, 292, 293, 9, 4, 2, 2, 293, 41, 3, 2, 2, 2, 294, 299, 5, 44, 23, 2, 295, 296, 7, 33, 2, 2, 296, 298, 5, 44, 23, 2, 297, 295, 3, 2, 2, 2, 298, 301, 3, 2, 2, 2, 299, 297, 3, 2, 2, 2, 299, 300, 3, 2, 2, 2, 300, 43, 3, 2, 2, 2, 301, 299, 3, 2, 2, 2, 302, 303, 9, 5, 2, 2, 303, 45, 3, 2, 2, 2, 304, 347, 7, 42, 2, 2, 305, 306, 5, 78, 40, 2, 306, 307, 7, 65, 2, 2, 307, 347, 3, 2, 2, 2, 308, 347, 5, 76, 39, 2, 309, 347, 5, 78, 40, 2, 310, 347, 5, 72, 37, 2, 311, 347, 7, 45, 2, 2, 312, 347, 5, 80, 41, 2, 313, 314, 7, 63, 2, 2, 314, 319, 5, 74, 38, 2, 315, 316, 7, 31, 2, 2, 316, 318, 5, 74, 38, 2, 317, 315, 3, 2, 2, 2, 318, 321, 3, 2, 2, 2, 319, 317, 3, 2, 2, 2, 319, 320, 3, 2, 2, 2, 320, 322, 3, 2, 2, 2, 321, 319, 3, 2, 2, 2, 322, 323, 7, 64, 2, 2, 323, 347, 3, 2, 2, 2, 324, 325, 7, 63, 2, 2, 325, 330, 5, 72, 37, 2, 326, 327, 7, 31, 2, 2, 327, 329, 5, 72, 37, 2, 328, 326, 3, 2, 2, 2, 329, 332, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 330, 331, 3, 2, 2, 2, 331, 333, 3, 2, 2, 2, 332, 330, 3, 2, 2, 2, 333, 334, 7, 64, 2, 2, 334, 347, 3, 2, 2, 2, 335, 336, 7, 63, 2, 2, 336, 341, 5, 80, 41, 2, 337, 338, 7, 31, 2, 2, 338, 340, 5, 80, 41, 2, 339, 337, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 3, 2, 2, 2, 343, 341, 3, 2, 2, 2, 344, 345, 7, 64, 2, 2, 345, 347, 3, 2, 2, 2, 346, 304, 3, 2, 2, 2, 346, 305, 3, 2, 2, 2, 346, 308, 3, 2, 2, 2, 346, 309, 3, 2, 2, 2, 346, 310, 3, 2, 2, 2, 346, 311, 3, 2, 2, 2, 346, 312, 3, 2, 2, 2, 346, 313, 3, 2, 2, 2, 346, 324, 3, 2, 2, 2, 346, 335, 3, 2, 2, 2, 347, 47, 3, 2, 2, 2, 348, 349, 7, 10, 2, 2, 349, 350, 7, 25, 2, 2, 350, 49, 3, 2, 2, 2, 351, 352, 7, 16, 2, 2, 352, 357, 5, 52, 27, 2, 353, 354, 7, 31, 2, 2, 354, 356, 5, 52, 27, 2, 355, 353, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 51, 3, 2, 2, 2, 359, 357, 3, 2, 2, 2, 360, 362, 5, 12, 7, 2, 361, 363, 9, 6, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 366, 3, 2, 2, 2, 364, 365, 7, 43, 2, 2, 365, 367, 9, 7, 2, 2, 366, 364, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 53, 3, 2, 2, 2, 368, 369, 7, 9, 2, 2, 369, 374, 5, 40, 21, 2, 370, 371, 7, 31, 2, 2, 371, 373, 5, 40, 21, 2, 372, 370, 3, 2, 2, 2, 373, 376, 3, 2, 2, 2, 374, 372, 3, 2, 2, 2, 374, 375, 3, 2, 2, 2, 375, 387, 3, 2, 2, 2, 376, 374, 3, 2, 2, 2, 377, 378, 7, 12, 2, 2, 378, 383, 5, 40, 21, 2, 379, 380, 7, 31, 2, 2, 380, 382, 5, 40, 21, 2, 381, 379, 3, 2, 2, 2, 382, 385, 3, 2, 2, 2, 383, 381, 3, 2, 2, 2, 383, 384, 3, 2, 2, 2, 384, 387, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 386, 368, 3, 2, 2, 2, 386, 377, 3, 2, 2, 2, 387, 55, 3, 2, 2, 2, 388, 389, 7, 4, 2, 2, 389, 394, 5, 40, 21, 2, 390, 391, 7, 31, 2, 2, 391, 393, 5, 40, 21, 2, 392, 390, 3, 2, 2, 2, 393, 396, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 57, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 398, 7, 13, 2, 2, 398, 403, 5, 60, 31, 2, 399, 400, 7, 31, 2, 2, 400, 402, 5, 60, 31, 2, 401, 399, 3, 2, 2, 2, 402, 405, 3, 2, 2, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 59, 3, 2, 2, 2, 405, 403, 3, 2, 2, 2, 406, 407, 5, 40, 21, 2, 407, 408, 7, 70, 2, 2, 408, 409, 5, 40, 21, 2, 409, 61, 3, 2, 2, 2, 410, 411, 7, 3, 2, 2, 411, 412, 5, 20, 11, 2, 412, 414, 5, 80, 41, 2, 413, 415, 5, 68, 35, 2, 414, 413, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 63, 3, 2, 2, 2, 416, 417, 7, 8, 2, 2, 417, 418, 5, 20, 11, 2, 418, 419, 5, 80, 41, 2, 419, 65, 3, 2, 2, 2, 420, 421, 7, 11, 2, 2, 421, 422, 5, 40, 21, 2, 422, 67, 3, 2, 2, 2, 423, 428, 5, 70, 36, 2, 424, 425, 7, 31, 2, 2, 425, 427, 5, 70, 36, 2, 426, 424, 3, 2, 2, 2, 427, 430, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 69, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 431, 432, 5, 44, 23, 2, 432, 433, 7, 30, 2, 2, 433, 434, 5, 46, 24, 2, 434, 71, 3, 2, 2, 2, 435, 436, 9, 8, 2, 2, 436, 73, 3, 2, 2, 2, 437, 440, 5, 76, 39, 2, 438, 440, 5, 78, 40, 2, 439, 437, 3, 2, 2, 2, 439, 438, 3, 2, 2, 2, 440, 75, 3, 2, 2, 2, 441, 443, 9, 2, 2, 2, 442, 441, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 444, 3, 2, 2, 2, 444, 445, 7, 26, 2, 2, 445, 77, 3, 2, 2, 2, 446, 448, 9, 2, 2, 2, 447, 446, 3, 2, 2, 2, 447, 448, 3, 2, 2, 2, 448, 449, 3, 2, 2, 2, 449, 450, 7, 25, 2, 2, 450, 79, 3, 2, 2, 2, 451, 452, 7, 24, 2, 2, 452, 81, 3, 2, 2, 2, 453, 454, 9, 9, 2, 2, 454, 83, 3, 2, 2, 2, 455, 456, 7, 15, 2, 2, 456, 460, 7, 49, 2, 2, 457, 458, 7, 15, 2, 2, 458, 460, 7, 50, 2, 2, 459, 455, 3, 2, 2, 2, 459, 457, 3, 2, 2, 2, 460, 85, 3, 2, 2, 2, 461, 462, 7, 5, 2, 2, 462, 465, 5, 40, 21, 2, 463, 464, 7, 72, 2, 2, 464, 466, 5, 40, 21, 2, 465, 463, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 476, 3, 2, 2, 2, 467, 468, 7, 73, 2, 2, 468, 473, 5, 88, 45, 2, 469, 470, 7, 31, 2, 2, 470, 472, 5, 88, 45, 2, 471, 469, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 467, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 87, 3, 2, 2, 2, 478, 479, 5, 40, 21, 2, 479, 480, 7, 30, 2, 2, 480, 482, 3, 2, 2, 2, 481, 478, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 484, 5, 40, 21, 2, 484, 89, 3, 2, 2, 2, 52, 101, 107, 121, 133, 142, 150, 154, 162, 164, 169, 176, 181, 188, 194, 202, 204, 214, 224, 227, 239, 247, 255, 259, 268, 278, 282, 289, 299, 319, 330, 341, 346, 357, 362, 366, 374, 383, 386, 394, 403, 414, 428, 439, 442, 447, 459, 465, 473, 476, 481] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 100, 521, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 110, 10, 3, 12, 3, 14, 3, 113, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 119, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 134, 10, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 146, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 153, 10, 7, 12, 7, 14, 7, 156, 11, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 163, 10, 7, 3, 7, 3, 7, 5, 7, 167, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 175, 10, 7, 12, 7, 14, 7, 178, 11, 7, 3, 8, 3, 8, 5, 8, 182, 10, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 189, 10, 8, 3, 8, 3, 8, 3, 8, 5, 8, 194, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 201, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 207, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 215, 10, 10, 12, 10, 14, 10, 218, 11, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 227, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 235, 10, 12, 12, 12, 14, 12, 238, 11, 12, 5, 12, 240, 10, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 7, 14, 250, 10, 14, 12, 14, 14, 14, 253, 11, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 260, 10, 15, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 266, 10, 16, 12, 16, 14, 16, 269, 11, 16, 3, 16, 5, 16, 272, 10, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 279, 10, 17, 12, 17, 14, 17, 282, 11, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 5, 19, 291, 10, 19, 3, 19, 3, 19, 5, 19, 295, 10, 19, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 21, 3, 21, 3, 21, 7, 21, 306, 10, 21, 12, 21, 14, 21, 309, 11, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 7, 23, 316, 10, 23, 12, 23, 14, 23, 319, 11, 23, 3, 24, 3, 24, 3, 24, 7, 24, 324, 10, 24, 12, 24, 14, 24, 327, 11, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 346, 10, 27, 12, 27, 14, 27, 349, 11, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 357, 10, 27, 12, 27, 14, 27, 360, 11, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 368, 10, 27, 12, 27, 14, 27, 371, 11, 27, 3, 27, 3, 27, 5, 27, 375, 10, 27, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 384, 10, 29, 12, 29, 14, 29, 387, 11, 29, 3, 30, 3, 30, 5, 30, 391, 10, 30, 3, 30, 3, 30, 5, 30, 395, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 401, 10, 31, 12, 31, 14, 31, 404, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 410, 10, 31, 12, 31, 14, 31, 413, 11, 31, 5, 31, 415, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 421, 10, 32, 12, 32, 14, 32, 424, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 430, 10, 33, 12, 33, 14, 33, 433, 11, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 443, 10, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 7, 38, 455, 10, 38, 12, 38, 14, 38, 458, 11, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 5, 41, 468, 10, 41, 3, 42, 5, 42, 471, 10, 42, 3, 42, 3, 42, 3, 43, 5, 43, 476, 10, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 495, 10, 48, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 501, 10, 49, 3, 49, 3, 49, 3, 49, 3, 49, 7, 49, 507, 10, 49, 12, 49, 14, 49, 510, 11, 49, 5, 49, 512, 10, 49, 3, 50, 3, 50, 3, 50, 5, 50, 517, 10, 50, 3, 50, 3, 50, 3, 50, 2, 2, 5, 4, 12, 18, 51, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 88, 2, 90, 2, 92, 2, 94, 2, 96, 2, 98, 2, 2, 11, 3, 2, 60, 61, 3, 2, 62, 64, 4, 2, 68, 68, 73, 73, 3, 2, 67, 68, 4, 2, 68, 68, 77, 77, 4, 2, 34, 34, 37, 37, 3, 2, 40, 41, 4, 2, 39, 39, 53, 53, 3, 2, 54, 59, 2, 550, 2, 100, 3, 2, 2, 2, 4, 103, 3, 2, 2, 2, 6, 118, 3, 2, 2, 2, 8, 133, 3, 2, 2, 2, 10, 135, 3, 2, 2, 2, 12, 166, 3, 2, 2, 2, 14, 193, 3, 2, 2, 2, 16, 200, 3, 2, 2, 2, 18, 206, 3, 2, 2, 2, 20, 226, 3, 2, 2, 2, 22, 228, 3, 2, 2, 2, 24, 243, 3, 2, 2, 2, 26, 246, 3, 2, 2, 2, 28, 259, 3, 2, 2, 2, 30, 261, 3, 2, 2, 2, 32, 273, 3, 2, 2, 2, 34, 285, 3, 2, 2, 2, 36, 288, 3, 2, 2, 2, 38, 296, 3, 2, 2, 2, 40, 302, 3, 2, 2, 2, 42, 310, 3, 2, 2, 2, 44, 312, 3, 2, 2, 2, 46, 320, 3, 2, 2, 2, 48, 328, 3, 2, 2, 2, 50, 330, 3, 2, 2, 2, 52, 374, 3, 2, 2, 2, 54, 376, 3, 2, 2, 2, 56, 379, 3, 2, 2, 2, 58, 388, 3, 2, 2, 2, 60, 414, 3, 2, 2, 2, 62, 416, 3, 2, 2, 2, 64, 425, 3, 2, 2, 2, 66, 434, 3, 2, 2, 2, 68, 438, 3, 2, 2, 2, 70, 444, 3, 2, 2, 2, 72, 448, 3, 2, 2, 2, 74, 451, 3, 2, 2, 2, 76, 459, 3, 2, 2, 2, 78, 463, 3, 2, 2, 2, 80, 467, 3, 2, 2, 2, 82, 470, 3, 2, 2, 2, 84, 475, 3, 2, 2, 2, 86, 479, 3, 2, 2, 2, 88, 481, 3, 2, 2, 2, 90, 483, 3, 2, 2, 2, 92, 486, 3, 2, 2, 2, 94, 494, 3, 2, 2, 2, 96, 496, 3, 2, 2, 2, 98, 516, 3, 2, 2, 2, 100, 101, 5, 4, 3, 2, 101, 102, 7, 2, 2, 3, 102, 3, 3, 2, 2, 2, 103, 104, 8, 3, 1, 2, 104, 105, 5, 6, 4, 2, 105, 111, 3, 2, 2, 2, 106, 107, 12, 3, 2, 2, 107, 108, 7, 28, 2, 2, 108, 110, 5, 8, 5, 2, 109, 106, 3, 2, 2, 2, 110, 113, 3, 2, 2, 2, 111, 109, 3, 2, 2, 2, 111, 112, 3, 2, 2, 2, 112, 5, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 114, 119, 5, 90, 46, 2, 115, 119, 5, 30, 16, 2, 116, 119, 5, 24, 13, 2, 117, 119, 5, 94, 48, 2, 118, 114, 3, 2, 2, 2, 118, 115, 3, 2, 2, 2, 118, 116, 3, 2, 2, 2, 118, 117, 3, 2, 2, 2, 119, 7, 3, 2, 2, 2, 120, 134, 5, 34, 18, 2, 121, 134, 5, 38, 20, 2, 122, 134, 5, 54, 28, 2, 123, 134, 5, 60, 31, 2, 124, 134, 5, 56, 29, 2, 125, 134, 5, 36, 19, 2, 126, 134, 5, 10, 6, 2, 127, 134, 5, 62, 32, 2, 128, 134, 5, 64, 33, 2, 129, 134, 5, 68, 35, 2, 130, 134, 5, 70, 36, 2, 131, 134, 5, 96, 49, 2, 132, 134, 5, 72, 37, 2, 133, 120, 3, 2, 2, 2, 133, 121, 3, 2, 2, 2, 133, 122, 3, 2, 2, 2, 133, 123, 3, 2, 2, 2, 133, 124, 3, 2, 2, 2, 133, 125, 3, 2, 2, 2, 133, 126, 3, 2, 2, 2, 133, 127, 3, 2, 2, 2, 133, 128, 3, 2, 2, 2, 133, 129, 3, 2, 2, 2, 133, 130, 3, 2, 2, 2, 133, 131, 3, 2, 2, 2, 133, 132, 3, 2, 2, 2, 134, 9, 3, 2, 2, 2, 135, 136, 7, 20, 2, 2, 136, 137, 5, 12, 7, 2, 137, 11, 3, 2, 2, 2, 138, 139, 8, 7, 1, 2, 139, 140, 7, 46, 2, 2, 140, 167, 5, 12, 7, 9, 141, 167, 5, 16, 9, 2, 142, 167, 5, 14, 8, 2, 143, 145, 5, 16, 9, 2, 144, 146, 7, 46, 2, 2, 145, 144, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 148, 7, 43, 2, 2, 148, 149, 7, 42, 2, 2, 149, 154, 5, 16, 9, 2, 150, 151, 7, 36, 2, 2, 151, 153, 5, 16, 9, 2, 152, 150, 3, 2, 2, 2, 153, 156, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 155, 3, 2, 2, 2, 155, 157, 3, 2, 2, 2, 156, 154, 3, 2, 2, 2, 157, 158, 7, 52, 2, 2, 158, 167, 3, 2, 2, 2, 159, 160, 5, 16, 9, 2, 160, 162, 7, 44, 2, 2, 161, 163, 7, 46, 2, 2, 162, 161, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 165, 7, 47, 2, 2, 165, 167, 3, 2, 2, 2, 166, 138, 3, 2, 2, 2, 166, 141, 3, 2, 2, 2, 166, 142, 3, 2, 2, 2, 166, 143, 3, 2, 2, 2, 166, 159, 3, 2, 2, 2, 167, 176, 3, 2, 2, 2, 168, 169, 12, 6, 2, 2, 169, 170, 7, 33, 2, 2, 170, 175, 5, 12, 7, 7, 171, 172, 12, 5, 2, 2, 172, 173, 7, 49, 2, 2, 173, 175, 5, 12, 7, 6, 174, 168, 3, 2, 2, 2, 174, 171, 3, 2, 2, 2, 175, 178, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 13, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 179, 181, 5, 16, 9, 2, 180, 182, 7, 46, 2, 2, 181, 180, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 184, 7, 45, 2, 2, 184, 185, 5, 86, 44, 2, 185, 194, 3, 2, 2, 2, 186, 188, 5, 16, 9, 2, 187, 189, 7, 46, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 191, 7, 51, 2, 2, 191, 192, 5, 86, 44, 2, 192, 194, 3, 2, 2, 2, 193, 179, 3, 2, 2, 2, 193, 186, 3, 2, 2, 2, 194, 15, 3, 2, 2, 2, 195, 201, 5, 18, 10, 2, 196, 197, 5, 18, 10, 2, 197, 198, 5, 88, 45, 2, 198, 199, 5, 18, 10, 2, 199, 201, 3, 2, 2, 2, 200, 195, 3, 2, 2, 2, 200, 196, 3, 2, 2, 2, 201, 17, 3, 2, 2, 2, 202, 203, 8, 10, 1, 2, 203, 207, 5, 20, 11, 2, 204, 205, 9, 2, 2, 2, 205, 207, 5, 18, 10, 5, 206, 202, 3, 2, 2, 2, 206, 204, 3, 2, 2, 2, 207, 216, 3, 2, 2, 2, 208, 209, 12, 4, 2, 2, 209, 210, 9, 3, 2, 2, 210, 215, 5, 18, 10, 5, 211, 212, 12, 3, 2, 2, 212, 213, 9, 2, 2, 2, 213, 215, 5, 18, 10, 4, 214, 208, 3, 2, 2, 2, 214, 211, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 19, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 227, 5, 52, 27, 2, 220, 227, 5, 44, 23, 2, 221, 227, 5, 22, 12, 2, 222, 223, 7, 42, 2, 2, 223, 224, 5, 12, 7, 2, 224, 225, 7, 52, 2, 2, 225, 227, 3, 2, 2, 2, 226, 219, 3, 2, 2, 2, 226, 220, 3, 2, 2, 2, 226, 221, 3, 2, 2, 2, 226, 222, 3, 2, 2, 2, 227, 21, 3, 2, 2, 2, 228, 229, 5, 48, 25, 2, 229, 239, 7, 42, 2, 2, 230, 240, 7, 62, 2, 2, 231, 236, 5, 12, 7, 2, 232, 233, 7, 36, 2, 2, 233, 235, 5, 12, 7, 2, 234, 232, 3, 2, 2, 2, 235, 238, 3, 2, 2, 2, 236, 234, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 240, 3, 2, 2, 2, 238, 236, 3, 2, 2, 2, 239, 230, 3, 2, 2, 2, 239, 231, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 242, 7, 52, 2, 2, 242, 23, 3, 2, 2, 2, 243, 244, 7, 16, 2, 2, 244, 245, 5, 26, 14, 2, 245, 25, 3, 2, 2, 2, 246, 251, 5, 28, 15, 2, 247, 248, 7, 36, 2, 2, 248, 250, 5, 28, 15, 2, 249, 247, 3, 2, 2, 2, 250, 253, 3, 2, 2, 2, 251, 249, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 27, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 254, 260, 5, 12, 7, 2, 255, 256, 5, 44, 23, 2, 256, 257, 7, 35, 2, 2, 257, 258, 5, 12, 7, 2, 258, 260, 3, 2, 2, 2, 259, 254, 3, 2, 2, 2, 259, 255, 3, 2, 2, 2, 260, 29, 3, 2, 2, 2, 261, 262, 7, 8, 2, 2, 262, 267, 5, 42, 22, 2, 263, 264, 7, 36, 2, 2, 264, 266, 5, 42, 22, 2, 265, 263, 3, 2, 2, 2, 266, 269, 3, 2, 2, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 270, 272, 5, 32, 17, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 31, 3, 2, 2, 2, 273, 274, 7, 65, 2, 2, 274, 275, 7, 72, 2, 2, 275, 280, 5, 42, 22, 2, 276, 277, 7, 36, 2, 2, 277, 279, 5, 42, 22, 2, 278, 276, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 283, 3, 2, 2, 2, 282, 280, 3, 2, 2, 2, 283, 284, 7, 66, 2, 2, 284, 33, 3, 2, 2, 2, 285, 286, 7, 6, 2, 2, 286, 287, 5, 26, 14, 2, 287, 35, 3, 2, 2, 2, 288, 290, 7, 19, 2, 2, 289, 291, 5, 26, 14, 2, 290, 289, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, 293, 7, 32, 2, 2, 293, 295, 5, 40, 21, 2, 294, 292, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 37, 3, 2, 2, 2, 296, 297, 7, 10, 2, 2, 297, 300, 5, 26, 14, 2, 298, 299, 7, 32, 2, 2, 299, 301, 5, 40, 21, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 39, 3, 2, 2, 2, 302, 307, 5, 44, 23, 2, 303, 304, 7, 36, 2, 2, 304, 306, 5, 44, 23, 2, 305, 303, 3, 2, 2, 2, 306, 309, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 41, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 310, 311, 9, 4, 2, 2, 311, 43, 3, 2, 2, 2, 312, 317, 5, 48, 25, 2, 313, 314, 7, 38, 2, 2, 314, 316, 5, 48, 25, 2, 315, 313, 3, 2, 2, 2, 316, 319, 3, 2, 2, 2, 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 45, 3, 2, 2, 2, 319, 317, 3, 2, 2, 2, 320, 325, 5, 50, 26, 2, 321, 322, 7, 38, 2, 2, 322, 324, 5, 50, 26, 2, 323, 321, 3, 2, 2, 2, 324, 327, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 47, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 328, 329, 9, 5, 2, 2, 329, 49, 3, 2, 2, 2, 330, 331, 9, 6, 2, 2, 331, 51, 3, 2, 2, 2, 332, 375, 7, 47, 2, 2, 333, 334, 5, 84, 43, 2, 334, 335, 7, 67, 2, 2, 335, 375, 3, 2, 2, 2, 336, 375, 5, 82, 42, 2, 337, 375, 5, 84, 43, 2, 338, 375, 5, 78, 40, 2, 339, 375, 7, 50, 2, 2, 340, 375, 5, 86, 44, 2, 341, 342, 7, 65, 2, 2, 342, 347, 5, 80, 41, 2, 343, 344, 7, 36, 2, 2, 344, 346, 5, 80, 41, 2, 345, 343, 3, 2, 2, 2, 346, 349, 3, 2, 2, 2, 347, 345, 3, 2, 2, 2, 347, 348, 3, 2, 2, 2, 348, 350, 3, 2, 2, 2, 349, 347, 3, 2, 2, 2, 350, 351, 7, 66, 2, 2, 351, 375, 3, 2, 2, 2, 352, 353, 7, 65, 2, 2, 353, 358, 5, 78, 40, 2, 354, 355, 7, 36, 2, 2, 355, 357, 5, 78, 40, 2, 356, 354, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 358, 3, 2, 2, 2, 361, 362, 7, 66, 2, 2, 362, 375, 3, 2, 2, 2, 363, 364, 7, 65, 2, 2, 364, 369, 5, 86, 44, 2, 365, 366, 7, 36, 2, 2, 366, 368, 5, 86, 44, 2, 367, 365, 3, 2, 2, 2, 368, 371, 3, 2, 2, 2, 369, 367, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 372, 3, 2, 2, 2, 371, 369, 3, 2, 2, 2, 372, 373, 7, 66, 2, 2, 373, 375, 3, 2, 2, 2, 374, 332, 3, 2, 2, 2, 374, 333, 3, 2, 2, 2, 374, 336, 3, 2, 2, 2, 374, 337, 3, 2, 2, 2, 374, 338, 3, 2, 2, 2, 374, 339, 3, 2, 2, 2, 374, 340, 3, 2, 2, 2, 374, 341, 3, 2, 2, 2, 374, 352, 3, 2, 2, 2, 374, 363, 3, 2, 2, 2, 375, 53, 3, 2, 2, 2, 376, 377, 7, 12, 2, 2, 377, 378, 7, 30, 2, 2, 378, 55, 3, 2, 2, 2, 379, 380, 7, 18, 2, 2, 380, 385, 5, 58, 30, 2, 381, 382, 7, 36, 2, 2, 382, 384, 5, 58, 30, 2, 383, 381, 3, 2, 2, 2, 384, 387, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 57, 3, 2, 2, 2, 387, 385, 3, 2, 2, 2, 388, 390, 5, 12, 7, 2, 389, 391, 9, 7, 2, 2, 390, 389, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 394, 3, 2, 2, 2, 392, 393, 7, 48, 2, 2, 393, 395, 9, 8, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 59, 3, 2, 2, 2, 396, 397, 7, 11, 2, 2, 397, 402, 5, 46, 24, 2, 398, 399, 7, 36, 2, 2, 399, 401, 5, 46, 24, 2, 400, 398, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 415, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 405, 406, 7, 14, 2, 2, 406, 411, 5, 46, 24, 2, 407, 408, 7, 36, 2, 2, 408, 410, 5, 46, 24, 2, 409, 407, 3, 2, 2, 2, 410, 413, 3, 2, 2, 2, 411, 409, 3, 2, 2, 2, 411, 412, 3, 2, 2, 2, 412, 415, 3, 2, 2, 2, 413, 411, 3, 2, 2, 2, 414, 396, 3, 2, 2, 2, 414, 405, 3, 2, 2, 2, 415, 61, 3, 2, 2, 2, 416, 417, 7, 4, 2, 2, 417, 422, 5, 46, 24, 2, 418, 419, 7, 36, 2, 2, 419, 421, 5, 46, 24, 2, 420, 418, 3, 2, 2, 2, 421, 424, 3, 2, 2, 2, 422, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 63, 3, 2, 2, 2, 424, 422, 3, 2, 2, 2, 425, 426, 7, 15, 2, 2, 426, 431, 5, 66, 34, 2, 427, 428, 7, 36, 2, 2, 428, 430, 5, 66, 34, 2, 429, 427, 3, 2, 2, 2, 430, 433, 3, 2, 2, 2, 431, 429, 3, 2, 2, 2, 431, 432, 3, 2, 2, 2, 432, 65, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 434, 435, 5, 46, 24, 2, 435, 436, 7, 81, 2, 2, 436, 437, 5, 46, 24, 2, 437, 67, 3, 2, 2, 2, 438, 439, 7, 3, 2, 2, 439, 440, 5, 20, 11, 2, 440, 442, 5, 86, 44, 2, 441, 443, 5, 74, 38, 2, 442, 441, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 69, 3, 2, 2, 2, 444, 445, 7, 9, 2, 2, 445, 446, 5, 20, 11, 2, 446, 447, 5, 86, 44, 2, 447, 71, 3, 2, 2, 2, 448, 449, 7, 13, 2, 2, 449, 450, 5, 44, 23, 2, 450, 73, 3, 2, 2, 2, 451, 456, 5, 76, 39, 2, 452, 453, 7, 36, 2, 2, 453, 455, 5, 76, 39, 2, 454, 452, 3, 2, 2, 2, 455, 458, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 75, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 460, 5, 48, 25, 2, 460, 461, 7, 35, 2, 2, 461, 462, 5, 52, 27, 2, 462, 77, 3, 2, 2, 2, 463, 464, 9, 9, 2, 2, 464, 79, 3, 2, 2, 2, 465, 468, 5, 82, 42, 2, 466, 468, 5, 84, 43, 2, 467, 465, 3, 2, 2, 2, 467, 466, 3, 2, 2, 2, 468, 81, 3, 2, 2, 2, 469, 471, 9, 2, 2, 2, 470, 469, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 473, 7, 31, 2, 2, 473, 83, 3, 2, 2, 2, 474, 476, 9, 2, 2, 2, 475, 474, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 478, 7, 30, 2, 2, 478, 85, 3, 2, 2, 2, 479, 480, 7, 29, 2, 2, 480, 87, 3, 2, 2, 2, 481, 482, 9, 10, 2, 2, 482, 89, 3, 2, 2, 2, 483, 484, 7, 7, 2, 2, 484, 485, 5, 92, 47, 2, 485, 91, 3, 2, 2, 2, 486, 487, 7, 65, 2, 2, 487, 488, 5, 4, 3, 2, 488, 489, 7, 66, 2, 2, 489, 93, 3, 2, 2, 2, 490, 491, 7, 17, 2, 2, 491, 495, 7, 96, 2, 2, 492, 493, 7, 17, 2, 2, 493, 495, 7, 97, 2, 2, 494, 490, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 95, 3, 2, 2, 2, 496, 497, 7, 5, 2, 2, 497, 500, 5, 42, 22, 2, 498, 499, 7, 85, 2, 2, 499, 501, 5, 46, 24, 2, 500, 498, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 511, 3, 2, 2, 2, 502, 503, 7, 86, 2, 2, 503, 508, 5, 98, 50, 2, 504, 505, 7, 36, 2, 2, 505, 507, 5, 98, 50, 2, 506, 504, 3, 2, 2, 2, 507, 510, 3, 2, 2, 2, 508, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 512, 3, 2, 2, 2, 510, 508, 3, 2, 2, 2, 511, 502, 3, 2, 2, 2, 511, 512, 3, 2, 2, 2, 512, 97, 3, 2, 2, 2, 513, 514, 5, 46, 24, 2, 514, 515, 7, 35, 2, 2, 515, 517, 3, 2, 2, 2, 516, 513, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 5, 46, 24, 2, 519, 99, 3, 2, 2, 2, 54, 111, 118, 133, 145, 154, 162, 166, 174, 176, 181, 188, 193, 200, 206, 214, 216, 226, 236, 239, 251, 259, 267, 271, 280, 290, 294, 300, 307, 317, 325, 347, 358, 369, 374, 385, 390, 394, 402, 411, 414, 422, 431, 442, 456, 467, 470, 475, 494, 500, 508, 511, 516] \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens b/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens index c3160ce1f6472..85a98c3a6d268 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens @@ -2,92 +2,116 @@ DISSECT=1 DROP=2 ENRICH=3 EVAL=4 -FROM=5 -GROK=6 -KEEP=7 -LIMIT=8 -MV_EXPAND=9 -PROJECT=10 -RENAME=11 -ROW=12 -SHOW=13 -SORT=14 -STATS=15 -WHERE=16 -UNKNOWN_CMD=17 -LINE_COMMENT=18 -MULTILINE_COMMENT=19 -WS=20 -PIPE=21 -STRING=22 -INTEGER_LITERAL=23 -DECIMAL_LITERAL=24 -BY=25 -AND=26 -ASC=27 -ASSIGN=28 -COMMA=29 -DESC=30 -DOT=31 -FALSE=32 -FIRST=33 -LAST=34 -LP=35 -IN=36 -IS=37 -LIKE=38 -NOT=39 -NULL=40 -NULLS=41 -OR=42 -PARAM=43 -RLIKE=44 -RP=45 -TRUE=46 -INFO=47 -FUNCTIONS=48 -UNDERSCORE=49 -EQ=50 -NEQ=51 -LT=52 -LTE=53 -GT=54 -GTE=55 -PLUS=56 -MINUS=57 -ASTERISK=58 -SLASH=59 -PERCENT=60 -OPENING_BRACKET=61 -CLOSING_BRACKET=62 -UNQUOTED_IDENTIFIER=63 -QUOTED_IDENTIFIER=64 -EXPR_LINE_COMMENT=65 -EXPR_MULTILINE_COMMENT=66 -EXPR_WS=67 -AS=68 -METADATA=69 -ON=70 -WITH=71 -SRC_UNQUOTED_IDENTIFIER=72 -SRC_QUOTED_IDENTIFIER=73 -SRC_LINE_COMMENT=74 -SRC_MULTILINE_COMMENT=75 -SRC_WS=76 -'.'=31 -'('=35 -'?'=43 -')'=45 -'_'=49 -'=='=50 -'!='=51 -'<'=52 -'<='=53 -'>'=54 -'>='=55 -'+'=56 -'-'=57 -'*'=58 -'/'=59 -'%'=60 -']'=62 +EXPLAIN=5 +FROM=6 +GROK=7 +INLINESTATS=8 +KEEP=9 +LIMIT=10 +MV_EXPAND=11 +PROJECT=12 +RENAME=13 +ROW=14 +SHOW=15 +SORT=16 +STATS=17 +WHERE=18 +UNKNOWN_CMD=19 +LINE_COMMENT=20 +MULTILINE_COMMENT=21 +WS=22 +EXPLAIN_WS=23 +EXPLAIN_LINE_COMMENT=24 +EXPLAIN_MULTILINE_COMMENT=25 +PIPE=26 +STRING=27 +INTEGER_LITERAL=28 +DECIMAL_LITERAL=29 +BY=30 +AND=31 +ASC=32 +ASSIGN=33 +COMMA=34 +DESC=35 +DOT=36 +FALSE=37 +FIRST=38 +LAST=39 +LP=40 +IN=41 +IS=42 +LIKE=43 +NOT=44 +NULL=45 +NULLS=46 +OR=47 +PARAM=48 +RLIKE=49 +RP=50 +TRUE=51 +EQ=52 +NEQ=53 +LT=54 +LTE=55 +GT=56 +GTE=57 +PLUS=58 +MINUS=59 +ASTERISK=60 +SLASH=61 +PERCENT=62 +OPENING_BRACKET=63 +CLOSING_BRACKET=64 +UNQUOTED_IDENTIFIER=65 +QUOTED_IDENTIFIER=66 +EXPR_LINE_COMMENT=67 +EXPR_MULTILINE_COMMENT=68 +EXPR_WS=69 +METADATA=70 +FROM_UNQUOTED_IDENTIFIER=71 +FROM_LINE_COMMENT=72 +FROM_MULTILINE_COMMENT=73 +FROM_WS=74 +PROJECT_UNQUOTED_IDENTIFIER=75 +PROJECT_LINE_COMMENT=76 +PROJECT_MULTILINE_COMMENT=77 +PROJECT_WS=78 +AS=79 +RENAME_LINE_COMMENT=80 +RENAME_MULTILINE_COMMENT=81 +RENAME_WS=82 +ON=83 +WITH=84 +ENRICH_LINE_COMMENT=85 +ENRICH_MULTILINE_COMMENT=86 +ENRICH_WS=87 +ENRICH_FIELD_LINE_COMMENT=88 +ENRICH_FIELD_MULTILINE_COMMENT=89 +ENRICH_FIELD_WS=90 +MVEXPAND_LINE_COMMENT=91 +MVEXPAND_MULTILINE_COMMENT=92 +MVEXPAND_WS=93 +INFO=94 +FUNCTIONS=95 +SHOW_LINE_COMMENT=96 +SHOW_MULTILINE_COMMENT=97 +SHOW_WS=98 +'|'=26 +'='=33 +','=34 +'.'=36 +'('=40 +'?'=48 +')'=50 +'=='=52 +'!='=53 +'<'=54 +'<='=55 +'>'=56 +'>='=57 +'+'=58 +'-'=59 +'*'=60 +'/'=61 +'%'=62 +']'=64 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts b/packages/kbn-monaco/src/esql/antlr/esql_parser.ts index 8e0a4ca8199b8..90d3da25c8d1c 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.ts @@ -31,78 +31,100 @@ export class esql_parser extends Parser { public static readonly DROP = 2; public static readonly ENRICH = 3; public static readonly EVAL = 4; - public static readonly FROM = 5; - public static readonly GROK = 6; - public static readonly KEEP = 7; - public static readonly LIMIT = 8; - public static readonly MV_EXPAND = 9; - public static readonly PROJECT = 10; - public static readonly RENAME = 11; - public static readonly ROW = 12; - public static readonly SHOW = 13; - public static readonly SORT = 14; - public static readonly STATS = 15; - public static readonly WHERE = 16; - public static readonly UNKNOWN_CMD = 17; - public static readonly LINE_COMMENT = 18; - public static readonly MULTILINE_COMMENT = 19; - public static readonly WS = 20; - public static readonly PIPE = 21; - public static readonly STRING = 22; - public static readonly INTEGER_LITERAL = 23; - public static readonly DECIMAL_LITERAL = 24; - public static readonly BY = 25; - public static readonly AND = 26; - public static readonly ASC = 27; - public static readonly ASSIGN = 28; - public static readonly COMMA = 29; - public static readonly DESC = 30; - public static readonly DOT = 31; - public static readonly FALSE = 32; - public static readonly FIRST = 33; - public static readonly LAST = 34; - public static readonly LP = 35; - public static readonly IN = 36; - public static readonly IS = 37; - public static readonly LIKE = 38; - public static readonly NOT = 39; - public static readonly NULL = 40; - public static readonly NULLS = 41; - public static readonly OR = 42; - public static readonly PARAM = 43; - public static readonly RLIKE = 44; - public static readonly RP = 45; - public static readonly TRUE = 46; - public static readonly INFO = 47; - public static readonly FUNCTIONS = 48; - public static readonly UNDERSCORE = 49; - public static readonly EQ = 50; - public static readonly NEQ = 51; - public static readonly LT = 52; - public static readonly LTE = 53; - public static readonly GT = 54; - public static readonly GTE = 55; - public static readonly PLUS = 56; - public static readonly MINUS = 57; - public static readonly ASTERISK = 58; - public static readonly SLASH = 59; - public static readonly PERCENT = 60; - public static readonly OPENING_BRACKET = 61; - public static readonly CLOSING_BRACKET = 62; - public static readonly UNQUOTED_IDENTIFIER = 63; - public static readonly QUOTED_IDENTIFIER = 64; - public static readonly EXPR_LINE_COMMENT = 65; - public static readonly EXPR_MULTILINE_COMMENT = 66; - public static readonly EXPR_WS = 67; - public static readonly AS = 68; - public static readonly METADATA = 69; - public static readonly ON = 70; - public static readonly WITH = 71; - public static readonly SRC_UNQUOTED_IDENTIFIER = 72; - public static readonly SRC_QUOTED_IDENTIFIER = 73; - public static readonly SRC_LINE_COMMENT = 74; - public static readonly SRC_MULTILINE_COMMENT = 75; - public static readonly SRC_WS = 76; + public static readonly EXPLAIN = 5; + public static readonly FROM = 6; + public static readonly GROK = 7; + public static readonly INLINESTATS = 8; + public static readonly KEEP = 9; + public static readonly LIMIT = 10; + public static readonly MV_EXPAND = 11; + public static readonly PROJECT = 12; + public static readonly RENAME = 13; + public static readonly ROW = 14; + public static readonly SHOW = 15; + public static readonly SORT = 16; + public static readonly STATS = 17; + public static readonly WHERE = 18; + public static readonly UNKNOWN_CMD = 19; + public static readonly LINE_COMMENT = 20; + public static readonly MULTILINE_COMMENT = 21; + public static readonly WS = 22; + public static readonly EXPLAIN_WS = 23; + public static readonly EXPLAIN_LINE_COMMENT = 24; + public static readonly EXPLAIN_MULTILINE_COMMENT = 25; + public static readonly PIPE = 26; + public static readonly STRING = 27; + public static readonly INTEGER_LITERAL = 28; + public static readonly DECIMAL_LITERAL = 29; + public static readonly BY = 30; + public static readonly AND = 31; + public static readonly ASC = 32; + public static readonly ASSIGN = 33; + public static readonly COMMA = 34; + public static readonly DESC = 35; + public static readonly DOT = 36; + public static readonly FALSE = 37; + public static readonly FIRST = 38; + public static readonly LAST = 39; + public static readonly LP = 40; + public static readonly IN = 41; + public static readonly IS = 42; + public static readonly LIKE = 43; + public static readonly NOT = 44; + public static readonly NULL = 45; + public static readonly NULLS = 46; + public static readonly OR = 47; + public static readonly PARAM = 48; + public static readonly RLIKE = 49; + public static readonly RP = 50; + public static readonly TRUE = 51; + public static readonly EQ = 52; + public static readonly NEQ = 53; + public static readonly LT = 54; + public static readonly LTE = 55; + public static readonly GT = 56; + public static readonly GTE = 57; + public static readonly PLUS = 58; + public static readonly MINUS = 59; + public static readonly ASTERISK = 60; + public static readonly SLASH = 61; + public static readonly PERCENT = 62; + public static readonly OPENING_BRACKET = 63; + public static readonly CLOSING_BRACKET = 64; + public static readonly UNQUOTED_IDENTIFIER = 65; + public static readonly QUOTED_IDENTIFIER = 66; + public static readonly EXPR_LINE_COMMENT = 67; + public static readonly EXPR_MULTILINE_COMMENT = 68; + public static readonly EXPR_WS = 69; + public static readonly METADATA = 70; + public static readonly FROM_UNQUOTED_IDENTIFIER = 71; + public static readonly FROM_LINE_COMMENT = 72; + public static readonly FROM_MULTILINE_COMMENT = 73; + public static readonly FROM_WS = 74; + public static readonly PROJECT_UNQUOTED_IDENTIFIER = 75; + public static readonly PROJECT_LINE_COMMENT = 76; + public static readonly PROJECT_MULTILINE_COMMENT = 77; + public static readonly PROJECT_WS = 78; + public static readonly AS = 79; + public static readonly RENAME_LINE_COMMENT = 80; + public static readonly RENAME_MULTILINE_COMMENT = 81; + public static readonly RENAME_WS = 82; + public static readonly ON = 83; + public static readonly WITH = 84; + public static readonly ENRICH_LINE_COMMENT = 85; + public static readonly ENRICH_MULTILINE_COMMENT = 86; + public static readonly ENRICH_WS = 87; + public static readonly ENRICH_FIELD_LINE_COMMENT = 88; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 89; + public static readonly ENRICH_FIELD_WS = 90; + public static readonly MVEXPAND_LINE_COMMENT = 91; + public static readonly MVEXPAND_MULTILINE_COMMENT = 92; + public static readonly MVEXPAND_WS = 93; + public static readonly INFO = 94; + public static readonly FUNCTIONS = 95; + public static readonly SHOW_LINE_COMMENT = 96; + public static readonly SHOW_MULTILINE_COMMENT = 97; + public static readonly SHOW_WS = 98; public static readonly RULE_singleStatement = 0; public static readonly RULE_query = 1; public static readonly RULE_sourceCommand = 2; @@ -121,69 +143,82 @@ export class esql_parser extends Parser { public static readonly RULE_metadata = 15; public static readonly RULE_evalCommand = 16; public static readonly RULE_statsCommand = 17; - public static readonly RULE_grouping = 18; - public static readonly RULE_sourceIdentifier = 19; - public static readonly RULE_qualifiedName = 20; - public static readonly RULE_identifier = 21; - public static readonly RULE_constant = 22; - public static readonly RULE_limitCommand = 23; - public static readonly RULE_sortCommand = 24; - public static readonly RULE_orderExpression = 25; - public static readonly RULE_keepCommand = 26; - public static readonly RULE_dropCommand = 27; - public static readonly RULE_renameCommand = 28; - public static readonly RULE_renameClause = 29; - public static readonly RULE_dissectCommand = 30; - public static readonly RULE_grokCommand = 31; - public static readonly RULE_mvExpandCommand = 32; - public static readonly RULE_commandOptions = 33; - public static readonly RULE_commandOption = 34; - public static readonly RULE_booleanValue = 35; - public static readonly RULE_numericValue = 36; - public static readonly RULE_decimalValue = 37; - public static readonly RULE_integerValue = 38; - public static readonly RULE_string = 39; - public static readonly RULE_comparisonOperator = 40; - public static readonly RULE_showCommand = 41; - public static readonly RULE_enrichCommand = 42; - public static readonly RULE_enrichWithClause = 43; + public static readonly RULE_inlinestatsCommand = 18; + public static readonly RULE_grouping = 19; + public static readonly RULE_fromIdentifier = 20; + public static readonly RULE_qualifiedName = 21; + public static readonly RULE_qualifiedNamePattern = 22; + public static readonly RULE_identifier = 23; + public static readonly RULE_identifierPattern = 24; + public static readonly RULE_constant = 25; + public static readonly RULE_limitCommand = 26; + public static readonly RULE_sortCommand = 27; + public static readonly RULE_orderExpression = 28; + public static readonly RULE_keepCommand = 29; + public static readonly RULE_dropCommand = 30; + public static readonly RULE_renameCommand = 31; + public static readonly RULE_renameClause = 32; + public static readonly RULE_dissectCommand = 33; + public static readonly RULE_grokCommand = 34; + public static readonly RULE_mvExpandCommand = 35; + public static readonly RULE_commandOptions = 36; + public static readonly RULE_commandOption = 37; + public static readonly RULE_booleanValue = 38; + public static readonly RULE_numericValue = 39; + public static readonly RULE_decimalValue = 40; + public static readonly RULE_integerValue = 41; + public static readonly RULE_string = 42; + public static readonly RULE_comparisonOperator = 43; + public static readonly RULE_explainCommand = 44; + public static readonly RULE_subqueryExpression = 45; + public static readonly RULE_showCommand = 46; + public static readonly RULE_enrichCommand = 47; + public static readonly RULE_enrichWithClause = 48; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", "booleanExpression", "regexBooleanExpression", "valueExpression", "operatorExpression", "primaryExpression", "functionExpression", "rowCommand", "fields", "field", - "fromCommand", "metadata", "evalCommand", "statsCommand", "grouping", - "sourceIdentifier", "qualifiedName", "identifier", "constant", "limitCommand", - "sortCommand", "orderExpression", "keepCommand", "dropCommand", "renameCommand", - "renameClause", "dissectCommand", "grokCommand", "mvExpandCommand", "commandOptions", + "fromCommand", "metadata", "evalCommand", "statsCommand", "inlinestatsCommand", + "grouping", "fromIdentifier", "qualifiedName", "qualifiedNamePattern", + "identifier", "identifierPattern", "constant", "limitCommand", "sortCommand", + "orderExpression", "keepCommand", "dropCommand", "renameCommand", "renameClause", + "dissectCommand", "grokCommand", "mvExpandCommand", "commandOptions", "commandOption", "booleanValue", "numericValue", "decimalValue", "integerValue", - "string", "comparisonOperator", "showCommand", "enrichCommand", "enrichWithClause", + "string", "comparisonOperator", "explainCommand", "subqueryExpression", + "showCommand", "enrichCommand", "enrichWithClause", ]; private static readonly _LITERAL_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, "'.'", undefined, undefined, undefined, - "'('", undefined, undefined, undefined, undefined, undefined, undefined, - undefined, "'?'", undefined, "')'", undefined, undefined, undefined, "'_'", + undefined, undefined, undefined, undefined, undefined, "'|'", undefined, + undefined, undefined, undefined, undefined, undefined, "'='", "','", undefined, + "'.'", undefined, undefined, undefined, "'('", undefined, undefined, undefined, + undefined, undefined, undefined, undefined, "'?'", undefined, "')'", undefined, "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", undefined, "']'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ - undefined, "DISSECT", "DROP", "ENRICH", "EVAL", "FROM", "GROK", "KEEP", - "LIMIT", "MV_EXPAND", "PROJECT", "RENAME", "ROW", "SHOW", "SORT", "STATS", - "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", - "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", - "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "IN", "IS", "LIKE", - "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "INFO", - "FUNCTIONS", "UNDERSCORE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", - "MINUS", "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", - "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", - "EXPR_WS", "AS", "METADATA", "ON", "WITH", "SRC_UNQUOTED_IDENTIFIER", - "SRC_QUOTED_IDENTIFIER", "SRC_LINE_COMMENT", "SRC_MULTILINE_COMMENT", - "SRC_WS", + undefined, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", + "INLINESTATS", "KEEP", "LIMIT", "MV_EXPAND", "PROJECT", "RENAME", "ROW", + "SHOW", "SORT", "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", + "WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", + "PIPE", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", + "ASSIGN", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "IN", + "IS", "LIKE", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", + "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", + "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", + "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", + "METADATA", "FROM_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", + "FROM_WS", "PROJECT_UNQUOTED_IDENTIFIER", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", + "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", + "RENAME_WS", "ON", "WITH", "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", + "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", + "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", + "MVEXPAND_WS", "INFO", "FUNCTIONS", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", + "SHOW_WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(esql_parser._LITERAL_NAMES, esql_parser._SYMBOLIC_NAMES, []); @@ -214,9 +249,9 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 88; + this.state = 98; this.query(0); - this.state = 89; + this.state = 99; this.match(esql_parser.EOF); } } @@ -258,11 +293,11 @@ export class esql_parser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 92; + this.state = 102; this.sourceCommand(); } this._ctx._stop = this._input.tryLT(-1); - this.state = 99; + this.state = 109; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 0, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -275,18 +310,18 @@ export class esql_parser extends Parser { { _localctx = new CompositeQueryContext(new QueryContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, esql_parser.RULE_query); - this.state = 94; + this.state = 104; if (!(this.precpred(this._ctx, 1))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 95; + this.state = 105; this.match(esql_parser.PIPE); - this.state = 96; + this.state = 106; this.processingCommand(); } } } - this.state = 101; + this.state = 111; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 0, this._ctx); } @@ -311,27 +346,34 @@ export class esql_parser extends Parser { let _localctx: SourceCommandContext = new SourceCommandContext(this._ctx, this.state); this.enterRule(_localctx, 4, esql_parser.RULE_sourceCommand); try { - this.state = 105; + this.state = 116; this._errHandler.sync(this); switch (this._input.LA(1)) { - case esql_parser.FROM: + case esql_parser.EXPLAIN: this.enterOuterAlt(_localctx, 1); { - this.state = 102; + this.state = 112; + this.explainCommand(); + } + break; + case esql_parser.FROM: + this.enterOuterAlt(_localctx, 2); + { + this.state = 113; this.fromCommand(); } break; case esql_parser.ROW: - this.enterOuterAlt(_localctx, 2); + this.enterOuterAlt(_localctx, 3); { - this.state = 103; + this.state = 114; this.rowCommand(); } break; case esql_parser.SHOW: - this.enterOuterAlt(_localctx, 3); + this.enterOuterAlt(_localctx, 4); { - this.state = 104; + this.state = 115; this.showCommand(); } break; @@ -358,91 +400,98 @@ export class esql_parser extends Parser { let _localctx: ProcessingCommandContext = new ProcessingCommandContext(this._ctx, this.state); this.enterRule(_localctx, 6, esql_parser.RULE_processingCommand); try { - this.state = 119; + this.state = 131; this._errHandler.sync(this); switch (this._input.LA(1)) { case esql_parser.EVAL: this.enterOuterAlt(_localctx, 1); { - this.state = 107; + this.state = 118; this.evalCommand(); } break; - case esql_parser.LIMIT: + case esql_parser.INLINESTATS: this.enterOuterAlt(_localctx, 2); { - this.state = 108; + this.state = 119; + this.inlinestatsCommand(); + } + break; + case esql_parser.LIMIT: + this.enterOuterAlt(_localctx, 3); + { + this.state = 120; this.limitCommand(); } break; case esql_parser.KEEP: case esql_parser.PROJECT: - this.enterOuterAlt(_localctx, 3); + this.enterOuterAlt(_localctx, 4); { - this.state = 109; + this.state = 121; this.keepCommand(); } break; case esql_parser.SORT: - this.enterOuterAlt(_localctx, 4); + this.enterOuterAlt(_localctx, 5); { - this.state = 110; + this.state = 122; this.sortCommand(); } break; case esql_parser.STATS: - this.enterOuterAlt(_localctx, 5); + this.enterOuterAlt(_localctx, 6); { - this.state = 111; + this.state = 123; this.statsCommand(); } break; case esql_parser.WHERE: - this.enterOuterAlt(_localctx, 6); + this.enterOuterAlt(_localctx, 7); { - this.state = 112; + this.state = 124; this.whereCommand(); } break; case esql_parser.DROP: - this.enterOuterAlt(_localctx, 7); + this.enterOuterAlt(_localctx, 8); { - this.state = 113; + this.state = 125; this.dropCommand(); } break; case esql_parser.RENAME: - this.enterOuterAlt(_localctx, 8); + this.enterOuterAlt(_localctx, 9); { - this.state = 114; + this.state = 126; this.renameCommand(); } break; case esql_parser.DISSECT: - this.enterOuterAlt(_localctx, 9); + this.enterOuterAlt(_localctx, 10); { - this.state = 115; + this.state = 127; this.dissectCommand(); } break; case esql_parser.GROK: - this.enterOuterAlt(_localctx, 10); + this.enterOuterAlt(_localctx, 11); { - this.state = 116; + this.state = 128; this.grokCommand(); } break; case esql_parser.ENRICH: - this.enterOuterAlt(_localctx, 11); + this.enterOuterAlt(_localctx, 12); { - this.state = 117; + this.state = 129; this.enrichCommand(); } break; case esql_parser.MV_EXPAND: - this.enterOuterAlt(_localctx, 12); + this.enterOuterAlt(_localctx, 13); { - this.state = 118; + this.state = 130; this.mvExpandCommand(); } break; @@ -471,9 +520,9 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 121; + this.state = 133; this.match(esql_parser.WHERE); - this.state = 122; + this.state = 134; this.booleanExpression(0); } } @@ -511,7 +560,7 @@ export class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 152; + this.state = 164; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 6, this._ctx) ) { case 1: @@ -520,9 +569,9 @@ export class esql_parser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 125; + this.state = 137; this.match(esql_parser.NOT); - this.state = 126; + this.state = 138; this.booleanExpression(7); } break; @@ -532,7 +581,7 @@ export class esql_parser extends Parser { _localctx = new BooleanDefaultContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 127; + this.state = 139; this.valueExpression(); } break; @@ -542,7 +591,7 @@ export class esql_parser extends Parser { _localctx = new RegexExpressionContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 128; + this.state = 140; this.regexBooleanExpression(); } break; @@ -552,41 +601,41 @@ export class esql_parser extends Parser { _localctx = new LogicalInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 129; + this.state = 141; this.valueExpression(); - this.state = 131; + this.state = 143; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === esql_parser.NOT) { { - this.state = 130; + this.state = 142; this.match(esql_parser.NOT); } } - this.state = 133; + this.state = 145; this.match(esql_parser.IN); - this.state = 134; + this.state = 146; this.match(esql_parser.LP); - this.state = 135; + this.state = 147; this.valueExpression(); - this.state = 140; + this.state = 152; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 136; + this.state = 148; this.match(esql_parser.COMMA); - this.state = 137; + this.state = 149; this.valueExpression(); } } - this.state = 142; + this.state = 154; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 143; + this.state = 155; this.match(esql_parser.RP); } break; @@ -596,27 +645,27 @@ export class esql_parser extends Parser { _localctx = new IsNullContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 145; + this.state = 157; this.valueExpression(); - this.state = 146; + this.state = 158; this.match(esql_parser.IS); - this.state = 148; + this.state = 160; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === esql_parser.NOT) { { - this.state = 147; + this.state = 159; this.match(esql_parser.NOT); } } - this.state = 150; + this.state = 162; this.match(esql_parser.NULL); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 162; + this.state = 174; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 8, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -626,7 +675,7 @@ export class esql_parser extends Parser { } _prevctx = _localctx; { - this.state = 160; + this.state = 172; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 7, this._ctx) ) { case 1: @@ -634,13 +683,13 @@ export class esql_parser extends Parser { _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); (_localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(_localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 154; + this.state = 166; if (!(this.precpred(this._ctx, 4))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 155; + this.state = 167; (_localctx as LogicalBinaryContext)._operator = this.match(esql_parser.AND); - this.state = 156; + this.state = 168; (_localctx as LogicalBinaryContext)._right = this.booleanExpression(5); } break; @@ -650,20 +699,20 @@ export class esql_parser extends Parser { _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); (_localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(_localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 157; + this.state = 169; if (!(this.precpred(this._ctx, 3))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 158; + this.state = 170; (_localctx as LogicalBinaryContext)._operator = this.match(esql_parser.OR); - this.state = 159; + this.state = 171; (_localctx as LogicalBinaryContext)._right = this.booleanExpression(4); } break; } } } - this.state = 164; + this.state = 176; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 8, this._ctx); } @@ -689,27 +738,27 @@ export class esql_parser extends Parser { this.enterRule(_localctx, 12, esql_parser.RULE_regexBooleanExpression); let _la: number; try { - this.state = 179; + this.state = 191; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 11, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 165; + this.state = 177; this.valueExpression(); - this.state = 167; + this.state = 179; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === esql_parser.NOT) { { - this.state = 166; + this.state = 178; this.match(esql_parser.NOT); } } - this.state = 169; + this.state = 181; _localctx._kind = this.match(esql_parser.LIKE); - this.state = 170; + this.state = 182; _localctx._pattern = this.string(); } break; @@ -717,21 +766,21 @@ export class esql_parser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 172; + this.state = 184; this.valueExpression(); - this.state = 174; + this.state = 186; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === esql_parser.NOT) { { - this.state = 173; + this.state = 185; this.match(esql_parser.NOT); } } - this.state = 176; + this.state = 188; _localctx._kind = this.match(esql_parser.RLIKE); - this.state = 177; + this.state = 189; _localctx._pattern = this.string(); } break; @@ -756,14 +805,14 @@ export class esql_parser extends Parser { let _localctx: ValueExpressionContext = new ValueExpressionContext(this._ctx, this.state); this.enterRule(_localctx, 14, esql_parser.RULE_valueExpression); try { - this.state = 186; + this.state = 198; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 12, this._ctx) ) { case 1: _localctx = new ValueExpressionDefaultContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 181; + this.state = 193; this.operatorExpression(0); } break; @@ -772,11 +821,11 @@ export class esql_parser extends Parser { _localctx = new ComparisonContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 182; + this.state = 194; (_localctx as ComparisonContext)._left = this.operatorExpression(0); - this.state = 183; + this.state = 195; this.comparisonOperator(); - this.state = 184; + this.state = 196; (_localctx as ComparisonContext)._right = this.operatorExpression(0); } break; @@ -816,7 +865,7 @@ export class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 192; + this.state = 204; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 13, this._ctx) ) { case 1: @@ -825,7 +874,7 @@ export class esql_parser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 189; + this.state = 201; this.primaryExpression(); } break; @@ -835,7 +884,7 @@ export class esql_parser extends Parser { _localctx = new ArithmeticUnaryContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 190; + this.state = 202; (_localctx as ArithmeticUnaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); if (!(_la === esql_parser.PLUS || _la === esql_parser.MINUS)) { @@ -848,13 +897,13 @@ export class esql_parser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 191; + this.state = 203; this.operatorExpression(3); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 202; + this.state = 214; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 15, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -864,7 +913,7 @@ export class esql_parser extends Parser { } _prevctx = _localctx; { - this.state = 200; + this.state = 212; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: @@ -872,14 +921,14 @@ export class esql_parser extends Parser { _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); (_localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(_localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 194; + this.state = 206; if (!(this.precpred(this._ctx, 2))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 195; + this.state = 207; (_localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 58)) & ~0x1F) === 0 && ((1 << (_la - 58)) & ((1 << (esql_parser.ASTERISK - 58)) | (1 << (esql_parser.SLASH - 58)) | (1 << (esql_parser.PERCENT - 58)))) !== 0))) { + if (!(((((_la - 60)) & ~0x1F) === 0 && ((1 << (_la - 60)) & ((1 << (esql_parser.ASTERISK - 60)) | (1 << (esql_parser.SLASH - 60)) | (1 << (esql_parser.PERCENT - 60)))) !== 0))) { (_localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -889,7 +938,7 @@ export class esql_parser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 196; + this.state = 208; (_localctx as ArithmeticBinaryContext)._right = this.operatorExpression(3); } break; @@ -899,11 +948,11 @@ export class esql_parser extends Parser { _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); (_localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(_localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 197; + this.state = 209; if (!(this.precpred(this._ctx, 1))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 198; + this.state = 210; (_localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); if (!(_la === esql_parser.PLUS || _la === esql_parser.MINUS)) { @@ -916,14 +965,14 @@ export class esql_parser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 199; + this.state = 211; (_localctx as ArithmeticBinaryContext)._right = this.operatorExpression(2); } break; } } } - this.state = 204; + this.state = 216; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 15, this._ctx); } @@ -948,14 +997,14 @@ export class esql_parser extends Parser { let _localctx: PrimaryExpressionContext = new PrimaryExpressionContext(this._ctx, this.state); this.enterRule(_localctx, 18, esql_parser.RULE_primaryExpression); try { - this.state = 212; + this.state = 224; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 16, this._ctx) ) { case 1: _localctx = new ConstantDefaultContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 205; + this.state = 217; this.constant(); } break; @@ -964,7 +1013,7 @@ export class esql_parser extends Parser { _localctx = new DereferenceContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 206; + this.state = 218; this.qualifiedName(); } break; @@ -973,7 +1022,7 @@ export class esql_parser extends Parser { _localctx = new FunctionContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 207; + this.state = 219; this.functionExpression(); } break; @@ -982,11 +1031,11 @@ export class esql_parser extends Parser { _localctx = new ParenthesizedExpressionContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 208; + this.state = 220; this.match(esql_parser.LP); - this.state = 209; + this.state = 221; this.booleanExpression(0); - this.state = 210; + this.state = 222; this.match(esql_parser.RP); } break; @@ -1014,16 +1063,16 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 214; + this.state = 226; this.identifier(); - this.state = 215; + this.state = 227; this.match(esql_parser.LP); - this.state = 225; + this.state = 237; this._errHandler.sync(this); switch (this._input.LA(1)) { case esql_parser.ASTERISK: { - this.state = 216; + this.state = 228; this.match(esql_parser.ASTERISK); } break; @@ -1043,21 +1092,21 @@ export class esql_parser extends Parser { case esql_parser.QUOTED_IDENTIFIER: { { - this.state = 217; + this.state = 229; this.booleanExpression(0); - this.state = 222; + this.state = 234; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 218; + this.state = 230; this.match(esql_parser.COMMA); - this.state = 219; + this.state = 231; this.booleanExpression(0); } } - this.state = 224; + this.state = 236; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -1069,7 +1118,7 @@ export class esql_parser extends Parser { default: break; } - this.state = 227; + this.state = 239; this.match(esql_parser.RP); } } @@ -1094,9 +1143,9 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 229; + this.state = 241; this.match(esql_parser.ROW); - this.state = 230; + this.state = 242; this.fields(); } } @@ -1122,23 +1171,23 @@ export class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 232; + this.state = 244; this.field(); - this.state = 237; + this.state = 249; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 19, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 233; + this.state = 245; this.match(esql_parser.COMMA); - this.state = 234; + this.state = 246; this.field(); } } } - this.state = 239; + this.state = 251; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 19, this._ctx); } @@ -1163,13 +1212,13 @@ export class esql_parser extends Parser { let _localctx: FieldContext = new FieldContext(this._ctx, this.state); this.enterRule(_localctx, 26, esql_parser.RULE_field); try { - this.state = 245; + this.state = 257; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 20, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 240; + this.state = 252; this.booleanExpression(0); } break; @@ -1177,11 +1226,11 @@ export class esql_parser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 241; + this.state = 253; this.qualifiedName(); - this.state = 242; + this.state = 254; this.match(esql_parser.ASSIGN); - this.state = 243; + this.state = 255; this.booleanExpression(0); } break; @@ -1209,34 +1258,34 @@ export class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 247; + this.state = 259; this.match(esql_parser.FROM); - this.state = 248; - this.sourceIdentifier(); - this.state = 253; + this.state = 260; + this.fromIdentifier(); + this.state = 265; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 21, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 249; + this.state = 261; this.match(esql_parser.COMMA); - this.state = 250; - this.sourceIdentifier(); + this.state = 262; + this.fromIdentifier(); } } } - this.state = 255; + this.state = 267; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 21, this._ctx); } - this.state = 257; + this.state = 269; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 22, this._ctx) ) { case 1: { - this.state = 256; + this.state = 268; this.metadata(); } break; @@ -1265,29 +1314,29 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 259; + this.state = 271; this.match(esql_parser.OPENING_BRACKET); - this.state = 260; + this.state = 272; this.match(esql_parser.METADATA); - this.state = 261; - this.sourceIdentifier(); - this.state = 266; + this.state = 273; + this.fromIdentifier(); + this.state = 278; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 262; + this.state = 274; this.match(esql_parser.COMMA); - this.state = 263; - this.sourceIdentifier(); + this.state = 275; + this.fromIdentifier(); } } - this.state = 268; + this.state = 280; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 269; + this.state = 281; this.match(esql_parser.CLOSING_BRACKET); } } @@ -1312,9 +1361,9 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 271; + this.state = 283; this.match(esql_parser.EVAL); - this.state = 272; + this.state = 284; this.fields(); } } @@ -1339,26 +1388,65 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 274; + this.state = 286; this.match(esql_parser.STATS); - this.state = 276; + this.state = 288; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { case 1: { - this.state = 275; + this.state = 287; this.fields(); } break; } - this.state = 280; + this.state = 292; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 25, this._ctx) ) { case 1: { - this.state = 278; + this.state = 290; this.match(esql_parser.BY); - this.state = 279; + this.state = 291; + this.grouping(); + } + break; + } + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) + public inlinestatsCommand(): InlinestatsCommandContext { + let _localctx: InlinestatsCommandContext = new InlinestatsCommandContext(this._ctx, this.state); + this.enterRule(_localctx, 36, esql_parser.RULE_inlinestatsCommand); + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 294; + this.match(esql_parser.INLINESTATS); + this.state = 295; + this.fields(); + this.state = 298; + this._errHandler.sync(this); + switch ( this.interpreter.adaptivePredict(this._input, 26, this._ctx) ) { + case 1: + { + this.state = 296; + this.match(esql_parser.BY); + this.state = 297; this.grouping(); } break; @@ -1382,30 +1470,30 @@ export class esql_parser extends Parser { // @RuleVersion(0) public grouping(): GroupingContext { let _localctx: GroupingContext = new GroupingContext(this._ctx, this.state); - this.enterRule(_localctx, 36, esql_parser.RULE_grouping); + this.enterRule(_localctx, 38, esql_parser.RULE_grouping); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 282; + this.state = 300; this.qualifiedName(); - this.state = 287; + this.state = 305; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 26, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 27, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 283; + this.state = 301; this.match(esql_parser.COMMA); - this.state = 284; + this.state = 302; this.qualifiedName(); } } } - this.state = 289; + this.state = 307; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 26, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 27, this._ctx); } } } @@ -1424,16 +1512,16 @@ export class esql_parser extends Parser { return _localctx; } // @RuleVersion(0) - public sourceIdentifier(): SourceIdentifierContext { - let _localctx: SourceIdentifierContext = new SourceIdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 38, esql_parser.RULE_sourceIdentifier); + public fromIdentifier(): FromIdentifierContext { + let _localctx: FromIdentifierContext = new FromIdentifierContext(this._ctx, this.state); + this.enterRule(_localctx, 40, esql_parser.RULE_fromIdentifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 290; + this.state = 308; _la = this._input.LA(1); - if (!(_la === esql_parser.SRC_UNQUOTED_IDENTIFIER || _la === esql_parser.SRC_QUOTED_IDENTIFIER)) { + if (!(_la === esql_parser.QUOTED_IDENTIFIER || _la === esql_parser.FROM_UNQUOTED_IDENTIFIER)) { this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -1462,30 +1550,74 @@ export class esql_parser extends Parser { // @RuleVersion(0) public qualifiedName(): QualifiedNameContext { let _localctx: QualifiedNameContext = new QualifiedNameContext(this._ctx, this.state); - this.enterRule(_localctx, 40, esql_parser.RULE_qualifiedName); + this.enterRule(_localctx, 42, esql_parser.RULE_qualifiedName); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 292; + this.state = 310; this.identifier(); - this.state = 297; + this.state = 315; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 27, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 28, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 293; + this.state = 311; this.match(esql_parser.DOT); - this.state = 294; + this.state = 312; this.identifier(); } } } - this.state = 299; + this.state = 317; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 27, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 28, this._ctx); + } + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) + public qualifiedNamePattern(): QualifiedNamePatternContext { + let _localctx: QualifiedNamePatternContext = new QualifiedNamePatternContext(this._ctx, this.state); + this.enterRule(_localctx, 44, esql_parser.RULE_qualifiedNamePattern); + try { + let _alt: number; + this.enterOuterAlt(_localctx, 1); + { + this.state = 318; + this.identifierPattern(); + this.state = 323; + this._errHandler.sync(this); + _alt = this.interpreter.adaptivePredict(this._input, 29, this._ctx); + while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + { + { + this.state = 319; + this.match(esql_parser.DOT); + this.state = 320; + this.identifierPattern(); + } + } + } + this.state = 325; + this._errHandler.sync(this); + _alt = this.interpreter.adaptivePredict(this._input, 29, this._ctx); } } } @@ -1506,12 +1638,12 @@ export class esql_parser extends Parser { // @RuleVersion(0) public identifier(): IdentifierContext { let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 42, esql_parser.RULE_identifier); + this.enterRule(_localctx, 46, esql_parser.RULE_identifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 300; + this.state = 326; _la = this._input.LA(1); if (!(_la === esql_parser.UNQUOTED_IDENTIFIER || _la === esql_parser.QUOTED_IDENTIFIER)) { this._errHandler.recoverInline(this); @@ -1540,19 +1672,55 @@ export class esql_parser extends Parser { return _localctx; } // @RuleVersion(0) + public identifierPattern(): IdentifierPatternContext { + let _localctx: IdentifierPatternContext = new IdentifierPatternContext(this._ctx, this.state); + this.enterRule(_localctx, 48, esql_parser.RULE_identifierPattern); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 328; + _la = this._input.LA(1); + if (!(_la === esql_parser.QUOTED_IDENTIFIER || _la === esql_parser.PROJECT_UNQUOTED_IDENTIFIER)) { + this._errHandler.recoverInline(this); + } else { + if (this._input.LA(1) === Token.EOF) { + this.matchedEOF = true; + } + + this._errHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) public constant(): ConstantContext { let _localctx: ConstantContext = new ConstantContext(this._ctx, this.state); - this.enterRule(_localctx, 44, esql_parser.RULE_constant); + this.enterRule(_localctx, 50, esql_parser.RULE_constant); let _la: number; try { - this.state = 344; + this.state = 372; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 31, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 33, this._ctx) ) { case 1: _localctx = new NullLiteralContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 302; + this.state = 330; this.match(esql_parser.NULL); } break; @@ -1561,9 +1729,9 @@ export class esql_parser extends Parser { _localctx = new QualifiedIntegerLiteralContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 303; + this.state = 331; this.integerValue(); - this.state = 304; + this.state = 332; this.match(esql_parser.UNQUOTED_IDENTIFIER); } break; @@ -1572,7 +1740,7 @@ export class esql_parser extends Parser { _localctx = new DecimalLiteralContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 306; + this.state = 334; this.decimalValue(); } break; @@ -1581,7 +1749,7 @@ export class esql_parser extends Parser { _localctx = new IntegerLiteralContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 307; + this.state = 335; this.integerValue(); } break; @@ -1590,7 +1758,7 @@ export class esql_parser extends Parser { _localctx = new BooleanLiteralContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 308; + this.state = 336; this.booleanValue(); } break; @@ -1599,7 +1767,7 @@ export class esql_parser extends Parser { _localctx = new InputParamContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 309; + this.state = 337; this.match(esql_parser.PARAM); } break; @@ -1608,7 +1776,7 @@ export class esql_parser extends Parser { _localctx = new StringLiteralContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 310; + this.state = 338; this.string(); } break; @@ -1617,27 +1785,27 @@ export class esql_parser extends Parser { _localctx = new NumericArrayLiteralContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 311; + this.state = 339; this.match(esql_parser.OPENING_BRACKET); - this.state = 312; + this.state = 340; this.numericValue(); - this.state = 317; + this.state = 345; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 313; + this.state = 341; this.match(esql_parser.COMMA); - this.state = 314; + this.state = 342; this.numericValue(); } } - this.state = 319; + this.state = 347; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 320; + this.state = 348; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -1646,27 +1814,27 @@ export class esql_parser extends Parser { _localctx = new BooleanArrayLiteralContext(_localctx); this.enterOuterAlt(_localctx, 9); { - this.state = 322; + this.state = 350; this.match(esql_parser.OPENING_BRACKET); - this.state = 323; + this.state = 351; this.booleanValue(); - this.state = 328; + this.state = 356; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 324; + this.state = 352; this.match(esql_parser.COMMA); - this.state = 325; + this.state = 353; this.booleanValue(); } } - this.state = 330; + this.state = 358; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 331; + this.state = 359; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -1675,27 +1843,27 @@ export class esql_parser extends Parser { _localctx = new StringArrayLiteralContext(_localctx); this.enterOuterAlt(_localctx, 10); { - this.state = 333; + this.state = 361; this.match(esql_parser.OPENING_BRACKET); - this.state = 334; + this.state = 362; this.string(); - this.state = 339; + this.state = 367; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 335; + this.state = 363; this.match(esql_parser.COMMA); - this.state = 336; + this.state = 364; this.string(); } } - this.state = 341; + this.state = 369; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 342; + this.state = 370; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -1718,13 +1886,13 @@ export class esql_parser extends Parser { // @RuleVersion(0) public limitCommand(): LimitCommandContext { let _localctx: LimitCommandContext = new LimitCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 46, esql_parser.RULE_limitCommand); + this.enterRule(_localctx, 52, esql_parser.RULE_limitCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 346; + this.state = 374; this.match(esql_parser.LIMIT); - this.state = 347; + this.state = 375; this.match(esql_parser.INTEGER_LITERAL); } } @@ -1745,32 +1913,32 @@ export class esql_parser extends Parser { // @RuleVersion(0) public sortCommand(): SortCommandContext { let _localctx: SortCommandContext = new SortCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 48, esql_parser.RULE_sortCommand); + this.enterRule(_localctx, 54, esql_parser.RULE_sortCommand); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 349; + this.state = 377; this.match(esql_parser.SORT); - this.state = 350; + this.state = 378; this.orderExpression(); - this.state = 355; + this.state = 383; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 32, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 34, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 351; + this.state = 379; this.match(esql_parser.COMMA); - this.state = 352; + this.state = 380; this.orderExpression(); } } } - this.state = 357; + this.state = 385; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 32, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 34, this._ctx); } } } @@ -1791,19 +1959,19 @@ export class esql_parser extends Parser { // @RuleVersion(0) public orderExpression(): OrderExpressionContext { let _localctx: OrderExpressionContext = new OrderExpressionContext(this._ctx, this.state); - this.enterRule(_localctx, 50, esql_parser.RULE_orderExpression); + this.enterRule(_localctx, 56, esql_parser.RULE_orderExpression); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 358; + this.state = 386; this.booleanExpression(0); - this.state = 360; + this.state = 388; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 33, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 35, this._ctx) ) { case 1: { - this.state = 359; + this.state = 387; _localctx._ordering = this._input.LT(1); _la = this._input.LA(1); if (!(_la === esql_parser.ASC || _la === esql_parser.DESC)) { @@ -1819,14 +1987,14 @@ export class esql_parser extends Parser { } break; } - this.state = 364; + this.state = 392; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 34, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 36, this._ctx) ) { case 1: { - this.state = 362; + this.state = 390; this.match(esql_parser.NULLS); - this.state = 363; + this.state = 391; _localctx._nullOrdering = this._input.LT(1); _la = this._input.LA(1); if (!(_la === esql_parser.FIRST || _la === esql_parser.LAST)) { @@ -1861,63 +2029,63 @@ export class esql_parser extends Parser { // @RuleVersion(0) public keepCommand(): KeepCommandContext { let _localctx: KeepCommandContext = new KeepCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 52, esql_parser.RULE_keepCommand); + this.enterRule(_localctx, 58, esql_parser.RULE_keepCommand); try { let _alt: number; - this.state = 384; + this.state = 412; this._errHandler.sync(this); switch (this._input.LA(1)) { case esql_parser.KEEP: this.enterOuterAlt(_localctx, 1); { - this.state = 366; + this.state = 394; this.match(esql_parser.KEEP); - this.state = 367; - this.sourceIdentifier(); - this.state = 372; + this.state = 395; + this.qualifiedNamePattern(); + this.state = 400; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 368; + this.state = 396; this.match(esql_parser.COMMA); - this.state = 369; - this.sourceIdentifier(); + this.state = 397; + this.qualifiedNamePattern(); } } } - this.state = 374; + this.state = 402; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); } } break; case esql_parser.PROJECT: this.enterOuterAlt(_localctx, 2); { - this.state = 375; + this.state = 403; this.match(esql_parser.PROJECT); - this.state = 376; - this.sourceIdentifier(); - this.state = 381; + this.state = 404; + this.qualifiedNamePattern(); + this.state = 409; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 36, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 377; + this.state = 405; this.match(esql_parser.COMMA); - this.state = 378; - this.sourceIdentifier(); + this.state = 406; + this.qualifiedNamePattern(); } } } - this.state = 383; + this.state = 411; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 36, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } } break; @@ -1942,32 +2110,32 @@ export class esql_parser extends Parser { // @RuleVersion(0) public dropCommand(): DropCommandContext { let _localctx: DropCommandContext = new DropCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 54, esql_parser.RULE_dropCommand); + this.enterRule(_localctx, 60, esql_parser.RULE_dropCommand); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 386; + this.state = 414; this.match(esql_parser.DROP); - this.state = 387; - this.sourceIdentifier(); - this.state = 392; + this.state = 415; + this.qualifiedNamePattern(); + this.state = 420; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 40, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 388; + this.state = 416; this.match(esql_parser.COMMA); - this.state = 389; - this.sourceIdentifier(); + this.state = 417; + this.qualifiedNamePattern(); } } } - this.state = 394; + this.state = 422; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 40, this._ctx); } } } @@ -1988,32 +2156,32 @@ export class esql_parser extends Parser { // @RuleVersion(0) public renameCommand(): RenameCommandContext { let _localctx: RenameCommandContext = new RenameCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 56, esql_parser.RULE_renameCommand); + this.enterRule(_localctx, 62, esql_parser.RULE_renameCommand); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 395; + this.state = 423; this.match(esql_parser.RENAME); - this.state = 396; + this.state = 424; this.renameClause(); - this.state = 401; + this.state = 429; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 39, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 397; + this.state = 425; this.match(esql_parser.COMMA); - this.state = 398; + this.state = 426; this.renameClause(); } } } - this.state = 403; + this.state = 431; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 39, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); } } } @@ -2034,16 +2202,16 @@ export class esql_parser extends Parser { // @RuleVersion(0) public renameClause(): RenameClauseContext { let _localctx: RenameClauseContext = new RenameClauseContext(this._ctx, this.state); - this.enterRule(_localctx, 58, esql_parser.RULE_renameClause); + this.enterRule(_localctx, 64, esql_parser.RULE_renameClause); try { this.enterOuterAlt(_localctx, 1); { - this.state = 404; - _localctx._oldName = this.sourceIdentifier(); - this.state = 405; + this.state = 432; + _localctx._oldName = this.qualifiedNamePattern(); + this.state = 433; this.match(esql_parser.AS); - this.state = 406; - _localctx._newName = this.sourceIdentifier(); + this.state = 434; + _localctx._newName = this.qualifiedNamePattern(); } } catch (re) { @@ -2063,22 +2231,22 @@ export class esql_parser extends Parser { // @RuleVersion(0) public dissectCommand(): DissectCommandContext { let _localctx: DissectCommandContext = new DissectCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 60, esql_parser.RULE_dissectCommand); + this.enterRule(_localctx, 66, esql_parser.RULE_dissectCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 408; + this.state = 436; this.match(esql_parser.DISSECT); - this.state = 409; + this.state = 437; this.primaryExpression(); - this.state = 410; + this.state = 438; this.string(); - this.state = 412; + this.state = 440; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 40, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 42, this._ctx) ) { case 1: { - this.state = 411; + this.state = 439; this.commandOptions(); } break; @@ -2102,15 +2270,15 @@ export class esql_parser extends Parser { // @RuleVersion(0) public grokCommand(): GrokCommandContext { let _localctx: GrokCommandContext = new GrokCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 62, esql_parser.RULE_grokCommand); + this.enterRule(_localctx, 68, esql_parser.RULE_grokCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 414; + this.state = 442; this.match(esql_parser.GROK); - this.state = 415; + this.state = 443; this.primaryExpression(); - this.state = 416; + this.state = 444; this.string(); } } @@ -2131,14 +2299,14 @@ export class esql_parser extends Parser { // @RuleVersion(0) public mvExpandCommand(): MvExpandCommandContext { let _localctx: MvExpandCommandContext = new MvExpandCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 64, esql_parser.RULE_mvExpandCommand); + this.enterRule(_localctx, 70, esql_parser.RULE_mvExpandCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 418; + this.state = 446; this.match(esql_parser.MV_EXPAND); - this.state = 419; - this.sourceIdentifier(); + this.state = 447; + this.qualifiedName(); } } catch (re) { @@ -2158,30 +2326,30 @@ export class esql_parser extends Parser { // @RuleVersion(0) public commandOptions(): CommandOptionsContext { let _localctx: CommandOptionsContext = new CommandOptionsContext(this._ctx, this.state); - this.enterRule(_localctx, 66, esql_parser.RULE_commandOptions); + this.enterRule(_localctx, 72, esql_parser.RULE_commandOptions); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 421; + this.state = 449; this.commandOption(); - this.state = 426; + this.state = 454; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 422; + this.state = 450; this.match(esql_parser.COMMA); - this.state = 423; + this.state = 451; this.commandOption(); } } } - this.state = 428; + this.state = 456; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); } } } @@ -2202,15 +2370,15 @@ export class esql_parser extends Parser { // @RuleVersion(0) public commandOption(): CommandOptionContext { let _localctx: CommandOptionContext = new CommandOptionContext(this._ctx, this.state); - this.enterRule(_localctx, 68, esql_parser.RULE_commandOption); + this.enterRule(_localctx, 74, esql_parser.RULE_commandOption); try { this.enterOuterAlt(_localctx, 1); { - this.state = 429; + this.state = 457; this.identifier(); - this.state = 430; + this.state = 458; this.match(esql_parser.ASSIGN); - this.state = 431; + this.state = 459; this.constant(); } } @@ -2231,12 +2399,12 @@ export class esql_parser extends Parser { // @RuleVersion(0) public booleanValue(): BooleanValueContext { let _localctx: BooleanValueContext = new BooleanValueContext(this._ctx, this.state); - this.enterRule(_localctx, 70, esql_parser.RULE_booleanValue); + this.enterRule(_localctx, 76, esql_parser.RULE_booleanValue); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 433; + this.state = 461; _la = this._input.LA(1); if (!(_la === esql_parser.FALSE || _la === esql_parser.TRUE)) { this._errHandler.recoverInline(this); @@ -2267,15 +2435,15 @@ export class esql_parser extends Parser { // @RuleVersion(0) public numericValue(): NumericValueContext { let _localctx: NumericValueContext = new NumericValueContext(this._ctx, this.state); - this.enterRule(_localctx, 72, esql_parser.RULE_numericValue); + this.enterRule(_localctx, 78, esql_parser.RULE_numericValue); try { - this.state = 437; + this.state = 465; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 42, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 44, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 435; + this.state = 463; this.decimalValue(); } break; @@ -2283,7 +2451,7 @@ export class esql_parser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 436; + this.state = 464; this.integerValue(); } break; @@ -2306,17 +2474,17 @@ export class esql_parser extends Parser { // @RuleVersion(0) public decimalValue(): DecimalValueContext { let _localctx: DecimalValueContext = new DecimalValueContext(this._ctx, this.state); - this.enterRule(_localctx, 74, esql_parser.RULE_decimalValue); + this.enterRule(_localctx, 80, esql_parser.RULE_decimalValue); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 440; + this.state = 468; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === esql_parser.PLUS || _la === esql_parser.MINUS) { { - this.state = 439; + this.state = 467; _la = this._input.LA(1); if (!(_la === esql_parser.PLUS || _la === esql_parser.MINUS)) { this._errHandler.recoverInline(this); @@ -2331,7 +2499,7 @@ export class esql_parser extends Parser { } } - this.state = 442; + this.state = 470; this.match(esql_parser.DECIMAL_LITERAL); } } @@ -2352,17 +2520,17 @@ export class esql_parser extends Parser { // @RuleVersion(0) public integerValue(): IntegerValueContext { let _localctx: IntegerValueContext = new IntegerValueContext(this._ctx, this.state); - this.enterRule(_localctx, 76, esql_parser.RULE_integerValue); + this.enterRule(_localctx, 82, esql_parser.RULE_integerValue); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 445; + this.state = 473; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === esql_parser.PLUS || _la === esql_parser.MINUS) { { - this.state = 444; + this.state = 472; _la = this._input.LA(1); if (!(_la === esql_parser.PLUS || _la === esql_parser.MINUS)) { this._errHandler.recoverInline(this); @@ -2377,7 +2545,7 @@ export class esql_parser extends Parser { } } - this.state = 447; + this.state = 475; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2398,11 +2566,11 @@ export class esql_parser extends Parser { // @RuleVersion(0) public string(): StringContext { let _localctx: StringContext = new StringContext(this._ctx, this.state); - this.enterRule(_localctx, 78, esql_parser.RULE_string); + this.enterRule(_localctx, 84, esql_parser.RULE_string); try { this.enterOuterAlt(_localctx, 1); { - this.state = 449; + this.state = 477; this.match(esql_parser.STRING); } } @@ -2423,14 +2591,14 @@ export class esql_parser extends Parser { // @RuleVersion(0) public comparisonOperator(): ComparisonOperatorContext { let _localctx: ComparisonOperatorContext = new ComparisonOperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 80, esql_parser.RULE_comparisonOperator); + this.enterRule(_localctx, 86, esql_parser.RULE_comparisonOperator); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 451; + this.state = 479; _la = this._input.LA(1); - if (!(((((_la - 50)) & ~0x1F) === 0 && ((1 << (_la - 50)) & ((1 << (esql_parser.EQ - 50)) | (1 << (esql_parser.NEQ - 50)) | (1 << (esql_parser.LT - 50)) | (1 << (esql_parser.LTE - 50)) | (1 << (esql_parser.GT - 50)) | (1 << (esql_parser.GTE - 50)))) !== 0))) { + if (!(((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & ((1 << (esql_parser.EQ - 52)) | (1 << (esql_parser.NEQ - 52)) | (1 << (esql_parser.LT - 52)) | (1 << (esql_parser.LTE - 52)) | (1 << (esql_parser.GT - 52)) | (1 << (esql_parser.GTE - 52)))) !== 0))) { this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2457,20 +2625,76 @@ export class esql_parser extends Parser { return _localctx; } // @RuleVersion(0) + public explainCommand(): ExplainCommandContext { + let _localctx: ExplainCommandContext = new ExplainCommandContext(this._ctx, this.state); + this.enterRule(_localctx, 88, esql_parser.RULE_explainCommand); + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 481; + this.match(esql_parser.EXPLAIN); + this.state = 482; + this.subqueryExpression(); + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) + public subqueryExpression(): SubqueryExpressionContext { + let _localctx: SubqueryExpressionContext = new SubqueryExpressionContext(this._ctx, this.state); + this.enterRule(_localctx, 90, esql_parser.RULE_subqueryExpression); + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 484; + this.match(esql_parser.OPENING_BRACKET); + this.state = 485; + this.query(0); + this.state = 486; + this.match(esql_parser.CLOSING_BRACKET); + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) public showCommand(): ShowCommandContext { let _localctx: ShowCommandContext = new ShowCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 82, esql_parser.RULE_showCommand); + this.enterRule(_localctx, 92, esql_parser.RULE_showCommand); try { - this.state = 457; + this.state = 492; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 45, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 47, this._ctx) ) { case 1: _localctx = new ShowInfoContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 453; + this.state = 488; this.match(esql_parser.SHOW); - this.state = 454; + this.state = 489; this.match(esql_parser.INFO); } break; @@ -2479,9 +2703,9 @@ export class esql_parser extends Parser { _localctx = new ShowFunctionsContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 455; + this.state = 490; this.match(esql_parser.SHOW); - this.state = 456; + this.state = 491; this.match(esql_parser.FUNCTIONS); } break; @@ -2504,53 +2728,53 @@ export class esql_parser extends Parser { // @RuleVersion(0) public enrichCommand(): EnrichCommandContext { let _localctx: EnrichCommandContext = new EnrichCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 84, esql_parser.RULE_enrichCommand); + this.enterRule(_localctx, 94, esql_parser.RULE_enrichCommand); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 459; + this.state = 494; this.match(esql_parser.ENRICH); - this.state = 460; - _localctx._policyName = this.sourceIdentifier(); - this.state = 463; + this.state = 495; + _localctx._policyName = this.fromIdentifier(); + this.state = 498; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 46, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 48, this._ctx) ) { case 1: { - this.state = 461; + this.state = 496; this.match(esql_parser.ON); - this.state = 462; - _localctx._matchField = this.sourceIdentifier(); + this.state = 497; + _localctx._matchField = this.qualifiedNamePattern(); } break; } - this.state = 474; + this.state = 509; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 48, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 50, this._ctx) ) { case 1: { - this.state = 465; + this.state = 500; this.match(esql_parser.WITH); - this.state = 466; + this.state = 501; this.enrichWithClause(); - this.state = 471; + this.state = 506; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 467; + this.state = 502; this.match(esql_parser.COMMA); - this.state = 468; + this.state = 503; this.enrichWithClause(); } } } - this.state = 473; + this.state = 508; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } } break; @@ -2574,24 +2798,24 @@ export class esql_parser extends Parser { // @RuleVersion(0) public enrichWithClause(): EnrichWithClauseContext { let _localctx: EnrichWithClauseContext = new EnrichWithClauseContext(this._ctx, this.state); - this.enterRule(_localctx, 86, esql_parser.RULE_enrichWithClause); + this.enterRule(_localctx, 96, esql_parser.RULE_enrichWithClause); try { this.enterOuterAlt(_localctx, 1); { - this.state = 479; + this.state = 514; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 49, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 51, this._ctx) ) { case 1: { - this.state = 476; - _localctx._newName = this.sourceIdentifier(); - this.state = 477; + this.state = 511; + _localctx._newName = this.qualifiedNamePattern(); + this.state = 512; this.match(esql_parser.ASSIGN); } break; } - this.state = 481; - _localctx._enrichField = this.sourceIdentifier(); + this.state = 516; + _localctx._enrichField = this.qualifiedNamePattern(); } } catch (re) { @@ -2651,7 +2875,7 @@ export class esql_parser extends Parser { } public static readonly _serializedATN: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03N\u01E6\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03d\u0209\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + @@ -2659,233 +2883,249 @@ export class esql_parser extends Parser { "\x18\t\x18\x04\x19\t\x19\x04\x1A\t\x1A\x04\x1B\t\x1B\x04\x1C\t\x1C\x04" + "\x1D\t\x1D\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!\t!\x04\"\t\"\x04#" + "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t)\x04*\t*\x04+\t+" + - "\x04,\t,\x04-\t-\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03" + - "\x03\x03\x03\x03\x07\x03d\n\x03\f\x03\x0E\x03g\v\x03\x03\x04\x03\x04\x03" + - "\x04\x05\x04l\n\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05z\n\x05\x03\x06\x03" + - "\x06\x03\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05" + - "\x07\x86\n\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x07\x07\x8D\n\x07" + - "\f\x07\x0E\x07\x90\v\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07" + - "\x97\n\x07\x03\x07\x03\x07\x05\x07\x9B\n\x07\x03\x07\x03\x07\x03\x07\x03" + - "\x07\x03\x07\x03\x07\x07\x07\xA3\n\x07\f\x07\x0E\x07\xA6\v\x07\x03\b\x03" + - "\b\x05\b\xAA\n\b\x03\b\x03\b\x03\b\x03\b\x03\b\x05\b\xB1\n\b\x03\b\x03" + - "\b\x03\b\x05\b\xB6\n\b\x03\t\x03\t\x03\t\x03\t\x03\t\x05\t\xBD\n\t\x03" + - "\n\x03\n\x03\n\x03\n\x05\n\xC3\n\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n" + - "\x07\n\xCB\n\n\f\n\x0E\n\xCE\v\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03" + - "\v\x05\v\xD7\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x07\f\xDF\n\f\f\f" + - "\x0E\f\xE2\v\f\x05\f\xE4\n\f\x03\f\x03\f\x03\r\x03\r\x03\r\x03\x0E\x03" + - "\x0E\x03\x0E\x07\x0E\xEE\n\x0E\f\x0E\x0E\x0E\xF1\v\x0E\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x05\x0F\xF8\n\x0F\x03\x10\x03\x10\x03\x10\x03" + - "\x10\x07\x10\xFE\n\x10\f\x10\x0E\x10\u0101\v\x10\x03\x10\x05\x10\u0104" + - "\n\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x07\x11\u010B\n\x11\f\x11" + - "\x0E\x11\u010E\v\x11\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03\x13\x03" + - "\x13\x05\x13\u0117\n\x13\x03\x13\x03\x13\x05\x13\u011B\n\x13\x03\x14\x03" + - "\x14\x03\x14\x07\x14\u0120\n\x14\f\x14\x0E\x14\u0123\v\x14\x03\x15\x03" + - "\x15\x03\x16\x03\x16\x03\x16\x07\x16\u012A\n\x16\f\x16\x0E\x16\u012D\v" + - "\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u013E\n\x18" + - "\f\x18\x0E\x18\u0141\v\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x07\x18\u0149\n\x18\f\x18\x0E\x18\u014C\v\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0154\n\x18\f\x18\x0E\x18\u0157\v" + - "\x18\x03\x18\x03\x18\x05\x18\u015B\n\x18\x03\x19\x03\x19\x03\x19\x03\x1A" + - "\x03\x1A\x03\x1A\x03\x1A\x07\x1A\u0164\n\x1A\f\x1A\x0E\x1A\u0167\v\x1A" + - "\x03\x1B\x03\x1B\x05\x1B\u016B\n\x1B\x03\x1B\x03\x1B\x05\x1B\u016F\n\x1B" + - "\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x07\x1C\u0175\n\x1C\f\x1C\x0E\x1C\u0178" + - "\v\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x07\x1C\u017E\n\x1C\f\x1C\x0E\x1C" + - "\u0181\v\x1C\x05\x1C\u0183\n\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x07\x1D" + - "\u0189\n\x1D\f\x1D\x0E\x1D\u018C\v\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E" + - "\x07\x1E\u0192\n\x1E\f\x1E\x0E\x1E\u0195\v\x1E\x03\x1F\x03\x1F\x03\x1F" + - "\x03\x1F\x03 \x03 \x03 \x03 \x05 \u019F\n \x03!\x03!\x03!\x03!\x03\"\x03" + - "\"\x03\"\x03#\x03#\x03#\x07#\u01AB\n#\f#\x0E#\u01AE\v#\x03$\x03$\x03$" + - "\x03$\x03%\x03%\x03&\x03&\x05&\u01B8\n&\x03\'\x05\'\u01BB\n\'\x03\'\x03" + - "\'\x03(\x05(\u01C0\n(\x03(\x03(\x03)\x03)\x03*\x03*\x03+\x03+\x03+\x03" + - "+\x05+\u01CC\n+\x03,\x03,\x03,\x03,\x05,\u01D2\n,\x03,\x03,\x03,\x03," + - "\x07,\u01D8\n,\f,\x0E,\u01DB\v,\x05,\u01DD\n,\x03-\x03-\x03-\x05-\u01E2" + - "\n-\x03-\x03-\x03-\x02\x02\x05\x04\f\x12.\x02\x02\x04\x02\x06\x02\b\x02" + - "\n\x02\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C" + - "\x02\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026" + - "\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02" + - "R\x02T\x02V\x02X\x02\x02\n\x03\x02:;\x03\x02<>\x03\x02JK\x03\x02AB\x04" + - "\x02\x1D\x1D \x03\x02#$\x04\x02\"\"00\x03\x0249\x02\u0204\x02Z\x03\x02" + - "\x02\x02\x04]\x03\x02\x02\x02\x06k\x03\x02\x02\x02\by\x03\x02\x02\x02" + - "\n{\x03\x02\x02\x02\f\x9A\x03\x02\x02\x02\x0E\xB5\x03\x02\x02\x02\x10" + - "\xBC\x03\x02\x02\x02\x12\xC2\x03\x02\x02\x02\x14\xD6\x03\x02\x02\x02\x16" + - "\xD8\x03\x02\x02\x02\x18\xE7\x03\x02\x02\x02\x1A\xEA\x03\x02\x02\x02\x1C" + - "\xF7\x03\x02\x02\x02\x1E\xF9\x03\x02\x02\x02 \u0105\x03\x02\x02\x02\"" + - "\u0111\x03\x02\x02\x02$\u0114\x03\x02\x02\x02&\u011C\x03\x02\x02\x02(" + - "\u0124\x03\x02\x02\x02*\u0126\x03\x02\x02\x02,\u012E\x03\x02\x02\x02." + - "\u015A\x03\x02\x02\x020\u015C\x03\x02\x02\x022\u015F\x03\x02\x02\x024" + - "\u0168\x03\x02\x02\x026\u0182\x03\x02\x02\x028\u0184\x03\x02\x02\x02:" + - "\u018D\x03\x02\x02\x02<\u0196\x03\x02\x02\x02>\u019A\x03\x02\x02\x02@" + - "\u01A0\x03\x02\x02\x02B\u01A4\x03\x02\x02\x02D\u01A7\x03\x02\x02\x02F" + - "\u01AF\x03\x02\x02\x02H\u01B3\x03\x02\x02\x02J\u01B7\x03\x02\x02\x02L" + - "\u01BA\x03\x02\x02\x02N\u01BF\x03\x02\x02\x02P\u01C3\x03\x02\x02\x02R" + - "\u01C5\x03\x02\x02\x02T\u01CB\x03\x02\x02\x02V\u01CD\x03\x02\x02\x02X" + - "\u01E1\x03\x02\x02\x02Z[\x05\x04\x03\x02[\\\x07\x02\x02\x03\\\x03\x03" + - "\x02\x02\x02]^\b\x03\x01\x02^_\x05\x06\x04\x02_e\x03\x02\x02\x02`a\f\x03" + - "\x02\x02ab\x07\x17\x02\x02bd\x05\b\x05\x02c`\x03\x02\x02\x02dg\x03\x02" + - "\x02\x02ec\x03\x02\x02\x02ef\x03\x02\x02\x02f\x05\x03\x02\x02\x02ge\x03" + - "\x02\x02\x02hl\x05\x1E\x10\x02il\x05\x18\r\x02jl\x05T+\x02kh\x03\x02\x02" + - "\x02ki\x03\x02\x02\x02kj\x03\x02\x02\x02l\x07\x03\x02\x02\x02mz\x05\"" + - "\x12\x02nz\x050\x19\x02oz\x056\x1C\x02pz\x052\x1A\x02qz\x05$\x13\x02r" + - "z\x05\n\x06\x02sz\x058\x1D\x02tz\x05:\x1E\x02uz\x05> \x02vz\x05@!\x02" + - "wz\x05V,\x02xz\x05B\"\x02ym\x03\x02\x02\x02yn\x03\x02\x02\x02yo\x03\x02" + - "\x02\x02yp\x03\x02\x02\x02yq\x03\x02\x02\x02yr\x03\x02\x02\x02ys\x03\x02" + - "\x02\x02yt\x03\x02\x02\x02yu\x03\x02\x02\x02yv\x03\x02\x02\x02yw\x03\x02" + - "\x02\x02yx\x03\x02\x02\x02z\t\x03\x02\x02\x02{|\x07\x12\x02\x02|}\x05" + - "\f\x07\x02}\v\x03\x02\x02\x02~\x7F\b\x07\x01\x02\x7F\x80\x07)\x02\x02" + - "\x80\x9B\x05\f\x07\t\x81\x9B\x05\x10\t\x02\x82\x9B\x05\x0E\b\x02\x83\x85" + - "\x05\x10\t\x02\x84\x86\x07)\x02\x02\x85\x84\x03\x02\x02\x02\x85\x86\x03" + - "\x02\x02\x02\x86\x87\x03\x02\x02\x02\x87\x88\x07&\x02\x02\x88\x89\x07" + - "%\x02\x02\x89\x8E\x05\x10\t\x02\x8A\x8B\x07\x1F\x02\x02\x8B\x8D\x05\x10" + - "\t\x02\x8C\x8A\x03\x02\x02\x02\x8D\x90\x03\x02\x02\x02\x8E\x8C\x03\x02" + - "\x02\x02\x8E\x8F\x03\x02\x02\x02\x8F\x91\x03\x02\x02\x02\x90\x8E\x03\x02" + - "\x02\x02\x91\x92\x07/\x02\x02\x92\x9B\x03\x02\x02\x02\x93\x94\x05\x10" + - "\t\x02\x94\x96\x07\'\x02\x02\x95\x97\x07)\x02\x02\x96\x95\x03\x02\x02" + - "\x02\x96\x97\x03\x02\x02\x02\x97\x98\x03\x02\x02\x02\x98\x99\x07*\x02" + - "\x02\x99\x9B\x03\x02\x02\x02\x9A~\x03\x02\x02\x02\x9A\x81\x03\x02\x02" + - "\x02\x9A\x82\x03\x02\x02\x02\x9A\x83\x03\x02\x02\x02\x9A\x93\x03\x02\x02" + - "\x02\x9B\xA4\x03\x02\x02\x02\x9C\x9D\f\x06\x02\x02\x9D\x9E\x07\x1C\x02" + - "\x02\x9E\xA3\x05\f\x07\x07\x9F\xA0\f\x05\x02\x02\xA0\xA1\x07,\x02\x02" + - "\xA1\xA3\x05\f\x07\x06\xA2\x9C\x03\x02\x02\x02\xA2\x9F\x03\x02\x02\x02" + - "\xA3\xA6\x03\x02\x02\x02\xA4\xA2\x03\x02\x02\x02\xA4\xA5\x03\x02\x02\x02" + - "\xA5\r\x03\x02\x02\x02\xA6\xA4\x03\x02\x02\x02\xA7\xA9\x05\x10\t\x02\xA8" + - "\xAA\x07)\x02\x02\xA9\xA8\x03\x02\x02\x02\xA9\xAA\x03\x02\x02\x02\xAA" + - "\xAB\x03\x02\x02\x02\xAB\xAC\x07(\x02\x02\xAC\xAD\x05P)\x02\xAD\xB6\x03" + - "\x02\x02\x02\xAE\xB0\x05\x10\t\x02\xAF\xB1\x07)\x02\x02\xB0\xAF\x03\x02" + - "\x02\x02\xB0\xB1\x03\x02\x02\x02\xB1\xB2\x03\x02\x02\x02\xB2\xB3\x07." + - "\x02\x02\xB3\xB4\x05P)\x02\xB4\xB6\x03\x02\x02\x02\xB5\xA7\x03\x02\x02" + - "\x02\xB5\xAE\x03\x02\x02\x02\xB6\x0F\x03\x02\x02\x02\xB7\xBD\x05\x12\n" + - "\x02\xB8\xB9\x05\x12\n\x02\xB9\xBA\x05R*\x02\xBA\xBB\x05\x12\n\x02\xBB" + - "\xBD\x03\x02\x02\x02\xBC\xB7\x03\x02\x02\x02\xBC\xB8\x03\x02\x02\x02\xBD" + - "\x11\x03\x02\x02\x02\xBE\xBF\b\n\x01\x02\xBF\xC3\x05\x14\v\x02\xC0\xC1" + - "\t\x02\x02\x02\xC1\xC3\x05\x12\n\x05\xC2\xBE\x03\x02\x02\x02\xC2\xC0\x03" + - "\x02\x02\x02\xC3\xCC\x03\x02\x02\x02\xC4\xC5\f\x04\x02\x02\xC5\xC6\t\x03" + - "\x02\x02\xC6\xCB\x05\x12\n\x05\xC7\xC8\f\x03\x02\x02\xC8\xC9\t\x02\x02" + - "\x02\xC9\xCB\x05\x12\n\x04\xCA\xC4\x03\x02\x02\x02\xCA\xC7\x03\x02\x02" + - "\x02\xCB\xCE\x03\x02\x02\x02\xCC\xCA\x03\x02\x02\x02\xCC\xCD\x03\x02\x02" + - "\x02\xCD\x13\x03\x02\x02\x02\xCE\xCC\x03\x02\x02\x02\xCF\xD7\x05.\x18" + - "\x02\xD0\xD7\x05*\x16\x02\xD1\xD7\x05\x16\f\x02\xD2\xD3\x07%\x02\x02\xD3" + - "\xD4\x05\f\x07\x02\xD4\xD5\x07/\x02\x02\xD5\xD7\x03\x02\x02\x02\xD6\xCF" + - "\x03\x02\x02\x02\xD6\xD0\x03\x02\x02\x02\xD6\xD1\x03\x02\x02\x02\xD6\xD2" + - "\x03\x02\x02\x02\xD7\x15\x03\x02\x02\x02\xD8\xD9\x05,\x17\x02\xD9\xE3" + - "\x07%\x02\x02\xDA\xE4\x07<\x02\x02\xDB\xE0\x05\f\x07\x02\xDC\xDD\x07\x1F" + - "\x02\x02\xDD\xDF\x05\f\x07\x02\xDE\xDC\x03\x02\x02\x02\xDF\xE2\x03\x02" + - "\x02\x02\xE0\xDE\x03\x02\x02\x02\xE0\xE1\x03\x02\x02\x02\xE1\xE4\x03\x02" + - "\x02\x02\xE2\xE0\x03\x02\x02\x02\xE3\xDA\x03\x02\x02\x02\xE3\xDB\x03\x02" + - "\x02\x02\xE3\xE4\x03\x02\x02\x02\xE4\xE5\x03\x02\x02\x02\xE5\xE6\x07/" + - "\x02\x02\xE6\x17\x03\x02\x02\x02\xE7\xE8\x07\x0E\x02\x02\xE8\xE9\x05\x1A" + - "\x0E\x02\xE9\x19\x03\x02\x02\x02\xEA\xEF\x05\x1C\x0F\x02\xEB\xEC\x07\x1F" + - "\x02\x02\xEC\xEE\x05\x1C\x0F\x02\xED\xEB\x03\x02\x02\x02\xEE\xF1\x03\x02" + - "\x02\x02\xEF\xED\x03\x02\x02\x02\xEF\xF0\x03\x02\x02\x02\xF0\x1B\x03\x02" + - "\x02\x02\xF1\xEF\x03\x02\x02\x02\xF2\xF8\x05\f\x07\x02\xF3\xF4\x05*\x16" + - "\x02\xF4\xF5\x07\x1E\x02\x02\xF5\xF6\x05\f\x07\x02\xF6\xF8\x03\x02\x02" + - "\x02\xF7\xF2\x03\x02\x02\x02\xF7\xF3\x03\x02\x02\x02\xF8\x1D\x03\x02\x02" + - "\x02\xF9\xFA\x07\x07\x02\x02\xFA\xFF\x05(\x15\x02\xFB\xFC\x07\x1F\x02" + - "\x02\xFC\xFE\x05(\x15\x02\xFD\xFB\x03\x02\x02\x02\xFE\u0101\x03\x02\x02" + - "\x02\xFF\xFD\x03\x02\x02\x02\xFF\u0100\x03\x02\x02\x02\u0100\u0103\x03" + - "\x02\x02\x02\u0101\xFF\x03\x02\x02\x02\u0102\u0104\x05 \x11\x02\u0103" + - "\u0102\x03\x02\x02\x02\u0103\u0104\x03\x02\x02\x02\u0104\x1F\x03\x02\x02" + - "\x02\u0105\u0106\x07?\x02\x02\u0106\u0107\x07G\x02\x02\u0107\u010C\x05" + - "(\x15\x02\u0108\u0109\x07\x1F\x02\x02\u0109\u010B\x05(\x15\x02\u010A\u0108" + - "\x03\x02\x02\x02\u010B\u010E\x03\x02\x02\x02\u010C\u010A\x03\x02\x02\x02" + - "\u010C\u010D\x03\x02\x02\x02\u010D\u010F\x03\x02\x02\x02\u010E\u010C\x03" + - "\x02\x02\x02\u010F\u0110\x07@\x02\x02\u0110!\x03\x02\x02\x02\u0111\u0112" + - "\x07\x06\x02\x02\u0112\u0113\x05\x1A\x0E\x02\u0113#\x03\x02\x02\x02\u0114" + - "\u0116\x07\x11\x02\x02\u0115\u0117\x05\x1A\x0E\x02\u0116\u0115\x03\x02" + - "\x02\x02\u0116\u0117\x03\x02\x02\x02\u0117\u011A\x03\x02\x02\x02\u0118" + - "\u0119\x07\x1B\x02\x02\u0119\u011B\x05&\x14\x02\u011A\u0118\x03\x02\x02" + - "\x02\u011A\u011B\x03\x02\x02\x02\u011B%\x03\x02\x02\x02\u011C\u0121\x05" + - "*\x16\x02\u011D\u011E\x07\x1F\x02\x02\u011E\u0120\x05*\x16\x02\u011F\u011D" + - "\x03\x02\x02\x02\u0120\u0123\x03\x02\x02\x02\u0121\u011F\x03\x02\x02\x02" + - "\u0121\u0122\x03\x02\x02\x02\u0122\'\x03\x02\x02\x02\u0123\u0121\x03\x02" + - "\x02\x02\u0124\u0125\t\x04\x02\x02\u0125)\x03\x02\x02\x02\u0126\u012B" + - "\x05,\x17\x02\u0127\u0128\x07!\x02\x02\u0128\u012A\x05,\x17\x02\u0129" + - "\u0127\x03\x02\x02\x02\u012A\u012D\x03\x02\x02\x02\u012B\u0129\x03\x02" + - "\x02\x02\u012B\u012C\x03\x02\x02\x02\u012C+\x03\x02\x02\x02\u012D\u012B" + - "\x03\x02\x02\x02\u012E\u012F\t\x05\x02\x02\u012F-\x03\x02\x02\x02\u0130" + - "\u015B\x07*\x02\x02\u0131\u0132\x05N(\x02\u0132\u0133\x07A\x02\x02\u0133" + - "\u015B\x03\x02\x02\x02\u0134\u015B\x05L\'\x02\u0135\u015B\x05N(\x02\u0136" + - "\u015B\x05H%\x02\u0137\u015B\x07-\x02\x02\u0138\u015B\x05P)\x02\u0139" + - "\u013A\x07?\x02\x02\u013A\u013F\x05J&\x02\u013B\u013C\x07\x1F\x02\x02" + - "\u013C\u013E\x05J&\x02\u013D\u013B\x03\x02\x02\x02\u013E\u0141\x03\x02" + - "\x02\x02\u013F\u013D\x03\x02\x02\x02\u013F\u0140\x03\x02\x02\x02\u0140" + - "\u0142\x03\x02\x02\x02\u0141\u013F\x03\x02\x02\x02\u0142\u0143\x07@\x02" + - "\x02\u0143\u015B\x03\x02\x02\x02\u0144\u0145\x07?\x02\x02\u0145\u014A" + - "\x05H%\x02\u0146\u0147\x07\x1F\x02\x02\u0147\u0149\x05H%\x02\u0148\u0146" + - "\x03\x02\x02\x02\u0149\u014C\x03\x02\x02\x02\u014A\u0148\x03\x02\x02\x02" + - "\u014A\u014B\x03\x02\x02\x02\u014B\u014D\x03\x02\x02\x02\u014C\u014A\x03" + - "\x02\x02\x02\u014D\u014E\x07@\x02\x02\u014E\u015B\x03\x02\x02\x02\u014F" + - "\u0150\x07?\x02\x02\u0150\u0155\x05P)\x02\u0151\u0152\x07\x1F\x02\x02" + - "\u0152\u0154\x05P)\x02\u0153\u0151\x03\x02\x02\x02\u0154\u0157\x03\x02" + - "\x02\x02\u0155\u0153\x03\x02\x02\x02\u0155\u0156\x03\x02\x02\x02\u0156" + - "\u0158\x03\x02\x02\x02\u0157\u0155\x03\x02\x02\x02\u0158\u0159\x07@\x02" + - "\x02\u0159\u015B\x03\x02\x02\x02\u015A\u0130\x03\x02\x02\x02\u015A\u0131" + - "\x03\x02\x02\x02\u015A\u0134\x03\x02\x02\x02\u015A\u0135\x03\x02\x02\x02" + - "\u015A\u0136\x03\x02\x02\x02\u015A\u0137\x03\x02\x02\x02\u015A\u0138\x03" + - "\x02\x02\x02\u015A\u0139\x03\x02\x02\x02\u015A\u0144\x03\x02\x02\x02\u015A" + - "\u014F\x03\x02\x02\x02\u015B/\x03\x02\x02\x02\u015C\u015D\x07\n\x02\x02" + - "\u015D\u015E\x07\x19\x02\x02\u015E1\x03\x02\x02\x02\u015F\u0160\x07\x10" + - "\x02\x02\u0160\u0165\x054\x1B\x02\u0161\u0162\x07\x1F\x02\x02\u0162\u0164" + - "\x054\x1B\x02\u0163\u0161\x03\x02\x02\x02\u0164\u0167\x03\x02\x02\x02" + - "\u0165\u0163\x03\x02\x02\x02\u0165\u0166\x03\x02\x02\x02\u01663\x03\x02" + - "\x02\x02\u0167\u0165\x03\x02\x02\x02\u0168\u016A\x05\f\x07\x02\u0169\u016B" + - "\t\x06\x02\x02\u016A\u0169\x03\x02\x02\x02\u016A\u016B\x03\x02\x02\x02" + - "\u016B\u016E\x03\x02\x02\x02\u016C\u016D\x07+\x02\x02\u016D\u016F\t\x07" + - "\x02\x02\u016E\u016C\x03\x02\x02\x02\u016E\u016F\x03\x02\x02\x02\u016F" + - "5\x03\x02\x02\x02\u0170\u0171\x07\t\x02\x02\u0171\u0176\x05(\x15\x02\u0172" + - "\u0173\x07\x1F\x02\x02\u0173\u0175\x05(\x15\x02\u0174\u0172\x03\x02\x02" + - "\x02\u0175\u0178\x03\x02\x02\x02\u0176\u0174\x03\x02\x02\x02\u0176\u0177" + - "\x03\x02\x02\x02\u0177\u0183\x03\x02\x02\x02\u0178\u0176\x03\x02\x02\x02" + - "\u0179\u017A\x07\f\x02\x02\u017A\u017F\x05(\x15\x02\u017B\u017C\x07\x1F" + - "\x02\x02\u017C\u017E\x05(\x15\x02\u017D\u017B\x03\x02\x02\x02\u017E\u0181" + - "\x03\x02\x02\x02\u017F\u017D\x03\x02\x02\x02\u017F\u0180\x03\x02\x02\x02" + - "\u0180\u0183\x03\x02\x02\x02\u0181\u017F\x03\x02\x02\x02\u0182\u0170\x03" + - "\x02\x02\x02\u0182\u0179\x03\x02\x02\x02\u01837\x03\x02\x02\x02\u0184" + - "\u0185\x07\x04\x02\x02\u0185\u018A\x05(\x15\x02\u0186\u0187\x07\x1F\x02" + - "\x02\u0187\u0189\x05(\x15\x02\u0188\u0186\x03\x02\x02\x02\u0189\u018C" + - "\x03\x02\x02\x02\u018A\u0188\x03\x02\x02\x02\u018A\u018B\x03\x02\x02\x02" + - "\u018B9\x03\x02\x02\x02\u018C\u018A\x03\x02\x02\x02\u018D\u018E\x07\r" + - "\x02\x02\u018E\u0193\x05<\x1F\x02\u018F\u0190\x07\x1F\x02\x02\u0190\u0192" + - "\x05<\x1F\x02\u0191\u018F\x03\x02\x02\x02\u0192\u0195\x03\x02\x02\x02" + - "\u0193\u0191\x03\x02\x02\x02\u0193\u0194\x03\x02\x02\x02\u0194;\x03\x02" + - "\x02\x02\u0195\u0193\x03\x02\x02\x02\u0196\u0197\x05(\x15\x02\u0197\u0198" + - "\x07F\x02\x02\u0198\u0199\x05(\x15\x02\u0199=\x03\x02\x02\x02\u019A\u019B" + - "\x07\x03\x02\x02\u019B\u019C\x05\x14\v\x02\u019C\u019E\x05P)\x02\u019D" + - "\u019F\x05D#\x02\u019E\u019D\x03\x02\x02\x02\u019E\u019F\x03\x02\x02\x02" + - "\u019F?\x03\x02\x02\x02\u01A0\u01A1\x07\b\x02\x02\u01A1\u01A2\x05\x14" + - "\v\x02\u01A2\u01A3\x05P)\x02\u01A3A\x03\x02\x02\x02\u01A4\u01A5\x07\v" + - "\x02\x02\u01A5\u01A6\x05(\x15\x02\u01A6C\x03\x02\x02\x02\u01A7\u01AC\x05" + - "F$\x02\u01A8\u01A9\x07\x1F\x02\x02\u01A9\u01AB\x05F$\x02\u01AA\u01A8\x03" + - "\x02\x02\x02\u01AB\u01AE\x03\x02\x02\x02\u01AC\u01AA\x03\x02\x02\x02\u01AC" + - "\u01AD\x03\x02\x02\x02\u01ADE\x03\x02\x02\x02\u01AE\u01AC\x03\x02\x02" + - "\x02\u01AF\u01B0\x05,\x17\x02\u01B0\u01B1\x07\x1E\x02\x02\u01B1\u01B2" + - "\x05.\x18\x02\u01B2G\x03\x02\x02\x02\u01B3\u01B4\t\b\x02\x02\u01B4I\x03" + - "\x02\x02\x02\u01B5\u01B8\x05L\'\x02\u01B6\u01B8\x05N(\x02\u01B7\u01B5" + - "\x03\x02\x02\x02\u01B7\u01B6\x03\x02\x02\x02\u01B8K\x03\x02\x02\x02\u01B9" + - "\u01BB\t\x02\x02\x02\u01BA\u01B9\x03\x02\x02\x02\u01BA\u01BB\x03\x02\x02" + - "\x02\u01BB\u01BC\x03\x02\x02\x02\u01BC\u01BD\x07\x1A\x02\x02\u01BDM\x03" + - "\x02\x02\x02\u01BE\u01C0\t\x02\x02\x02\u01BF\u01BE\x03\x02\x02\x02\u01BF" + - "\u01C0\x03\x02\x02\x02\u01C0\u01C1\x03\x02\x02\x02\u01C1\u01C2\x07\x19" + - "\x02\x02\u01C2O\x03\x02\x02\x02\u01C3\u01C4\x07\x18\x02\x02\u01C4Q\x03" + - "\x02\x02\x02\u01C5\u01C6\t\t\x02\x02\u01C6S\x03\x02\x02\x02\u01C7\u01C8" + - "\x07\x0F\x02\x02\u01C8\u01CC\x071\x02\x02\u01C9\u01CA\x07\x0F\x02\x02" + - "\u01CA\u01CC\x072\x02\x02\u01CB\u01C7\x03\x02\x02\x02\u01CB\u01C9\x03" + - "\x02\x02\x02\u01CCU\x03\x02\x02\x02\u01CD\u01CE\x07\x05\x02\x02\u01CE" + - "\u01D1\x05(\x15\x02\u01CF\u01D0\x07H\x02\x02\u01D0\u01D2\x05(\x15\x02" + - "\u01D1\u01CF\x03\x02\x02\x02\u01D1\u01D2\x03\x02\x02\x02\u01D2\u01DC\x03" + - "\x02\x02\x02\u01D3\u01D4\x07I\x02\x02\u01D4\u01D9\x05X-\x02\u01D5\u01D6" + - "\x07\x1F\x02\x02\u01D6\u01D8\x05X-\x02\u01D7\u01D5\x03\x02\x02\x02\u01D8" + - "\u01DB\x03\x02\x02\x02\u01D9\u01D7\x03\x02\x02\x02\u01D9\u01DA\x03\x02" + - "\x02\x02\u01DA\u01DD\x03\x02\x02\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC" + - "\u01D3\x03\x02\x02\x02\u01DC\u01DD\x03\x02\x02\x02\u01DDW\x03\x02\x02" + - "\x02\u01DE\u01DF\x05(\x15\x02\u01DF\u01E0\x07\x1E\x02\x02\u01E0\u01E2" + - "\x03\x02\x02\x02\u01E1\u01DE\x03\x02\x02\x02\u01E1\u01E2\x03\x02\x02\x02" + - "\u01E2\u01E3\x03\x02\x02\x02\u01E3\u01E4\x05(\x15\x02\u01E4Y\x03\x02\x02" + - "\x024eky\x85\x8E\x96\x9A\xA2\xA4\xA9\xB0\xB5\xBC\xC2\xCA\xCC\xD6\xE0\xE3" + - "\xEF\xF7\xFF\u0103\u010C\u0116\u011A\u0121\u012B\u013F\u014A\u0155\u015A" + - "\u0165\u016A\u016E\u0176\u017F\u0182\u018A\u0193\u019E\u01AC\u01B7\u01BA" + - "\u01BF\u01CB\u01D1\u01D9\u01DC\u01E1"; + "\x04,\t,\x04-\t-\x04.\t.\x04/\t/\x040\t0\x041\t1\x042\t2\x03\x02\x03\x02" + + "\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03n\n\x03" + + "\f\x03\x0E\x03q\v\x03\x03\x04\x03\x04\x03\x04\x03\x04\x05\x04w\n\x04\x03" + + "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + + "\x05\x03\x05\x03\x05\x03\x05\x05\x05\x86\n\x05\x03\x06\x03\x06\x03\x06" + + "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\x92\n" + + "\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x07\x07\x99\n\x07\f\x07\x0E" + + "\x07\x9C\v\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\xA3\n\x07" + + "\x03\x07\x03\x07\x05\x07\xA7\n\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + + "\x07\x03\x07\x07\x07\xAF\n\x07\f\x07\x0E\x07\xB2\v\x07\x03\b\x03\b\x05" + + "\b\xB6\n\b\x03\b\x03\b\x03\b\x03\b\x03\b\x05\b\xBD\n\b\x03\b\x03\b\x03" + + "\b\x05\b\xC2\n\b\x03\t\x03\t\x03\t\x03\t\x03\t\x05\t\xC9\n\t\x03\n\x03" + + "\n\x03\n\x03\n\x05\n\xCF\n\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x07\n" + + "\xD7\n\n\f\n\x0E\n\xDA\v\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x05" + + "\v\xE3\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x07\f\xEB\n\f\f\f\x0E\f" + + "\xEE\v\f\x05\f\xF0\n\f\x03\f\x03\f\x03\r\x03\r\x03\r\x03\x0E\x03\x0E\x03" + + "\x0E\x07\x0E\xFA\n\x0E\f\x0E\x0E\x0E\xFD\v\x0E\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x05\x0F\u0104\n\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x07" + + "\x10\u010A\n\x10\f\x10\x0E\x10\u010D\v\x10\x03\x10\x05\x10\u0110\n\x10" + + "\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x07\x11\u0117\n\x11\f\x11\x0E" + + "\x11\u011A\v\x11\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03\x13\x03\x13" + + "\x05\x13\u0123\n\x13\x03\x13\x03\x13\x05\x13\u0127\n\x13\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x05\x14\u012D\n\x14\x03\x15\x03\x15\x03\x15\x07\x15\u0132" + + "\n\x15\f\x15\x0E\x15\u0135\v\x15\x03\x16\x03\x16\x03\x17\x03\x17\x03\x17" + + "\x07\x17\u013C\n\x17\f\x17\x0E\x17\u013F\v\x17\x03\x18\x03\x18\x03\x18" + + "\x07\x18\u0144\n\x18\f\x18\x0E\x18\u0147\v\x18\x03\x19\x03\x19\x03\x1A" + + "\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B" + + "\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x07\x1B\u015A\n\x1B\f\x1B\x0E" + + "\x1B\u015D\v\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x07\x1B" + + "\u0165\n\x1B\f\x1B\x0E\x1B\u0168\v\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B" + + "\x03\x1B\x03\x1B\x07\x1B\u0170\n\x1B\f\x1B\x0E\x1B\u0173\v\x1B\x03\x1B" + + "\x03\x1B\x05\x1B\u0177\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x03" + + "\x1D\x03\x1D\x07\x1D\u0180\n\x1D\f\x1D\x0E\x1D\u0183\v\x1D\x03\x1E\x03" + + "\x1E\x05\x1E\u0187\n\x1E\x03\x1E\x03\x1E\x05\x1E\u018B\n\x1E\x03\x1F\x03" + + "\x1F\x03\x1F\x03\x1F\x07\x1F\u0191\n\x1F\f\x1F\x0E\x1F\u0194\v\x1F\x03" + + "\x1F\x03\x1F\x03\x1F\x03\x1F\x07\x1F\u019A\n\x1F\f\x1F\x0E\x1F\u019D\v" + + "\x1F\x05\x1F\u019F\n\x1F\x03 \x03 \x03 \x03 \x07 \u01A5\n \f \x0E \u01A8" + + "\v \x03!\x03!\x03!\x03!\x07!\u01AE\n!\f!\x0E!\u01B1\v!\x03\"\x03\"\x03" + + "\"\x03\"\x03#\x03#\x03#\x03#\x05#\u01BB\n#\x03$\x03$\x03$\x03$\x03%\x03" + + "%\x03%\x03&\x03&\x03&\x07&\u01C7\n&\f&\x0E&\u01CA\v&\x03\'\x03\'\x03\'" + + "\x03\'\x03(\x03(\x03)\x03)\x05)\u01D4\n)\x03*\x05*\u01D7\n*\x03*\x03*" + + "\x03+\x05+\u01DC\n+\x03+\x03+\x03,\x03,\x03-\x03-\x03.\x03.\x03.\x03/" + + "\x03/\x03/\x03/\x030\x030\x030\x030\x050\u01EF\n0\x031\x031\x031\x031" + + "\x051\u01F5\n1\x031\x031\x031\x031\x071\u01FB\n1\f1\x0E1\u01FE\v1\x05" + + "1\u0200\n1\x032\x032\x032\x052\u0205\n2\x032\x032\x032\x02\x02\x05\x04" + + "\f\x123\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02\x12" + + "\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02&" + + "\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02" + + "B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02T\x02V\x02X\x02Z\x02\\\x02" + + "^\x02`\x02b\x02\x02\v\x03\x02<=\x03\x02>@\x04\x02DDII\x03\x02CD\x04\x02" + + "DDMM\x04\x02\"\"%%\x03\x02()\x04\x02\'\'55\x03\x026;\x02\u0226\x02d\x03" + + "\x02\x02\x02\x04g\x03\x02\x02\x02\x06v\x03\x02\x02\x02\b\x85\x03\x02\x02" + + "\x02\n\x87\x03\x02\x02\x02\f\xA6\x03\x02\x02\x02\x0E\xC1\x03\x02\x02\x02" + + "\x10\xC8\x03\x02\x02\x02\x12\xCE\x03\x02\x02\x02\x14\xE2\x03\x02\x02\x02" + + "\x16\xE4\x03\x02\x02\x02\x18\xF3\x03\x02\x02\x02\x1A\xF6\x03\x02\x02\x02" + + "\x1C\u0103\x03\x02\x02\x02\x1E\u0105\x03\x02\x02\x02 \u0111\x03\x02\x02" + + "\x02\"\u011D\x03\x02\x02\x02$\u0120\x03\x02\x02\x02&\u0128\x03\x02\x02" + + "\x02(\u012E\x03\x02\x02\x02*\u0136\x03\x02\x02\x02,\u0138\x03\x02\x02" + + "\x02.\u0140\x03\x02\x02\x020\u0148\x03\x02\x02\x022\u014A\x03\x02\x02" + + "\x024\u0176\x03\x02\x02\x026\u0178\x03\x02\x02\x028\u017B\x03\x02\x02" + + "\x02:\u0184\x03\x02\x02\x02<\u019E\x03\x02\x02\x02>\u01A0\x03\x02\x02" + + "\x02@\u01A9\x03\x02\x02\x02B\u01B2\x03\x02\x02\x02D\u01B6\x03\x02\x02" + + "\x02F\u01BC\x03\x02\x02\x02H\u01C0\x03\x02\x02\x02J\u01C3\x03\x02\x02" + + "\x02L\u01CB\x03\x02\x02\x02N\u01CF\x03\x02\x02\x02P\u01D3\x03\x02\x02" + + "\x02R\u01D6\x03\x02\x02\x02T\u01DB\x03\x02\x02\x02V\u01DF\x03\x02\x02" + + "\x02X\u01E1\x03\x02\x02\x02Z\u01E3\x03\x02\x02\x02\\\u01E6\x03\x02\x02" + + "\x02^\u01EE\x03\x02\x02\x02`\u01F0\x03\x02\x02\x02b\u0204\x03\x02\x02" + + "\x02de\x05\x04\x03\x02ef\x07\x02\x02\x03f\x03\x03\x02\x02\x02gh\b\x03" + + "\x01\x02hi\x05\x06\x04\x02io\x03\x02\x02\x02jk\f\x03\x02\x02kl\x07\x1C" + + "\x02\x02ln\x05\b\x05\x02mj\x03\x02\x02\x02nq\x03\x02\x02\x02om\x03\x02" + + "\x02\x02op\x03\x02\x02\x02p\x05\x03\x02\x02\x02qo\x03\x02\x02\x02rw\x05" + + "Z.\x02sw\x05\x1E\x10\x02tw\x05\x18\r\x02uw\x05^0\x02vr\x03\x02\x02\x02" + + "vs\x03\x02\x02\x02vt\x03\x02\x02\x02vu\x03\x02\x02\x02w\x07\x03\x02\x02" + + "\x02x\x86\x05\"\x12\x02y\x86\x05&\x14\x02z\x86\x056\x1C\x02{\x86\x05<" + + "\x1F\x02|\x86\x058\x1D\x02}\x86\x05$\x13\x02~\x86\x05\n\x06\x02\x7F\x86" + + "\x05> \x02\x80\x86\x05@!\x02\x81\x86\x05D#\x02\x82\x86\x05F$\x02\x83\x86" + + "\x05`1\x02\x84\x86\x05H%\x02\x85x\x03\x02\x02\x02\x85y\x03\x02\x02\x02" + + "\x85z\x03\x02\x02\x02\x85{\x03\x02\x02\x02\x85|\x03\x02\x02\x02\x85}\x03" + + "\x02\x02\x02\x85~\x03\x02\x02\x02\x85\x7F\x03\x02\x02\x02\x85\x80\x03" + + "\x02\x02\x02\x85\x81\x03\x02\x02\x02\x85\x82\x03\x02\x02\x02\x85\x83\x03" + + "\x02\x02\x02\x85\x84\x03\x02\x02\x02\x86\t\x03\x02\x02\x02\x87\x88\x07" + + "\x14\x02\x02\x88\x89\x05\f\x07\x02\x89\v\x03\x02\x02\x02\x8A\x8B\b\x07" + + "\x01\x02\x8B\x8C\x07.\x02\x02\x8C\xA7\x05\f\x07\t\x8D\xA7\x05\x10\t\x02" + + "\x8E\xA7\x05\x0E\b\x02\x8F\x91\x05\x10\t\x02\x90\x92\x07.\x02\x02\x91" + + "\x90\x03\x02\x02\x02\x91\x92\x03\x02\x02\x02\x92\x93\x03\x02\x02\x02\x93" + + "\x94\x07+\x02\x02\x94\x95\x07*\x02\x02\x95\x9A\x05\x10\t\x02\x96\x97\x07" + + "$\x02\x02\x97\x99\x05\x10\t\x02\x98\x96\x03\x02\x02\x02\x99\x9C\x03\x02" + + "\x02\x02\x9A\x98\x03\x02\x02\x02\x9A\x9B\x03\x02\x02\x02\x9B\x9D\x03\x02" + + "\x02\x02\x9C\x9A\x03\x02\x02\x02\x9D\x9E\x074\x02\x02\x9E\xA7\x03\x02" + + "\x02\x02\x9F\xA0\x05\x10\t\x02\xA0\xA2\x07,\x02\x02\xA1\xA3\x07.\x02\x02" + + "\xA2\xA1\x03\x02\x02\x02\xA2\xA3\x03\x02\x02\x02\xA3\xA4\x03\x02\x02\x02" + + "\xA4\xA5\x07/\x02\x02\xA5\xA7\x03\x02\x02\x02\xA6\x8A\x03\x02\x02\x02" + + "\xA6\x8D\x03\x02\x02\x02\xA6\x8E\x03\x02\x02\x02\xA6\x8F\x03\x02\x02\x02" + + "\xA6\x9F\x03\x02\x02\x02\xA7\xB0\x03\x02\x02\x02\xA8\xA9\f\x06\x02\x02" + + "\xA9\xAA\x07!\x02\x02\xAA\xAF\x05\f\x07\x07\xAB\xAC\f\x05\x02\x02\xAC" + + "\xAD\x071\x02\x02\xAD\xAF\x05\f\x07\x06\xAE\xA8\x03\x02\x02\x02\xAE\xAB" + + "\x03\x02\x02\x02\xAF\xB2\x03\x02\x02\x02\xB0\xAE\x03\x02\x02\x02\xB0\xB1" + + "\x03\x02\x02\x02\xB1\r\x03\x02\x02\x02\xB2\xB0\x03\x02\x02\x02\xB3\xB5" + + "\x05\x10\t\x02\xB4\xB6\x07.\x02\x02\xB5\xB4\x03\x02\x02\x02\xB5\xB6\x03" + + "\x02\x02\x02\xB6\xB7\x03\x02\x02\x02\xB7\xB8\x07-\x02\x02\xB8\xB9\x05" + + "V,\x02\xB9\xC2\x03\x02\x02\x02\xBA\xBC\x05\x10\t\x02\xBB\xBD\x07.\x02" + + "\x02\xBC\xBB\x03\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBE\x03\x02\x02" + + "\x02\xBE\xBF\x073\x02\x02\xBF\xC0\x05V,\x02\xC0\xC2\x03\x02\x02\x02\xC1" + + "\xB3\x03\x02\x02\x02\xC1\xBA\x03\x02\x02\x02\xC2\x0F\x03\x02\x02\x02\xC3" + + "\xC9\x05\x12\n\x02\xC4\xC5\x05\x12\n\x02\xC5\xC6\x05X-\x02\xC6\xC7\x05" + + "\x12\n\x02\xC7\xC9\x03\x02\x02\x02\xC8\xC3\x03\x02\x02\x02\xC8\xC4\x03" + + "\x02\x02\x02\xC9\x11\x03\x02\x02\x02\xCA\xCB\b\n\x01\x02\xCB\xCF\x05\x14" + + "\v\x02\xCC\xCD\t\x02\x02\x02\xCD\xCF\x05\x12\n\x05\xCE\xCA\x03\x02\x02" + + "\x02\xCE\xCC\x03\x02\x02\x02\xCF\xD8\x03\x02\x02\x02\xD0\xD1\f\x04\x02" + + "\x02\xD1\xD2\t\x03\x02\x02\xD2\xD7\x05\x12\n\x05\xD3\xD4\f\x03\x02\x02" + + "\xD4\xD5\t\x02\x02\x02\xD5\xD7\x05\x12\n\x04\xD6\xD0\x03\x02\x02\x02\xD6" + + "\xD3\x03\x02\x02\x02\xD7\xDA\x03\x02\x02\x02\xD8\xD6\x03\x02\x02\x02\xD8" + + "\xD9\x03\x02\x02\x02\xD9\x13\x03\x02\x02\x02\xDA\xD8\x03\x02\x02\x02\xDB" + + "\xE3\x054\x1B\x02\xDC\xE3\x05,\x17\x02\xDD\xE3\x05\x16\f\x02\xDE\xDF\x07" + + "*\x02\x02\xDF\xE0\x05\f\x07\x02\xE0\xE1\x074\x02\x02\xE1\xE3\x03\x02\x02" + + "\x02\xE2\xDB\x03\x02\x02\x02\xE2\xDC\x03\x02\x02\x02\xE2\xDD\x03\x02\x02" + + "\x02\xE2\xDE\x03\x02\x02\x02\xE3\x15\x03\x02\x02\x02\xE4\xE5\x050\x19" + + "\x02\xE5\xEF\x07*\x02\x02\xE6\xF0\x07>\x02\x02\xE7\xEC\x05\f\x07\x02\xE8" + + "\xE9\x07$\x02\x02\xE9\xEB\x05\f\x07\x02\xEA\xE8\x03\x02\x02\x02\xEB\xEE" + + "\x03\x02\x02\x02\xEC\xEA\x03\x02\x02\x02\xEC\xED\x03\x02\x02\x02\xED\xF0" + + "\x03\x02\x02\x02\xEE\xEC\x03\x02\x02\x02\xEF\xE6\x03\x02\x02\x02\xEF\xE7" + + "\x03\x02\x02\x02\xEF\xF0\x03\x02\x02\x02\xF0\xF1\x03\x02\x02\x02\xF1\xF2" + + "\x074\x02\x02\xF2\x17\x03\x02\x02\x02\xF3\xF4\x07\x10\x02\x02\xF4\xF5" + + "\x05\x1A\x0E\x02\xF5\x19\x03\x02\x02\x02\xF6\xFB\x05\x1C\x0F\x02\xF7\xF8" + + "\x07$\x02\x02\xF8\xFA\x05\x1C\x0F\x02\xF9\xF7\x03\x02\x02\x02\xFA\xFD" + + "\x03\x02\x02\x02\xFB\xF9\x03\x02\x02\x02\xFB\xFC\x03\x02\x02\x02\xFC\x1B" + + "\x03\x02\x02\x02\xFD\xFB\x03\x02\x02\x02\xFE\u0104\x05\f\x07\x02\xFF\u0100" + + "\x05,\x17\x02\u0100\u0101\x07#\x02\x02\u0101\u0102\x05\f\x07\x02\u0102" + + "\u0104\x03\x02\x02\x02\u0103\xFE\x03\x02\x02\x02\u0103\xFF\x03\x02\x02" + + "\x02\u0104\x1D\x03\x02\x02\x02\u0105\u0106\x07\b\x02\x02\u0106\u010B\x05" + + "*\x16\x02\u0107\u0108\x07$\x02\x02\u0108\u010A\x05*\x16\x02\u0109\u0107" + + "\x03\x02\x02\x02\u010A\u010D\x03\x02\x02\x02\u010B\u0109\x03\x02\x02\x02" + + "\u010B\u010C\x03\x02\x02\x02\u010C\u010F\x03\x02\x02\x02\u010D\u010B\x03" + + "\x02\x02\x02\u010E\u0110\x05 \x11\x02\u010F\u010E\x03\x02\x02\x02\u010F" + + "\u0110\x03\x02\x02\x02\u0110\x1F\x03\x02\x02\x02\u0111\u0112\x07A\x02" + + "\x02\u0112\u0113\x07H\x02\x02\u0113\u0118\x05*\x16\x02\u0114\u0115\x07" + + "$\x02\x02\u0115\u0117\x05*\x16\x02\u0116\u0114\x03\x02\x02\x02\u0117\u011A" + + "\x03\x02\x02\x02\u0118\u0116\x03\x02\x02\x02\u0118\u0119\x03\x02\x02\x02" + + "\u0119\u011B\x03\x02\x02\x02\u011A\u0118\x03\x02\x02\x02\u011B\u011C\x07" + + "B\x02\x02\u011C!\x03\x02\x02\x02\u011D\u011E\x07\x06\x02\x02\u011E\u011F" + + "\x05\x1A\x0E\x02\u011F#\x03\x02\x02\x02\u0120\u0122\x07\x13\x02\x02\u0121" + + "\u0123\x05\x1A\x0E\x02\u0122\u0121\x03\x02\x02\x02\u0122\u0123\x03\x02" + + "\x02\x02\u0123\u0126\x03\x02\x02\x02\u0124\u0125\x07 \x02\x02\u0125\u0127" + + "\x05(\x15\x02\u0126\u0124\x03\x02\x02\x02\u0126\u0127\x03\x02\x02\x02" + + "\u0127%\x03\x02\x02\x02\u0128\u0129\x07\n\x02\x02\u0129\u012C\x05\x1A" + + "\x0E\x02\u012A\u012B\x07 \x02\x02\u012B\u012D\x05(\x15\x02\u012C\u012A" + + "\x03\x02\x02\x02\u012C\u012D\x03\x02\x02\x02\u012D\'\x03\x02\x02\x02\u012E" + + "\u0133\x05,\x17\x02\u012F\u0130\x07$\x02\x02\u0130\u0132\x05,\x17\x02" + + "\u0131\u012F\x03\x02\x02\x02\u0132\u0135\x03\x02\x02\x02\u0133\u0131\x03" + + "\x02\x02\x02\u0133\u0134\x03\x02\x02\x02\u0134)\x03\x02\x02\x02\u0135" + + "\u0133\x03\x02\x02\x02\u0136\u0137\t\x04\x02\x02\u0137+\x03\x02\x02\x02" + + "\u0138\u013D\x050\x19\x02\u0139\u013A\x07&\x02\x02\u013A\u013C\x050\x19" + + "\x02\u013B\u0139\x03\x02\x02\x02\u013C\u013F\x03\x02\x02\x02\u013D\u013B" + + "\x03\x02\x02\x02\u013D\u013E\x03\x02\x02\x02\u013E-\x03\x02\x02\x02\u013F" + + "\u013D\x03\x02\x02\x02\u0140\u0145\x052\x1A\x02\u0141\u0142\x07&\x02\x02" + + "\u0142\u0144\x052\x1A\x02\u0143\u0141\x03\x02\x02\x02\u0144\u0147\x03" + + "\x02\x02\x02\u0145\u0143\x03\x02\x02\x02\u0145\u0146\x03\x02\x02\x02\u0146" + + "/\x03\x02\x02\x02\u0147\u0145\x03\x02\x02\x02\u0148\u0149\t\x05\x02\x02" + + "\u01491\x03\x02\x02\x02\u014A\u014B\t\x06\x02\x02\u014B3\x03\x02\x02\x02" + + "\u014C\u0177\x07/\x02\x02\u014D\u014E\x05T+\x02\u014E\u014F\x07C\x02\x02" + + "\u014F\u0177\x03\x02\x02\x02\u0150\u0177\x05R*\x02\u0151\u0177\x05T+\x02" + + "\u0152\u0177\x05N(\x02\u0153\u0177\x072\x02\x02\u0154\u0177\x05V,\x02" + + "\u0155\u0156\x07A\x02\x02\u0156\u015B\x05P)\x02\u0157\u0158\x07$\x02\x02" + + "\u0158\u015A\x05P)\x02\u0159\u0157\x03\x02\x02\x02\u015A\u015D\x03\x02" + + "\x02\x02\u015B\u0159\x03\x02\x02\x02\u015B\u015C\x03\x02\x02\x02\u015C" + + "\u015E\x03\x02\x02\x02\u015D\u015B\x03\x02\x02\x02\u015E\u015F\x07B\x02" + + "\x02\u015F\u0177\x03\x02\x02\x02\u0160\u0161\x07A\x02\x02\u0161\u0166" + + "\x05N(\x02\u0162\u0163\x07$\x02\x02\u0163\u0165\x05N(\x02\u0164\u0162" + + "\x03\x02\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166\u0164\x03\x02\x02\x02" + + "\u0166\u0167\x03\x02\x02\x02\u0167\u0169\x03\x02\x02\x02\u0168\u0166\x03" + + "\x02\x02\x02\u0169\u016A\x07B\x02\x02\u016A\u0177\x03\x02\x02\x02\u016B" + + "\u016C\x07A\x02\x02\u016C\u0171\x05V,\x02\u016D\u016E\x07$\x02\x02\u016E" + + "\u0170\x05V,\x02\u016F\u016D\x03\x02\x02\x02\u0170\u0173\x03\x02\x02\x02" + + "\u0171\u016F\x03\x02\x02\x02\u0171\u0172\x03\x02\x02\x02\u0172\u0174\x03" + + "\x02\x02\x02\u0173\u0171\x03\x02\x02\x02\u0174\u0175\x07B\x02\x02\u0175" + + "\u0177\x03\x02\x02\x02\u0176\u014C\x03\x02\x02\x02\u0176\u014D\x03\x02" + + "\x02\x02\u0176\u0150\x03\x02\x02\x02\u0176\u0151\x03\x02\x02\x02\u0176" + + "\u0152\x03\x02\x02\x02\u0176\u0153\x03\x02\x02\x02\u0176\u0154\x03\x02" + + "\x02\x02\u0176\u0155\x03\x02\x02\x02\u0176\u0160\x03\x02\x02\x02\u0176" + + "\u016B\x03\x02\x02\x02\u01775\x03\x02\x02\x02\u0178\u0179\x07\f\x02\x02" + + "\u0179\u017A\x07\x1E\x02\x02\u017A7\x03\x02\x02\x02\u017B\u017C\x07\x12" + + "\x02\x02\u017C\u0181\x05:\x1E\x02\u017D\u017E\x07$\x02\x02\u017E\u0180" + + "\x05:\x1E\x02\u017F\u017D\x03\x02\x02\x02\u0180\u0183\x03\x02\x02\x02" + + "\u0181\u017F\x03\x02\x02\x02\u0181\u0182\x03\x02\x02\x02\u01829\x03\x02" + + "\x02\x02\u0183\u0181\x03\x02\x02\x02\u0184\u0186\x05\f\x07\x02\u0185\u0187" + + "\t\x07\x02\x02\u0186\u0185\x03\x02\x02\x02\u0186\u0187\x03\x02\x02\x02" + + "\u0187\u018A\x03\x02\x02\x02\u0188\u0189\x070\x02\x02\u0189\u018B\t\b" + + "\x02\x02\u018A\u0188\x03\x02\x02\x02\u018A\u018B\x03\x02\x02\x02\u018B" + + ";\x03\x02\x02\x02\u018C\u018D\x07\v\x02\x02\u018D\u0192\x05.\x18\x02\u018E" + + "\u018F\x07$\x02\x02\u018F\u0191\x05.\x18\x02\u0190\u018E\x03\x02\x02\x02" + + "\u0191\u0194\x03\x02\x02\x02\u0192\u0190\x03\x02\x02\x02\u0192\u0193\x03" + + "\x02\x02\x02\u0193\u019F\x03\x02\x02\x02\u0194\u0192\x03\x02\x02\x02\u0195" + + "\u0196\x07\x0E\x02\x02\u0196\u019B\x05.\x18\x02\u0197\u0198\x07$\x02\x02" + + "\u0198\u019A\x05.\x18\x02\u0199\u0197\x03\x02\x02\x02\u019A\u019D\x03" + + "\x02\x02\x02\u019B\u0199\x03\x02\x02\x02\u019B\u019C\x03\x02\x02\x02\u019C" + + "\u019F\x03\x02\x02\x02\u019D\u019B\x03\x02\x02\x02\u019E\u018C\x03\x02" + + "\x02\x02\u019E\u0195\x03\x02\x02\x02\u019F=\x03\x02\x02\x02\u01A0\u01A1" + + "\x07\x04\x02\x02\u01A1\u01A6\x05.\x18\x02\u01A2\u01A3\x07$\x02\x02\u01A3" + + "\u01A5\x05.\x18\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5\u01A8\x03\x02\x02" + + "\x02\u01A6\u01A4\x03\x02\x02\x02\u01A6\u01A7\x03\x02\x02\x02\u01A7?\x03" + + "\x02\x02\x02\u01A8\u01A6\x03\x02\x02\x02\u01A9\u01AA\x07\x0F\x02\x02\u01AA" + + "\u01AF\x05B\"\x02\u01AB\u01AC\x07$\x02\x02\u01AC\u01AE\x05B\"\x02\u01AD" + + "\u01AB\x03\x02\x02\x02\u01AE\u01B1\x03\x02\x02\x02\u01AF\u01AD\x03\x02" + + "\x02\x02\u01AF\u01B0\x03\x02\x02\x02\u01B0A\x03\x02\x02\x02\u01B1\u01AF" + + "\x03\x02\x02\x02\u01B2\u01B3\x05.\x18\x02\u01B3\u01B4\x07Q\x02\x02\u01B4" + + "\u01B5\x05.\x18\x02\u01B5C\x03\x02\x02\x02\u01B6\u01B7\x07\x03\x02\x02" + + "\u01B7\u01B8\x05\x14\v\x02\u01B8\u01BA\x05V,\x02\u01B9\u01BB\x05J&\x02" + + "\u01BA\u01B9\x03\x02\x02\x02\u01BA\u01BB\x03\x02\x02\x02\u01BBE\x03\x02" + + "\x02\x02\u01BC\u01BD\x07\t\x02\x02\u01BD\u01BE\x05\x14\v\x02\u01BE\u01BF" + + "\x05V,\x02\u01BFG\x03\x02\x02\x02\u01C0\u01C1\x07\r\x02\x02\u01C1\u01C2" + + "\x05,\x17\x02\u01C2I\x03\x02\x02\x02\u01C3\u01C8\x05L\'\x02\u01C4\u01C5" + + "\x07$\x02\x02\u01C5\u01C7\x05L\'\x02\u01C6\u01C4\x03\x02\x02\x02\u01C7" + + "\u01CA\x03\x02\x02\x02\u01C8\u01C6\x03\x02\x02\x02\u01C8\u01C9\x03\x02" + + "\x02\x02\u01C9K\x03\x02\x02\x02\u01CA\u01C8\x03\x02\x02\x02\u01CB\u01CC" + + "\x050\x19\x02\u01CC\u01CD\x07#\x02\x02\u01CD\u01CE\x054\x1B\x02\u01CE" + + "M\x03\x02\x02\x02\u01CF\u01D0\t\t\x02\x02\u01D0O\x03\x02\x02\x02\u01D1" + + "\u01D4\x05R*\x02\u01D2\u01D4\x05T+\x02\u01D3\u01D1\x03\x02\x02\x02\u01D3" + + "\u01D2\x03\x02\x02\x02\u01D4Q\x03\x02\x02\x02\u01D5\u01D7\t\x02\x02\x02" + + "\u01D6\u01D5\x03\x02\x02\x02\u01D6\u01D7\x03\x02\x02\x02\u01D7\u01D8\x03" + + "\x02\x02\x02\u01D8\u01D9\x07\x1F\x02\x02\u01D9S\x03\x02\x02\x02\u01DA" + + "\u01DC\t\x02\x02\x02\u01DB\u01DA\x03\x02\x02\x02\u01DB\u01DC\x03\x02\x02" + + "\x02\u01DC\u01DD\x03\x02\x02\x02\u01DD\u01DE\x07\x1E\x02\x02\u01DEU\x03" + + "\x02\x02\x02\u01DF\u01E0\x07\x1D\x02\x02\u01E0W\x03\x02\x02\x02\u01E1" + + "\u01E2\t\n\x02\x02\u01E2Y\x03\x02\x02\x02\u01E3\u01E4\x07\x07\x02\x02" + + "\u01E4\u01E5\x05\\/\x02\u01E5[\x03\x02\x02\x02\u01E6\u01E7\x07A\x02\x02" + + "\u01E7\u01E8\x05\x04\x03\x02\u01E8\u01E9\x07B\x02\x02\u01E9]\x03\x02\x02" + + "\x02\u01EA\u01EB\x07\x11\x02\x02\u01EB\u01EF\x07`\x02\x02\u01EC\u01ED" + + "\x07\x11\x02\x02\u01ED\u01EF\x07a\x02\x02\u01EE\u01EA\x03\x02\x02\x02" + + "\u01EE\u01EC\x03\x02\x02\x02\u01EF_\x03\x02\x02\x02\u01F0\u01F1\x07\x05" + + "\x02\x02\u01F1\u01F4\x05*\x16\x02\u01F2\u01F3\x07U\x02\x02\u01F3\u01F5" + + "\x05.\x18\x02\u01F4\u01F2\x03\x02\x02\x02\u01F4\u01F5\x03\x02\x02\x02" + + "\u01F5\u01FF\x03\x02\x02\x02\u01F6\u01F7\x07V\x02\x02\u01F7\u01FC\x05" + + "b2\x02\u01F8\u01F9\x07$\x02\x02\u01F9\u01FB\x05b2\x02\u01FA\u01F8\x03" + + "\x02\x02\x02\u01FB\u01FE\x03\x02\x02\x02\u01FC\u01FA\x03\x02\x02\x02\u01FC" + + "\u01FD\x03\x02\x02\x02\u01FD\u0200\x03\x02\x02\x02\u01FE\u01FC\x03\x02" + + "\x02\x02\u01FF\u01F6\x03\x02\x02\x02\u01FF\u0200\x03\x02\x02\x02\u0200" + + "a\x03\x02\x02\x02\u0201\u0202\x05.\x18\x02\u0202\u0203\x07#\x02\x02\u0203" + + "\u0205\x03\x02\x02\x02\u0204\u0201\x03\x02\x02\x02\u0204\u0205\x03\x02" + + "\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x05.\x18\x02\u0207c\x03" + + "\x02\x02\x026ov\x85\x91\x9A\xA2\xA6\xAE\xB0\xB5\xBC\xC1\xC8\xCE\xD6\xD8" + + "\xE2\xEC\xEF\xFB\u0103\u010B\u010F\u0118\u0122\u0126\u012C\u0133\u013D" + + "\u0145\u015B\u0166\u0171\u0176\u0181\u0186\u018A\u0192\u019B\u019E\u01A6" + + "\u01AF\u01BA\u01C8\u01D3\u01D6\u01DB\u01EE\u01F4\u01FC\u01FF\u0204"; public static __ATN: ATN; public static get _ATN(): ATN { if (!esql_parser.__ATN) { @@ -2981,6 +3221,9 @@ export class CompositeQueryContext extends QueryContext { export class SourceCommandContext extends ParserRuleContext { + public explainCommand(): ExplainCommandContext | undefined { + return this.tryGetRuleContext(0, ExplainCommandContext); + } public fromCommand(): FromCommandContext | undefined { return this.tryGetRuleContext(0, FromCommandContext); } @@ -3014,6 +3257,9 @@ export class ProcessingCommandContext extends ParserRuleContext { public evalCommand(): EvalCommandContext | undefined { return this.tryGetRuleContext(0, EvalCommandContext); } + public inlinestatsCommand(): InlinestatsCommandContext | undefined { + return this.tryGetRuleContext(0, InlinestatsCommandContext); + } public limitCommand(): LimitCommandContext | undefined { return this.tryGetRuleContext(0, LimitCommandContext); } @@ -3690,13 +3936,13 @@ export class FieldContext extends ParserRuleContext { export class FromCommandContext extends ParserRuleContext { public FROM(): TerminalNode { return this.getToken(esql_parser.FROM, 0); } - public sourceIdentifier(): SourceIdentifierContext[]; - public sourceIdentifier(i: number): SourceIdentifierContext; - public sourceIdentifier(i?: number): SourceIdentifierContext | SourceIdentifierContext[] { + public fromIdentifier(): FromIdentifierContext[]; + public fromIdentifier(i: number): FromIdentifierContext; + public fromIdentifier(i?: number): FromIdentifierContext | FromIdentifierContext[] { if (i === undefined) { - return this.getRuleContexts(SourceIdentifierContext); + return this.getRuleContexts(FromIdentifierContext); } else { - return this.getRuleContext(i, SourceIdentifierContext); + return this.getRuleContext(i, FromIdentifierContext); } } public COMMA(): TerminalNode[]; @@ -3734,13 +3980,13 @@ export class FromCommandContext extends ParserRuleContext { export class MetadataContext extends ParserRuleContext { public OPENING_BRACKET(): TerminalNode { return this.getToken(esql_parser.OPENING_BRACKET, 0); } public METADATA(): TerminalNode { return this.getToken(esql_parser.METADATA, 0); } - public sourceIdentifier(): SourceIdentifierContext[]; - public sourceIdentifier(i: number): SourceIdentifierContext; - public sourceIdentifier(i?: number): SourceIdentifierContext | SourceIdentifierContext[] { + public fromIdentifier(): FromIdentifierContext[]; + public fromIdentifier(i: number): FromIdentifierContext; + public fromIdentifier(i?: number): FromIdentifierContext | FromIdentifierContext[] { if (i === undefined) { - return this.getRuleContexts(SourceIdentifierContext); + return this.getRuleContexts(FromIdentifierContext); } else { - return this.getRuleContext(i, SourceIdentifierContext); + return this.getRuleContext(i, FromIdentifierContext); } } public CLOSING_BRACKET(): TerminalNode { return this.getToken(esql_parser.CLOSING_BRACKET, 0); } @@ -3827,6 +4073,35 @@ export class StatsCommandContext extends ParserRuleContext { } +export class InlinestatsCommandContext extends ParserRuleContext { + public INLINESTATS(): TerminalNode { return this.getToken(esql_parser.INLINESTATS, 0); } + public fields(): FieldsContext { + return this.getRuleContext(0, FieldsContext); + } + public BY(): TerminalNode | undefined { return this.tryGetToken(esql_parser.BY, 0); } + public grouping(): GroupingContext | undefined { + return this.tryGetRuleContext(0, GroupingContext); + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return esql_parser.RULE_inlinestatsCommand; } + // @Override + public enterRule(listener: esql_parserListener): void { + if (listener.enterInlinestatsCommand) { + listener.enterInlinestatsCommand(this); + } + } + // @Override + public exitRule(listener: esql_parserListener): void { + if (listener.exitInlinestatsCommand) { + listener.exitInlinestatsCommand(this); + } + } +} + + export class GroupingContext extends ParserRuleContext { public qualifiedName(): QualifiedNameContext[]; public qualifiedName(i: number): QualifiedNameContext; @@ -3866,24 +4141,24 @@ export class GroupingContext extends ParserRuleContext { } -export class SourceIdentifierContext extends ParserRuleContext { - public SRC_UNQUOTED_IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(esql_parser.SRC_UNQUOTED_IDENTIFIER, 0); } - public SRC_QUOTED_IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(esql_parser.SRC_QUOTED_IDENTIFIER, 0); } +export class FromIdentifierContext extends ParserRuleContext { + public FROM_UNQUOTED_IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(esql_parser.FROM_UNQUOTED_IDENTIFIER, 0); } + public QUOTED_IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(esql_parser.QUOTED_IDENTIFIER, 0); } constructor(parent: ParserRuleContext | undefined, invokingState: number) { super(parent, invokingState); } // @Override - public get ruleIndex(): number { return esql_parser.RULE_sourceIdentifier; } + public get ruleIndex(): number { return esql_parser.RULE_fromIdentifier; } // @Override public enterRule(listener: esql_parserListener): void { - if (listener.enterSourceIdentifier) { - listener.enterSourceIdentifier(this); + if (listener.enterFromIdentifier) { + listener.enterFromIdentifier(this); } } // @Override public exitRule(listener: esql_parserListener): void { - if (listener.exitSourceIdentifier) { - listener.exitSourceIdentifier(this); + if (listener.exitFromIdentifier) { + listener.exitFromIdentifier(this); } } } @@ -3928,6 +4203,45 @@ export class QualifiedNameContext extends ParserRuleContext { } +export class QualifiedNamePatternContext extends ParserRuleContext { + public identifierPattern(): IdentifierPatternContext[]; + public identifierPattern(i: number): IdentifierPatternContext; + public identifierPattern(i?: number): IdentifierPatternContext | IdentifierPatternContext[] { + if (i === undefined) { + return this.getRuleContexts(IdentifierPatternContext); + } else { + return this.getRuleContext(i, IdentifierPatternContext); + } + } + public DOT(): TerminalNode[]; + public DOT(i: number): TerminalNode; + public DOT(i?: number): TerminalNode | TerminalNode[] { + if (i === undefined) { + return this.getTokens(esql_parser.DOT); + } else { + return this.getToken(esql_parser.DOT, i); + } + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return esql_parser.RULE_qualifiedNamePattern; } + // @Override + public enterRule(listener: esql_parserListener): void { + if (listener.enterQualifiedNamePattern) { + listener.enterQualifiedNamePattern(this); + } + } + // @Override + public exitRule(listener: esql_parserListener): void { + if (listener.exitQualifiedNamePattern) { + listener.exitQualifiedNamePattern(this); + } + } +} + + export class IdentifierContext extends ParserRuleContext { public UNQUOTED_IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(esql_parser.UNQUOTED_IDENTIFIER, 0); } public QUOTED_IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(esql_parser.QUOTED_IDENTIFIER, 0); } @@ -3951,6 +4265,29 @@ export class IdentifierContext extends ParserRuleContext { } +export class IdentifierPatternContext extends ParserRuleContext { + public PROJECT_UNQUOTED_IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(esql_parser.PROJECT_UNQUOTED_IDENTIFIER, 0); } + public QUOTED_IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(esql_parser.QUOTED_IDENTIFIER, 0); } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return esql_parser.RULE_identifierPattern; } + // @Override + public enterRule(listener: esql_parserListener): void { + if (listener.enterIdentifierPattern) { + listener.enterIdentifierPattern(this); + } + } + // @Override + public exitRule(listener: esql_parserListener): void { + if (listener.exitIdentifierPattern) { + listener.exitIdentifierPattern(this); + } + } +} + + export class ConstantContext extends ParserRuleContext { constructor(parent: ParserRuleContext | undefined, invokingState: number) { super(parent, invokingState); @@ -4317,13 +4654,13 @@ export class OrderExpressionContext extends ParserRuleContext { export class KeepCommandContext extends ParserRuleContext { public KEEP(): TerminalNode | undefined { return this.tryGetToken(esql_parser.KEEP, 0); } - public sourceIdentifier(): SourceIdentifierContext[]; - public sourceIdentifier(i: number): SourceIdentifierContext; - public sourceIdentifier(i?: number): SourceIdentifierContext | SourceIdentifierContext[] { + public qualifiedNamePattern(): QualifiedNamePatternContext[]; + public qualifiedNamePattern(i: number): QualifiedNamePatternContext; + public qualifiedNamePattern(i?: number): QualifiedNamePatternContext | QualifiedNamePatternContext[] { if (i === undefined) { - return this.getRuleContexts(SourceIdentifierContext); + return this.getRuleContexts(QualifiedNamePatternContext); } else { - return this.getRuleContext(i, SourceIdentifierContext); + return this.getRuleContext(i, QualifiedNamePatternContext); } } public COMMA(): TerminalNode[]; @@ -4358,13 +4695,13 @@ export class KeepCommandContext extends ParserRuleContext { export class DropCommandContext extends ParserRuleContext { public DROP(): TerminalNode { return this.getToken(esql_parser.DROP, 0); } - public sourceIdentifier(): SourceIdentifierContext[]; - public sourceIdentifier(i: number): SourceIdentifierContext; - public sourceIdentifier(i?: number): SourceIdentifierContext | SourceIdentifierContext[] { + public qualifiedNamePattern(): QualifiedNamePatternContext[]; + public qualifiedNamePattern(i: number): QualifiedNamePatternContext; + public qualifiedNamePattern(i?: number): QualifiedNamePatternContext | QualifiedNamePatternContext[] { if (i === undefined) { - return this.getRuleContexts(SourceIdentifierContext); + return this.getRuleContexts(QualifiedNamePatternContext); } else { - return this.getRuleContext(i, SourceIdentifierContext); + return this.getRuleContext(i, QualifiedNamePatternContext); } } public COMMA(): TerminalNode[]; @@ -4437,16 +4774,16 @@ export class RenameCommandContext extends ParserRuleContext { export class RenameClauseContext extends ParserRuleContext { - public _oldName: SourceIdentifierContext; - public _newName: SourceIdentifierContext; + public _oldName: QualifiedNamePatternContext; + public _newName: QualifiedNamePatternContext; public AS(): TerminalNode { return this.getToken(esql_parser.AS, 0); } - public sourceIdentifier(): SourceIdentifierContext[]; - public sourceIdentifier(i: number): SourceIdentifierContext; - public sourceIdentifier(i?: number): SourceIdentifierContext | SourceIdentifierContext[] { + public qualifiedNamePattern(): QualifiedNamePatternContext[]; + public qualifiedNamePattern(i: number): QualifiedNamePatternContext; + public qualifiedNamePattern(i?: number): QualifiedNamePatternContext | QualifiedNamePatternContext[] { if (i === undefined) { - return this.getRuleContexts(SourceIdentifierContext); + return this.getRuleContexts(QualifiedNamePatternContext); } else { - return this.getRuleContext(i, SourceIdentifierContext); + return this.getRuleContext(i, QualifiedNamePatternContext); } } constructor(parent: ParserRuleContext | undefined, invokingState: number) { @@ -4530,8 +4867,8 @@ export class GrokCommandContext extends ParserRuleContext { export class MvExpandCommandContext extends ParserRuleContext { public MV_EXPAND(): TerminalNode { return this.getToken(esql_parser.MV_EXPAND, 0); } - public sourceIdentifier(): SourceIdentifierContext { - return this.getRuleContext(0, SourceIdentifierContext); + public qualifiedName(): QualifiedNameContext { + return this.getRuleContext(0, QualifiedNameContext); } constructor(parent: ParserRuleContext | undefined, invokingState: number) { super(parent, invokingState); @@ -4767,6 +5104,57 @@ export class ComparisonOperatorContext extends ParserRuleContext { } +export class ExplainCommandContext extends ParserRuleContext { + public EXPLAIN(): TerminalNode { return this.getToken(esql_parser.EXPLAIN, 0); } + public subqueryExpression(): SubqueryExpressionContext { + return this.getRuleContext(0, SubqueryExpressionContext); + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return esql_parser.RULE_explainCommand; } + // @Override + public enterRule(listener: esql_parserListener): void { + if (listener.enterExplainCommand) { + listener.enterExplainCommand(this); + } + } + // @Override + public exitRule(listener: esql_parserListener): void { + if (listener.exitExplainCommand) { + listener.exitExplainCommand(this); + } + } +} + + +export class SubqueryExpressionContext extends ParserRuleContext { + public OPENING_BRACKET(): TerminalNode { return this.getToken(esql_parser.OPENING_BRACKET, 0); } + public query(): QueryContext { + return this.getRuleContext(0, QueryContext); + } + public CLOSING_BRACKET(): TerminalNode { return this.getToken(esql_parser.CLOSING_BRACKET, 0); } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return esql_parser.RULE_subqueryExpression; } + // @Override + public enterRule(listener: esql_parserListener): void { + if (listener.enterSubqueryExpression) { + listener.enterSubqueryExpression(this); + } + } + // @Override + public exitRule(listener: esql_parserListener): void { + if (listener.exitSubqueryExpression) { + listener.exitSubqueryExpression(this); + } + } +} + + export class ShowCommandContext extends ParserRuleContext { constructor(parent: ParserRuleContext | undefined, invokingState: number) { super(parent, invokingState); @@ -4820,17 +5208,11 @@ export class ShowFunctionsContext extends ShowCommandContext { export class EnrichCommandContext extends ParserRuleContext { - public _policyName: SourceIdentifierContext; - public _matchField: SourceIdentifierContext; + public _policyName: FromIdentifierContext; + public _matchField: QualifiedNamePatternContext; public ENRICH(): TerminalNode { return this.getToken(esql_parser.ENRICH, 0); } - public sourceIdentifier(): SourceIdentifierContext[]; - public sourceIdentifier(i: number): SourceIdentifierContext; - public sourceIdentifier(i?: number): SourceIdentifierContext | SourceIdentifierContext[] { - if (i === undefined) { - return this.getRuleContexts(SourceIdentifierContext); - } else { - return this.getRuleContext(i, SourceIdentifierContext); - } + public fromIdentifier(): FromIdentifierContext { + return this.getRuleContext(0, FromIdentifierContext); } public ON(): TerminalNode | undefined { return this.tryGetToken(esql_parser.ON, 0); } public WITH(): TerminalNode | undefined { return this.tryGetToken(esql_parser.WITH, 0); } @@ -4843,6 +5225,9 @@ export class EnrichCommandContext extends ParserRuleContext { return this.getRuleContext(i, EnrichWithClauseContext); } } + public qualifiedNamePattern(): QualifiedNamePatternContext | undefined { + return this.tryGetRuleContext(0, QualifiedNamePatternContext); + } public COMMA(): TerminalNode[]; public COMMA(i: number): TerminalNode; public COMMA(i?: number): TerminalNode | TerminalNode[] { @@ -4873,15 +5258,15 @@ export class EnrichCommandContext extends ParserRuleContext { export class EnrichWithClauseContext extends ParserRuleContext { - public _newName: SourceIdentifierContext; - public _enrichField: SourceIdentifierContext; - public sourceIdentifier(): SourceIdentifierContext[]; - public sourceIdentifier(i: number): SourceIdentifierContext; - public sourceIdentifier(i?: number): SourceIdentifierContext | SourceIdentifierContext[] { + public _newName: QualifiedNamePatternContext; + public _enrichField: QualifiedNamePatternContext; + public qualifiedNamePattern(): QualifiedNamePatternContext[]; + public qualifiedNamePattern(i: number): QualifiedNamePatternContext; + public qualifiedNamePattern(i?: number): QualifiedNamePatternContext | QualifiedNamePatternContext[] { if (i === undefined) { - return this.getRuleContexts(SourceIdentifierContext); + return this.getRuleContexts(QualifiedNamePatternContext); } else { - return this.getRuleContext(i, SourceIdentifierContext); + return this.getRuleContext(i, QualifiedNamePatternContext); } } public ASSIGN(): TerminalNode | undefined { return this.tryGetToken(esql_parser.ASSIGN, 0); } diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser_listener.ts b/packages/kbn-monaco/src/esql/antlr/esql_parser_listener.ts index ff67f81aeab09..de114f648d0b0 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser_listener.ts +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser_listener.ts @@ -4,8 +4,6 @@ import { ParseTreeListener } from "antlr4ts/tree/ParseTreeListener"; -import { ValueExpressionDefaultContext } from "./esql_parser"; -import { ComparisonContext } from "./esql_parser"; import { NullLiteralContext } from "./esql_parser"; import { QualifiedIntegerLiteralContext } from "./esql_parser"; import { DecimalLiteralContext } from "./esql_parser"; @@ -16,23 +14,25 @@ import { StringLiteralContext } from "./esql_parser"; import { NumericArrayLiteralContext } from "./esql_parser"; import { BooleanArrayLiteralContext } from "./esql_parser"; import { StringArrayLiteralContext } from "./esql_parser"; +import { SingleCommandQueryContext } from "./esql_parser"; +import { CompositeQueryContext } from "./esql_parser"; +import { OperatorExpressionDefaultContext } from "./esql_parser"; +import { ArithmeticUnaryContext } from "./esql_parser"; +import { ArithmeticBinaryContext } from "./esql_parser"; +import { ValueExpressionDefaultContext } from "./esql_parser"; +import { ComparisonContext } from "./esql_parser"; import { ShowInfoContext } from "./esql_parser"; import { ShowFunctionsContext } from "./esql_parser"; import { ConstantDefaultContext } from "./esql_parser"; import { DereferenceContext } from "./esql_parser"; import { FunctionContext } from "./esql_parser"; import { ParenthesizedExpressionContext } from "./esql_parser"; -import { SingleCommandQueryContext } from "./esql_parser"; -import { CompositeQueryContext } from "./esql_parser"; import { LogicalNotContext } from "./esql_parser"; import { BooleanDefaultContext } from "./esql_parser"; import { RegexExpressionContext } from "./esql_parser"; import { LogicalBinaryContext } from "./esql_parser"; import { LogicalInContext } from "./esql_parser"; import { IsNullContext } from "./esql_parser"; -import { OperatorExpressionDefaultContext } from "./esql_parser"; -import { ArithmeticUnaryContext } from "./esql_parser"; -import { ArithmeticBinaryContext } from "./esql_parser"; import { SingleStatementContext } from "./esql_parser"; import { QueryContext } from "./esql_parser"; import { SourceCommandContext } from "./esql_parser"; @@ -51,10 +51,13 @@ import { FromCommandContext } from "./esql_parser"; import { MetadataContext } from "./esql_parser"; import { EvalCommandContext } from "./esql_parser"; import { StatsCommandContext } from "./esql_parser"; +import { InlinestatsCommandContext } from "./esql_parser"; import { GroupingContext } from "./esql_parser"; -import { SourceIdentifierContext } from "./esql_parser"; +import { FromIdentifierContext } from "./esql_parser"; import { QualifiedNameContext } from "./esql_parser"; +import { QualifiedNamePatternContext } from "./esql_parser"; import { IdentifierContext } from "./esql_parser"; +import { IdentifierPatternContext } from "./esql_parser"; import { ConstantContext } from "./esql_parser"; import { LimitCommandContext } from "./esql_parser"; import { SortCommandContext } from "./esql_parser"; @@ -74,6 +77,8 @@ import { DecimalValueContext } from "./esql_parser"; import { IntegerValueContext } from "./esql_parser"; import { StringContext } from "./esql_parser"; import { ComparisonOperatorContext } from "./esql_parser"; +import { ExplainCommandContext } from "./esql_parser"; +import { SubqueryExpressionContext } from "./esql_parser"; import { ShowCommandContext } from "./esql_parser"; import { EnrichCommandContext } from "./esql_parser"; import { EnrichWithClauseContext } from "./esql_parser"; @@ -84,32 +89,6 @@ import { EnrichWithClauseContext } from "./esql_parser"; * `esql_parser`. */ export interface esql_parserListener extends ParseTreeListener { - /** - * Enter a parse tree produced by the `valueExpressionDefault` - * labeled alternative in `esql_parser.valueExpression`. - * @param ctx the parse tree - */ - enterValueExpressionDefault?: (ctx: ValueExpressionDefaultContext) => void; - /** - * Exit a parse tree produced by the `valueExpressionDefault` - * labeled alternative in `esql_parser.valueExpression`. - * @param ctx the parse tree - */ - exitValueExpressionDefault?: (ctx: ValueExpressionDefaultContext) => void; - - /** - * Enter a parse tree produced by the `comparison` - * labeled alternative in `esql_parser.valueExpression`. - * @param ctx the parse tree - */ - enterComparison?: (ctx: ComparisonContext) => void; - /** - * Exit a parse tree produced by the `comparison` - * labeled alternative in `esql_parser.valueExpression`. - * @param ctx the parse tree - */ - exitComparison?: (ctx: ComparisonContext) => void; - /** * Enter a parse tree produced by the `nullLiteral` * labeled alternative in `esql_parser.constant`. @@ -240,6 +219,97 @@ export interface esql_parserListener extends ParseTreeListener { */ exitStringArrayLiteral?: (ctx: StringArrayLiteralContext) => void; + /** + * Enter a parse tree produced by the `singleCommandQuery` + * labeled alternative in `esql_parser.query`. + * @param ctx the parse tree + */ + enterSingleCommandQuery?: (ctx: SingleCommandQueryContext) => void; + /** + * Exit a parse tree produced by the `singleCommandQuery` + * labeled alternative in `esql_parser.query`. + * @param ctx the parse tree + */ + exitSingleCommandQuery?: (ctx: SingleCommandQueryContext) => void; + + /** + * Enter a parse tree produced by the `compositeQuery` + * labeled alternative in `esql_parser.query`. + * @param ctx the parse tree + */ + enterCompositeQuery?: (ctx: CompositeQueryContext) => void; + /** + * Exit a parse tree produced by the `compositeQuery` + * labeled alternative in `esql_parser.query`. + * @param ctx the parse tree + */ + exitCompositeQuery?: (ctx: CompositeQueryContext) => void; + + /** + * Enter a parse tree produced by the `operatorExpressionDefault` + * labeled alternative in `esql_parser.operatorExpression`. + * @param ctx the parse tree + */ + enterOperatorExpressionDefault?: (ctx: OperatorExpressionDefaultContext) => void; + /** + * Exit a parse tree produced by the `operatorExpressionDefault` + * labeled alternative in `esql_parser.operatorExpression`. + * @param ctx the parse tree + */ + exitOperatorExpressionDefault?: (ctx: OperatorExpressionDefaultContext) => void; + + /** + * Enter a parse tree produced by the `arithmeticUnary` + * labeled alternative in `esql_parser.operatorExpression`. + * @param ctx the parse tree + */ + enterArithmeticUnary?: (ctx: ArithmeticUnaryContext) => void; + /** + * Exit a parse tree produced by the `arithmeticUnary` + * labeled alternative in `esql_parser.operatorExpression`. + * @param ctx the parse tree + */ + exitArithmeticUnary?: (ctx: ArithmeticUnaryContext) => void; + + /** + * Enter a parse tree produced by the `arithmeticBinary` + * labeled alternative in `esql_parser.operatorExpression`. + * @param ctx the parse tree + */ + enterArithmeticBinary?: (ctx: ArithmeticBinaryContext) => void; + /** + * Exit a parse tree produced by the `arithmeticBinary` + * labeled alternative in `esql_parser.operatorExpression`. + * @param ctx the parse tree + */ + exitArithmeticBinary?: (ctx: ArithmeticBinaryContext) => void; + + /** + * Enter a parse tree produced by the `valueExpressionDefault` + * labeled alternative in `esql_parser.valueExpression`. + * @param ctx the parse tree + */ + enterValueExpressionDefault?: (ctx: ValueExpressionDefaultContext) => void; + /** + * Exit a parse tree produced by the `valueExpressionDefault` + * labeled alternative in `esql_parser.valueExpression`. + * @param ctx the parse tree + */ + exitValueExpressionDefault?: (ctx: ValueExpressionDefaultContext) => void; + + /** + * Enter a parse tree produced by the `comparison` + * labeled alternative in `esql_parser.valueExpression`. + * @param ctx the parse tree + */ + enterComparison?: (ctx: ComparisonContext) => void; + /** + * Exit a parse tree produced by the `comparison` + * labeled alternative in `esql_parser.valueExpression`. + * @param ctx the parse tree + */ + exitComparison?: (ctx: ComparisonContext) => void; + /** * Enter a parse tree produced by the `showInfo` * labeled alternative in `esql_parser.showCommand`. @@ -318,32 +388,6 @@ export interface esql_parserListener extends ParseTreeListener { */ exitParenthesizedExpression?: (ctx: ParenthesizedExpressionContext) => void; - /** - * Enter a parse tree produced by the `singleCommandQuery` - * labeled alternative in `esql_parser.query`. - * @param ctx the parse tree - */ - enterSingleCommandQuery?: (ctx: SingleCommandQueryContext) => void; - /** - * Exit a parse tree produced by the `singleCommandQuery` - * labeled alternative in `esql_parser.query`. - * @param ctx the parse tree - */ - exitSingleCommandQuery?: (ctx: SingleCommandQueryContext) => void; - - /** - * Enter a parse tree produced by the `compositeQuery` - * labeled alternative in `esql_parser.query`. - * @param ctx the parse tree - */ - enterCompositeQuery?: (ctx: CompositeQueryContext) => void; - /** - * Exit a parse tree produced by the `compositeQuery` - * labeled alternative in `esql_parser.query`. - * @param ctx the parse tree - */ - exitCompositeQuery?: (ctx: CompositeQueryContext) => void; - /** * Enter a parse tree produced by the `logicalNot` * labeled alternative in `esql_parser.booleanExpression`. @@ -422,45 +466,6 @@ export interface esql_parserListener extends ParseTreeListener { */ exitIsNull?: (ctx: IsNullContext) => void; - /** - * Enter a parse tree produced by the `operatorExpressionDefault` - * labeled alternative in `esql_parser.operatorExpression`. - * @param ctx the parse tree - */ - enterOperatorExpressionDefault?: (ctx: OperatorExpressionDefaultContext) => void; - /** - * Exit a parse tree produced by the `operatorExpressionDefault` - * labeled alternative in `esql_parser.operatorExpression`. - * @param ctx the parse tree - */ - exitOperatorExpressionDefault?: (ctx: OperatorExpressionDefaultContext) => void; - - /** - * Enter a parse tree produced by the `arithmeticUnary` - * labeled alternative in `esql_parser.operatorExpression`. - * @param ctx the parse tree - */ - enterArithmeticUnary?: (ctx: ArithmeticUnaryContext) => void; - /** - * Exit a parse tree produced by the `arithmeticUnary` - * labeled alternative in `esql_parser.operatorExpression`. - * @param ctx the parse tree - */ - exitArithmeticUnary?: (ctx: ArithmeticUnaryContext) => void; - - /** - * Enter a parse tree produced by the `arithmeticBinary` - * labeled alternative in `esql_parser.operatorExpression`. - * @param ctx the parse tree - */ - enterArithmeticBinary?: (ctx: ArithmeticBinaryContext) => void; - /** - * Exit a parse tree produced by the `arithmeticBinary` - * labeled alternative in `esql_parser.operatorExpression`. - * @param ctx the parse tree - */ - exitArithmeticBinary?: (ctx: ArithmeticBinaryContext) => void; - /** * Enter a parse tree produced by `esql_parser.singleStatement`. * @param ctx the parse tree @@ -659,6 +664,17 @@ export interface esql_parserListener extends ParseTreeListener { */ exitStatsCommand?: (ctx: StatsCommandContext) => void; + /** + * Enter a parse tree produced by `esql_parser.inlinestatsCommand`. + * @param ctx the parse tree + */ + enterInlinestatsCommand?: (ctx: InlinestatsCommandContext) => void; + /** + * Exit a parse tree produced by `esql_parser.inlinestatsCommand`. + * @param ctx the parse tree + */ + exitInlinestatsCommand?: (ctx: InlinestatsCommandContext) => void; + /** * Enter a parse tree produced by `esql_parser.grouping`. * @param ctx the parse tree @@ -671,15 +687,15 @@ export interface esql_parserListener extends ParseTreeListener { exitGrouping?: (ctx: GroupingContext) => void; /** - * Enter a parse tree produced by `esql_parser.sourceIdentifier`. + * Enter a parse tree produced by `esql_parser.fromIdentifier`. * @param ctx the parse tree */ - enterSourceIdentifier?: (ctx: SourceIdentifierContext) => void; + enterFromIdentifier?: (ctx: FromIdentifierContext) => void; /** - * Exit a parse tree produced by `esql_parser.sourceIdentifier`. + * Exit a parse tree produced by `esql_parser.fromIdentifier`. * @param ctx the parse tree */ - exitSourceIdentifier?: (ctx: SourceIdentifierContext) => void; + exitFromIdentifier?: (ctx: FromIdentifierContext) => void; /** * Enter a parse tree produced by `esql_parser.qualifiedName`. @@ -692,6 +708,17 @@ export interface esql_parserListener extends ParseTreeListener { */ exitQualifiedName?: (ctx: QualifiedNameContext) => void; + /** + * Enter a parse tree produced by `esql_parser.qualifiedNamePattern`. + * @param ctx the parse tree + */ + enterQualifiedNamePattern?: (ctx: QualifiedNamePatternContext) => void; + /** + * Exit a parse tree produced by `esql_parser.qualifiedNamePattern`. + * @param ctx the parse tree + */ + exitQualifiedNamePattern?: (ctx: QualifiedNamePatternContext) => void; + /** * Enter a parse tree produced by `esql_parser.identifier`. * @param ctx the parse tree @@ -703,6 +730,17 @@ export interface esql_parserListener extends ParseTreeListener { */ exitIdentifier?: (ctx: IdentifierContext) => void; + /** + * Enter a parse tree produced by `esql_parser.identifierPattern`. + * @param ctx the parse tree + */ + enterIdentifierPattern?: (ctx: IdentifierPatternContext) => void; + /** + * Exit a parse tree produced by `esql_parser.identifierPattern`. + * @param ctx the parse tree + */ + exitIdentifierPattern?: (ctx: IdentifierPatternContext) => void; + /** * Enter a parse tree produced by `esql_parser.constant`. * @param ctx the parse tree @@ -912,6 +950,28 @@ export interface esql_parserListener extends ParseTreeListener { */ exitComparisonOperator?: (ctx: ComparisonOperatorContext) => void; + /** + * Enter a parse tree produced by `esql_parser.explainCommand`. + * @param ctx the parse tree + */ + enterExplainCommand?: (ctx: ExplainCommandContext) => void; + /** + * Exit a parse tree produced by `esql_parser.explainCommand`. + * @param ctx the parse tree + */ + exitExplainCommand?: (ctx: ExplainCommandContext) => void; + + /** + * Enter a parse tree produced by `esql_parser.subqueryExpression`. + * @param ctx the parse tree + */ + enterSubqueryExpression?: (ctx: SubqueryExpressionContext) => void; + /** + * Exit a parse tree produced by `esql_parser.subqueryExpression`. + * @param ctx the parse tree + */ + exitSubqueryExpression?: (ctx: SubqueryExpressionContext) => void; + /** * Enter a parse tree produced by `esql_parser.showCommand`. * @param ctx the parse tree diff --git a/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts b/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts index d6e8ea7d0a038..1a7dc44160872 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts @@ -162,23 +162,24 @@ export function computeLocationExtends(fn: ESQLFunction) { // Note: do not import esql_parser or bundle size will grow up by ~500 kb function getQuotedText(ctx: ParserRuleContext) { - return ( - ctx.tryGetToken(73 /* esql_parser.SRC_QUOTED_IDENTIFIER*/, 0) || - ctx.tryGetToken(64 /* esql_parser.QUOTED_IDENTIFIER */, 0) - ); + return [66 /* esql_parser.QUOTED_IDENTIFIER */, 72 /* esql_parser.FROM_QUOTED_IDENTIFIER */] + .map((keyCode) => ctx.tryGetToken(keyCode, 0)) + .filter(nonNullable)[0]; } function getUnquotedText(ctx: ParserRuleContext) { - return ( - ctx.tryGetToken(72 /* esql_parser.SRC_UNQUOTED_IDENTIFIER */, 0) || - ctx.tryGetToken(63 /* esql_parser.UNQUOTED_IDENTIFIER */, 0) - ); + return [ + 65 /* esql_parser.UNQUOTED_IDENTIFIER */, 71 /* esql_parser.FROM_UNQUOTED_IDENTIFIER */, + 76 /* esql_parser.PROJECT_UNQUOTED_IDENTIFIER */, + ] + .map((keyCode) => ctx.tryGetToken(keyCode, 0)) + .filter(nonNullable)[0]; } const TICKS_REGEX = /(`)/g; function isQuoted(text: string | undefined) { - return text && TICKS_REGEX.test(text); + return text && /^(`)/.test(text); } export function sanifyIdentifierString(ctx: ParserRuleContext) { @@ -189,6 +190,10 @@ export function sanifyIdentifierString(ctx: ParserRuleContext) { ); } +export function wrapIdentifierAsArray(identifierCtx: T | T[]): T[] { + return Array.isArray(identifierCtx) ? identifierCtx : [identifierCtx]; +} + export function createSource( ctx: ParserRuleContext, type: 'index' | 'policy' = 'index' @@ -219,9 +224,9 @@ export function createColumn(ctx: ParserRuleContext): ESQLColumn { const text = sanifyIdentifierString(ctx); const hasQuotes = Boolean(getQuotedText(ctx) || isQuoted(ctx.text)); return { - type: 'column', + type: 'column' as const, name: text, - text, + text: ctx.text, location: getPosition(ctx.start, ctx.stop), incomplete: Boolean(ctx.exception || text === ''), quoted: hasQuotes, diff --git a/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts b/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts index 677bc4694e05a..3916dc68d1ece 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import type { ParserRuleContext } from 'antlr4ts/ParserRuleContext'; import { ArithmeticBinaryContext, ArithmeticUnaryContext, @@ -36,8 +37,8 @@ import { LogicalBinaryContext, LogicalInContext, LogicalNotContext, - type MetadataContext, - type MvExpandCommandContext, + MetadataContext, + MvExpandCommandContext, NullLiteralContext, NumericArrayLiteralContext, NumericValueContext, @@ -49,13 +50,13 @@ import { QualifiedIntegerLiteralContext, RegexBooleanExpressionContext, type RenameClauseContext, - SourceIdentifierContext, type StatsCommandContext, StringArrayLiteralContext, StringContext, StringLiteralContext, type ValueExpressionContext, ValueExpressionDefaultContext, + FromIdentifierContext, } from '../../antlr/esql_parser'; import { createSource, @@ -71,6 +72,7 @@ import { sanifyIdentifierString, computeLocationExtends, createColumnStar, + wrapIdentifierAsArray, } from './ast_helpers'; import { getPosition } from './ast_position_utils'; import type { @@ -82,15 +84,22 @@ import type { } from './types'; export function collectAllSourceIdentifiers(ctx: FromCommandContext): ESQLAstItem[] { - return ctx.getRuleContexts(SourceIdentifierContext).map((sourceCtx) => createSource(sourceCtx)); + return ctx.getRuleContexts(FromIdentifierContext).map((sourceCtx) => createSource(sourceCtx)); } -export function collectAllColumnIdentifiers( +function extractIdentifiers( ctx: KeepCommandContext | DropCommandContext | MvExpandCommandContext | MetadataContext -): ESQLAstItem[] { - const identifiers = ( - Array.isArray(ctx.sourceIdentifier()) ? ctx.sourceIdentifier() : [ctx.sourceIdentifier()] - ) as SourceIdentifierContext[]; +) { + if (ctx instanceof MetadataContext) { + return wrapIdentifierAsArray(ctx.fromIdentifier()); + } + if (ctx instanceof MvExpandCommandContext) { + return wrapIdentifierAsArray(ctx.qualifiedName()); + } + return wrapIdentifierAsArray(ctx.qualifiedNamePattern()); +} + +function makeColumnsOutOfIdentifiers(identifiers: ParserRuleContext[]) { const args: ESQLColumn[] = identifiers .filter((child) => child.text) @@ -100,6 +109,13 @@ export function collectAllColumnIdentifiers( return args; } +export function collectAllColumnIdentifiers( + ctx: KeepCommandContext | DropCommandContext | MvExpandCommandContext | MetadataContext +): ESQLAstItem[] { + const identifiers = extractIdentifiers(ctx); + return makeColumnsOutOfIdentifiers(identifiers); +} + export function getPolicyName(ctx: EnrichCommandContext) { if (!ctx._policyName) { return []; @@ -111,7 +127,7 @@ export function getMatchField(ctx: EnrichCommandContext) { if (!ctx._matchField) { return []; } - const identifier = ctx.sourceIdentifier(1); + const identifier = ctx.qualifiedNamePattern(); if (identifier) { const fn = createOption(ctx.ON()!.text.toLowerCase(), ctx); if (identifier.text) { diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/commands.ts b/packages/kbn-monaco/src/esql/lib/ast/definitions/commands.ts index 4404bf00b5fad..e727cffd83a1e 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/commands.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/definitions/commands.ts @@ -56,7 +56,7 @@ export const commandDefinitions: CommandDefinition[] = [ options: [], signature: { multipleParams: false, - params: [{ name: 'functions', type: 'string', values: ['functions', 'info'] }], + params: [{ name: 'functions', type: 'function' }], }, }, { diff --git a/packages/kbn-monaco/src/esql/lib/ast/shared/variables.ts b/packages/kbn-monaco/src/esql/lib/ast/shared/variables.ts index 3f93ce50b71c3..71fd4ce8176a2 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/shared/variables.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/shared/variables.ts @@ -136,7 +136,7 @@ export function collectVariables( // just save the entire expression as variable string const expressionType = 'number'; addToVariableOccurrencies(variables, { - name: expressionOperation.text, + name: expressionOperation.text.replace(/`/g, ''), type: expressionType, location: expressionOperation.location, }); diff --git a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts b/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts index 0df20ac7d88f4..246b867397420 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts @@ -226,18 +226,18 @@ describe('validation logic', () => { ['eval', 'stats', 'rename', 'limit', 'keep', 'drop', 'mv_expand', 'dissect', 'grok'].map( (command) => testErrorsAndWarnings(command, [ - `SyntaxError: expected {FROM, ROW, SHOW} but found "${command}"`, + `SyntaxError: expected {EXPLAIN, FROM, ROW, SHOW} but found "${command}"`, ]) ); }); describe('from', () => { - testErrorsAndWarnings('f', ['SyntaxError: expected {FROM, ROW, SHOW} but found "f"']); + testErrorsAndWarnings('f', ['SyntaxError: expected {EXPLAIN, FROM, ROW, SHOW} but found "f"']); testErrorsAndWarnings(`from `, [ - "SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''", + "SyntaxError: missing {QUOTED_IDENTIFIER, FROM_UNQUOTED_IDENTIFIER} at ''", ]); testErrorsAndWarnings(`from index,`, [ - "SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''", + "SyntaxError: missing {QUOTED_IDENTIFIER, FROM_UNQUOTED_IDENTIFIER} at ''", ]); testErrorsAndWarnings(`from assignment = 1`, [ 'SyntaxError: expected {, PIPE, COMMA, OPENING_BRACKET} but found "="', @@ -495,7 +495,10 @@ describe('validation logic', () => { testErrorsAndWarnings('show functions', []); testErrorsAndWarnings('show info', []); testErrorsAndWarnings('show functions blah', [ - "SyntaxError: extraneous input 'blah' expecting ", + "SyntaxError: token recognition error at: 'b'", + "SyntaxError: token recognition error at: 'l'", + "SyntaxError: token recognition error at: 'a'", + "SyntaxError: token recognition error at: 'h'", ]); }); @@ -521,18 +524,25 @@ describe('validation logic', () => { describe('keep', () => { testErrorsAndWarnings('from index | keep ', [ - `SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''`, + `SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ''`, ]); testErrorsAndWarnings('from index | keep stringField, numberField, dateField', []); testErrorsAndWarnings('from index | keep `stringField`, `numberField`, `dateField`', []); - testErrorsAndWarnings('from index | keep 4.5', ['Unknown column [4.5]']); + testErrorsAndWarnings('from index | keep 4.5', [ + "SyntaxError: token recognition error at: '4'", + "SyntaxError: token recognition error at: '5'", + "SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at '.'", + "SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ''", + 'Unknown column [.]', + ]); + testErrorsAndWarnings('from index | keep `4.5`', ['Unknown column [4.5]']); testErrorsAndWarnings('from index | keep missingField, numberField, dateField', [ 'Unknown column [missingField]', ]); testErrorsAndWarnings('from index | keep `any#Char$ field`', []); testErrorsAndWarnings( 'from index | project ', - [`SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''`], + [`SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ''`], ['PROJECT command is no longer supported, please use KEEP instead'] ); testErrorsAndWarnings( @@ -569,10 +579,16 @@ describe('validation logic', () => { describe('drop', () => { testErrorsAndWarnings('from index | drop ', [ - `SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''`, + `SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ''`, ]); testErrorsAndWarnings('from index | drop stringField, numberField, dateField', []); - testErrorsAndWarnings('from index | drop 4.5', ['Unknown column [4.5]']); + testErrorsAndWarnings('from index | drop 4.5', [ + "SyntaxError: token recognition error at: '4'", + "SyntaxError: token recognition error at: '5'", + "SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at '.'", + "SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ''", + 'Unknown column [.]', + ]); testErrorsAndWarnings('from index | drop missingField, numberField, dateField', [ 'Unknown column [missingField]', ]); @@ -603,7 +619,7 @@ describe('validation logic', () => { describe('mv_expand', () => { testErrorsAndWarnings('from a | mv_expand ', [ - "SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''", + "SyntaxError: missing {UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER} at ''", ]); testErrorsAndWarnings('from a | mv_expand stringField', [ 'Mv_expand only supports list type values, found [stringField] of type string', @@ -612,7 +628,8 @@ describe('validation logic', () => { testErrorsAndWarnings(`from a | mv_expand listField`, []); testErrorsAndWarnings('from a | mv_expand listField, b', [ - 'SyntaxError: expected {, PIPE} but found ","', + "SyntaxError: token recognition error at: ','", + "SyntaxError: extraneous input 'b' expecting ", ]); testErrorsAndWarnings('row a = "a" | mv_expand a', [ @@ -623,20 +640,20 @@ describe('validation logic', () => { describe('rename', () => { testErrorsAndWarnings('from a | rename', [ - "SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''", + "SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ''", ]); testErrorsAndWarnings('from a | rename stringField', [ - 'SyntaxError: expected {AS} but found ""', + 'SyntaxError: expected {DOT, AS} but found ""', ]); testErrorsAndWarnings('from a | rename a', [ - 'SyntaxError: expected {AS} but found ""', + 'SyntaxError: expected {DOT, AS} but found ""', 'Unknown column [a]', ]); testErrorsAndWarnings('from a | rename stringField as', [ - "SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''", + "SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ''", ]); testErrorsAndWarnings('from a | rename missingField as', [ - "SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''", + "SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ''", 'Unknown column [missingField]', ]); testErrorsAndWarnings('from a | rename stringField as b', []); @@ -644,7 +661,9 @@ describe('validation logic', () => { testErrorsAndWarnings('from a | rename stringField As b', []); testErrorsAndWarnings('from a | rename stringField As b, b AS c', []); testErrorsAndWarnings('from a | rename fn() as a', [ - 'Unknown column [fn()]', + "SyntaxError: token recognition error at: '('", + "SyntaxError: token recognition error at: ')'", + 'Unknown column [fn]', 'Unknown column [a]', ]); testErrorsAndWarnings('from a | eval numberField + 1 | rename `numberField + 1` as a', []); @@ -653,7 +672,7 @@ describe('validation logic', () => { [] ); testErrorsAndWarnings('from a | eval numberField + 1 | rename `numberField + 1` as ', [ - "SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''", + "SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ''", ]); testErrorsAndWarnings('from a | rename s* as strings', [ 'Using wildcards (*) in rename is not allowed [s*]', @@ -1129,6 +1148,14 @@ describe('validation logic', () => { 'SyntaxError: expected {, PIPE, COMMA, DOT} but found "("', 'Unknown column [percentile]', ]); + testErrorsAndWarnings('from a | stats count(`numberField`)', []); + + for (const subCommand of ['keep', 'drop', 'eval']) { + testErrorsAndWarnings( + `from a | stats count(\`numberField\`) | ${subCommand} \`count(\`\`numberField\`\`)\` `, + [] + ); + } testErrorsAndWarnings( 'from a | stats avg(numberField) by stringField, percentile(numberField) by ipField', @@ -1312,22 +1339,22 @@ describe('validation logic', () => { describe('enrich', () => { testErrorsAndWarnings(`from a | enrich`, [ - "SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''", + "SyntaxError: missing {QUOTED_IDENTIFIER, FROM_UNQUOTED_IDENTIFIER} at ''", ]); testErrorsAndWarnings(`from a | enrich policy `, []); testErrorsAndWarnings(`from a | enrich missing-policy `, ['Unknown policy [missing-policy]']); testErrorsAndWarnings(`from a | enrich policy on `, [ - "SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''", + "SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ''", ]); testErrorsAndWarnings(`from a | enrich policy on b `, ['Unknown column [b]']); testErrorsAndWarnings(`from a | enrich policy on numberField with `, [ - 'SyntaxError: expected {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} but found ""', + 'SyntaxError: expected {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} but found ""', ]); testErrorsAndWarnings(`from a | enrich policy on numberField with var0 `, [ 'Unknown column [var0]', ]); testErrorsAndWarnings(`from a | enrich policy on numberField with var0 = `, [ - "SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''", + "SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ''", 'Unknown column [var0]', ]); testErrorsAndWarnings(`from a | enrich policy on numberField with var0 = c `, [ @@ -1339,8 +1366,8 @@ describe('validation logic', () => { // `Unknown column [stringField]`, // ]); testErrorsAndWarnings(`from a | enrich policy on numberField with var0 = , `, [ - "SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ','", - 'SyntaxError: expected {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} but found ""', + "SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ','", + 'SyntaxError: expected {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} but found ""', 'Unknown column [var0]', ]); testErrorsAndWarnings(`from a | enrich policy on numberField with var0 = otherField, var1 `, [ @@ -1352,7 +1379,7 @@ describe('validation logic', () => { [] ); testErrorsAndWarnings(`from a | enrich policy on numberField with var0 = otherField, var1 = `, [ - "SyntaxError: missing {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} at ''", + "SyntaxError: missing {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} at ''", 'Unknown column [var1]', ]); @@ -1361,7 +1388,7 @@ describe('validation logic', () => { [] ); testErrorsAndWarnings(`from a | enrich policy with `, [ - 'SyntaxError: expected {SRC_UNQUOTED_IDENTIFIER, SRC_QUOTED_IDENTIFIER} but found ""', + 'SyntaxError: expected {QUOTED_IDENTIFIER, PROJECT_UNQUOTED_IDENTIFIER} but found ""', ]); testErrorsAndWarnings(`from a | enrich policy with otherField`, []); testErrorsAndWarnings(`from a | enrich policy | eval otherField`, []); From 3c75764e0763ce6adee5a2aac51a0e4216492363 Mon Sep 17 00:00:00 2001 From: Mike Pellegrini Date: Wed, 20 Dec 2023 08:29:12 -0500 Subject: [PATCH 16/62] Fix warnings generated by the model selection list (#173629) ## Summary Fix DOM attribute warnings generated by the model selection list. This approach uses the [`option.data` prop](https://eui.elastic.co/#/forms/selectable#rendering-the-options) to pass custom data for option rendering, which prevents the custom data from being added to the rendered DOM element. --- .../ml_inference/model_select.test.tsx | 27 ++++++++++++++----- .../pipelines/ml_inference/model_select.tsx | 27 ++++++++++++------- .../ml_inference/model_select_option.test.tsx | 8 +++--- .../ml_inference/model_select_option.tsx | 8 ++---- 4 files changed, 44 insertions(+), 26 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select.test.tsx index f82c0ffb3b1c8..c8a970751643a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select.test.tsx @@ -83,11 +83,15 @@ describe('ModelSelect', () => { const selectable = wrapper.find(EuiSelectable); expect(selectable.prop('options')).toEqual([ { - modelId: 'model_1', + data: { + modelId: 'model_1', + }, label: 'model_1', }, { - modelId: 'model_2', + data: { + modelId: 'model_2', + }, label: 'model_2', }, ]); @@ -114,7 +118,10 @@ describe('ModelSelect', () => { const wrapper = shallow(); expect(wrapper.find(EuiSelectable)).toHaveLength(1); const selectable = wrapper.find(EuiSelectable); - selectable.simulate('change', [{ modelId: 'model_1' }, { modelId: 'model_2', checked: 'on' }]); + selectable.simulate('change', [ + { data: { modelId: 'model_1' } }, + { data: { modelId: 'model_2' }, checked: 'on' }, + ]); expect(MOCK_ACTIONS.setInferencePipelineConfiguration).toHaveBeenCalledWith( expect.objectContaining({ inferenceConfig: undefined, @@ -130,8 +137,8 @@ describe('ModelSelect', () => { expect(wrapper.find(EuiSelectable)).toHaveLength(1); const selectable = wrapper.find(EuiSelectable); selectable.simulate('change', [ - { modelId: 'model_1' }, - { modelId: 'model_2', isPlaceholder: true, checked: 'on' }, + { data: { modelId: 'model_1' } }, + { data: { modelId: 'model_2', isPlaceholder: true }, checked: 'on' }, ]); expect(MOCK_ACTIONS.setInferencePipelineConfiguration).toHaveBeenCalledWith( expect.objectContaining({ @@ -146,7 +153,10 @@ describe('ModelSelect', () => { const wrapper = shallow(); expect(wrapper.find(EuiSelectable)).toHaveLength(1); const selectable = wrapper.find(EuiSelectable); - selectable.simulate('change', [{ modelId: 'model_1' }, { modelId: 'model_2', checked: 'on' }]); + selectable.simulate('change', [ + { data: { modelId: 'model_1' } }, + { data: { modelId: 'model_2' }, checked: 'on' }, + ]); expect(MOCK_ACTIONS.setInferencePipelineConfiguration).toHaveBeenCalledWith( expect.objectContaining({ pipelineName: 'my-index-model_2', @@ -168,7 +178,10 @@ describe('ModelSelect', () => { const wrapper = shallow(); expect(wrapper.find(EuiSelectable)).toHaveLength(1); const selectable = wrapper.find(EuiSelectable); - selectable.simulate('change', [{ modelId: 'model_1' }, { modelId: 'model_2', checked: 'on' }]); + selectable.simulate('change', [ + { data: { modelId: 'model_1' } }, + { data: { modelId: 'model_2' }, checked: 'on' }, + ]); expect(MOCK_ACTIONS.setInferencePipelineConfiguration).toHaveBeenCalledWith( expect.objectContaining({ pipelineName: 'user-pipeline', diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select.tsx index 6f5fc424aef0b..853bcb41a080f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select.tsx @@ -18,6 +18,7 @@ import { EuiPanel, EuiScreenReaderLive, EuiSelectable, + EuiSelectableOption, EuiText, EuiTextColor, EuiTitle, @@ -31,9 +32,13 @@ import { MlModel, MlModelDeploymentState } from '../../../../../../../common/typ import { LicenseBadge } from './license_badge'; import { ModelSelectLogic } from './model_select_logic'; -import { ModelSelectOption, ModelSelectOptionProps } from './model_select_option'; +import { ModelSelectOption } from './model_select_option'; import { normalizeModelName } from './utils'; +type EuiSelectableOptionWithMlModelData = EuiSelectableOption & { + data: MlModel; +}; + export const DeployModelButton: React.FC<{ onClick: () => void; modelId: string; @@ -297,33 +302,37 @@ export const ModelSelect: React.FC = () => { const maxVisibleOptions = 4.5; const [listHeight, setListHeight] = useState(maxVisibleOptions * rowHeight); - const getModelSelectOptionProps = (models: MlModel[]): ModelSelectOptionProps[] => + const getModelSelectOptionProps = (models: MlModel[]): EuiSelectableOptionWithMlModelData[] => (models ?? []).map((model) => ({ - ...model, label: model.modelId, checked: model.modelId === modelID ? 'on' : undefined, + data: { ...model }, })); - const onChange = (options: ModelSelectOptionProps[]) => { + const onChange = (options: EuiSelectableOptionWithMlModelData[]) => { const selectedModelOption = options.find((option) => option.checked === 'on'); setInferencePipelineConfiguration({ ...configuration, inferenceConfig: undefined, - modelID: selectedModelOption?.modelId ?? '', - isModelPlaceholderSelected: selectedModelOption?.isPlaceholder ?? false, + modelID: selectedModelOption?.data.modelId ?? '', + isModelPlaceholderSelected: selectedModelOption?.data.isPlaceholder ?? false, fieldMappings: undefined, pipelineName: isPipelineNameUserSupplied ? pipelineName - : indexName + '-' + normalizeModelName(selectedModelOption?.modelId ?? ''), + : indexName + '-' + normalizeModelName(selectedModelOption?.data.modelId ?? ''), }); }; - const onSearchChange = (_: string, matchingOptions: ModelSelectOptionProps[]) => { + const onSearchChange = (_: string, matchingOptions: EuiSelectableOptionWithMlModelData[]) => { setListHeight(Math.min(maxVisibleOptions, matchingOptions.length) * rowHeight); }; - const renderOption = (option: ModelSelectOptionProps) => ; + const renderOption = (option: EuiSelectableOptionWithMlModelData) => { + const { data, ...optionExclData } = option; + const flattenedOption = { ...optionExclData, ...data }; + return ; + }; return ( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_option.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_option.test.tsx index 81d022aedfb74..bcf4eb8342db1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_option.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_option.test.tsx @@ -11,15 +11,15 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { EuiText } from '@elastic/eui'; +import { EuiSelectableOption, EuiText } from '@elastic/eui'; -import { MlModelDeploymentState } from '../../../../../../../common/types/ml'; +import { MlModel, MlModelDeploymentState } from '../../../../../../../common/types/ml'; import { TrainedModelHealth } from '../ml_model_health'; import { LicenseBadge } from './license_badge'; -import { ModelSelectOption, ModelSelectOptionProps } from './model_select_option'; +import { ModelSelectOption } from './model_select_option'; -const DEFAULT_PROPS: ModelSelectOptionProps = { +const DEFAULT_PROPS: EuiSelectableOption = { modelId: 'model_1', type: 'ner', label: 'Model 1', diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_option.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_option.tsx index ced26293cd68d..b3728ab6f2c7f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_option.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_select_option.tsx @@ -10,6 +10,7 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, + EuiSelectableOption, EuiText, EuiTextColor, EuiTextTruncate, @@ -22,12 +23,7 @@ import { TrainedModelHealth } from '../ml_model_health'; import { LicenseBadge } from './license_badge'; -export type ModelSelectOptionProps = MlModel & { - label: string; - checked?: 'on'; -}; - -export const ModelSelectOption: React.FC = ({ +export const ModelSelectOption: React.FC> = ({ modelId, title, description, From 909e501de6a9a170ba503c07339a8ab1d0ff72d7 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 20 Dec 2023 08:29:39 -0500 Subject: [PATCH 17/62] skip failing test suite (#173165) --- .../observability/observability_log_explorer/header_menu.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts index 14d8dd94376de..0bb8da7a911b9 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts @@ -22,7 +22,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'svlCommonNavigation', ]); - describe('Header menu', () => { + // Failing: See https://github.com/elastic/kibana/issues/173165 + describe.skip('Header menu', () => { before(async () => { await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); await esArchiver.load( From b35e323718497338d7101f36253208bb3c301c1b Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Wed, 20 Dec 2023 14:41:39 +0100 Subject: [PATCH 18/62] [EDR Workflows][Osquery] Prevent querying offline agents (#173300) closes https://github.com/elastic/security-team/issues/8138 This PR resolves the bug that allowed users to run a query against an offline agent using a query from their query history. Before: https://github.com/elastic/kibana/assets/29123534/7742faee-8389-41ab-a8bf-9b0f6d70a26f After: https://github.com/elastic/kibana/assets/29123534/c4ff0213-8266-4fc1-a989-99bee8e93975 --- .../osquery/public/agents/agent_grouper.ts | 2 +- .../osquery/public/agents/agents_table.tsx | 65 ++++++++++--------- .../osquery/public/agents/helpers.test.ts | 2 + .../plugins/osquery/public/agents/helpers.ts | 13 +++- x-pack/plugins/osquery/public/agents/types.ts | 1 + .../osquery/public/agents/use_all_agents.ts | 37 ++++++----- .../live_queries/form/agents_table_field.tsx | 6 ++ 7 files changed, 75 insertions(+), 51 deletions(-) diff --git a/x-pack/plugins/osquery/public/agents/agent_grouper.ts b/x-pack/plugins/osquery/public/agents/agent_grouper.ts index 1375c30437d60..86f6bcbd42245 100644 --- a/x-pack/plugins/osquery/public/agents/agent_grouper.ts +++ b/x-pack/plugins/osquery/public/agents/agent_grouper.ts @@ -35,7 +35,7 @@ export const generateAgentOption = ( disabled: agent.status !== 'online', label: `${agent.local_metadata.host.hostname} (${agent.local_metadata.elastic.agent.id})`, key: agent.local_metadata.elastic.agent.id, - color: getColor(groupType), + color: agent.status !== 'online' ? 'danger' : getColor(groupType), value: { groupType, groups: { diff --git a/x-pack/plugins/osquery/public/agents/agents_table.tsx b/x-pack/plugins/osquery/public/agents/agents_table.tsx index f6b80e670f95b..c7b6fdd432fa3 100644 --- a/x-pack/plugins/osquery/public/agents/agents_table.tsx +++ b/x-pack/plugins/osquery/public/agents/agents_table.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import { find } from 'lodash/fp'; -import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { find, isEmpty } from 'lodash/fp'; +import React, { useCallback, useEffect, useRef, useState, useMemo } from 'react'; import { EuiComboBox, EuiHealth, @@ -40,7 +40,7 @@ import { NO_AGENT_AVAILABLE_TITLE, } from './translations'; -import type { SelectedGroups, AgentOptionValue, GroupOption, AgentSelection } from './types'; +import type { GroupOption, AgentSelection } from './types'; import { AGENT_GROUP_KEY } from './types'; interface AgentsTableProps { @@ -70,48 +70,45 @@ const AgentsTableComponent: React.FC = ({ agentSelection, onCh const { isLoading: agentsLoading, + isRefetching: agentsRefetching, data: agentList, isFetched: agentsFetched, } = useAllAgents(debouncedSearchValue, { perPage, + agentIds: agentSelection?.agents, }); // option related const [options, setOptions] = useState([]); const [selectedOptions, setSelectedOptions] = useState([]); - const [numAgentsSelected, setNumAgentsSelected] = useState(0); const defaultValueInitialized = useRef(false); + const numAgentsSelected = useMemo(() => { + const { newAgentSelection, selectedAgents, selectedGroups } = + generateAgentSelection(selectedOptions); + if (newAgentSelection.allAgentsSelected) { + return agentList?.total ?? 0; + } else { + const checkAgent = generateAgentCheck(selectedGroups); + + return ( + // filter out all the agents counted by selected policies and platforms + selectedAgents.filter(checkAgent).length + + // add the number of agents added via policy and platform groups + getNumAgentsInGrouping(selectedGroups) - + // subtract the number of agents double counted by policy/platform selections + getNumOverlapped(selectedGroups, agentList?.groups?.overlap ?? {}) + ); + } + }, [agentList?.groups?.overlap, agentList?.total, selectedOptions]); + const onSelection = useCallback( (selection: GroupOption[]) => { - // TODO?: optimize this by making the selection computation incremental - const { - newAgentSelection, - selectedAgents, - selectedGroups, - }: { - newAgentSelection: AgentSelection; - selectedAgents: AgentOptionValue[]; - selectedGroups: SelectedGroups; - } = generateAgentSelection(selection); - if (newAgentSelection.allAgentsSelected) { - setNumAgentsSelected(agentList?.total ?? 0); - } else { - const checkAgent = generateAgentCheck(selectedGroups); - setNumAgentsSelected( - // filter out all the agents counted by selected policies and platforms - selectedAgents.filter(checkAgent).length + - // add the number of agents added via policy and platform groups - getNumAgentsInGrouping(selectedGroups) - - // subtract the number of agents double counted by policy/platform selections - getNumOverlapped(selectedGroups, agentList?.groups?.overlap ?? {}) - ); - } - + const { newAgentSelection } = generateAgentSelection(selection); onChange(newAgentSelection); setSelectedOptions(selection); }, - [agentList?.groups?.overlap, agentList?.total, onChange] + [onChange] ); useEffect(() => { @@ -132,7 +129,13 @@ const AgentsTableComponent: React.FC = ({ agentSelection, onCh } }; - if (agentSelection && !defaultValueInitialized.current && options.length) { + if ( + agentSelection && + !isEmpty(agentSelection) && + !defaultValueInitialized.current && + options.length && + !agentsRefetching + ) { if (agentSelection.allAgentsSelected) { const allAgentsOptions = find(['label', ALL_AGENTS_LABEL], options); @@ -150,7 +153,7 @@ const AgentsTableComponent: React.FC = ({ agentSelection, onCh handleSelectedOptions(agentSelection.agents, AGENT_SELECTION_LABEL); } } - }, [agentSelection, onSelection, options, selectedOptions]); + }, [agentSelection, agentsFetched, agentsRefetching, onSelection, options, selectedOptions]); useEffect(() => { if (agentsFetched && agentList?.groups) { diff --git a/x-pack/plugins/osquery/public/agents/helpers.test.ts b/x-pack/plugins/osquery/public/agents/helpers.test.ts index 067aebc57944e..bdf4d2628e360 100644 --- a/x-pack/plugins/osquery/public/agents/helpers.test.ts +++ b/x-pack/plugins/osquery/public/agents/helpers.test.ts @@ -19,6 +19,7 @@ describe('generateAgentSelection', () => { expect(newAgentSelection).toEqual({ agents: [], allAgentsSelected: false, + offlineAgentsSelected: false, platformsSelected: [], policiesSelected: [], }); @@ -47,6 +48,7 @@ describe('generateAgentSelection', () => { expect(newAgentSelection).toEqual({ agents: [], allAgentsSelected: false, + offlineAgentsSelected: false, platformsSelected: platformOptions.map(({ value: { id } }) => id), policiesSelected: policyOptions.map(({ value: { id } }) => id), }); diff --git a/x-pack/plugins/osquery/public/agents/helpers.ts b/x-pack/plugins/osquery/public/agents/helpers.ts index b84c6e4957286..83c14ec0dcdac 100644 --- a/x-pack/plugins/osquery/public/agents/helpers.ts +++ b/x-pack/plugins/osquery/public/agents/helpers.ts @@ -67,12 +67,19 @@ export const generateAgentCheck = }) .every((a) => !a); -export const generateAgentSelection = (selection: GroupOption[]) => { +export const generateAgentSelection = ( + selection: GroupOption[] +): { + newAgentSelection: AgentSelection; + selectedAgents: AgentOptionValue[]; + selectedGroups: SelectedGroups; +} => { const newAgentSelection: AgentSelection = { agents: [], allAgentsSelected: false, platformsSelected: [], policiesSelected: [], + offlineAgentsSelected: false, }; // parse through the selections to be able to determine how many are actually selected const selectedAgents: AgentOptionValue[] = []; @@ -116,6 +123,10 @@ export const generateAgentSelection = (selection: GroupOption[]) => { } newAgentSelection.agents.push(key); + if (opt.disabled) { + newAgentSelection.offlineAgentsSelected = true; + } + break; default: // this should never happen! diff --git a/x-pack/plugins/osquery/public/agents/types.ts b/x-pack/plugins/osquery/public/agents/types.ts index 6f443641b227b..813c8a6276a02 100644 --- a/x-pack/plugins/osquery/public/agents/types.ts +++ b/x-pack/plugins/osquery/public/agents/types.ts @@ -30,6 +30,7 @@ export interface AgentSelection { allAgentsSelected: boolean; platformsSelected: string[]; policiesSelected: string[]; + offlineAgentsSelected?: boolean; } interface BaseGroupOption { diff --git a/x-pack/plugins/osquery/public/agents/use_all_agents.ts b/x-pack/plugins/osquery/public/agents/use_all_agents.ts index d0ea65c6bab05..12b98bccc0ed5 100644 --- a/x-pack/plugins/osquery/public/agents/use_all_agents.ts +++ b/x-pack/plugins/osquery/public/agents/use_all_agents.ts @@ -18,11 +18,12 @@ import { useOsqueryPolicies } from './use_osquery_policies'; interface RequestOptions { perPage?: number; page?: number; + agentIds?: string[]; } // TODO: break out the paginated vs all cases into separate hooks export const useAllAgents = (searchValue = '', opts: RequestOptions = { perPage: 9000 }) => { - const { perPage } = opts; + const { perPage, agentIds } = opts; const { http } = useKibana().services; const setErrorToast = useErrorToast(); @@ -32,9 +33,9 @@ export const useAllAgents = (searchValue = '', opts: RequestOptions = { perPage: agents: Agent[]; groups: ReturnType; total: number; - }>( - ['agents', osqueryPolicies, searchValue, perPage], - () => { + }>({ + queryKey: ['agents', osqueryPolicies, searchValue, perPage, agentIds], + queryFn: () => { let kuery = ''; if (osqueryPolicies?.length) { @@ -43,7 +44,9 @@ export const useAllAgents = (searchValue = '', opts: RequestOptions = { perPage: if (searchValue) { kuery += ` and (local_metadata.host.hostname:*${searchValue}* or local_metadata.elastic.agent.id:*${searchValue}*)`; } else { - kuery += ` and (status:online)`; + kuery += ` and (status:online ${ + agentIds?.length ? `or local_metadata.elastic.agent.id:(${agentIds.join(' or ')})` : '' + })`; } } @@ -55,18 +58,16 @@ export const useAllAgents = (searchValue = '', opts: RequestOptions = { perPage: }, }); }, - { - enabled: isFetched && !!osqueryPolicies?.length, - onSuccess: () => setErrorToast(), - onError: (error) => - // @ts-expect-error update types - setErrorToast(error?.body, { - title: i18n.translate('xpack.osquery.agents.fetchError', { - defaultMessage: 'Error while fetching agents', - }), - // @ts-expect-error update types - toastMessage: error?.body?.error, + enabled: isFetched && !!osqueryPolicies?.length, + onSuccess: () => setErrorToast(), + onError: (error) => + // @ts-expect-error update types + setErrorToast(error?.body, { + title: i18n.translate('xpack.osquery.agents.fetchError', { + defaultMessage: 'Error while fetching agents', }), - } - ); + // @ts-expect-error update types + toastMessage: error?.body?.error, + }), + }); }; diff --git a/x-pack/plugins/osquery/public/live_queries/form/agents_table_field.tsx b/x-pack/plugins/osquery/public/live_queries/form/agents_table_field.tsx index eab43c5982b80..078a9c712fc08 100644 --- a/x-pack/plugins/osquery/public/live_queries/form/agents_table_field.tsx +++ b/x-pack/plugins/osquery/public/live_queries/form/agents_table_field.tsx @@ -14,6 +14,12 @@ import type { AgentSelection } from '../../agents/types'; const checkAgentsLength = (agentsSelection: AgentSelection) => { if (!isEmpty(agentsSelection)) { + if (agentsSelection.offlineAgentsSelected) { + return i18n.translate('xpack.osquery.pack.queryFlyoutForm.osqueryAgentsOfflineErrorMessage', { + defaultMessage: 'Some agents are offline', + }); + } + const isValid = !!( agentsSelection.allAgentsSelected || agentsSelection.agents?.length || From 9023497cb52be81a7180262a14d95f10cb8bf40c Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Wed, 20 Dec 2023 14:44:54 +0100 Subject: [PATCH 19/62] [ES|QL] Display the correct language string (#173721) ## Summary Fixes the action title to use the correct language name Screenshot 2023-12-20 at 11 29 34 --- x-pack/plugins/lens/public/embeddable/embeddable.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index e5d34db62ba75..c1dd7901f3822 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -21,6 +21,7 @@ import { isOfQueryType, getAggregateQueryMode, ExecutionContextSearch, + getLanguageDisplayName, } from '@kbn/es-query'; import type { PaletteOutput } from '@kbn/coloring'; import { @@ -740,7 +741,7 @@ export class Embeddable } const query = this.savedVis?.state.query as unknown as AggregateQuery; const language = getAggregateQueryMode(query); - return String(language).toUpperCase(); + return getLanguageDisplayName(language).toUpperCase(); } /** From 2c51f63dd1c91a5f5d5eaa68b22db7abadce6b8c Mon Sep 17 00:00:00 2001 From: Pete Harverson Date: Wed, 20 Dec 2023 14:00:27 +0000 Subject: [PATCH 20/62] [ML] Enhances toast notifications to improve error reporting (#173362) ## Summary Several enhancements to the error toast notifications in the ML plugin to improve error reporting. The bulk of the changes are to add 'See the full error' buttons to the toasts allowing the user to see further details on the error that has occurred. Also makes minor edits to some of the error messages to improve clarity. Also closes #171839 by changes to `x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js` so that the the 'Jobs started successfully' toast is only shown if 1 or more jobs have been started successfully. Fixes #171839 ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/full_time_range_selector.tsx | 11 ++--- .../full_time_range_selector_service.test.ts | 6 ++- .../full_time_range_selector_service.ts | 11 ++--- .../alerting/ml_anomaly_alert_trigger.tsx | 13 +++--- .../custom_url_editor/list.test.tsx | 8 ++++ .../custom_urls/custom_url_editor/list.tsx | 10 ++--- .../components/custom_urls/custom_urls.tsx | 45 ++++++++++--------- .../rule_editor/rule_editor_flyout.js | 43 +++++++++--------- .../rule_editor/rule_editor_flyout.test.js | 5 +++ .../jobs/jobs_list/components/utils.js | 24 +++++----- .../util/model_memory_estimator.ts | 6 ++- .../components/time_range_step/time_range.tsx | 3 +- .../jobs/new_job/recognize/page.tsx | 21 ++++----- .../memory_usage/memory_tree_map/tree_map.tsx | 2 +- .../nodes_overview/nodes_list.tsx | 2 +- .../model_management/models_list.tsx | 4 +- .../components/notifications_list.tsx | 2 +- .../routing/routes/new_job/recognize.tsx | 8 ++-- .../settings/anomaly_detection_settings.tsx | 10 +++-- .../settings/calendars/edit/new_calendar.js | 19 ++++---- .../calendars/edit/new_calendar.test.js | 5 +++ .../settings/calendars/list/calendars_list.js | 8 ++++ .../filter_lists/edit/edit_filter_list.js | 18 ++++---- .../edit/edit_filter_list.test.js | 9 ++++ .../filter_lists/list/filter_lists.js | 15 ++++++- .../application/settings/settings.test.tsx | 2 +- 26 files changed, 186 insertions(+), 124 deletions(-) diff --git a/x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx b/x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx index cb890172bbdd9..5fd828feb8fa4 100644 --- a/x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx +++ b/x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx @@ -118,14 +118,15 @@ export const FullTimeRangeSelector: FC = (props) => callback(fullTimeRange); } } catch (e) { - toasts.addDanger( - i18n.translate( + toasts.addError(e, { + title: i18n.translate( 'xpack.ml.datePicker.fullTimeRangeSelector.errorSettingTimeRangeNotification', { - defaultMessage: 'An error occurred setting the time range.', + defaultMessage: + 'An error occurred setting the time range. Please set the desired start and end times.', } - ) - ); + ), + }); } }, [ timefilter, diff --git a/x-pack/packages/ml/date_picker/src/services/full_time_range_selector_service.test.ts b/x-pack/packages/ml/date_picker/src/services/full_time_range_selector_service.test.ts index c38357d77dbc7..285bae4fd199b 100644 --- a/x-pack/packages/ml/date_picker/src/services/full_time_range_selector_service.test.ts +++ b/x-pack/packages/ml/date_picker/src/services/full_time_range_selector_service.test.ts @@ -20,7 +20,11 @@ import { getTimeFieldRange } from './time_field_range'; const mockParamsFactory = () => ({ timefilter: { setTime: jest.fn() } as unknown as TimefilterContract, dataView: { getIndexPattern: jest.fn(), getRuntimeMappings: jest.fn() } as unknown as DataView, - toasts: { addWarning: jest.fn(), addDanger: jest.fn() } as unknown as ToastsStart, + toasts: { + addWarning: jest.fn(), + addDanger: jest.fn(), + addError: jest.fn(), + } as unknown as ToastsStart, }); describe('setFullTimeRange', () => { diff --git a/x-pack/packages/ml/date_picker/src/services/full_time_range_selector_service.ts b/x-pack/packages/ml/date_picker/src/services/full_time_range_selector_service.ts index c4cdd23995ae7..6d824989c13e0 100644 --- a/x-pack/packages/ml/date_picker/src/services/full_time_range_selector_service.ts +++ b/x-pack/packages/ml/date_picker/src/services/full_time_range_selector_service.ts @@ -81,14 +81,15 @@ export async function setFullTimeRange( }); } } catch (error) { - toasts.addDanger( - i18n.translate( + toasts.addError(error, { + title: i18n.translate( 'xpack.ml.datePicker.fullTimeRangeSelector.errorSettingTimeRangeNotification', { - defaultMessage: 'An error occurred setting the time range.', + defaultMessage: + 'An error occurred setting the time range. Please set the desired start and end times.', } - ) - ); + ), + }); } } diff --git a/x-pack/plugins/ml/public/alerting/ml_anomaly_alert_trigger.tsx b/x-pack/plugins/ml/public/alerting/ml_anomaly_alert_trigger.tsx index 3262fbd6cac7f..45bf7b1ca613b 100644 --- a/x-pack/plugins/ml/public/alerting/ml_anomaly_alert_trigger.tsx +++ b/x-pack/plugins/ml/public/alerting/ml_anomaly_alert_trigger.tsx @@ -16,6 +16,7 @@ import { JobSelectorControl } from './job_selector'; import { useMlKibana } from '../application/contexts/kibana'; import { jobsApiProvider } from '../application/services/ml_api_service/jobs'; import { HttpService } from '../application/services/http_service'; +import { useToastNotificationService } from '../application/services/toast_notification_service'; import { SeverityControl } from '../application/components/severity_control'; import { ResultTypeSelector } from './result_type_selector'; import { alertingApiProvider } from '../application/services/ml_api_service/alerting'; @@ -44,11 +45,11 @@ const MlAnomalyAlertTrigger: FC = ({ }) => { const { services: { http }, - notifications: { toasts }, } = useMlKibana(); const mlHttpService = useMemo(() => new HttpService(http), [http]); const adJobsApiService = useMemo(() => jobsApiProvider(mlHttpService), [mlHttpService]); const alertingApiService = useMemo(() => alertingApiProvider(mlHttpService), [mlHttpService]); + const { displayErrorToast } = useToastNotificationService(); const [jobConfigs, setJobConfigs] = useState([]); @@ -74,13 +75,13 @@ const MlAnomalyAlertTrigger: FC = ({ const jobs = await adJobsApiService.jobs(jobsAndGroupIds); setJobConfigs(jobs); } catch (e) { - toasts.danger({ - title: i18n.translate('xpack.ml.anomalyDetectionAlert.errorFetchingJobs', { + displayErrorToast( + e, + i18n.translate('xpack.ml.anomalyDetectionAlert.errorFetchingJobs', { defaultMessage: 'Unable to fetch jobs configuration', }), - body: e.message, - toastLifeTimeMs: 5000, - }); + 5000 + ); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobsAndGroupIds]); diff --git a/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/list.test.tsx b/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/list.test.tsx index 7f2bd05fe9208..f061dbb96f16f 100644 --- a/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/list.test.tsx +++ b/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/list.test.tsx @@ -13,6 +13,14 @@ import { CustomUrlList, CustomUrlListProps } from './list'; jest.mock('../../../contexts/kibana'); +jest.mock('../../../services/toast_notification_service', () => ({ + useToastNotificationService: () => { + return { + displayErrorToast: jest.fn(), + }; + }, +})); + function prepareTest(setCustomUrlsFn: jest.Mock) { const customUrls = [ { diff --git a/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/list.tsx b/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/list.tsx index 3ee39cb611764..a4de96f662600 100644 --- a/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/list.tsx +++ b/x-pack/plugins/ml/public/application/components/custom_urls/custom_url_editor/list.tsx @@ -29,6 +29,7 @@ import { import { parseUrlState } from '@kbn/ml-url-state'; import { useMlKibana } from '../../../contexts/kibana'; +import { useToastNotificationService } from '../../../services/toast_notification_service'; import { isValidLabel, openCustomUrlWindow } from '../../../util/custom_url_utils'; import { getTestUrl } from './utils'; @@ -68,10 +69,10 @@ export const CustomUrlList: FC = ({ const { services: { http, - notifications, data: { dataViews }, }, } = useMlKibana(); + const { displayErrorToast } = useToastNotificationService(); const [expandedUrlIndex, setExpandedUrlIndex] = useState(null); const onLabelChange = (e: ChangeEvent, index: number) => { @@ -161,11 +162,8 @@ export const CustomUrlList: FC = ({ const testUrl = await getTestUrl(job, customUrl, timefieldName, undefined, isPartialDFAJob); openCustomUrlWindow(testUrl, customUrl, http.basePath.get()); } catch (error) { - // eslint-disable-next-line no-console - console.error('Error obtaining URL for test:', error); - - const { toasts } = notifications; - toasts.addDanger( + displayErrorToast( + error, i18n.translate( 'xpack.ml.customUrlEditorList.obtainingUrlToTestConfigurationErrorMessage', { diff --git a/x-pack/plugins/ml/public/application/components/custom_urls/custom_urls.tsx b/x-pack/plugins/ml/public/application/components/custom_urls/custom_urls.tsx index b020a87b36c1b..c64f7f3ee2861 100644 --- a/x-pack/plugins/ml/public/application/components/custom_urls/custom_urls.tsx +++ b/x-pack/plugins/ml/public/application/components/custom_urls/custom_urls.tsx @@ -29,6 +29,10 @@ import type { DataViewListItem } from '@kbn/data-views-plugin/common'; import type { MlUrlConfig } from '@kbn/ml-anomaly-utils'; import { isDataFrameAnalyticsConfigs } from '@kbn/ml-data-frame-analytics-utils'; import type { DashboardService, DashboardItems } from '../../services/dashboard_service'; +import { + ToastNotificationService, + toastNotificationServiceProvider, +} from '../../services/toast_notification_service'; import type { MlKibanaReactContextValue } from '../../contexts/kibana'; import { CustomUrlEditor, CustomUrlList } from './custom_url_editor'; import { @@ -58,6 +62,8 @@ interface CustomUrlsProps extends CustomUrlsWrapperProps { } class CustomUrlsUI extends Component { + private toastNotificationService: ToastNotificationService | undefined; + constructor(props: CustomUrlsProps) { super(props); @@ -79,16 +85,17 @@ class CustomUrlsUI extends Component { componentDidMount() { const { toasts } = this.props.kibana.services.notifications; + this.toastNotificationService = toastNotificationServiceProvider(toasts); const { dashboardService } = this.props; + dashboardService .fetchDashboards() .then((dashboards) => { this.setState({ dashboards }); }) - .catch((resp) => { - // eslint-disable-next-line no-console - console.error('Error loading list of dashboards:', resp); - toasts.addDanger( + .catch((error) => { + this.toastNotificationService!.displayErrorToast( + error, i18n.translate( 'xpack.ml.jobsList.editJobFlyout.customUrls.loadSavedDashboardsErrorNotificationMessage', { @@ -102,10 +109,9 @@ class CustomUrlsUI extends Component { .then((dataViewListItems) => { this.setState({ dataViewListItems }); }) - .catch((resp) => { - // eslint-disable-next-line no-console - console.error('Error loading list of dashboards:', resp); - toasts.addDanger( + .catch((error) => { + this.toastNotificationService!.displayErrorToast( + error, i18n.translate( 'xpack.ml.jobsList.editJobFlyout.customUrls.loadDataViewsErrorNotificationMessage', { @@ -148,11 +154,9 @@ class CustomUrlsUI extends Component { this.props.setCustomUrls(customUrls); this.setState({ editorOpen: false }); }) - .catch((error: Error) => { - // eslint-disable-next-line no-console - console.error('Error building custom URL from settings:', error); - const { toasts } = this.props.kibana.services.notifications; - toasts.addDanger( + .catch((error) => { + this.toastNotificationService!.displayErrorToast( + error, i18n.translate( 'xpack.ml.jobsList.editJobFlyout.customUrls.addNewUrlErrorNotificationMessage', { @@ -167,7 +171,6 @@ class CustomUrlsUI extends Component { onTestButtonClick = () => { const { http: { basePath }, - notifications: { toasts }, data: { dataViews }, dashboard, } = this.props.kibana.services; @@ -194,10 +197,9 @@ class CustomUrlsUI extends Component { .then((testUrl) => { openCustomUrlWindow(testUrl, customUrl, basePath.get()); }) - .catch((resp) => { - // eslint-disable-next-line no-console - console.error('Error obtaining URL for test:', resp); - toasts.addWarning( + .catch((error) => { + this.toastNotificationService!.displayErrorToast( + error, i18n.translate( 'xpack.ml.jobsList.editJobFlyout.customUrls.getTestUrlErrorNotificationMessage', { @@ -210,10 +212,9 @@ class CustomUrlsUI extends Component { } ); }) - .catch((resp) => { - // eslint-disable-next-line no-console - console.error('Error building custom URL from settings:', resp); - toasts.addWarning( + .catch((error) => { + this.toastNotificationService!.displayErrorToast( + error, i18n.translate( 'xpack.ml.jobsList.editJobFlyout.customUrls.buildUrlErrorNotificationMessage', { diff --git a/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.js b/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.js index 907933ad290c3..0e21de91dbbb9 100644 --- a/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.js +++ b/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.js @@ -32,7 +32,6 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { withKibana } from '@kbn/kibana-react-plugin/public'; -import { extractErrorMessage } from '@kbn/ml-error-utils'; import { ML_DETECTOR_RULE_ACTION, ML_DETECTOR_RULE_CONDITIONS_NOT_SUPPORTED_FUNCTIONS, @@ -55,6 +54,7 @@ import { import { getPartitioningFieldNames } from '../../../../common/util/job_utils'; import { mlJobService } from '../../services/job_service'; +import { toastNotificationServiceProvider } from '../../services/toast_notification_service'; import { ml } from '../../services/ml_api_service'; class RuleEditorFlyoutUI extends Component { @@ -83,6 +83,9 @@ class RuleEditorFlyoutUI extends Component { } componentDidMount() { + this.toastNotificationService = toastNotificationServiceProvider( + this.props.kibana.services.notifications.toasts + ); if (typeof this.props.setShowFunction === 'function') { this.props.setShowFunction(this.showFlyout); } @@ -105,8 +108,7 @@ class RuleEditorFlyoutUI extends Component { i18n.translate( 'xpack.ml.ruleEditor.ruleEditorFlyout.unableToConfigureRulesNotificationMesssage', { - defaultMessage: - 'Unable to configure job rules as an error occurred obtaining details for job ID {jobId}', + defaultMessage: 'Unable to configure job rules as no job found with ID {jobId}', values: { jobId: anomaly.jobId }, } ) @@ -153,10 +155,9 @@ class RuleEditorFlyoutUI extends Component { filterListIds, }); }) - .catch((resp) => { - console.log('Error loading list of filters:', resp); - const { toasts } = this.props.kibana.services.notifications; - toasts.addDanger( + .catch((error) => { + this.toastNotificationService.displayErrorToast( + error, i18n.translate( 'xpack.ml.ruleEditor.ruleEditorFlyout.errorWithLoadingFilterListsNotificationMesssage', { @@ -374,8 +375,8 @@ class RuleEditorFlyoutUI extends Component { } }) .catch((error) => { - console.error(error); - toasts.addDanger( + this.toastNotificationService.displayErrorToast( + error, i18n.translate( 'xpack.ml.ruleEditor.ruleEditorFlyout.errorWithSavingChangesToJobDetectorRulesNotificationMessage', { @@ -426,18 +427,16 @@ class RuleEditorFlyoutUI extends Component { } }) .catch((error) => { - console.error(error); - let errorMessage = i18n.translate( - 'xpack.ml.ruleEditor.ruleEditorFlyout.errorWithDeletingRuleFromJobDetectorNotificationMessage', - { - defaultMessage: 'Error deleting rule from {jobId} detector', - values: { jobId }, - } + this.toastNotificationService.displayErrorToast( + error, + i18n.translate( + 'xpack.ml.ruleEditor.ruleEditorFlyout.errorWithDeletingRuleFromJobDetectorNotificationMessage', + { + defaultMessage: 'Error deleting rule from {jobId} detector', + values: { jobId }, + } + ) ); - if (error.error) { - errorMessage += ` : ${extractErrorMessage(error.error)}`; - } - toasts.addDanger(errorMessage); }); }; @@ -467,8 +466,8 @@ class RuleEditorFlyoutUI extends Component { } }) .catch((error) => { - console.log(`Error adding ${item} to filter ${filterId}:`, error); - toasts.addDanger( + this.toastNotificationService.displayErrorToast( + error, i18n.translate( 'xpack.ml.ruleEditor.ruleEditorFlyout.errorWithAddingItemToFilterListNotificationMessage', { diff --git a/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.test.js b/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.test.js index 290d815271dcc..67ace1427eb13 100644 --- a/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.test.js +++ b/x-pack/plugins/ml/public/application/components/rule_editor/rule_editor_flyout.test.js @@ -93,6 +93,11 @@ function prepareTest() { }, }, }, + notifications: { + toasts: { + addDanger: () => {}, + }, + }, }, }, }; diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js index 840b34ca70ceb..ffa9e8eecf0ee 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js @@ -185,17 +185,19 @@ function showResults(resp, action) { } const toastNotifications = getToastNotifications(); - toastNotifications.addSuccess( - i18n.translate('xpack.ml.jobsList.actionExecuteSuccessfullyNotificationMessage', { - defaultMessage: - '{successesJobsCount, plural, one{{successJob}} other{# jobs}} {actionTextPT} successfully', - values: { - successesJobsCount: successes.length, - successJob: successes[0], - actionTextPT, - }, - }) - ); + if (successes.length > 0) { + toastNotifications.addSuccess( + i18n.translate('xpack.ml.jobsList.actionExecuteSuccessfullyNotificationMessage', { + defaultMessage: + '{successesJobsCount, plural, one{{successJob}} other{# jobs}} {actionTextPT} successfully', + values: { + successesJobsCount: successes.length, + successJob: successes[0], + actionTextPT, + }, + }) + ); + } if (failures.length > 0) { failures.forEach((f) => { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts index 52d4d77106217..ebc8820e25566 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts @@ -123,7 +123,11 @@ export const useModelMemoryEstimator = ( title: i18n.translate('xpack.ml.newJob.wizard.estimateModelMemoryError', { defaultMessage: 'Model memory limit could not be calculated', }), - text: extractErrorMessage(error), + text: i18n.translate('xpack.ml.newJob.wizard.estimateModelMemoryErrorText', { + defaultMessage: + '{errorText}. You can proceed with creating the job, but check for warning messages once the job is running that the configured limit has not been exceeded.', + values: { errorText: extractErrorMessage(error) }, + }), }); }) ); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/time_range_step/time_range.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/time_range_step/time_range.tsx index d93eb690c31d9..9849864811bc4 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/time_range_step/time_range.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/time_range_step/time_range.tsx @@ -113,7 +113,8 @@ export const TimeRangeStep: FC = ({ setCurrentStep, isCurrentStep }) const { toasts } = services.notifications; toasts.addDanger( i18n.translate('xpack.ml.newJob.wizard.timeRangeStep.fullTimeRangeError', { - defaultMessage: 'An error occurred obtaining the time range for the index', + defaultMessage: + 'An error occurred obtaining the time range for the index. Please set the desired start and end times.', }) ); } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx index fe2c5dfa966aa..1feab0193d087 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx @@ -234,21 +234,22 @@ export const Page: FC = ({ moduleId, existingGroupIds }) => { ); } catch (e) { setSaveState(SAVE_STATE.FAILED); - // eslint-disable-next-line no-console - console.error('Error setting up module', e); const { toasts } = notifications; - toasts.addDanger({ + toasts.addError(e, { title: i18n.translate('xpack.ml.newJob.recognize.moduleSetupFailedWarningTitle', { defaultMessage: 'Error setting up module {moduleId}', values: { moduleId }, }), - text: i18n.translate('xpack.ml.newJob.recognize.moduleSetupFailedWarningDescription', { - defaultMessage: - 'An error occurred trying to create the {count, plural, one {job} other {jobs}} in the module.', - values: { - count: jobs.length, - }, - }), + toastMessage: i18n.translate( + 'xpack.ml.newJob.recognize.moduleSetupFailedWarningDescription', + { + defaultMessage: + 'An error occurred trying to create the {count, plural, one {job} other {jobs}} in the module.', + values: { + count: jobs.length, + }, + } + ), }); } }, diff --git a/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx b/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx index ebbae3fff924f..e8851124e3399 100644 --- a/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx +++ b/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx @@ -126,7 +126,7 @@ export const JobMemoryTreeMap: FC = ({ node, type, height }) => { displayErrorToast( error, i18n.translate('xpack.ml.memoryUsage.treeMap.fetchFailedErrorMessage', { - defaultMessage: 'Models memory usage fetch failed', + defaultMessage: 'Error loading model memory usage data', }) ); } diff --git a/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/nodes_list.tsx b/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/nodes_list.tsx index a8e5848aaef1a..8c2bfa15a0891 100644 --- a/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/nodes_list.tsx +++ b/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/nodes_list.tsx @@ -84,7 +84,7 @@ export const NodesList: FC = ({ compactView = false }) => { displayErrorToast( e, i18n.translate('xpack.ml.trainedModels.nodesList.nodesFetchError', { - defaultMessage: 'Nodes fetch failed', + defaultMessage: 'Error loading overview on machine learning nodes', }) ); setIsLoading(false); diff --git a/x-pack/plugins/ml/public/application/model_management/models_list.tsx b/x-pack/plugins/ml/public/application/model_management/models_list.tsx index dd766d10c36d1..a12d55cd22bed 100644 --- a/x-pack/plugins/ml/public/application/model_management/models_list.tsx +++ b/x-pack/plugins/ml/public/application/model_management/models_list.tsx @@ -305,7 +305,7 @@ export const ModelsList: FC = ({ displayErrorToast( error, i18n.translate('xpack.ml.trainedModels.modelsList.fetchFailedErrorMessage', { - defaultMessage: 'Models fetch failed', + defaultMessage: 'Error loading trained models', }) ); } @@ -383,7 +383,7 @@ export const ModelsList: FC = ({ displayErrorToast( error, i18n.translate('xpack.ml.trainedModels.modelsList.fetchModelStatsErrorMessage', { - defaultMessage: 'Fetch model stats failed', + defaultMessage: 'Error loading trained models statistics', }) ); return false; diff --git a/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx b/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx index 850ce45fde123..c603fcde74df1 100644 --- a/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx +++ b/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx @@ -136,7 +136,7 @@ export const NotificationsList: FC = () => { displayErrorToast( error, i18n.translate('xpack.ml.notifications.fetchFailedError', { - defaultMessage: 'Fetch notifications failed', + defaultMessage: 'Error loading list of notifications', }) ); } diff --git a/x-pack/plugins/ml/public/application/routing/routes/new_job/recognize.tsx b/x-pack/plugins/ml/public/application/routing/routes/new_job/recognize.tsx index ff783fe2260af..caf6a7674373a 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/new_job/recognize.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/new_job/recognize.tsx @@ -105,18 +105,16 @@ const CheckViewOrCreateWrapper: FC = ({ location }) => { } }) .catch(async (err: Error) => { - // eslint-disable-next-line no-console - console.error(`Error checking whether jobs in module ${moduleId} exists`, err); - toasts.addWarning({ + toasts.addError(err, { title: i18n.translate('xpack.ml.newJob.recognize.moduleCheckJobsExistWarningTitle', { defaultMessage: 'Error checking module {moduleId}', values: { moduleId }, }), - text: i18n.translate( + toastMessage: i18n.translate( 'xpack.ml.newJob.recognize.moduleCheckJobsExistWarningDescription', { defaultMessage: - 'An error occurred trying to check whether the jobs in the module have been created.', + 'An error occurred checking whether the jobs in the module have been created. Search the list for matching jobs or create new jobs.', } ), }); diff --git a/x-pack/plugins/ml/public/application/settings/anomaly_detection_settings.tsx b/x-pack/plugins/ml/public/application/settings/anomaly_detection_settings.tsx index 4a19bc96c8c67..17dea3ca3536f 100644 --- a/x-pack/plugins/ml/public/application/settings/anomaly_detection_settings.tsx +++ b/x-pack/plugins/ml/public/application/settings/anomaly_detection_settings.tsx @@ -22,8 +22,8 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { AnomalyDetectionSettingsContext } from './anomaly_detection_settings_context'; -import { useNotifications } from '../contexts/kibana'; import { ml } from '../services/ml_api_service'; +import { useToastNotificationService } from '../services/toast_notification_service'; import { ML_PAGES } from '../../../common/constants/locator'; import { useCreateAndNavigateToMlLink } from '../contexts/kibana/use_create_url'; @@ -35,7 +35,7 @@ export const AnomalyDetectionSettings: FC = () => { AnomalyDetectionSettingsContext ); - const { toasts } = useNotifications(); + const { displayErrorToast } = useToastNotificationService(); const redirectToCalendarList = useCreateAndNavigateToMlLink(ML_PAGES.CALENDARS_MANAGE); const redirectToNewCalendarPage = useCreateAndNavigateToMlLink(ML_PAGES.CALENDARS_NEW); const redirectToFilterLists = useCreateAndNavigateToMlLink(ML_PAGES.FILTER_LISTS_MANAGE); @@ -53,7 +53,8 @@ export const AnomalyDetectionSettings: FC = () => { const calendars = await ml.calendars(); setCalendarsCount(calendars.length); } catch (e) { - toasts.addDanger( + displayErrorToast( + e, i18n.translate('xpack.ml.settings.anomalyDetection.loadingCalendarsCountErrorMessage', { defaultMessage: 'An error occurred obtaining the count of calendars', }) @@ -66,7 +67,8 @@ export const AnomalyDetectionSettings: FC = () => { const filterLists = await ml.filters.filtersStats(); setFilterListsCount(filterLists.length); } catch (e) { - toasts.addDanger( + displayErrorToast( + e, i18n.translate('xpack.ml.settings.anomalyDetection.loadingFilterListCountErrorMessage', { defaultMessage: 'An error occurred obtaining the count of filter lists', }) diff --git a/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.js b/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.js index ce1dfe7cd970f..6375dfab79857 100644 --- a/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.js +++ b/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.js @@ -20,6 +20,7 @@ import { ml } from '../../../services/ml_api_service'; import { withKibana } from '@kbn/kibana-react-plugin/public'; import { GLOBAL_CALENDAR } from '../../../../../common/constants/calendars'; import { ML_PAGES } from '../../../../../common/constants/locator'; +import { toastNotificationServiceProvider } from '../../../services/toast_notification_service'; import { getDocLinks } from '../../../util/dependency_cache'; import { HelpMenu } from '../../../components/help_menu'; @@ -54,6 +55,9 @@ class NewCalendarUI extends Component { } componentDidMount() { + this.toastNotificationService = toastNotificationServiceProvider( + this.props.kibana.services.notifications.toasts + ); this.formSetup(); } @@ -118,10 +122,9 @@ class NewCalendarUI extends Component { isGlobalCalendar, }); } catch (error) { - console.log(error); this.setState({ loading: false }); - const { toasts } = this.props.kibana.services.notifications; - toasts.addDanger( + this.toastNotificationService.displayErrorToast( + error, i18n.translate('xpack.ml.calendarsEdit.errorWithLoadingCalendarFromDataErrorMessage', { defaultMessage: 'An error occurred loading calendar form data. Try refreshing the page.', }) @@ -160,10 +163,9 @@ class NewCalendarUI extends Component { await ml.addCalendar(calendar); await this.returnToCalendarsManagementPage(); } catch (error) { - console.log('Error saving calendar', error); this.setState({ saving: false }); - const { toasts } = this.props.kibana.services.notifications; - toasts.addDanger( + this.toastNotificationService.displayErrorToast( + error, i18n.translate('xpack.ml.calendarsEdit.errorWithCreatingCalendarErrorMessage', { defaultMessage: 'An error occurred creating calendar {calendarId}', values: { calendarId: calendar.calendarId }, @@ -181,10 +183,9 @@ class NewCalendarUI extends Component { await ml.updateCalendar(calendar); await this.returnToCalendarsManagementPage(); } catch (error) { - console.log('Error saving calendar', error); this.setState({ saving: false }); - const { toasts } = this.props.kibana.services.notifications; - toasts.addDanger( + this.toastNotificationService.displayErrorToast( + error, i18n.translate('xpack.ml.calendarsEdit.errorWithUpdatingCalendarErrorMessage', { defaultMessage: 'An error occurred saving calendar {calendarId}. Try refreshing the page.', diff --git a/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.test.js b/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.test.js index 299c1340e8599..4e9a16858f816 100644 --- a/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.test.js +++ b/x-pack/plugins/ml/public/application/settings/calendars/edit/new_calendar.test.js @@ -117,6 +117,11 @@ const props = { }, }, }, + notifications: { + toasts: { + addDanger: () => {}, + }, + }, }, }, }; diff --git a/x-pack/plugins/ml/public/application/settings/calendars/list/calendars_list.js b/x-pack/plugins/ml/public/application/settings/calendars/list/calendars_list.js index a3bb900ca1ce2..27c6b4de8389c 100644 --- a/x-pack/plugins/ml/public/application/settings/calendars/list/calendars_list.js +++ b/x-pack/plugins/ml/public/application/settings/calendars/list/calendars_list.js @@ -13,6 +13,7 @@ import { EuiConfirmModal, EUI_MODAL_CONFIRM_BUTTON } from '@elastic/eui'; import { CalendarsListHeader } from './header'; import { CalendarsListTable } from './table'; import { ml } from '../../../services/ml_api_service'; +import { toastNotificationServiceProvider } from '../../../services/toast_notification_service'; import { mlNodesAvailable } from '../../../ml_nodes_check/check_ml_nodes'; import { deleteCalendars } from './delete_calendars'; import { i18n } from '@kbn/i18n'; @@ -58,6 +59,13 @@ export class CalendarsListUI extends Component { defaultMessage: 'An error occurred loading the list of calendars.', }) ); + const toastNotificationService = toastNotificationServiceProvider(toasts); + toastNotificationService.displayErrorToast( + error, + i18n.translate('xpack.ml.calendarsList.errorWithLoadingListOfCalendarsErrorMessage', { + defaultMessage: 'An error occurred loading the list of calendars.', + }) + ); } }; diff --git a/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.js b/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.js index 1c6dc162f505f..d05484a9d3b89 100644 --- a/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.js +++ b/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.js @@ -31,6 +31,7 @@ import { EditFilterListToolbar } from './toolbar'; import { ItemsGrid } from '../../../components/items_grid'; import { isValidFilterListId, saveFilterList } from './utils'; import { ml } from '../../../services/ml_api_service'; +import { toastNotificationServiceProvider } from '../../../services/toast_notification_service'; import { ML_PAGES } from '../../../../../common/constants/locator'; import { getDocLinks } from '../../../util/dependency_cache'; import { HelpMenu } from '../../../components/help_menu'; @@ -93,6 +94,9 @@ export class EditFilterListUI extends Component { } componentDidMount() { + this.toastNotificationService = toastNotificationServiceProvider( + this.props.kibana.services.notifications.toasts + ); const filterId = this.props.filterId; if (filterId !== undefined) { this.loadFilterList(filterId); @@ -117,10 +121,9 @@ export class EditFilterListUI extends Component { .then((filter) => { this.setLoadedFilterState(filter); }) - .catch((resp) => { - console.log(`Error loading filter ${filterId}:`, resp); - const { toasts } = this.props.kibana.services.notifications; - toasts.addDanger( + .catch((error) => { + this.toastNotificationService.displayErrorToast( + error, i18n.translate( 'xpack.ml.settings.filterLists.editFilterList.loadingDetailsOfFilterErrorMessage', { @@ -287,10 +290,9 @@ export class EditFilterListUI extends Component { this.setLoadedFilterState(savedFilter); this.returnToFiltersList(); }) - .catch((resp) => { - console.log(`Error saving filter ${filterId}:`, resp); - const { toasts } = this.props.kibana.services.notifications; - toasts.addDanger( + .catch((error) => { + this.toastNotificationService.displayErrorToast( + error, i18n.translate('xpack.ml.settings.filterLists.editFilterList.savingFilterErrorMessage', { defaultMessage: 'An error occurred saving filter {filterId}', values: { diff --git a/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.test.js b/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.test.js index 45c43e04daa68..e3e740f1f7d78 100644 --- a/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.test.js +++ b/x-pack/plugins/ml/public/application/settings/filter_lists/edit/edit_filter_list.test.js @@ -59,6 +59,15 @@ import { EditFilterList } from './edit_filter_list'; const props = { canCreateFilter: true, canDeleteFilter: true, + kibana: { + services: { + notifications: { + toasts: { + addWarning: () => {}, + }, + }, + }, + }, }; function prepareEditTest() { diff --git a/x-pack/plugins/ml/public/application/settings/filter_lists/list/filter_lists.js b/x-pack/plugins/ml/public/application/settings/filter_lists/list/filter_lists.js index 352856c6fcf51..a55473a731322 100644 --- a/x-pack/plugins/ml/public/application/settings/filter_lists/list/filter_lists.js +++ b/x-pack/plugins/ml/public/application/settings/filter_lists/list/filter_lists.js @@ -19,6 +19,7 @@ import { withKibana } from '@kbn/kibana-react-plugin/public'; import { FilterListsHeader } from './header'; import { FilterListsTable } from './table'; import { ml } from '../../../services/ml_api_service'; +import { toastNotificationServiceProvider } from '../../../services/toast_notification_service'; import { getDocLinks } from '../../../util/dependency_cache'; import { HelpMenu } from '../../../components/help_menu'; @@ -69,8 +70,8 @@ export class FilterListsUI extends Component { .then((filterLists) => { this.setFilterLists(filterLists); }) - .catch((resp) => { - console.log('Error loading list of filters:', resp); + .catch((error) => { + console.log('Error loading list of filters:', error); const { toasts } = this.props.kibana.services.notifications; toasts.addDanger( i18n.translate( @@ -80,6 +81,16 @@ export class FilterListsUI extends Component { } ) ); + const toastNotificationService = toastNotificationServiceProvider(toasts); + toastNotificationService.displayErrorToast( + error, + i18n.translate( + 'xpack.ml.settings.filterLists.filterLists.loadingFilterListsErrorMessage', + { + defaultMessage: 'An error occurred loading the filter lists', + } + ) + ); }); }; diff --git a/x-pack/plugins/ml/public/application/settings/settings.test.tsx b/x-pack/plugins/ml/public/application/settings/settings.test.tsx index ad3847e011371..89ad2a965df91 100644 --- a/x-pack/plugins/ml/public/application/settings/settings.test.tsx +++ b/x-pack/plugins/ml/public/application/settings/settings.test.tsx @@ -18,7 +18,7 @@ jest.mock('../components/help_menu', () => ({ jest.mock('../contexts/kibana', () => ({ useNotifications: () => { return { - toasts: { addDanger: jest.fn() }, + toasts: { addDanger: jest.fn(), addError: jest.fn() }, }; }, useMlKibana: () => { From a47417c2aa82eecb64d9bc219be8d4ab9f8b60f3 Mon Sep 17 00:00:00 2001 From: Ignacio Rivas Date: Wed, 20 Dec 2023 15:00:43 +0100 Subject: [PATCH 21/62] [Index management] Skip DSL cits (#173649) --- .../index_template_wizard/template_create.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.test.tsx index 367437e5c5346..2bd505b4fa7aa 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.test.tsx @@ -608,7 +608,7 @@ describe('', () => { }); }); - describe('DSL', () => { + describe.skip('DSL', () => { beforeEach(async () => { await act(async () => { testBed = await setup(httpSetup); From f82e83d7b8ae2f7d9c5d11d2ab84bae365b919e2 Mon Sep 17 00:00:00 2001 From: Thom Heymann <190132+thomheymann@users.noreply.github.com> Date: Wed, 20 Dec 2023 14:03:38 +0000 Subject: [PATCH 22/62] [Logs UI] Indicate when viewing a widget (embedded logs) in Logs Stream (#173480) Resolves #171103 ## Summary This PR adds an indication when viewing a widget (embedded logs) in Logs Stream. It also adds to ability to revert back to default Logs Stream view. ## Screenshot Logs stream app when viewing a widget (embedded logs): Screenshot 2023-12-19 at 22 40 53 Also moved warning callout on Settings page to the top so users know what settings apply to before making changes: Screenshot 2023-12-20 at 09 35 15 --- .../asset_details/hooks/use_data_views.ts | 11 +++ .../public/hooks/use_log_view_reference.ts | 11 ++- .../logs/settings/inline_log_view_callout.tsx | 22 +++-- .../source_configuration_settings.tsx | 92 +++++++++---------- .../components/stream_page_template.tsx | 84 ++++++++++++++--- .../components/tabs/logs/logs_tab_content.tsx | 4 + .../translations/translations/fr-FR.json | 5 +- .../translations/translations/ja-JP.json | 5 +- .../translations/translations/zh-CN.json | 5 +- 9 files changed, 153 insertions(+), 86 deletions(-) diff --git a/x-pack/plugins/infra/public/components/asset_details/hooks/use_data_views.ts b/x-pack/plugins/infra/public/components/asset_details/hooks/use_data_views.ts index ec299be484f2d..d8883b9c2079a 100644 --- a/x-pack/plugins/infra/public/components/asset_details/hooks/use_data_views.ts +++ b/x-pack/plugins/infra/public/components/asset_details/hooks/use_data_views.ts @@ -7,10 +7,14 @@ import useAsync from 'react-use/lib/useAsync'; import createContainer from 'constate'; +import { i18n } from '@kbn/i18n'; +import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common'; import { useLogViewReference } from '../../../hooks/use_log_view_reference'; import { useDataMetricsAdHocDataView } from '../../../hooks/use_metrics_adhoc_data_view'; +import { useAssetDetailsRenderPropsContext } from './use_asset_details_render_props'; const useDataViews = ({ metricAlias }: { metricAlias: string }) => { + const { asset } = useAssetDetailsRenderPropsContext(); const { dataView: metricsDataView, loading: metricsDataViewLoading } = useDataMetricsAdHocDataView({ metricAlias }); const { @@ -19,6 +23,13 @@ const useDataViews = ({ metricAlias }: { metricAlias: string }) => { loading: logsReferenceLoading, } = useLogViewReference({ id: 'asset-details-logs-view', + name: i18n.translate('xpack.infra.hostsViewPage.tabs.logs.assetLogsWidgetName', { + defaultMessage: 'Logs from {type} "{name}"', + values: { + name: asset.name, + type: findInventoryModel(asset.type).singularDisplayName, + }, + }), }); const { value: logsDataView, loading: logsDataViewLoading } = useAsync( diff --git a/x-pack/plugins/infra/public/hooks/use_log_view_reference.ts b/x-pack/plugins/infra/public/hooks/use_log_view_reference.ts index d8c063767a8d1..56ba82b697338 100644 --- a/x-pack/plugins/infra/public/hooks/use_log_view_reference.ts +++ b/x-pack/plugins/infra/public/hooks/use_log_view_reference.ts @@ -14,9 +14,14 @@ import { useKibanaContextForPlugin } from './use_kibana'; interface Props { id: string; + /** + * Human readable name of log view. + * Will be displayed as the page title when navigating to "View in Logs". + * */ + name: string; extraFields?: string[]; } -export const useLogViewReference = ({ id, extraFields = [] }: Props) => { +export const useLogViewReference = ({ id, name, extraFields = [] }: Props) => { const { services: { logsShared }, } = useKibanaContextForPlugin(); @@ -33,8 +38,8 @@ export const useLogViewReference = ({ id, extraFields = [] }: Props) => { type: 'log-view-inline', id, attributes: { - name: 'Hosts Logs View', - description: 'Default view for hosts logs tab', + name, + description: '', logIndices: defaultLogView.attributes.logIndices, logColumns: [ { diff --git a/x-pack/plugins/infra/public/pages/logs/settings/inline_log_view_callout.tsx b/x-pack/plugins/infra/public/pages/logs/settings/inline_log_view_callout.tsx index ed332f97ea471..d3db574528490 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/inline_log_view_callout.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/inline_log_view_callout.tsx @@ -7,7 +7,6 @@ import { EuiButton } from '@elastic/eui'; import { EuiCallOut } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -19,26 +18,29 @@ export const InlineLogViewCallout = ({ return ( + } > <>

- {i18n.translate('xpack.infra.logs.settings.inlineLogViewCalloutDescription', { - defaultMessage: - 'An inline Log View is currently being used, changes will be synchronized to the URL, but they will not be persisted.', - })} +

diff --git a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx index 482a2fe48dd00..557fe1cfab314 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx @@ -101,6 +101,14 @@ export const LogsSettingsPage = () => { + {isInlineLogView && ( + + + + + + + )} { isLoading fill > - Loading + {i18n.translate('xpack.infra.logsSettingsPage.loadingButtonLabel', { + defaultMessage: 'Loading', + })}
) : ( - <> - {isInlineLogView && ( - - - - - - - )} - - - { - sourceConfigurationFormElement.resetValue(); - }} - > - - - - - - - - - - + + + { + sourceConfigurationFormElement.resetValue(); + }} + > + + + + + + + + + )} )} diff --git a/x-pack/plugins/infra/public/pages/logs/stream/components/stream_page_template.tsx b/x-pack/plugins/infra/public/pages/logs/stream/components/stream_page_template.tsx index fb9c26676d01c..5ea865351ef38 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/components/stream_page_template.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/components/stream_page_template.tsx @@ -8,24 +8,78 @@ import { APP_WRAPPER_CLASS } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import React from 'react'; +import { useLogViewContext } from '@kbn/logs-shared-plugin/public'; +import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiBadge, EuiToolTip } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; import { fullHeightContentStyles } from '../../../../page_template.styles'; import { LogsPageTemplate, LogsPageTemplateProps } from '../../shared/page_template'; -export const LogStreamPageTemplate: React.FC = React.memo((props) => ( -
- -
-)); +export const LogStreamPageTemplate: React.FC = (props) => { + const { logView, isInlineLogView, revertToDefaultLogView } = useLogViewContext(); + return ( +
+ + {logView.attributes.name} + + + } + > + + + + + + + ) : ( + streamTitle + ), + breadcrumbs: isInlineLogView + ? [ + { + text: ( + + + + + + + + + ), + color: 'primary', + 'aria-current': false, + 'data-test-subj': 'infraAssetDetailsReturnButton', + href: '#', + onClick: revertToDefaultLogView, + }, + ] + : undefined, + }} + pageSectionProps={{ + contentProps: { + css: fullHeightContentStyles, + }, + }} + {...props} + /> +
+ ); +}; const streamTitle = i18n.translate('xpack.infra.logs.streamPageTitle', { defaultMessage: 'Stream', diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/logs/logs_tab_content.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/logs/logs_tab_content.tsx index 331cc35722998..c977c1fde37a9 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/logs/logs_tab_content.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/logs/logs_tab_content.tsx @@ -9,6 +9,7 @@ import React, { useMemo } from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { LogStream } from '@kbn/logs-shared-plugin/public'; +import { i18n } from '@kbn/i18n'; import { InfraLoadingPanel } from '../../../../../../components/loading'; import { useHostsViewContext } from '../../../hooks/use_hosts_view'; import { useUnifiedSearchContext } from '../../../hooks/use_unified_search'; @@ -35,6 +36,9 @@ export const LogsTabContent = () => { const { logViewReference: logView, loading: logViewLoading } = useLogViewReference({ id: 'hosts-logs-view', + name: i18n.translate('xpack.infra.hostsViewPage.tabs.logs.LogsByHostWidgetName', { + defaultMessage: 'Logs by host', + }), extraFields: ['host.name'], }); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 00510fafcbb58..99be3d9af2923 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -20415,9 +20415,6 @@ "xpack.infra.logs.search.previousButtonLabel": "Précédent", "xpack.infra.logs.search.searchInLogsAriaLabel": "rechercher", "xpack.infra.logs.search.searchInLogsPlaceholder": "Recherche", - "xpack.infra.logs.settings.inlineLogViewCalloutButtonText": "Revenir à la vue de log (persistante) par défaut", - "xpack.infra.logs.settings.inlineLogViewCalloutDescription": "Une vue de log en ligne est actuellement utilisée. Les modifications seront synchronisées avec l'URL, mais elles ne seront pas conservées.", - "xpack.infra.logs.settings.inlineLogViewCalloutTitle": "Vue de log en ligne utilisée", "xpack.infra.logs.startStreamingButtonLabel": "Diffuser en direct", "xpack.infra.logs.stopStreamingButtonLabel": "Arrêter la diffusion", "xpack.infra.logs.streamPageTitle": "Flux", @@ -43295,4 +43292,4 @@ "xpack.serverlessObservability.nav.projectSettings": "Paramètres de projet", "xpack.serverlessObservability.nav.visualizations": "Visualisations" } -} +} \ No newline at end of file diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 8d313440282b5..cf450dbeeb29c 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -20428,9 +20428,6 @@ "xpack.infra.logs.search.previousButtonLabel": "前へ", "xpack.infra.logs.search.searchInLogsAriaLabel": "検索", "xpack.infra.logs.search.searchInLogsPlaceholder": "検索", - "xpack.infra.logs.settings.inlineLogViewCalloutButtonText": "デフォルト(永続)ログビューに戻す", - "xpack.infra.logs.settings.inlineLogViewCalloutDescription": "現在インラインログビューが使用されています。変更はURLと同期されますが、永続しません。", - "xpack.infra.logs.settings.inlineLogViewCalloutTitle": "使用中のインラインログビュー", "xpack.infra.logs.startStreamingButtonLabel": "ライブストリーム", "xpack.infra.logs.stopStreamingButtonLabel": "ストリーム停止", "xpack.infra.logs.streamPageTitle": "ストリーム", @@ -43286,4 +43283,4 @@ "xpack.serverlessObservability.nav.projectSettings": "プロジェクト設定", "xpack.serverlessObservability.nav.visualizations": "ビジュアライゼーション" } -} +} \ No newline at end of file diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 3cd194aabd49e..9cabcd3ccab48 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -20428,9 +20428,6 @@ "xpack.infra.logs.search.previousButtonLabel": "上一页", "xpack.infra.logs.search.searchInLogsAriaLabel": "搜索", "xpack.infra.logs.search.searchInLogsPlaceholder": "搜索", - "xpack.infra.logs.settings.inlineLogViewCalloutButtonText": "恢复到默认(持久化)日志视图", - "xpack.infra.logs.settings.inlineLogViewCalloutDescription": "当前正使用内联日志视图,更改将同步到该 URL,但它们无法持久。", - "xpack.infra.logs.settings.inlineLogViewCalloutTitle": "正使用内联日志视图", "xpack.infra.logs.startStreamingButtonLabel": "实时流式传输", "xpack.infra.logs.stopStreamingButtonLabel": "停止流式传输", "xpack.infra.logs.streamPageTitle": "流式传输", @@ -43279,4 +43276,4 @@ "xpack.serverlessObservability.nav.projectSettings": "项目设置", "xpack.serverlessObservability.nav.visualizations": "可视化" } -} +} \ No newline at end of file From c3b3194ea06bc5e22b6da798b814cab812cd01e1 Mon Sep 17 00:00:00 2001 From: Dan Panzarella Date: Wed, 20 Dec 2023 09:05:43 -0500 Subject: [PATCH 23/62] [Security Solution] Disable package v2 detection for now (#173686) --- .../common/endpoint/utils/package_v2.ts | 17 ++++++++++------- .../e2e/artifacts/artifacts_mocked_data.cy.ts | 2 +- .../apps/endpoint/endpoint_list.ts | 2 +- .../apps/integrations/policy_details.ts | 2 +- .../apis/endpoint_response_actions/execute.ts | 2 +- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/security_solution/common/endpoint/utils/package_v2.ts b/x-pack/plugins/security_solution/common/endpoint/utils/package_v2.ts index fffa55ccbe514..5aec9e894ad8b 100644 --- a/x-pack/plugins/security_solution/common/endpoint/utils/package_v2.ts +++ b/x-pack/plugins/security_solution/common/endpoint/utils/package_v2.ts @@ -5,14 +5,17 @@ * 2.0. */ -import semverLte from 'semver/functions/lte'; +// import semverLte from 'semver/functions/lte'; -function parseSemver(semver: string) { - return semver.includes('-') ? semver.substring(0, semver.indexOf('-')) : semver; -} +// function parseSemver(semver: string) { +// return semver.includes('-') ? semver.substring(0, semver.indexOf('-')) : semver; +// } -const MIN_ENDPOINT_PACKAGE_V2_VERSION = '8.13.0'; +// until a release is confirmed, or another feature-detection method is used, do not automatically +// switch to "v2" logic +// const MIN_ENDPOINT_PACKAGE_V2_VERSION = '8.13.0'; export function isEndpointPackageV2(version: string) { - const parsedVersion = parseSemver(version); - return semverLte(MIN_ENDPOINT_PACKAGE_V2_VERSION, parsedVersion); + // const parsedVersion = parseSemver(version); + // return semverLte(MIN_ENDPOINT_PACKAGE_V2_VERSION, parsedVersion); + return false; } diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts index 55a1035ca8969..8d21ff3804364 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts @@ -32,7 +32,7 @@ const loginWithoutAccess = (url: string) => { }; // Flaky: https://github.com/elastic/kibana/issues/171168 -describe.skip('Artifacts pages', { tags: ['@ess', '@serverless'] }, () => { +describe('Artifacts pages', { tags: ['@ess', '@serverless'] }, () => { let endpointData: ReturnTypeFromChainable | undefined; before(() => { diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts index e4d9b91e579b7..6f9c89bd8c930 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts @@ -87,7 +87,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { // FLAKY: https://github.com/elastic/kibana/issues/170357 // FLAKY: https://github.com/elastic/kibana/issues/173670 - describe.skip('endpoint list', function () { + describe('endpoint list', function () { targetTags(this, ['@ess', '@serverless']); let indexedData: IndexedHostsAndAlertsResponse; diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts index a2b1feaabd7cd..f4d587daf64f1 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts +++ b/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts @@ -30,7 +30,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { // FLAKY: https://github.com/elastic/kibana/issues/171653 // FLAKY: https://github.com/elastic/kibana/issues/171654 - describe.skip('When on the Endpoint Policy Details Page', function () { + describe('When on the Endpoint Policy Details Page', function () { targetTags(this, ['@ess', '@serverless']); let indexedData: IndexedHostsAndAlertsResponse; diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts index 401ff25fee620..341f874e8e330 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts @@ -18,7 +18,7 @@ export default function ({ getService }: FtrProviderContext) { // FLAKY: https://github.com/elastic/kibana/issues/171666 // FLAKY: https://github.com/elastic/kibana/issues/171667 - describe.skip('Endpoint `execute` response action', function () { + describe('Endpoint `execute` response action', function () { targetTags(this, ['@ess', '@serverless']); let indexedData: IndexedHostsAndAlertsResponse; From 9d1feb5febfc5c4192d2ab11bf17555971e17195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?= Date: Wed, 20 Dec 2023 15:20:46 +0100 Subject: [PATCH 24/62] [Enterprise Search]Fix cursor jumping form inputs. (#173659) ## Summary Moved all inputs to separate components with internal inner values. https://github.com/elastic/kibana/assets/1410658/2155049d-d6bc-4c28-8ddb-0201af080a9d ### Checklist Delete any items that are not applicable to this PR. - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../connector_configuration_field.tsx | 192 ++++++++++++------ 1 file changed, 128 insertions(+), 64 deletions(-) diff --git a/packages/kbn-search-connectors/components/configuration/connector_configuration_field.tsx b/packages/kbn-search-connectors/components/configuration/connector_configuration_field.tsx index 01950617511a4..cb9108a783fdb 100644 --- a/packages/kbn-search-connectors/components/configuration/connector_configuration_field.tsx +++ b/packages/kbn-search-connectors/components/configuration/connector_configuration_field.tsx @@ -41,6 +41,109 @@ interface ConnectorConfigurationFieldProps { setConfigValue: (value: number | string | boolean | null) => void; } +interface ConfigInputFieldProps { + configEntry: ConfigEntryView; + isLoading: boolean; + validateAndSetConfigValue: (value: string) => void; +} +export const ConfigInputField: React.FC = ({ + configEntry, + isLoading, + validateAndSetConfigValue, +}) => { + const { isValid, required, placeholder, value } = configEntry; + const [innerValue, setInnerValue] = useState(value); + return ( + { + setInnerValue(event.target.value); + validateAndSetConfigValue(event.target.value); + }} + placeholder={placeholder} + /> + ); +}; + +export const ConfigInputTextArea: React.FC = ({ + isLoading, + configEntry, + validateAndSetConfigValue, +}) => { + const { isValid, required, placeholder, value } = configEntry; + const [innerValue, setInnerValue] = useState(value); + return ( + { + setInnerValue(event.target.value); + validateAndSetConfigValue(event.target.value); + }} + placeholder={placeholder} + /> + ); +}; + +export const ConfigSensitiveTextArea: React.FC = ({ + isLoading, + configEntry, + validateAndSetConfigValue, +}) => { + const { key, label, tooltip } = configEntry; + return ( + + +

{label}

+
+ + + +
+ ) : ( +

{label}

+ ) + } + > + + + ); +}; +export const ConfigInputPassword: React.FC = ({ + isLoading, + configEntry, + validateAndSetConfigValue, +}) => { + const { required, value } = configEntry; + const [innerValue, setInnerValue] = useState(value); + return ( + { + setInnerValue(event.target.value); + validateAndSetConfigValue(event.target.value); + }} + /> + ); +}; + export const ConnectorConfigurationField: React.FC = ({ configEntry, isLoading, @@ -53,18 +156,7 @@ export const ConnectorConfigurationField: React.FC { - validateAndSetConfigValue(event.target.value); - }} - placeholder={placeholder} + ); case DisplayType.TEXTAREA: const textarea = ( - { - validateAndSetConfigValue(event.target.value); - }} + ); return sensitive ? ( - - -

{label}

-
- - - -
- ) : ( -

{label}

- ) - } - > - {textarea} - + ) : ( textarea ); @@ -210,24 +281,17 @@ export const ConnectorConfigurationField: React.FC { - validateAndSetConfigValue(event.target.value); - }} + ) : ( - { - validateAndSetConfigValue(event.target.value); - }} + ); } From 891d79b9e7bbdab31a7f0df8f8ccd10f87fcf1c2 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 20 Dec 2023 14:44:33 +0000 Subject: [PATCH 25/62] fix(NA): skip plugin-helpers assets optimization when no ui (#173703) This fixes a bug where the asset optimization script will try to run even when we don't have any ui plugin generated. --- .../kbn-plugin-helpers/src/tasks/brotli_compress_bundles.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/kbn-plugin-helpers/src/tasks/brotli_compress_bundles.ts b/packages/kbn-plugin-helpers/src/tasks/brotli_compress_bundles.ts index f04d707b279e9..ef03cb86c7aa0 100644 --- a/packages/kbn-plugin-helpers/src/tasks/brotli_compress_bundles.ts +++ b/packages/kbn-plugin-helpers/src/tasks/brotli_compress_bundles.ts @@ -20,7 +20,11 @@ import { TaskContext } from '../task_context'; const asyncPipeline = promisify(pipeline); -export async function brotliCompressBundles({ buildDir, log }: TaskContext) { +export async function brotliCompressBundles({ buildDir, log, plugin }: TaskContext) { + if (!plugin.manifest.ui) { + return; + } + const compressDir = Path.resolve(buildDir, 'target/public'); log.info( From 3d76e3932e5816395737905ce4585f2c920086f4 Mon Sep 17 00:00:00 2001 From: Achyut Jhunjhunwala Date: Wed, 20 Dec 2023 15:50:30 +0100 Subject: [PATCH 26/62] [APM UI] Add option to pass number of services to a scenario (#173737) ## Summary This PR adds an option to pass number of services to the scenario running `many_services` as running 500 services on the CI causes it to fail With this change, the scenario can now be run like this ``` node scripts/synthtrace many_services.ts --scenarioOpts.services=2 ``` --- packages/kbn-apm-synthtrace/src/scenarios/many_services.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts index 705d425d8d932..68a5432f1a29a 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts @@ -14,8 +14,8 @@ import { withClient } from '../lib/utils/with_client'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); -const scenario: Scenario = async ({ logger }) => { - const numServices = 500; +const scenario: Scenario = async ({ logger, scenarioOpts = { services: 500 } }) => { + const numServices = scenarioOpts.services; const languages = ['go', 'dotnet', 'java', 'python']; const services = ['web', 'order-processing', 'api-backend', 'proxy']; const agentVersions: Record = { From bada436def0188812f759e9b0ec27106afd03a5b Mon Sep 17 00:00:00 2001 From: Luke G <11671118+lgestc@users.noreply.github.com> Date: Wed, 20 Dec 2023 16:08:56 +0100 Subject: [PATCH 27/62] [Security Solution] Fix flaky timeline pagination tests (#173531) ## Summary Fixes https://github.com/elastic/kibana/issues/169413 https://github.com/elastic/kibana/issues/169619 and colocates related tests cases. Flaky TR pipeline: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/4614 --- .../investigations/timelines/pagination.cy.ts | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts index dcf847224067a..4c64f23167578 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/pagination.cy.ts @@ -24,39 +24,34 @@ import { hostsUrl } from '../../../urls/navigation'; // Flaky on serverless const defaultPageSize = 25; -// FLAKY: https://github.com/elastic/kibana/issues/169413 -describe.skip('Pagination', { tags: ['@ess', '@serverless'] }, () => { - before(() => { - cy.task('esArchiverLoad', { archiveName: 'timeline' }); - }); +describe('Timeline Pagination', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { + cy.task('esArchiverLoad', { archiveName: 'timeline' }); login(); visitWithTimeRange(hostsUrl('allHosts')); openTimelineUsingToggle(); populateTimeline(); }); - after(() => { + afterEach(() => { cy.task('esArchiverUnload', 'timeline'); }); - it(`should have ${defaultPageSize} events in the page by default`, () => { + it(`should paginate records correctly`, () => { + // should have ${defaultPageSize} events in the page by default cy.get(TIMELINE_EVENT).should('have.length', defaultPageSize); - }); - it('should be able to go to next / previous page', () => { + // should be able to go to next / previous page cy.get(`${TIMELINE_FLYOUT} ${TIMELINE_EVENTS_COUNT_NEXT_PAGE}`).first().click(); cy.get(`${TIMELINE_FLYOUT} ${TIMELINE_EVENTS_COUNT_PREV_PAGE}`).first().click(); - }); - it(`should select ${defaultPageSize} items per page by default`, () => { + // should select ${defaultPageSize} items per page by default cy.get(TIMELINE_EVENTS_COUNT_PER_PAGE).should('contain.text', defaultPageSize); - }); - it('should be able to change items count per page with the dropdown', () => { + // should be able to change items count per page with the dropdown const itemsPerPage = 100; - cy.get(TIMELINE_EVENTS_COUNT_PER_PAGE_BTN).first().click({ force: true }); + cy.get(TIMELINE_EVENTS_COUNT_PER_PAGE_BTN).first().click(); cy.get(TIMELINE_EVENTS_COUNT_PER_PAGE_OPTION(itemsPerPage)).click(); cy.get(TIMELINE_EVENTS_COUNT_PER_PAGE).should('not.have.text', '0'); cy.get(TIMELINE_EVENTS_COUNT_PER_PAGE) From cdb10478ce1270e8ce0ec37ddff98888e92f0af7 Mon Sep 17 00:00:00 2001 From: Georgii Gorbachev Date: Wed, 20 Dec 2023 16:18:21 +0100 Subject: [PATCH 28/62] [Security Solution] Skip flaky Rule Management tests (#173730) **Resolves: https://github.com/elastic/kibana/issues/173469** ## Summary This PR: - Skips flaky Rule Management tests that occurred recently and haven't been already skipped by Kibana Operations. - Adds `TODO` comments with links to the corresponding tickets. We will be working on fixing and unskipping these and a few other tests in January as part of https://github.com/elastic/kibana/issues/173731. --- .../prebuilt_rules/management/fleet_integration.ts | 3 ++- .../rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/fleet_integration.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/fleet_integration.ts index 0eff0a25c2cb8..5453ff5b34c77 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/fleet_integration.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/management/fleet_integration.ts @@ -33,7 +33,8 @@ export default ({ getService }: FtrProviderContext): void => { * Unlike other tests that use mocks, this test uses actual rules from the * package storage and checks that they are installed. */ - it('should install prebuilt rules from the package storage', async () => { + // TODO: Fix and unskip https://github.com/elastic/kibana/issues/172107 + it.skip('should install prebuilt rules from the package storage', async () => { // Verify that status is empty before package installation const statusBeforePackageInstallation = await getPrebuiltRulesAndTimelinesStatus(supertest); expect(statusBeforePackageInstallation.rules_installed).toBe(0); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts index 9a4d3cdc1b1d4..f6df3e59bab93 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts @@ -74,6 +74,7 @@ const ruleNameToAssert = 'Custom rule name with actions'; const expectedExistingSlackMessage = 'Existing slack action'; const expectedSlackMessage = 'Slack action test message'; +// TODO: Fix and unskip in Serverless https://github.com/elastic/kibana/issues/171101 describe( 'Detection rules, bulk edit of rule actions', { tags: ['@ess', '@serverless', '@brokenInServerless', '@brokenInServerlessQA'] }, From 0503b820dee2fed2f59c6091a7000748e3dfb2d7 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 20 Dec 2023 17:19:48 +0200 Subject: [PATCH 29/62] [ES|QL] Creates charts from the dashboard (#171973) ## Summary Closes https://github.com/elastic/kibana/issues/165928 Enables the creation of ES|QL charts from the dashboard. ![esql](https://github.com/elastic/kibana/assets/17003240/86dd5594-d130-4fb7-b495-29ddbaee5e5b) The implementation is using UIActions which I think is the correct way to register a new panel action to a dashboard. Lens is responsible to register the ESQL panel action and owns the code. ### How it works - A new ES|QL panel has been added to the dashboard toolbar registered by a ui action - A new panel is been created with a default esql query `from | limit 10` - This results to a datatable and opens the flyout - If a user clicks cancel then the embeddable is being removed ### Checklist - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../add_panel_action_menu_items.test.ts | 40 ++++++ .../top_nav/add_panel_action_menu_items.ts | 52 +++++++ .../top_nav/dashboard_editing_toolbar.tsx | 48 +++++-- .../dashboard_app/top_nav/editor_menu.tsx | 48 ++++++- src/plugins/dashboard/public/plugin.tsx | 15 ++- .../public/services/plugin_services.stub.ts | 2 + .../public/services/plugin_services.ts | 2 + .../dashboard/public/services/types.ts | 2 + .../public/services/ui_actions/types.ts | 13 ++ .../ui_actions/ui_actions_service.stub.ts | 17 +++ .../services/ui_actions/ui_actions_service.ts | 25 ++++ .../dashboard/public/triggers/index.ts | 20 +++ .../dashboard/group6/dashboard_esql_chart.ts | 73 ++++++++++ .../functional/apps/dashboard/group6/index.ts | 1 + .../services/dashboard/add_panel.ts | 4 + .../shared/edit_on_the_fly/flyout_wrapper.tsx | 18 ++- .../get_edit_lens_configuration.tsx | 4 + .../lens_configuration_flyout.test.tsx | 10 ++ .../lens_configuration_flyout.tsx | 15 ++- .../shared/edit_on_the_fly/types.ts | 5 + x-pack/plugins/lens/public/async_services.ts | 3 +- .../lens/public/embeddable/embeddable.tsx | 8 +- x-pack/plugins/lens/public/plugin.ts | 10 +- .../open_lens_config/create_action.test.tsx | 41 ++++++ .../open_lens_config/create_action.tsx | 67 +++++++++ .../open_lens_config/create_action_helpers.ts | 127 ++++++++++++++++++ .../{action.test.tsx => edit_action.test.tsx} | 2 +- .../{action.tsx => edit_action.tsx} | 8 +- .../{helpers.ts => edit_action_helpers.ts} | 17 ++- 29 files changed, 663 insertions(+), 34 deletions(-) create mode 100644 src/plugins/dashboard/public/dashboard_app/top_nav/add_panel_action_menu_items.test.ts create mode 100644 src/plugins/dashboard/public/dashboard_app/top_nav/add_panel_action_menu_items.ts create mode 100644 src/plugins/dashboard/public/services/ui_actions/types.ts create mode 100644 src/plugins/dashboard/public/services/ui_actions/ui_actions_service.stub.ts create mode 100644 src/plugins/dashboard/public/services/ui_actions/ui_actions_service.ts create mode 100644 src/plugins/dashboard/public/triggers/index.ts create mode 100644 test/functional/apps/dashboard/group6/dashboard_esql_chart.ts create mode 100644 x-pack/plugins/lens/public/trigger_actions/open_lens_config/create_action.test.tsx create mode 100644 x-pack/plugins/lens/public/trigger_actions/open_lens_config/create_action.tsx create mode 100644 x-pack/plugins/lens/public/trigger_actions/open_lens_config/create_action_helpers.ts rename x-pack/plugins/lens/public/trigger_actions/open_lens_config/{action.test.tsx => edit_action.test.tsx} (98%) rename x-pack/plugins/lens/public/trigger_actions/open_lens_config/{action.tsx => edit_action.tsx} (88%) rename x-pack/plugins/lens/public/trigger_actions/open_lens_config/{helpers.ts => edit_action_helpers.ts} (85%) diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/add_panel_action_menu_items.test.ts b/src/plugins/dashboard/public/dashboard_app/top_nav/add_panel_action_menu_items.test.ts new file mode 100644 index 0000000000000..024a7518aba0c --- /dev/null +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/add_panel_action_menu_items.test.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { getAddPanelActionMenuItems } from './add_panel_action_menu_items'; + +describe('getAddPanelActionMenuItems', () => { + it('returns the items correctly', async () => { + const registeredActions = [ + { + id: 'ACTION_CREATE_ESQL_CHART', + type: 'ACTION_CREATE_ESQL_CHART', + getDisplayName: () => 'Action name', + getIconType: () => 'pencil', + getDisplayNameTooltip: () => 'Action tooltip', + isCompatible: () => Promise.resolve(true), + execute: jest.fn(), + }, + ]; + const items = getAddPanelActionMenuItems(registeredActions, jest.fn(), jest.fn(), jest.fn()); + expect(items).toStrictEqual([ + { + 'data-test-subj': 'create-action-Action name', + icon: 'pencil', + name: 'Action name', + onClick: expect.any(Function), + toolTipContent: 'Action tooltip', + }, + ]); + }); + + it('returns empty array if no actions have been registered', async () => { + const items = getAddPanelActionMenuItems([], jest.fn(), jest.fn(), jest.fn()); + expect(items).toStrictEqual([]); + }); +}); diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/add_panel_action_menu_items.ts b/src/plugins/dashboard/public/dashboard_app/top_nav/add_panel_action_menu_items.ts new file mode 100644 index 0000000000000..3df8343887982 --- /dev/null +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/add_panel_action_menu_items.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import type { ActionExecutionContext, Action } from '@kbn/ui-actions-plugin/public'; +import type { EmbeddableFactory } from '@kbn/embeddable-plugin/public'; +import { addPanelMenuTrigger } from '../../triggers'; + +const onAddPanelActionClick = + (action: Action, context: ActionExecutionContext, closePopover: () => void) => + (event: React.MouseEvent) => { + closePopover(); + if (event.currentTarget instanceof HTMLAnchorElement) { + if ( + !event.defaultPrevented && // onClick prevented default + event.button === 0 && + (!event.currentTarget.target || event.currentTarget.target === '_self') && + !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey) + ) { + event.preventDefault(); + action.execute(context); + } + } else action.execute(context); + }; + +export const getAddPanelActionMenuItems = ( + actions: Array> | undefined, + createNewEmbeddable: (embeddableFactory: EmbeddableFactory) => void, + deleteEmbeddable: (embeddableId: string) => void, + closePopover: () => void +) => { + return ( + actions?.map((item) => { + const context = { + createNewEmbeddable, + deleteEmbeddable, + trigger: addPanelMenuTrigger, + }; + const actionName = item.getDisplayName(context); + return { + name: actionName, + icon: item.getIconType(context), + onClick: onAddPanelActionClick(item, context, closePopover), + 'data-test-subj': `create-action-${actionName}`, + toolTipContent: item?.getDisplayNameTooltip?.(context), + }; + }) ?? [] + ); +}; diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/dashboard_editing_toolbar.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/dashboard_editing_toolbar.tsx index 6afdf1429663b..e39e227da0643 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/dashboard_editing_toolbar.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/dashboard_editing_toolbar.tsx @@ -80,8 +80,17 @@ export function DashboardEditingToolbar({ isDisabled }: { isDisabled?: boolean } [stateTransferService, dashboard, search.session, trackUiMetric] ); + /** + * embeddableFactory: Required, you can get the factory from embeddableStart.getEmbeddableFactory() + * initialInput: Optional, use it in case you want to pass your own input to the factory + * dismissNotification: Optional, if not passed a toast will appear in the dashboard + */ const createNewEmbeddable = useCallback( - async (embeddableFactory: EmbeddableFactory) => { + async ( + embeddableFactory: EmbeddableFactory, + initialInput?: Partial, + dismissNotification?: boolean + ) => { if (trackUiMetric) { trackUiMetric(METRIC_TYPE.CLICK, embeddableFactory.type); } @@ -89,12 +98,19 @@ export function DashboardEditingToolbar({ isDisabled }: { isDisabled?: boolean } let explicitInput: Partial; let attributes: unknown; try { - const explicitInputReturn = await embeddableFactory.getExplicitInput(undefined, dashboard); - if (isExplicitInputWithAttributes(explicitInputReturn)) { - explicitInput = explicitInputReturn.newInput; - attributes = explicitInputReturn.attributes; + if (initialInput) { + explicitInput = initialInput; } else { - explicitInput = explicitInputReturn; + const explicitInputReturn = await embeddableFactory.getExplicitInput( + undefined, + dashboard + ); + if (isExplicitInputWithAttributes(explicitInputReturn)) { + explicitInput = explicitInputReturn.newInput; + attributes = explicitInputReturn.attributes; + } else { + explicitInput = explicitInputReturn; + } } } catch (e) { // error likely means user canceled embeddable creation @@ -110,19 +126,31 @@ export function DashboardEditingToolbar({ isDisabled }: { isDisabled?: boolean } if (newEmbeddable) { dashboard.setScrollToPanelId(newEmbeddable.id); dashboard.setHighlightPanelId(newEmbeddable.id); - toasts.addSuccess({ - title: dashboardReplacePanelActionStrings.getSuccessMessage(newEmbeddable.getTitle()), - 'data-test-subj': 'addEmbeddableToDashboardSuccess', - }); + + if (!dismissNotification) { + toasts.addSuccess({ + title: dashboardReplacePanelActionStrings.getSuccessMessage(newEmbeddable.getTitle()), + 'data-test-subj': 'addEmbeddableToDashboardSuccess', + }); + } } + return newEmbeddable; }, [trackUiMetric, dashboard, toasts] ); + const deleteEmbeddable = useCallback( + (embeddableId: string) => { + dashboard.removeEmbeddable(embeddableId); + }, + [dashboard] + ); + const extraButtons = [ , () => void; /** Handler for creating a new embeddable of a specified type */ createNewEmbeddable: (embeddableFactory: EmbeddableFactory) => void; + /** Handler for deleting an embeddable */ + deleteEmbeddable: (embeddableId: string) => void; } interface FactoryGroup { @@ -44,7 +49,13 @@ interface UnwrappedEmbeddableFactory { isEditable: boolean; } -export const EditorMenu = ({ createNewVisType, createNewEmbeddable, isDisabled }: Props) => { +export const EditorMenu = ({ + createNewVisType, + createNewEmbeddable, + deleteEmbeddable, + isDisabled, +}: Props) => { + const isMounted = useRef(false); const { embeddable, visualizations: { @@ -52,6 +63,7 @@ export const EditorMenu = ({ createNewVisType, createNewEmbeddable, isDisabled } getByGroup: getVisTypesByGroup, showNewVisModal, }, + uiActions, } = pluginServices.getServices(); const { euiTheme } = useEuiTheme(); @@ -64,6 +76,10 @@ export const EditorMenu = ({ createNewVisType, createNewEmbeddable, isDisabled } UnwrappedEmbeddableFactory[] >([]); + const [addPanelActions, setAddPanelActions] = useState> | undefined>( + undefined + ); + useEffect(() => { Promise.all( embeddableFactories.map>(async (factory) => ({ @@ -121,6 +137,28 @@ export const EditorMenu = ({ createNewVisType, createNewEmbeddable, isDisabled } let panelCount = 1 + aggBasedPanelID; + useEffect(() => { + isMounted.current = true; + + return () => { + isMounted.current = false; + }; + }, []); + + // Retrieve ADD_PANEL_TRIGGER actions + useEffect(() => { + async function loadPanelActions() { + const registeredActions = await uiActions?.getTriggerCompatibleActions?.( + ADD_PANEL_TRIGGER, + {} + ); + if (isMounted.current) { + setAddPanelActions(registeredActions); + } + } + loadPanelActions(); + }, [uiActions]); + factories.forEach(({ factory }) => { const { grouping } = factory; @@ -236,6 +274,12 @@ export const EditorMenu = ({ createNewVisType, createNewEmbeddable, isDisabled } })), ...promotedVisTypes.map(getVisTypeMenuItem), + ...getAddPanelActionMenuItems( + addPanelActions, + createNewEmbeddable, + deleteEmbeddable, + closePopover + ), ]; if (aggsBasedVisTypes.length > 0) { initialPanelItems.push({ diff --git a/src/plugins/dashboard/public/plugin.tsx b/src/plugins/dashboard/public/plugin.tsx index 98af5088967f2..4c75362485b6a 100644 --- a/src/plugins/dashboard/public/plugin.tsx +++ b/src/plugins/dashboard/public/plugin.tsx @@ -70,6 +70,7 @@ import { import { DashboardMountContextProps } from './dashboard_app/types'; import type { FindDashboardsService } from './services/dashboard_content_management/types'; import { CONTENT_ID, LATEST_VERSION } from '../common/content_management'; +import { addPanelMenuTrigger } from './triggers'; export interface DashboardFeatureFlagConfig { allowByValueEmbeddables: boolean; @@ -149,11 +150,23 @@ export class DashboardPlugin public setup( core: CoreSetup, - { share, embeddable, home, urlForwarding, data, contentManagement }: DashboardSetupDependencies + { + share, + embeddable, + home, + urlForwarding, + data, + contentManagement, + uiActions, + }: DashboardSetupDependencies ): DashboardSetup { this.dashboardFeatureFlagConfig = this.initializerContext.config.get(); + // this trigger enables external consumers to register actions for + // adding items to the add panel menu + uiActions.registerTrigger(addPanelMenuTrigger); + if (share) { this.locator = share.url.locators.create( new DashboardAppLocatorDefinition({ diff --git a/src/plugins/dashboard/public/services/plugin_services.stub.ts b/src/plugins/dashboard/public/services/plugin_services.stub.ts index b77888f1293f5..e61aab184b09c 100644 --- a/src/plugins/dashboard/public/services/plugin_services.stub.ts +++ b/src/plugins/dashboard/public/services/plugin_services.stub.ts @@ -43,6 +43,7 @@ import { savedObjectsManagementServiceFactory } from './saved_objects_management import { contentManagementServiceFactory } from './content_management/content_management_service.stub'; import { serverlessServiceFactory } from './serverless/serverless_service.stub'; import { noDataPageServiceFactory } from './no_data_page/no_data_page_service.stub'; +import { uiActionsServiceFactory } from './ui_actions/ui_actions_service.stub'; export const providers: PluginServiceProviders = { dashboardContentManagement: new PluginServiceProvider(dashboardContentManagementServiceFactory), @@ -74,6 +75,7 @@ export const providers: PluginServiceProviders = { contentManagement: new PluginServiceProvider(contentManagementServiceFactory), serverless: new PluginServiceProvider(serverlessServiceFactory), noDataPage: new PluginServiceProvider(noDataPageServiceFactory), + uiActions: new PluginServiceProvider(uiActionsServiceFactory), }; export const registry = new PluginServiceRegistry(providers); diff --git a/src/plugins/dashboard/public/services/plugin_services.ts b/src/plugins/dashboard/public/services/plugin_services.ts index 1d159014a4e72..2c9c1d95828e8 100644 --- a/src/plugins/dashboard/public/services/plugin_services.ts +++ b/src/plugins/dashboard/public/services/plugin_services.ts @@ -44,6 +44,7 @@ import { dashboardContentManagementServiceFactory } from './dashboard_content_ma import { contentManagementServiceFactory } from './content_management/content_management_service'; import { serverlessServiceFactory } from './serverless/serverless_service'; import { noDataPageServiceFactory } from './no_data_page/no_data_page_service'; +import { uiActionsServiceFactory } from './ui_actions/ui_actions_service'; const providers: PluginServiceProviders = { dashboardContentManagement: new PluginServiceProvider(dashboardContentManagementServiceFactory, [ @@ -88,6 +89,7 @@ const providers: PluginServiceProviders(); diff --git a/src/plugins/dashboard/public/services/types.ts b/src/plugins/dashboard/public/services/types.ts index c1c7c1aa39e71..420ba257b6a6a 100644 --- a/src/plugins/dashboard/public/services/types.ts +++ b/src/plugins/dashboard/public/services/types.ts @@ -39,6 +39,7 @@ import { DashboardUsageCollectionService } from './usage_collection/types'; import { DashboardVisualizationsService } from './visualizations/types'; import { DashboardServerlessService } from './serverless/types'; import { NoDataPageService } from './no_data_page/types'; +import { DashboardUiActionsService } from './ui_actions/types'; export type DashboardPluginServiceParams = KibanaPluginServiceParams & { initContext: PluginInitializerContext; // need a custom type so that initContext is a required parameter for initializerContext @@ -74,4 +75,5 @@ export interface DashboardServices { contentManagement: ContentManagementPublicStart; serverless: DashboardServerlessService; // TODO: make this optional in follow up noDataPage: NoDataPageService; + uiActions: DashboardUiActionsService; } diff --git a/src/plugins/dashboard/public/services/ui_actions/types.ts b/src/plugins/dashboard/public/services/ui_actions/types.ts new file mode 100644 index 0000000000000..102cb70d8a11d --- /dev/null +++ b/src/plugins/dashboard/public/services/ui_actions/types.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; + +export interface DashboardUiActionsService { + getTriggerCompatibleActions?: UiActionsStart['getTriggerCompatibleActions']; +} diff --git a/src/plugins/dashboard/public/services/ui_actions/ui_actions_service.stub.ts b/src/plugins/dashboard/public/services/ui_actions/ui_actions_service.stub.ts new file mode 100644 index 0000000000000..033889959b89a --- /dev/null +++ b/src/plugins/dashboard/public/services/ui_actions/ui_actions_service.stub.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { uiActionsPluginMock } from '@kbn/ui-actions-plugin/public/mocks'; +import { PluginServiceFactory } from '@kbn/presentation-util-plugin/public'; +import { DashboardUiActionsService } from './types'; + +export type UIActionsServiceFactory = PluginServiceFactory; + +export const uiActionsServiceFactory: UIActionsServiceFactory = () => { + const pluginMock = uiActionsPluginMock.createStartContract(); + return { getTriggerCompatibleActions: pluginMock.getTriggerCompatibleActions }; +}; diff --git a/src/plugins/dashboard/public/services/ui_actions/ui_actions_service.ts b/src/plugins/dashboard/public/services/ui_actions/ui_actions_service.ts new file mode 100644 index 0000000000000..221380c6d0479 --- /dev/null +++ b/src/plugins/dashboard/public/services/ui_actions/ui_actions_service.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { KibanaPluginServiceFactory } from '@kbn/presentation-util-plugin/public'; +import type { DashboardStartDependencies } from '../../plugin'; +import type { DashboardUiActionsService } from './types'; + +export type UsageCollectionServiceFactory = KibanaPluginServiceFactory< + DashboardUiActionsService, + DashboardStartDependencies +>; +export const uiActionsServiceFactory: UsageCollectionServiceFactory = ({ startPlugins }) => { + const { uiActions } = startPlugins; + if (!uiActions) return {}; + + const { getTriggerCompatibleActions } = uiActions; + return { + getTriggerCompatibleActions, + }; +}; diff --git a/src/plugins/dashboard/public/triggers/index.ts b/src/plugins/dashboard/public/triggers/index.ts new file mode 100644 index 0000000000000..96dfa814b949a --- /dev/null +++ b/src/plugins/dashboard/public/triggers/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { i18n } from '@kbn/i18n'; +import type { Trigger } from '@kbn/ui-actions-plugin/public'; + +export const ADD_PANEL_TRIGGER = 'ADD_PANEL_TRIGGER'; +export const addPanelMenuTrigger: Trigger = { + id: ADD_PANEL_TRIGGER, + title: i18n.translate('dashboard.addPanelMenuTrigger.title', { + defaultMessage: 'Add panel menu', + }), + description: i18n.translate('dashboard.addPanelMenuTrigger.description', { + defaultMessage: "A new action will appear to the dashboard's add panel menu", + }), +}; diff --git a/test/functional/apps/dashboard/group6/dashboard_esql_chart.ts b/test/functional/apps/dashboard/group6/dashboard_esql_chart.ts new file mode 100644 index 0000000000000..f69477b926b71 --- /dev/null +++ b/test/functional/apps/dashboard/group6/dashboard_esql_chart.ts @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const retry = getService('retry'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects(['common', 'dashboard', 'timePicker', 'header']); + const testSubjects = getService('testSubjects'); + const monacoEditor = getService('monacoEditor'); + const dashboardAddPanel = getService('dashboardAddPanel'); + + describe('dashboard add ES|QL chart', function () { + before(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/dashboard/current/kibana' + ); + await kibanaServer.uiSettings.replace({ + defaultIndex: '0bf35f60-3dc9-11e8-8660-4d65aa086b3c', + }); + }); + + it('should add an ES|QL datatable chart when the ES|QL panel action is clicked', async () => { + await PageObjects.dashboard.navigateToApp(); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.timePicker.setDefaultDataRange(); + await PageObjects.dashboard.switchToEditMode(); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickAddNewPanelFromUIActionLink('ES|QL'); + await dashboardAddPanel.expectEditorMenuClosed(); + await PageObjects.dashboard.waitForRenderComplete(); + + await retry.try(async () => { + const panelCount = await PageObjects.dashboard.getPanelCount(); + expect(panelCount).to.eql(1); + }); + + expect(await testSubjects.exists('lnsDataTable')).to.be(true); + }); + + it('should remove the panel if cancel button is clicked', async () => { + await testSubjects.click('cancelFlyoutButton'); + await PageObjects.dashboard.waitForRenderComplete(); + await retry.try(async () => { + const panelCount = await PageObjects.dashboard.getPanelCount(); + expect(panelCount).to.eql(0); + }); + }); + + it('should be able to edit the query and render another chart', async () => { + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickAddNewPanelFromUIActionLink('ES|QL'); + await dashboardAddPanel.expectEditorMenuClosed(); + await PageObjects.dashboard.waitForRenderComplete(); + + await monacoEditor.setCodeEditorValue('from logstash-* | stats maxB = max(bytes)'); + await testSubjects.click('TextBasedLangEditor-run-query-button'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await testSubjects.click('applyFlyoutButton'); + expect(await testSubjects.exists('mtrVis')).to.be(true); + }); + }); +} diff --git a/test/functional/apps/dashboard/group6/index.ts b/test/functional/apps/dashboard/group6/index.ts index 95d18049053ae..75decec10fb4c 100644 --- a/test/functional/apps/dashboard/group6/index.ts +++ b/test/functional/apps/dashboard/group6/index.ts @@ -35,5 +35,6 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { // If we don't use the timestamp in the URL, the colors in the charts will be different. loadTestFile(require.resolve('./dashboard_snapshots')); loadTestFile(require.resolve('./embeddable_library')); + loadTestFile(require.resolve('./dashboard_esql_chart')); }); } diff --git a/test/functional/services/dashboard/add_panel.ts b/test/functional/services/dashboard/add_panel.ts index 00a91dff87b85..65adf6dee5359 100644 --- a/test/functional/services/dashboard/add_panel.ts +++ b/test/functional/services/dashboard/add_panel.ts @@ -77,6 +77,10 @@ export class DashboardAddPanelService extends FtrService { await this.testSubjects.click(`createNew-${type}`); } + async clickAddNewPanelFromUIActionLink(type: string) { + await this.testSubjects.click(`create-action-${type}`); + } + async addEveryEmbeddableOnCurrentPage() { this.log.debug('addEveryEmbeddableOnCurrentPage'); const itemList = await this.testSubjects.find('savedObjectsFinderTable'); diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/flyout_wrapper.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/flyout_wrapper.tsx index bab45a9ffe856..f9a6ac0ce397b 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/flyout_wrapper.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/flyout_wrapper.tsx @@ -32,6 +32,7 @@ export const FlyoutWrapper = ({ displayFlyoutHeader, language, attributesChanged, + isNewPanel, onCancel, navigateToLensEditor, onApply, @@ -49,12 +50,17 @@ export const FlyoutWrapper = ({ > - +

- {i18n.translate('xpack.lens.config.editVisualizationLabel', { - defaultMessage: 'Edit {lang} visualization', - values: { lang: language }, - })} + {isNewPanel + ? i18n.translate('xpack.lens.config.createVisualizationLabel', { + defaultMessage: 'Create {lang} visualization', + values: { lang: language }, + }) + : i18n.translate('xpack.lens.config.editVisualizationLabel', { + defaultMessage: 'Edit {lang} visualization', + values: { lang: language }, + })} diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx index 2421f303d7b3a..acef8feb6da50 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx @@ -114,6 +114,8 @@ export async function getEditLensConfiguration( navigateToLensEditor, displayFlyoutHeader, canEditTextBasedQuery, + isNewPanel, + deletePanel, hidesSuggestions, }: EditLensConfigurationProps) => { if (!lensServices || !datasourceMap || !visualizationMap) { @@ -208,6 +210,8 @@ export async function getEditLensConfiguration( canEditTextBasedQuery, hidesSuggestions, setCurrentAttributes, + isNewPanel, + deletePanel, }; return getWrapper( diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx index adc0b83861b9c..6aad89b50ef0c 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx @@ -94,6 +94,16 @@ describe('LensEditConfigurationFlyout', () => { expect(navigateToLensEditorSpy).toHaveBeenCalled(); }); + it('should display the header title correctly for a newly created panel', async () => { + renderConfigFlyout({ + displayFlyoutHeader: true, + isNewPanel: true, + }); + expect(screen.getByTestId('inlineEditingFlyoutLabel').textContent).toBe( + 'Create ES|QL visualization' + ); + }); + it('should call the closeFlyout callback if cancel button is clicked', async () => { const closeFlyoutSpy = jest.fn(); diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx index 13fedcf5cd7e0..39801f41c391c 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx @@ -61,6 +61,8 @@ export function LensEditConfigurationFlyout({ navigateToLensEditor, displayFlyoutHeader, canEditTextBasedQuery, + isNewPanel, + deletePanel, hidesSuggestions, }: EditConfigPanelProps) { const euiTheme = useEuiTheme(); @@ -165,18 +167,23 @@ export function LensEditConfigurationFlyout({ updateByRefInput?.(savedObjectId); } } + // for a newly created chart, I want cancelling to also remove the panel + if (isNewPanel && deletePanel) { + deletePanel(); + } closeFlyout?.(); }, [ - previousAttributes, attributesChanged, + isNewPanel, + deletePanel, closeFlyout, + visualization.activeId, + savedObjectId, datasourceMap, datasourceId, updatePanelState, updateSuggestion, - savedObjectId, updateByRefInput, - visualization, ]); const onApply = useCallback(() => { @@ -279,6 +286,7 @@ export function LensEditConfigurationFlyout({ onApply={onApply} isScrollable={true} attributesChanged={attributesChanged} + isNewPanel={isNewPanel} > void; onApply?: () => void; navigateToLensEditor?: () => void; @@ -75,6 +76,10 @@ export interface EditConfigPanelProps { displayFlyoutHeader?: boolean; /** If set to true the layout changes to accordion and the text based query (i.e. ES|QL) can be edited */ canEditTextBasedQuery?: boolean; + /** The flyout is used for adding a new panel by scratch */ + isNewPanel?: boolean; + /** Handler for deleting the embeddable, used in case a user cancels a newly created chart */ + deletePanel?: () => void; /** If set to true the layout changes to accordion and the text based query (i.e. ES|QL) can be edited */ hidesSuggestions?: boolean; } diff --git a/x-pack/plugins/lens/public/async_services.ts b/x-pack/plugins/lens/public/async_services.ts index 7bbfaf415db03..85724c871cda6 100644 --- a/x-pack/plugins/lens/public/async_services.ts +++ b/x-pack/plugins/lens/public/async_services.ts @@ -50,4 +50,5 @@ export * from './app_plugin/save_modal_container'; export * from './chart_info_api'; export * from './trigger_actions/open_in_discover_helpers'; -export * from './trigger_actions/open_lens_config/helpers'; +export * from './trigger_actions/open_lens_config/edit_action_helpers'; +export * from './trigger_actions/open_lens_config/create_action_helpers'; diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index c1dd7901f3822..529f80b803c6f 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -845,7 +845,11 @@ export class Embeddable this.updateInput({ attributes: attrs, savedObjectId }); } - async openConfingPanel(startDependencies: LensPluginStartDependencies) { + async openConfingPanel( + startDependencies: LensPluginStartDependencies, + isNewPanel?: boolean, + deletePanel?: () => void + ) { const { getEditLensConfiguration } = await import('../async_services'); const Component = await getEditLensConfiguration( this.deps.coreStart, @@ -875,6 +879,8 @@ export class Embeddable } displayFlyoutHeader={true} canEditTextBasedQuery={this.isTextBasedLanguage()} + isNewPanel={isNewPanel} + deletePanel={deletePanel} /> ); } diff --git a/x-pack/plugins/lens/public/plugin.ts b/x-pack/plugins/lens/public/plugin.ts index 460864d1c86f2..872e1a566ab20 100644 --- a/x-pack/plugins/lens/public/plugin.ts +++ b/x-pack/plugins/lens/public/plugin.ts @@ -105,7 +105,8 @@ import type { } from './types'; import { getLensAliasConfig } from './vis_type_alias'; import { createOpenInDiscoverAction } from './trigger_actions/open_in_discover_action'; -import { ConfigureInLensPanelAction } from './trigger_actions/open_lens_config/action'; +import { ConfigureInLensPanelAction } from './trigger_actions/open_lens_config/edit_action'; +import { CreateESQLPanelAction } from './trigger_actions/open_lens_config/create_action'; import { visualizeFieldAction } from './trigger_actions/visualize_field_actions'; import { visualizeTSVBAction } from './trigger_actions/visualize_tsvb_actions'; import { visualizeAggBasedVisAction } from './trigger_actions/visualize_agg_based_vis_actions'; @@ -327,6 +328,9 @@ export class LensPlugin { this.editorFrameService!.loadVisualizations(), this.editorFrameService!.loadDatasources(), ]); + const { setVisualizationMap, setDatasourceMap } = await import('./async_services'); + setDatasourceMap(datasourceMap); + setVisualizationMap(visualizationMap); const eventAnnotationService = await plugins.eventAnnotation.getService(); if (plugins.usageCollection) { @@ -598,6 +602,10 @@ export class LensPlugin { ); startDependencies.uiActions.addTriggerAction('CONTEXT_MENU_TRIGGER', editInLensAction); + // Displays the add ESQL panel in the dashboard add Panel menu + const createESQLPanelAction = new CreateESQLPanelAction(startDependencies, core); + startDependencies.uiActions.addTriggerAction('ADD_PANEL_TRIGGER', createESQLPanelAction); + const discoverLocator = startDependencies.share?.url.locators.get('DISCOVER_APP_LOCATOR'); if (discoverLocator) { startDependencies.uiActions.addTriggerAction( diff --git a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/create_action.test.tsx b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/create_action.test.tsx new file mode 100644 index 0000000000000..9a06fea94cd98 --- /dev/null +++ b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/create_action.test.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { CoreStart } from '@kbn/core/public'; +import { coreMock } from '@kbn/core/public/mocks'; +import type { LensPluginStartDependencies } from '../../plugin'; +import { createMockStartDependencies } from '../../editor_frame_service/mocks'; +import { CreateESQLPanelAction } from './create_action'; + +describe('create Lens panel action', () => { + const core = coreMock.createStart(); + const mockStartDependencies = + createMockStartDependencies() as unknown as LensPluginStartDependencies; + describe('compatibility check', () => { + it('is incompatible if ui setting for ES|QL is off', async () => { + const configurablePanelAction = new CreateESQLPanelAction(mockStartDependencies, core); + const isCompatible = await configurablePanelAction.isCompatible(); + + expect(isCompatible).toBeFalsy(); + }); + + it('is compatible if ui setting for ES|QL is on', async () => { + const updatedCore = { + ...core, + uiSettings: { + ...core.uiSettings, + get: (setting: string) => { + return setting === 'discover:enableESQL'; + }, + }, + } as CoreStart; + const createESQLAction = new CreateESQLPanelAction(mockStartDependencies, updatedCore); + const isCompatible = await createESQLAction.isCompatible(); + + expect(isCompatible).toBeTruthy(); + }); + }); +}); diff --git a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/create_action.tsx b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/create_action.tsx new file mode 100644 index 0000000000000..aa33a629c3969 --- /dev/null +++ b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/create_action.tsx @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { i18n } from '@kbn/i18n'; +import type { CoreStart } from '@kbn/core/public'; +import { Action } from '@kbn/ui-actions-plugin/public'; +import type { + EmbeddableFactory, + EmbeddableInput, + IEmbeddable, +} from '@kbn/embeddable-plugin/public'; +import type { LensPluginStartDependencies } from '../../plugin'; + +const ACTION_CREATE_ESQL_CHART = 'ACTION_CREATE_ESQL_CHART'; + +interface Context { + createNewEmbeddable: ( + embeddableFactory: EmbeddableFactory, + initialInput?: Partial, + dismissNotification?: boolean + ) => Promise; + deleteEmbeddable: (embeddableId: string) => void; + initialInput?: Partial; +} + +export const getAsyncHelpers = async () => await import('../../async_services'); + +export class CreateESQLPanelAction implements Action { + public type = ACTION_CREATE_ESQL_CHART; + public id = ACTION_CREATE_ESQL_CHART; + public order = 50; + + constructor( + protected readonly startDependencies: LensPluginStartDependencies, + protected readonly core: CoreStart + ) {} + + public getDisplayName(): string { + return i18n.translate('xpack.lens.app.createVisualizationLabel', { + defaultMessage: 'ES|QL', + }); + } + + public getIconType() { + // need to create a new one + return 'esqlVis'; + } + + public async isCompatible() { + // compatible only when ES|QL advanced setting is enabled + const { isCreateActionCompatible } = await getAsyncHelpers(); + return isCreateActionCompatible(this.core); + } + + public async execute({ createNewEmbeddable, deleteEmbeddable }: Context) { + const { executeCreateAction } = await getAsyncHelpers(); + executeCreateAction({ + deps: this.startDependencies, + core: this.core, + createNewEmbeddable, + deleteEmbeddable, + }); + } +} diff --git a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/create_action_helpers.ts b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/create_action_helpers.ts new file mode 100644 index 0000000000000..1eddc499f4170 --- /dev/null +++ b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/create_action_helpers.ts @@ -0,0 +1,127 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { createGetterSetter } from '@kbn/kibana-utils-plugin/common'; +import type { CoreStart } from '@kbn/core/public'; +import type { + EmbeddableFactory, + EmbeddableInput, + IEmbeddable, +} from '@kbn/embeddable-plugin/public'; +import { IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; +import type { Datasource, Visualization } from '../../types'; +import type { LensPluginStartDependencies } from '../../plugin'; +import { fetchDataFromAggregateQuery } from '../../datasources/text_based/fetch_data_from_aggregate_query'; +import { suggestionsApi } from '../../lens_suggestions_api'; +import { getLensAttributes } from '../../app_plugin/shared/edit_on_the_fly/helpers'; +import { generateId } from '../../id_generator'; +import { executeEditAction } from './edit_action_helpers'; + +// datasourceMap and visualizationMap setters/getters +export const [getVisualizationMap, setVisualizationMap] = createGetterSetter< + Record> +>('VisualizationMap', false); + +export const [getDatasourceMap, setDatasourceMap] = createGetterSetter< + Record> +>('DatasourceMap', false); + +export function isCreateActionCompatible(core: CoreStart) { + return core.uiSettings.get('discover:enableESQL'); +} + +export async function executeCreateAction({ + deps, + core, + createNewEmbeddable, + deleteEmbeddable, +}: { + deps: LensPluginStartDependencies; + core: CoreStart; + createNewEmbeddable: ( + embeddableFactory: EmbeddableFactory, + initialInput?: Partial, + dismissNotification?: boolean + ) => Promise; + deleteEmbeddable: (embeddableId: string) => void; +}) { + const isCompatibleAction = isCreateActionCompatible(core); + const defaultDataView = await deps.dataViews.getDefaultDataView({ + displayErrors: false, + }); + if (!isCompatibleAction || !defaultDataView) { + throw new IncompatibleActionError(); + } + const visualizationMap = getVisualizationMap(); + const datasourceMap = getDatasourceMap(); + + const defaultIndex = defaultDataView.getIndexPattern(); + const defaultEsqlQuery = { + esql: `from ${defaultIndex} | limit 10`, + }; + + // For the suggestions api we need only the columns + // so we are requesting them with limit 0 + // this is much more performant than requesting + // all the table + const performantQuery = { + esql: `from ${defaultIndex} | limit 0`, + }; + + const table = await fetchDataFromAggregateQuery( + performantQuery, + defaultDataView, + deps.data, + deps.expressions + ); + + const context = { + dataViewSpec: defaultDataView.toSpec(), + fieldName: '', + textBasedColumns: table?.columns, + query: defaultEsqlQuery, + }; + + // get the initial attributes from the suggestions api + const allSuggestions = + suggestionsApi({ context, dataView: defaultDataView, datasourceMap, visualizationMap }) ?? []; + + // Lens might not return suggestions for some cases, i.e. in case of errors + if (!allSuggestions.length) return undefined; + const [firstSuggestion] = allSuggestions; + const attrs = getLensAttributes({ + filters: [], + query: defaultEsqlQuery, + suggestion: firstSuggestion, + dataView: defaultDataView, + }); + + const input = { + attributes: attrs, + id: generateId(), + }; + const embeddableStart = deps.embeddable; + const factory = embeddableStart.getEmbeddableFactory('lens'); + if (!factory) { + return undefined; + } + const embeddable = await createNewEmbeddable(factory, input, true); + // open the flyout if embeddable has been created successfully + if (embeddable) { + const deletePanel = () => { + deleteEmbeddable(embeddable.id); + }; + + executeEditAction({ + embeddable, + startDependencies: deps, + overlays: core.overlays, + theme: core.theme, + isNewPanel: true, + deletePanel, + }); + } +} diff --git a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/action.test.tsx b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action.test.tsx similarity index 98% rename from x-pack/plugins/lens/public/trigger_actions/open_lens_config/action.test.tsx rename to x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action.test.tsx index d8dbc219c6c17..e1ab0f715cac5 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/action.test.tsx +++ b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action.test.tsx @@ -12,7 +12,7 @@ import { themeServiceMock } from '@kbn/core-theme-browser-mocks'; import type { LensPluginStartDependencies } from '../../plugin'; import { createMockStartDependencies } from '../../editor_frame_service/mocks'; import { DOC_TYPE } from '../../../common/constants'; -import { ConfigureInLensPanelAction } from './action'; +import { ConfigureInLensPanelAction } from './edit_action'; describe('open config panel action', () => { const overlays = overlayServiceMock.createStartContract(); diff --git a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/action.tsx b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action.tsx similarity index 88% rename from x-pack/plugins/lens/public/trigger_actions/open_lens_config/action.tsx rename to x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action.tsx index 376cae58d1339..c4960532bdd66 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/action.tsx +++ b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action.tsx @@ -43,13 +43,13 @@ export class ConfigureInLensPanelAction implements Action { } public async isCompatible({ embeddable }: Context) { - const { isActionCompatible } = await getConfigureLensHelpersAsync(); - return isActionCompatible(embeddable); + const { isEditActionCompatible } = await getConfigureLensHelpersAsync(); + return isEditActionCompatible(embeddable); } public async execute({ embeddable }: Context) { - const { executeAction } = await getConfigureLensHelpersAsync(); - return executeAction({ + const { executeEditAction } = await getConfigureLensHelpersAsync(); + return executeEditAction({ embeddable, startDependencies: this.startDependencies, overlays: this.overlays, diff --git a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action_helpers.ts similarity index 85% rename from x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts rename to x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action_helpers.ts index 8fd011fddfb2e..38f1aadc2c576 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts +++ b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action_helpers.ts @@ -18,22 +18,31 @@ interface Context { startDependencies: LensPluginStartDependencies; overlays: OverlayStart; theme: ThemeServiceStart; + isNewPanel?: boolean; + deletePanel?: () => void; } -export async function isActionCompatible(embeddable: IEmbeddable) { +export async function isEditActionCompatible(embeddable: IEmbeddable) { // display the action only if dashboard is on editable mode const inDashboardEditMode = embeddable.getInput().viewMode === 'edit'; return Boolean(isLensEmbeddable(embeddable) && embeddable.getIsEditable() && inDashboardEditMode); } -export async function executeAction({ embeddable, startDependencies, overlays, theme }: Context) { - const isCompatibleAction = await isActionCompatible(embeddable); +export async function executeEditAction({ + embeddable, + startDependencies, + overlays, + theme, + isNewPanel, + deletePanel, +}: Context) { + const isCompatibleAction = await isEditActionCompatible(embeddable); if (!isCompatibleAction || !isLensEmbeddable(embeddable)) { throw new IncompatibleActionError(); } const rootEmbeddable = embeddable.getRoot(); const overlayTracker = tracksOverlays(rootEmbeddable) ? rootEmbeddable : undefined; - const ConfigPanel = await embeddable.openConfingPanel(startDependencies); + const ConfigPanel = await embeddable.openConfingPanel(startDependencies, isNewPanel, deletePanel); if (ConfigPanel) { const handle = overlays.openFlyout( toMountPoint( From f9233bd2ad4b6f3962778d2074fb13d66d745c27 Mon Sep 17 00:00:00 2001 From: Hannah Mudge Date: Wed, 20 Dec 2023 08:22:05 -0700 Subject: [PATCH 30/62] [Dashboard] Unskip flaky colour sync test (#173582) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://github.com/elastic/kibana/issues/148557 ## Summary [Ran the FTR](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/4636) on the skipped test suite and it passed 100 times... Really unclear on why it keeps failing, especially after https://github.com/elastic/kibana/pull/172633. For now, since I can't get it to fail locally or with the FTR, I'm going to unskip. If it starts to fail on `main` again, we could loop in the Vis team to help (since it's the timepicker in the Lens app that is misbehaving) - but hopefully the previous failure was a fluke and that won't be necessary🤞 ### Checklist - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed ([Link](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/4636)) ![Screenshot 2023-12-20 at 7 47 58 AM](https://github.com/elastic/kibana/assets/8698078/523e715a-a347-4c82-955c-b18cabe53566) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- x-pack/test/functional/apps/dashboard/group2/sync_colors.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/test/functional/apps/dashboard/group2/sync_colors.ts b/x-pack/test/functional/apps/dashboard/group2/sync_colors.ts index d82868aa068b3..a388a4d90af3b 100644 --- a/x-pack/test/functional/apps/dashboard/group2/sync_colors.ts +++ b/x-pack/test/functional/apps/dashboard/group2/sync_colors.ts @@ -35,8 +35,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return colorMapping; } - // FLAKY: https://github.com/elastic/kibana/issues/148557 - describe.skip('sync colors', function () { + describe('sync colors', function () { before(async function () { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); await kibanaServer.importExport.load( From 69395c611e5ebfdfc4ca6b244e995b15e59bc36f Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Wed, 20 Dec 2023 08:09:31 -0800 Subject: [PATCH 31/62] [Connectors] Pass data-test-subj into JSON editor with message variables (#172642) --- .../public/connector_types/bedrock/params.tsx | 4 ++-- .../connector_types/cases_webhook/steps/create.tsx | 2 +- .../connector_types/cases_webhook/steps/update.tsx | 4 ++-- .../public/connector_types/d3security/params.tsx | 3 ++- .../connector_types/es_index/es_index_params.tsx | 4 ++-- .../public/connector_types/openai/params.tsx | 4 ++-- .../opsgenie/create_alert/json_editor.tsx | 3 ++- .../connector_types/pagerduty/pagerduty_params.tsx | 2 +- .../public/connector_types/tines/tines_params.tsx | 4 ++-- .../public/connector_types/torq/torq_params.tsx | 3 ++- .../public/connector_types/webhook/webhook_params.tsx | 3 ++- .../components/json_editor_with_message_variables.tsx | 10 ++++++---- .../stack_connectors/index_connector.ts | 2 +- .../cypress/screens/common/rule_actions.ts | 2 +- 14 files changed, 28 insertions(+), 22 deletions(-) diff --git a/x-pack/plugins/stack_connectors/public/connector_types/bedrock/params.tsx b/x-pack/plugins/stack_connectors/public/connector_types/bedrock/params.tsx index b880e388b9f91..7678f52321dd3 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/bedrock/params.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/bedrock/params.tsx @@ -67,7 +67,7 @@ const BedrockParamsFields: React.FunctionComponent { editSubActionParams({ body: json }); @@ -77,7 +77,7 @@ const BedrockParamsFields: React.FunctionComponent = ({ display, readOnly }) => ( componentProps={{ euiCodeEditorProps: { isReadOnly: readOnly, - 'data-test-subj': 'webhookCreateIncidentJson', ['aria-label']: i18n.CODE_EDITOR, }, + dataTestSubj: 'webhookCreateIncidentJson', messageVariables: casesVars, paramsProperty: 'createIncidentJson', buttonTitle: i18n.ADD_CASES_VARIABLE, diff --git a/x-pack/plugins/stack_connectors/public/connector_types/cases_webhook/steps/update.tsx b/x-pack/plugins/stack_connectors/public/connector_types/cases_webhook/steps/update.tsx index a140ecbc6a221..e7a37d415f4af 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/cases_webhook/steps/update.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/cases_webhook/steps/update.tsx @@ -104,9 +104,9 @@ export const UpdateStep: FunctionComponent = ({ display, readOnly }) => ( euiCodeEditorProps: { height: '200px', isReadOnly: readOnly, - 'data-test-subj': 'webhookUpdateIncidentJson', ['aria-label']: i18n.CODE_EDITOR, }, + dataTestSubj: 'webhookUpdateIncidentJson', messageVariables: [...casesVars, ...urlVars], paramsProperty: 'updateIncidentJson', buttonTitle: i18n.ADD_CASES_VARIABLE, @@ -192,9 +192,9 @@ export const UpdateStep: FunctionComponent = ({ display, readOnly }) => ( euiCodeEditorProps: { height: '200px', isReadOnly: readOnly, - 'data-test-subj': 'webhookCreateCommentJson', ['aria-label']: i18n.CODE_EDITOR, }, + dataTestSubj: 'webhookCreateCommentJson', messageVariables: [...commentVars, ...urlVars], paramsProperty: 'createCommentJson', buttonTitle: i18n.ADD_CASES_VARIABLE, diff --git a/x-pack/plugins/stack_connectors/public/connector_types/d3security/params.tsx b/x-pack/plugins/stack_connectors/public/connector_types/d3security/params.tsx index 4785399c65f2f..605afadb5af2b 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/d3security/params.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/d3security/params.tsx @@ -89,7 +89,7 @@ const D3ParamsFields: React.FunctionComponent ); diff --git a/x-pack/plugins/stack_connectors/public/connector_types/es_index/es_index_params.tsx b/x-pack/plugins/stack_connectors/public/connector_types/es_index/es_index_params.tsx index fc51ae0ba1ccf..b9b9ef8e7d41f 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/es_index/es_index_params.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/es_index/es_index_params.tsx @@ -196,10 +196,10 @@ export const IndexParamsFields = ({ > = ( label={i18n.translate('xpack.stackConnectors.components.genAi.bodyFieldLabel', { defaultMessage: 'Body', })} - aria-label={i18n.translate('xpack.stackConnectors.components.genAi.bodyCodeEditorAriaLabel', { + ariaLabel={i18n.translate('xpack.stackConnectors.components.genAi.bodyCodeEditorAriaLabel', { defaultMessage: 'Code editor', })} errors={errors.body as string[]} @@ -79,7 +79,7 @@ const ParamsFields: React.FunctionComponent> = ( editSubActionParams({ body: '' }); } }} - data-test-subj="genAi-bodyJsonEditor" + dataTestSubj="genAi-bodyJsonEditor" /> ); }; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/opsgenie/create_alert/json_editor.tsx b/x-pack/plugins/stack_connectors/public/connector_types/opsgenie/create_alert/json_editor.tsx index 17054b00dc920..2e352235729c1 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/opsgenie/create_alert/json_editor.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/opsgenie/create_alert/json_editor.tsx @@ -83,10 +83,11 @@ const JsonEditorComponent: React.FC = ({ messageVariables={messageVariables} paramsProperty={'subActionParams'} inputTargetValue={jsonEditorValue} - aria-label={i18n.JSON_EDITOR_ARIA} + ariaLabel={i18n.JSON_EDITOR_ARIA} onDocumentsChange={onAdvancedEditorChange} errors={jsonEditorErrors} label={i18n.ALERT_FIELDS_LABEL} + dataTestSubj="actionJsonEditor" /> ); }; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty_params.tsx b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty_params.tsx index 08d92a0f4ad3e..7c9d74de5e571 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty_params.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty_params.tsx @@ -373,7 +373,7 @@ const PagerDutyParamsFields: React.FunctionComponent { editSubActionParams({ body: json }); @@ -317,7 +317,7 @@ const TinesParamsFields: React.FunctionComponent )} diff --git a/x-pack/plugins/stack_connectors/public/connector_types/torq/torq_params.tsx b/x-pack/plugins/stack_connectors/public/connector_types/torq/torq_params.tsx index e6cb9880c3ef2..e5847717a74a2 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/torq/torq_params.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/torq/torq_params.tsx @@ -27,7 +27,7 @@ const TorqParamsFields: React.FunctionComponent { editAction('body', json, index); @@ -37,6 +37,7 @@ const TorqParamsFields: React.FunctionComponent ); }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/json_editor_with_message_variables.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/json_editor_with_message_variables.tsx index 4459735acb927..45852171b5be4 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/json_editor_with_message_variables.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/json_editor_with_message_variables.tsx @@ -39,11 +39,12 @@ interface Props { inputTargetValue?: string | null; label: string; errors?: string[]; - areaLabel?: string; + ariaLabel?: string; onDocumentsChange: (data: string) => void; helpText?: JSX.Element; onBlur?: () => void; showButtonTitle?: boolean; + dataTestSubj?: string; euiCodeEditorProps?: { [key: string]: any }; } @@ -61,11 +62,12 @@ export const JsonEditorWithMessageVariables: React.FunctionComponent = ({ inputTargetValue, label, errors, - areaLabel, + ariaLabel, onDocumentsChange, helpText, onBlur, showButtonTitle, + dataTestSubj, euiCodeEditorProps = {}, }) => { const editorRef = useRef(); @@ -154,7 +156,7 @@ export const JsonEditorWithMessageVariables: React.FunctionComponent = ({ return ( 0 && inputTargetValue !== undefined} @@ -191,7 +193,7 @@ export const JsonEditorWithMessageVariables: React.FunctionComponent = ({ width="100%" height="200px" data-test-subj={`${paramsProperty}JsonEditor`} - aria-label={areaLabel} + aria-label={ariaLabel} {...euiCodeEditorProps} editorDidMount={onEditorMount} onChange={(xjson: string) => { diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index_connector.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index_connector.ts index 838ca43b19724..3caaab6daccca 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index_connector.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index_connector.ts @@ -39,7 +39,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await commonScreenshots.takeScreenshot('index-connector', screenshotDirectories); const saveTestButton = await testSubjects.find('create-connector-flyout-save-test-btn'); await saveTestButton.click(); - await testSubjects.setValue('actionJsonEditor', indexDocument); + await testSubjects.setValue('documentToIndex', indexDocument); await commonScreenshots.takeScreenshot('index-params-test', screenshotDirectories); const flyOutCancelButton = await testSubjects.find('euiFlyoutCloseButton'); await flyOutCancelButton.click(); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/common/rule_actions.ts b/x-pack/test/security_solution_cypress/cypress/screens/common/rule_actions.ts index e6d44f0918c6d..21d8bfdc0c0ce 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/common/rule_actions.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/common/rule_actions.ts @@ -42,7 +42,7 @@ export const EMAIL_CONNECTOR_SERVICE_SELECTOR = '[data-test-subj="emailServiceSe export const FORM_VALIDATION_ERROR = '.euiFormErrorText'; -export const JSON_EDITOR = "[data-test-subj='actionJsonEditor']"; +export const JSON_EDITOR = "[data-test-subj='documentToIndex']"; export const INDEX_SELECTOR = "[data-test-subj='.index-siem-ActionTypeSelectOption']"; From 0ac7dbd4f61acc5cf523a8ecebac661d88f4ffd8 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Wed, 20 Dec 2023 08:11:24 -0800 Subject: [PATCH 32/62] [Connectors][IBM Resilient] Edit required labels and automate screenshots (#166022) --- .../action-types/resilient.asciidoc | 58 ++++++++++-------- .../connectors/images/resilient-connector.png | Bin 152361 -> 173548 bytes .../images/resilient-params-test.png | Bin 184380 -> 104332 bytes .../resilient/case_fields_preview.test.tsx | 2 +- .../connectors/resilient/translations.ts | 2 +- .../resilient/resilient_params.tsx | 10 ++- .../connector_types/resilient/translations.ts | 4 +- .../ibm_resilient_connector.ts | 57 +++++++++++++++++ .../stack_connectors/index.ts | 1 + .../e2e/explore/cases/connector_options.cy.ts | 2 +- 10 files changed, 102 insertions(+), 34 deletions(-) create mode 100644 x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/ibm_resilient_connector.ts diff --git a/docs/management/connectors/action-types/resilient.asciidoc b/docs/management/connectors/action-types/resilient.asciidoc index 04531a71dee62..ad8ebffcf0bb9 100644 --- a/docs/management/connectors/action-types/resilient.asciidoc +++ b/docs/management/connectors/action-types/resilient.asciidoc @@ -8,7 +8,7 @@ :frontmatter-tags-content-type: [how-to] :frontmatter-tags-user-goals: [configure] -The IBM Resilient connector uses the https://developer.ibm.com/security/resilient/rest/[RESILIENT REST v2] to create IBM Resilient incidents. +The {ibm-r} connector uses the https://developer.ibm.com/security/resilient/rest/[RESILIENT REST v2] to create {ibm-r} incidents. [float] [[define-resilient-ui]] @@ -18,47 +18,51 @@ You can create connectors in *{stack-manage-app} > {connectors-ui}* or as needed when you're creating a rule. For example: [role="screenshot"] -image::management/connectors/images/resilient-connector.png[IBM Resilient connector] +image::management/connectors/images/resilient-connector.png[{ibm-r} connector] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. [float] [[resilient-connector-configuration]] ==== Connector configuration -IBM Resilient connectors have the following configuration properties: +{ibm-r} connectors have the following configuration properties: -Name:: The name of the connector. -URL:: IBM Resilient instance URL. -Organization ID:: IBM Resilient organization ID. -API key ID:: The authentication key ID for HTTP Basic authentication. -API key secret:: The authentication key secret for HTTP Basic authentication. +API key ID:: +The authentication key ID for HTTP Basic authentication. +API key secret:: +The authentication key secret for HTTP Basic authentication. +Organization ID:: +The {ibm-r} organization ID. +URL:: +The {ibm-r} instance URL. [float] [[resilient-action-configuration]] === Test connectors -You can test connectors with the <> or -as you're creating or editing the connector in {kib}. For example: +You can test connectors as you're creating or editing the connector in {kib}. +For example: [role="screenshot"] -image::management/connectors/images/resilient-params-test.png[IBM Resilient params test] - - -IBM Resilient actions have the following configuration properties. - -Incident types:: The type of the incident. -Severity code:: The severity of the incident. -Name:: A name for the issue, used for searching the contents of the knowledge base. -Description:: The details about the incident. -Additional comments:: Additional information for the client, such as how to troubleshoot the issue. +image::management/connectors/images/resilient-params-test.png[IBM Resilient connector test options] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +{ibm-r} actions have the following configuration properties. + +Additional comments:: +Extra information for the client, such as how to troubleshoot the issue. +Description:: +The details about the incident. +Incident type:: +The type of the incident. +Name:: +A name for the issue, used for searching the contents of the knowledge base. +Severity:: +The severity of the incident. [float] [[resilient-connector-networking-configuration]] === Connector networking configuration -Use the <> to customize connector networking configurations, such as proxies, certificates, or TLS settings. You can set configurations that apply to all your connectors or use `xpack.actions.customHostSettings` to set per-host configurations. - -[float] -[[configuring-resilient]] -=== Configure IBM Resilient - -IBM Resilient offers https://www.ibm.com/security/intelligent-orchestration/resilient[Instances], which you can use to test incidents. +Use the <> to customize connector networking configurations, such as proxies, certificates, or TLS settings. +You can set configurations that apply to all your connectors or use `xpack.actions.customHostSettings` to set per-host configurations. diff --git a/docs/management/connectors/images/resilient-connector.png b/docs/management/connectors/images/resilient-connector.png index b7d216d150f8c1862601e976fddcc5f78eae595e..b5d08ed5987b23c934375c5be7d42b01c52f838c 100644 GIT binary patch literal 173548 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
jC3Q>UcSo}T_yjduzT)CvWtu?*LzRZk9M;^X5% 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

UF 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 DaAFsS diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields_preview.test.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields_preview.test.tsx index dd6b9f08c0d09..f4ac54c1eb925 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields_preview.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields_preview.test.tsx @@ -81,7 +81,7 @@ describe('Jira Fields: Preview', () => { const getByText = createQueryWithMarkup(screen.getByText); - expect(getByText('Incident Types: Malware, Denial of Service')).toBeInTheDocument(); + expect(getByText('Incident types: Malware, Denial of Service')).toBeInTheDocument(); expect(getByText('Severity: Medium')).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/translations.ts b/x-pack/plugins/cases/public/components/connectors/resilient/translations.ts index 1b63a5098e92a..132234f0d2d57 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/translations.ts +++ b/x-pack/plugins/cases/public/components/connectors/resilient/translations.ts @@ -31,7 +31,7 @@ export const INCIDENT_TYPES_PLACEHOLDER = i18n.translate( export const INCIDENT_TYPES_LABEL = i18n.translate( 'xpack.cases.connectors.resilient.incidentTypesLabel', { - defaultMessage: 'Incident Types', + defaultMessage: 'Incident types', } ); diff --git a/x-pack/plugins/stack_connectors/public/connector_types/resilient/resilient_params.tsx b/x-pack/plugins/stack_connectors/public/connector_types/resilient/resilient_params.tsx index 04a0ba4f85ec4..fb53e3567186c 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/resilient/resilient_params.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/resilient/resilient_params.tsx @@ -11,6 +11,7 @@ import { EuiComboBox, EuiSelect, EuiSpacer, + EuiText, EuiTitle, EuiComboBoxOptionOption, EuiSelectOption, @@ -171,7 +172,7 @@ const ResilientParamsFields: React.FunctionComponent + Required + + } > { + resilientSimulatorUrl = kibanaServer.resolveUrl( + getExternalServiceSimulatorPath(ExternalServiceSimulator.RESILIENT) + ); + smallUrl = resilientSimulatorUrl.replace('/elastic:changeme@', '/'); + }); + + beforeEach(async () => { + await pageObjects.common.navigateToApp('connectors'); + await pageObjects.header.waitUntilLoadingHasFinished(); + }); + + it('ibm resilient connector creation screenshots', async () => { + await pageObjects.common.navigateToApp('connectors'); + await pageObjects.header.waitUntilLoadingHasFinished(); + await actions.common.openNewConnectorForm('resilient'); + await testSubjects.setValue('nameInput', 'IBM Resilient test connector'); + await testSubjects.setValue('config.apiUrl-input', smallUrl); + await testSubjects.setValue('config.orgId-input', '201'); + await testSubjects.setValue('secrets.apiKeyId-input', 'tester'); + await testSubjects.setValue('secrets.apiKeySecret-input', 'testkey'); + await commonScreenshots.takeScreenshot('resilient-connector', screenshotDirectories); + await testSubjects.click('create-connector-flyout-save-test-btn'); + // Close all toasts since it is unable to get incident types from example site + await pageObjects.common.clearAllToasts(); + await pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.common.clearAllToasts(); + await commonScreenshots.takeScreenshot('resilient-params-test', screenshotDirectories); + await testSubjects.click('euiFlyoutCloseButton'); + }); + }); +} diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index.ts index 8c3454772fffa..5b9afd0ffd32d 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/index.ts @@ -57,6 +57,7 @@ export default function ({ loadTestFile, getService }: FtrProviderContext) { loadTestFile(require.resolve('./bedrock_connector')); loadTestFile(require.resolve('./email_connector')); loadTestFile(require.resolve('./generative_ai_connector')); + loadTestFile(require.resolve('./ibm_resilient_connector')); loadTestFile(require.resolve('./index_connector')); loadTestFile(require.resolve('./jira_connector')); loadTestFile(require.resolve('./opsgenie_connector')); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connector_options.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connector_options.cy.ts index 9bff9b341c68a..274d839c95a87 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connector_options.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connector_options.cy.ts @@ -76,7 +76,7 @@ describe('Cases connector incident fields', { tags: ['@ess', '@serverless'] }, ( cy.get(CONNECTOR_TITLE).should('have.text', getIbmResilientConnectorOptions().title); cy.get(CONNECTOR_CARD_DETAILS).should( 'have.text', - `Incident Types: ${getIbmResilientConnectorOptions().incidentTypes.join(', ')}Severity: ${ + `Incident types: ${getIbmResilientConnectorOptions().incidentTypes.join(', ')}Severity: ${ getIbmResilientConnectorOptions().severity }` ); From 36c9d5dd3dd51f70c8d38a0a28e5ddb59d8520d7 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Wed, 20 Dec 2023 17:15:54 +0100 Subject: [PATCH 33/62] Require page reload when changing `timepicker:quickRanges` (#173747) ## Summary fix https://github.com/elastic/kibana/issues/172601 I reviewed how this setting is used. It is directly used in a lot of places and it is hard to guarantee/fix that all places pick up the new setting. Safer to ask to reload. --- src/plugins/data/server/ui_settings.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/data/server/ui_settings.ts b/src/plugins/data/server/ui_settings.ts index 46794e0a3c9c6..b7b665689c106 100644 --- a/src/plugins/data/server/ui_settings.ts +++ b/src/plugins/data/server/ui_settings.ts @@ -471,6 +471,7 @@ export function getUiSettings( '', }, }), + requiresPageReload: true, schema: enableValidations ? schema.arrayOf( schema.object({ From 9522d7424f1a707d6629486e9cd13a6c3da7aa2b Mon Sep 17 00:00:00 2001 From: Shahzad Date: Wed, 20 Dec 2023 18:08:29 +0100 Subject: [PATCH 34/62] [SLOs] Use more apm data in temp slo docs (#173386) ## Summary fixes https://github.com/elastic/kibana/issues/172727 Use more APM data in temp slo docs !! --- .../services/slo/__snapshots__/create_slo.test.ts.snap | 8 ++++---- .../services/slo/__snapshots__/reset_slo.test.ts.snap | 8 ++++---- .../helpers/create_temp_summary.ts | 10 ++++++---- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/observability/server/services/slo/__snapshots__/create_slo.test.ts.snap b/x-pack/plugins/observability/server/services/slo/__snapshots__/create_slo.test.ts.snap index 8c2cfc3b0d1f5..7c0ea00b409c9 100644 --- a/x-pack/plugins/observability/server/services/slo/__snapshots__/create_slo.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/__snapshots__/create_slo.test.ts.snap @@ -149,8 +149,8 @@ Array [ "goodEvents": 0, "isTempDoc": true, "service": Object { - "environment": null, - "name": null, + "environment": "irrelevant", + "name": "irrelevant", }, "sliValue": -1, "slo": Object { @@ -180,8 +180,8 @@ Array [ "statusCode": 0, "totalEvents": 0, "transaction": Object { - "name": null, - "type": null, + "name": "irrelevant", + "type": "irrelevant", }, }, "id": "slo-unique-id", diff --git a/x-pack/plugins/observability/server/services/slo/__snapshots__/reset_slo.test.ts.snap b/x-pack/plugins/observability/server/services/slo/__snapshots__/reset_slo.test.ts.snap index 9ad1d09bd1ef8..d70d8ebfc0073 100644 --- a/x-pack/plugins/observability/server/services/slo/__snapshots__/reset_slo.test.ts.snap +++ b/x-pack/plugins/observability/server/services/slo/__snapshots__/reset_slo.test.ts.snap @@ -435,8 +435,8 @@ exports[`ResetSLO resets all associated resources 11`] = ` "goodEvents": 0, "isTempDoc": true, "service": Object { - "environment": null, - "name": null, + "environment": "irrelevant", + "name": "irrelevant", }, "sliValue": -1, "slo": Object { @@ -469,8 +469,8 @@ exports[`ResetSLO resets all associated resources 11`] = ` "statusCode": 0, "totalEvents": 0, "transaction": Object { - "name": null, - "type": null, + "name": "irrelevant", + "type": "irrelevant", }, }, "id": "slo-irrelevant", diff --git a/x-pack/plugins/observability/server/services/slo/summary_transform_generator/helpers/create_temp_summary.ts b/x-pack/plugins/observability/server/services/slo/summary_transform_generator/helpers/create_temp_summary.ts index 166ca0198dbb8..8e1939647bac8 100644 --- a/x-pack/plugins/observability/server/services/slo/summary_transform_generator/helpers/create_temp_summary.ts +++ b/x-pack/plugins/observability/server/services/slo/summary_transform_generator/helpers/create_temp_summary.ts @@ -9,14 +9,16 @@ import { ALL_VALUE } from '@kbn/slo-schema'; import { SLO } from '../../../../domain/models'; export function createTempSummaryDocument(slo: SLO, spaceId: string) { + const apmParams = 'environment' in slo.indicator.params ? slo.indicator.params : null; + return { service: { - environment: null, - name: null, + environment: apmParams?.environment ?? null, + name: apmParams?.service ?? null, }, transaction: { - name: null, - type: null, + name: apmParams?.transactionName ?? null, + type: apmParams?.transactionType ?? null, }, slo: { indicator: { From f0af2b91b471c47b3a548c83be0e5f03169f04c4 Mon Sep 17 00:00:00 2001 From: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> Date: Wed, 20 Dec 2023 17:11:13 +0000 Subject: [PATCH 35/62] [Index Management] Fix empty error toast message from extension actions (#173620) Fixes https://github.com/elastic/kibana/issues/118464 Similar to https://github.com/elastic/kibana/pull/162656 ## Summary This PR fixes the empty error toast that appears from a failed extension action. For example, when the ILM extension action "Retry lifecycle step" fails, it would display an empty error toast on cloud (or it would display "Bad request" when running locally): https://github.com/elastic/kibana/assets/59341489/37c3113a-4f2b-4157-ab0c-658c410349c8 With these changes, the error toast also displays the message: https://github.com/elastic/kibana/assets/59341489/1f6df5c4-381f-4039-b5f3-746c5783bd2c **How to test:** For testing a failing "Retry lifecycle step" action, I followed the instructions in this [README](https://github.com/elastic/kibana/blob/main/x-pack/plugins/index_lifecycle_management/README.md) file to create a lifecycle policy error. The changes in this PR can be tested in its [CI Cloud deployment](https://kibana-pr-173620.kb.us-west2.gcp.elastic-cloud.com:9243/). --- .../public/application/store/actions/extension_action.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/index_management/public/application/store/actions/extension_action.js b/x-pack/plugins/index_management/public/application/store/actions/extension_action.js index 0fb49eea24b4d..95a94bf1d1696 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/extension_action.js +++ b/x-pack/plugins/index_management/public/application/store/actions/extension_action.js @@ -15,7 +15,7 @@ export const performExtensionAction = try { await requestMethod(indexNames, httpService.httpClient); } catch (error) { - notificationService.showDangerToast(error.message); + notificationService.showDangerToast(error.body.message); return; } dispatch(reloadIndices(indexNames)); From a4af14e6596fe5c4b8630e6fea021916a9039b98 Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Wed, 20 Dec 2023 12:45:15 -0500 Subject: [PATCH 36/62] [Response Ops][Alerting] Fix null alerts client reference in rule executors (#173560) Resolves https://github.com/elastic/kibana/issues/170683 ## Summary This scenario occurs when there is an issue installing alert resources for a context for a rule type that is using the framework alerts-as-data reporting. When the alert resources are not installed, the task runner passes in `null` for the alertsClient into the executors so when the rule executor is using the new alerts client (vs the alert factory), we see a null accessor error. We only see this in the ES query rule type because all other rule types using the alerts client performs a check at the start of rule execution. This PR adds that check to the ES query rule type, and in all cases, has the executor throw a controlled `AlertsClientError` if this scenario is encountered. ## To Verify 1. Start up ES and Kibana on `main` and create an ES query run 2. Stop Kibana. Switch to this branch. Make a non-additive change to the alerts field map, like ``` --- a/packages/kbn-alerts-as-data-utils/src/field_maps/alert_field_map.ts +++ b/packages/kbn-alerts-as-data-utils/src/field_maps/alert_field_map.ts @@ -51,7 +51,7 @@ export const alertFieldMap = { required: false, }, [ALERT_CASE_IDS]: { - type: 'keyword', + type: 'date', array: true, required: false, }, ``` 3. Start Kibana. See errors during startup about not being able to install alert resources. See error thrown during rule execution about the alerts client being expected. --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../server/alerts_client/alerts_client_error.ts | 15 +++++++++++++++ .../alerting/server/alerts_client/index.ts | 1 + x-pack/plugins/alerting/server/index.ts | 2 +- .../metric_threshold_executor.ts | 4 ++-- .../register_anomaly_detection_alert_type.ts | 10 ++++++++-- .../server/rule_types/es_query/executor.ts | 14 +++++++++----- .../rule_types/index_threshold/rule_type.ts | 16 ++++++++++------ 7 files changed, 46 insertions(+), 16 deletions(-) create mode 100644 x-pack/plugins/alerting/server/alerts_client/alerts_client_error.ts diff --git a/x-pack/plugins/alerting/server/alerts_client/alerts_client_error.ts b/x-pack/plugins/alerting/server/alerts_client/alerts_client_error.ts new file mode 100644 index 0000000000000..e553618ea921d --- /dev/null +++ b/x-pack/plugins/alerting/server/alerts_client/alerts_client_error.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export class AlertsClientError extends Error { + constructor() { + super( + `Expected alertsClient not to be null! There may have been an issue installing alert resources.` + ); + Object.setPrototypeOf(this, AlertsClientError.prototype); + } +} diff --git a/x-pack/plugins/alerting/server/alerts_client/index.ts b/x-pack/plugins/alerting/server/alerts_client/index.ts index a1c0a309e0dc4..c141ac8167e9b 100644 --- a/x-pack/plugins/alerting/server/alerts_client/index.ts +++ b/x-pack/plugins/alerting/server/alerts_client/index.ts @@ -9,3 +9,4 @@ export { type LegacyAlertsClientParams, LegacyAlertsClient } from './legacy_aler export { AlertsClient } from './alerts_client'; export type { AlertRuleData } from './types'; export { sanitizeBulkErrorResponse } from './lib'; +export { AlertsClientError } from './alerts_client_error'; diff --git a/x-pack/plugins/alerting/server/index.ts b/x-pack/plugins/alerting/server/index.ts index 5be648354e61f..916d1bd11a384 100644 --- a/x-pack/plugins/alerting/server/index.ts +++ b/x-pack/plugins/alerting/server/index.ts @@ -69,7 +69,7 @@ export { isValidAlertIndexName, InstallShutdownError, } from './alerts_service'; -export { sanitizeBulkErrorResponse } from './alerts_client'; +export { sanitizeBulkErrorResponse, AlertsClientError } from './alerts_client'; export { getDataStreamAdapter } from './alerts_service/lib/data_stream_adapter'; export const plugin = async (initContext: PluginInitializerContext) => { diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts index 4a51722288c05..830e50d04f5c7 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts @@ -14,7 +14,7 @@ import { AlertInstanceState as AlertState, RecoveredActionGroup, } from '@kbn/alerting-plugin/common'; -import { RuleExecutorOptions, RuleTypeState } from '@kbn/alerting-plugin/server'; +import { AlertsClientError, RuleExecutorOptions, RuleTypeState } from '@kbn/alerting-plugin/server'; import type { TimeUnitChar } from '@kbn/observability-plugin/common'; import { getAlertUrl } from '@kbn/observability-plugin/common'; import { ObservabilityMetricsAlert } from '@kbn/alerts-as-data-utils'; @@ -120,7 +120,7 @@ export const createMetricThresholdExecutor = const { alertsClient, savedObjectsClient } = services; if (!alertsClient) { - throw new Error(`Expected alertsClient to be defined but it was not!`); + throw new AlertsClientError(); } const alertReporter: MetricThresholdAlertReporter = async ( diff --git a/x-pack/plugins/ml/server/lib/alerts/register_anomaly_detection_alert_type.ts b/x-pack/plugins/ml/server/lib/alerts/register_anomaly_detection_alert_type.ts index 2dadf5e510268..d270ca3166e2f 100644 --- a/x-pack/plugins/ml/server/lib/alerts/register_anomaly_detection_alert_type.ts +++ b/x-pack/plugins/ml/server/lib/alerts/register_anomaly_detection_alert_type.ts @@ -15,7 +15,11 @@ import type { RuleTypeParams, RuleTypeState, } from '@kbn/alerting-plugin/common'; -import { IRuleTypeAlerts, RuleExecutorOptions } from '@kbn/alerting-plugin/server'; +import { + AlertsClientError, + IRuleTypeAlerts, + RuleExecutorOptions, +} from '@kbn/alerting-plugin/server'; import { ALERT_REASON, ALERT_URL } from '@kbn/rule-data-utils'; import { MlAnomalyDetectionAlert } from '@kbn/alerts-as-data-utils'; import { ES_FIELD_TYPES } from '@kbn/field-types'; @@ -249,7 +253,9 @@ export function registerAnomalyDetectionAlertType({ ); const { alertsClient } = services; - if (!alertsClient) return { state: {} }; + if (!alertsClient) { + throw new AlertsClientError(); + } const executionResult = await execute(params, spaceId); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.ts index d0d440c769487..7d8d2df355c16 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/executor.ts @@ -15,6 +15,7 @@ import { ALERT_URL, } from '@kbn/rule-data-utils'; +import { AlertsClientError } from '@kbn/alerting-plugin/server'; import { ComparatorFns } from '../../../common'; import { addMessages, @@ -48,10 +49,13 @@ export async function executor(core: CoreSetup, options: ExecutorOptions Date: Wed, 20 Dec 2023 12:21:37 -0600 Subject: [PATCH 37/62] [ci/pr] Remove renovate from allowed_list (#173285) Renovate pull requests often sit inactive before a developer is able to review. While inactive renovate is adding new versions, or the pull request becomes outdated and CI cycles are not used. This moves renovate CI on pull requests to a manual trigger, either via `buildkite test this` or `/ci`. --- .buildkite/pull_requests.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/.buildkite/pull_requests.json b/.buildkite/pull_requests.json index 02686fe378b4f..6db75b64a1e08 100644 --- a/.buildkite/pull_requests.json +++ b/.buildkite/pull_requests.json @@ -8,7 +8,6 @@ "enabled": true, "allow_org_users": true, "allowed_repo_permissions": ["admin", "write"], - "allowed_list": ["barlowm", "renovate[bot]"], "set_commit_status": true, "commit_status_context": "kibana-ci", "build_on_commit": true, @@ -59,7 +58,6 @@ "enabled": true, "allow_org_users": true, "allowed_repo_permissions": ["admin", "write"], - "allowed_list": ["barlowm", "renovate[bot]"], "set_commit_status": true, "commit_status_context": "kibana-ci-test", "build_on_commit": true, From 73f53f59d0bda0434f324e5ded8b935ef087c16d Mon Sep 17 00:00:00 2001 From: Maryam Saeidi Date: Wed, 20 Dec 2023 19:27:51 +0100 Subject: [PATCH 38/62] [Observability Overview] Fix unable to load page due to an error in MetricWithSparkline (#173773) Fixes #173768 ## Summary In order to check the issue, you need to generate some host data and then check the observability overview page. |Local|Oblt| |---|---| |![image](https://github.com/elastic/kibana/assets/12370520/c3113dd3-0b30-4c7b-a222-70f9045ebbdd)![image](https://github.com/elastic/kibana/assets/12370520/434d2266-e033-4761-92ad-c4cea6c351a0)|![image](https://github.com/elastic/kibana/assets/12370520/02af7c79-9119-44c6-a4ce-d24591014b09)| --- .../components/sections/metrics/metric_with_sparkline.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metric_with_sparkline.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metric_with_sparkline.tsx index 3e4b0476b5075..bd292a2bf88cb 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metric_with_sparkline.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metric_with_sparkline.tsx @@ -36,7 +36,7 @@ export function MetricWithSparkline({ id, formatter, value, timeseries, color }: const theme = [EUI_SPARKLINE_THEME_PARTIAL]; const baseTheme = isDarkTheme ? DARK_THEME : LIGHT_THEME; - const colors = theme[1].colors?.vizColors ?? []; + const colors = baseTheme.colors?.vizColors ?? []; if (!value) { return ( From 4c2ea7d89c7b8a711c576d720702be2757848578 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Wed, 20 Dec 2023 20:31:14 +0200 Subject: [PATCH 39/62] [Actions] Pass the Kibana requests to the executor of system actions (#173763) ## Summary System actions, like the case action, may need access to the Kibana request to initiate clients (cases client for example) or services. This PR passes the Kibana request to the `executor` of system actions. It does not pass the request to nonsystem action types. ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../server/lib/action_executor.test.ts | 72 +++++++++++++++++++ .../actions/server/lib/action_executor.ts | 1 + x-pack/plugins/actions/server/types.ts | 1 + 3 files changed, 74 insertions(+) diff --git a/x-pack/plugins/actions/server/lib/action_executor.test.ts b/x-pack/plugins/actions/server/lib/action_executor.test.ts index c58e16a11aa4a..f283732c16f2a 100644 --- a/x-pack/plugins/actions/server/lib/action_executor.test.ts +++ b/x-pack/plugins/actions/server/lib/action_executor.test.ts @@ -720,6 +720,7 @@ test('successfully executes with system connector', async () => { secrets: {}, params: { foo: true }, logger: loggerMock, + request: {}, }); expect(loggerMock.debug).toBeCalledWith( @@ -812,6 +813,75 @@ test('successfully executes with system connector', async () => { `); }); +test('passes the Kibana request on the executor of a system action', async () => { + const actionType: jest.Mocked = { + id: '.cases', + name: 'Cases', + minimumLicenseRequired: 'platinum', + supportedFeatureIds: ['alerting'], + isSystemActionType: true, + validate: { + config: { schema: schema.any() }, + secrets: { schema: schema.any() }, + params: { schema: schema.any() }, + }, + executor: jest.fn(), + }; + + actionTypeRegistry.get.mockReturnValueOnce(actionType); + await actionExecutor.execute({ ...executeParams, actionId: 'system-connector-.cases' }); + + expect(actionType.executor).toHaveBeenCalledWith({ + actionId: 'system-connector-.cases', + services: expect.anything(), + config: {}, + secrets: {}, + params: { foo: true }, + logger: loggerMock, + request: {}, + }); +}); + +test('does not pass the Kibana request on the executor if the action is not a system action', async () => { + const actionType: jest.Mocked = { + id: 'test', + name: 'Test', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.object({ bar: schema.boolean() }) }, + secrets: { schema: schema.object({ baz: schema.boolean() }) }, + params: { schema: schema.object({ foo: schema.boolean() }) }, + }, + executor: jest.fn(), + }; + + const actionSavedObject = { + id: '1', + type: 'action', + attributes: { + name: '1', + actionTypeId: 'test', + config: { + bar: true, + }, + secrets: { + baz: true, + }, + isMissingSecrets: false, + }, + references: [], + }; + + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce(actionSavedObject); + actionTypeRegistry.get.mockReturnValueOnce(actionType); + await actionExecutor.execute(executeParams); + + const args = actionType.executor.mock.calls[0][0]; + + expect(args.request).toBeUndefined(); +}); + test('successfully authorize system actions', async () => { const actionType: jest.Mocked = { id: '.cases', @@ -1278,6 +1348,7 @@ test('should not throws an error if actionType is system action', async () => { secrets: {}, params: { foo: true }, logger: loggerMock, + request: {}, }); }); @@ -1510,6 +1581,7 @@ test('should not throw error if action is system action and isESOCanEncrypt is f secrets: {}, params: { foo: true }, logger: loggerMock, + request: {}, }); expect(loggerMock.debug).toBeCalledWith( diff --git a/x-pack/plugins/actions/server/lib/action_executor.ts b/x-pack/plugins/actions/server/lib/action_executor.ts index 69aab56e4e5b3..16d3d70c5b97e 100644 --- a/x-pack/plugins/actions/server/lib/action_executor.ts +++ b/x-pack/plugins/actions/server/lib/action_executor.ts @@ -259,6 +259,7 @@ export class ActionExecutor { configurationUtilities, logger, source, + ...(actionType.isSystemActionType ? { request } : {}), }); } catch (err) { if ( diff --git a/x-pack/plugins/actions/server/types.ts b/x-pack/plugins/actions/server/types.ts index 6a038d5092363..0d9cc99ac6186 100644 --- a/x-pack/plugins/actions/server/types.ts +++ b/x-pack/plugins/actions/server/types.ts @@ -76,6 +76,7 @@ export interface ActionTypeExecutorOptions< taskInfo?: TaskInfo; configurationUtilities: ActionsConfigurationUtilities; source?: ActionExecutionSource; + request?: KibanaRequest; } export type ActionResult = Connector; From dc25e896fe05a0ef0c53f53c56fc1148dff141c5 Mon Sep 17 00:00:00 2001 From: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com> Date: Wed, 20 Dec 2023 19:51:33 +0100 Subject: [PATCH 40/62] Distinguish error types(source) for actions serverless metrics (#171416) Resolves: #168635 This PR intends to add `source` data (user or framework) to the errors that returned by the actions plugin and use them to create two new metrics in TaskManager. New metrics: ``` USER_ERRORS = 'user_errors' FRAMEWORK_ERRORS = 'framework_errors' ``` Error source types: ``` FRAMEWORK = 'framework' USER = 'user' ``` I tried to keep the errorSource definition close to the place that the error is thrown as much as possible. To check the types / numbers for these, you can `curl $KB_URL/api/task_manager/metrics?reset=false` to get the values that our support infrastructure will be using. To test how well this code works, you can inject errors (add code) into a connector executor that you use in an alert action, and then use the endpoint to see how the errors were counted. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/actions/common/types.ts | 2 + .../server/lib/action_executor.test.ts | 86 +- .../actions/server/lib/action_executor.ts | 79 +- .../server/lib/task_runner_factory.test.ts | 57 +- .../actions/server/lib/task_runner_factory.ts | 14 +- .../plugins/task_manager/common/constants.ts | 11 + x-pack/plugins/task_manager/common/index.ts | 8 + .../server/metrics/create_aggregator.test.ts | 1872 +++++++++++++++-- .../task_run_metrics_aggregator.test.ts | 233 +- .../metrics/task_run_metrics_aggregator.ts | 26 +- .../server/task_running/errors.test.ts | 22 + .../server/task_running/errors.ts | 25 +- .../server/task_running/task_runner.test.ts | 4 +- .../server/task_running/task_runner.ts | 2 +- x-pack/plugins/task_manager/tsconfig.json | 1 + .../tests/actions/connector_types/bedrock.ts | 5 + .../actions/connector_types/cases_webhook.ts | 20 +- .../actions/connector_types/d3security.ts | 4 + .../tests/actions/connector_types/jira.ts | 15 +- .../tests/actions/connector_types/openai.ts | 5 + .../tests/actions/connector_types/opsgenie.ts | 18 +- .../actions/connector_types/resilient.ts | 14 +- .../connector_types/servicenow_itom.ts | 12 +- .../connector_types/servicenow_itsm.ts | 15 +- .../actions/connector_types/servicenow_sir.ts | 15 +- .../tests/actions/connector_types/swimlane.ts | 13 +- .../tests/actions/connector_types/tines.ts | 19 +- .../actions/sub_action_framework/index.ts | 7 + .../spaces_only/tests/actions/execute.ts | 3 + .../spaces_only/tests/actions/migrations.ts | 1 + 30 files changed, 2269 insertions(+), 339 deletions(-) create mode 100644 x-pack/plugins/task_manager/common/constants.ts create mode 100644 x-pack/plugins/task_manager/common/index.ts diff --git a/x-pack/plugins/actions/common/types.ts b/x-pack/plugins/actions/common/types.ts index 44d7516595d19..2560cbae3f7e7 100644 --- a/x-pack/plugins/actions/common/types.ts +++ b/x-pack/plugins/actions/common/types.ts @@ -6,6 +6,7 @@ */ import { LicenseType } from '@kbn/licensing-plugin/common/types'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; export { AlertingConnectorFeatureId, @@ -47,6 +48,7 @@ export interface ActionTypeExecutorResult { serviceMessage?: string; data?: Data; retry?: null | boolean | Date; + errorSource?: TaskErrorSource; } export type ActionTypeExecutorRawResult = ActionTypeExecutorResult & { diff --git a/x-pack/plugins/actions/server/lib/action_executor.test.ts b/x-pack/plugins/actions/server/lib/action_executor.test.ts index f283732c16f2a..9af58047878d1 100644 --- a/x-pack/plugins/actions/server/lib/action_executor.test.ts +++ b/x-pack/plugins/actions/server/lib/action_executor.test.ts @@ -23,6 +23,8 @@ import { securityMock } from '@kbn/security-plugin/server/mocks'; import { finished } from 'stream/promises'; import { PassThrough } from 'stream'; import { SecurityConnectorFeatureId } from '../../common'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; +import { getErrorSource } from '@kbn/task-manager-plugin/server/task_running'; const actionExecutor = new ActionExecutor({ isESOCanEncrypt: true }); const services = actionsMock.createServices(); @@ -911,6 +913,53 @@ test('successfully authorize system actions', async () => { }); }); +test('actionType Executor returns status "error" and an error message', async () => { + const actionType: jest.Mocked = { + id: 'test', + name: 'Test', + minimumLicenseRequired: 'basic', + supportedFeatureIds: ['alerting'], + validate: { + config: { schema: schema.any() }, + secrets: { schema: schema.any() }, + params: { schema: schema.any() }, + }, + executor: jest.fn().mockReturnValue({ + actionId: 'test', + status: 'error', + message: 'test error message', + retry: true, + }), + }; + const actionSavedObject = { + id: '1', + type: 'action', + attributes: { + name: '1', + actionTypeId: 'test', + config: { + bar: true, + }, + secrets: { + baz: true, + }, + isMissingSecrets: false, + }, + references: [], + }; + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce(actionSavedObject); + actionTypeRegistry.get.mockReturnValueOnce(actionType); + const result = await actionExecutor.execute(executeParams); + + expect(result).toEqual({ + actionId: 'test', + errorSource: TaskErrorSource.USER, + message: 'test error message', + retry: true, + status: 'error', + }); +}); + test('Execute of SentinelOne sub-actions require create privilege', async () => { const actionType: jest.Mocked = { id: '.sentinelone', @@ -1130,6 +1179,7 @@ test('throws an error when config is invalid', async () => { status: 'error', retry: false, message: `error validating action type config: [param1]: expected value of type [string] but got [undefined]`, + errorSource: TaskErrorSource.FRAMEWORK, }); }); @@ -1169,6 +1219,7 @@ test('returns an error when connector is invalid', async () => { status: 'error', retry: false, message: `error validating action type connector: config must be defined`, + errorSource: TaskErrorSource.FRAMEWORK, }); }); @@ -1207,6 +1258,7 @@ test('throws an error when params is invalid', async () => { status: 'error', retry: false, message: `error validating action params: [param1]: expected value of type [string] but got [undefined]`, + errorSource: TaskErrorSource.FRAMEWORK, }); }); @@ -1214,9 +1266,13 @@ test('throws an error when failing to load action through savedObjectsClient', a encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockRejectedValueOnce( new Error('No access') ); - await expect(actionExecutor.execute(executeParams)).rejects.toThrowErrorMatchingInlineSnapshot( - `"No access"` - ); + + try { + await actionExecutor.execute(executeParams); + } catch (e) { + expect(e.message).toBe('No access'); + expect(getErrorSource(e)).toBe(TaskErrorSource.FRAMEWORK); + } }); test('throws an error if actionType is not enabled', async () => { @@ -1246,9 +1302,13 @@ test('throws an error if actionType is not enabled', async () => { actionTypeRegistry.ensureActionTypeEnabled.mockImplementationOnce(() => { throw new Error('not enabled for test'); }); - await expect(actionExecutor.execute(executeParams)).rejects.toThrowErrorMatchingInlineSnapshot( - `"not enabled for test"` - ); + + try { + await actionExecutor.execute(executeParams); + } catch (e) { + expect(e.message).toBe('not enabled for test'); + expect(getErrorSource(e)).toBe(TaskErrorSource.FRAMEWORK); + } expect(actionTypeRegistry.ensureActionTypeEnabled).toHaveBeenCalledWith('test'); }); @@ -1364,11 +1424,15 @@ test('throws an error when passing isESOCanEncrypt with value of false', async ( inMemoryConnectors: [], getActionsAuthorizationWithRequest, }); - await expect( - customActionExecutor.execute(executeParams) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"Unable to execute action because the Encrypted Saved Objects plugin is missing encryption key. Please set xpack.encryptedSavedObjects.encryptionKey in the kibana.yml or use the bin/kibana-encryption-keys command."` - ); + + try { + await customActionExecutor.execute(executeParams); + } catch (e) { + expect(e.message).toBe( + 'Unable to execute action because the Encrypted Saved Objects plugin is missing encryption key. Please set xpack.encryptedSavedObjects.encryptionKey in the kibana.yml or use the bin/kibana-encryption-keys command.' + ); + expect(getErrorSource(e)).toBe(TaskErrorSource.USER); + } }); test('should not throw error if action is preconfigured and isESOCanEncrypt is false', async () => { diff --git a/x-pack/plugins/actions/server/lib/action_executor.ts b/x-pack/plugins/actions/server/lib/action_executor.ts index 16d3d70c5b97e..afcb96bbde8be 100644 --- a/x-pack/plugins/actions/server/lib/action_executor.ts +++ b/x-pack/plugins/actions/server/lib/action_executor.ts @@ -6,7 +6,7 @@ */ import type { PublicMethodsOf } from '@kbn/utility-types'; -import { Logger, KibanaRequest } from '@kbn/core/server'; +import { KibanaRequest, Logger } from '@kbn/core/server'; import { cloneDeep } from 'lodash'; import { set } from '@kbn/safer-lodash-set'; import { withSpan } from '@kbn/apm-utils'; @@ -14,24 +14,25 @@ import { EncryptedSavedObjectsClient } from '@kbn/encrypted-saved-objects-plugin import { SpacesServiceStart } from '@kbn/spaces-plugin/server'; import { IEventLogger, SAVED_OBJECT_REL_PRIMARY } from '@kbn/event-log-plugin/server'; import { SecurityPluginStart } from '@kbn/security-plugin/server'; +import { createTaskRunError, TaskErrorSource } from '@kbn/task-manager-plugin/server'; import { getGenAiTokenTracking, shouldTrackGenAiToken } from './gen_ai_token_tracking'; import { - validateParams, validateConfig, - validateSecrets, validateConnector, + validateParams, + validateSecrets, } from './validate_with_schema'; import { ActionType, - ActionTypeExecutorResult, + ActionTypeConfig, ActionTypeExecutorRawResult, + ActionTypeExecutorResult, ActionTypeRegistryContract, + ActionTypeSecrets, GetServicesFunction, InMemoryConnector, RawAction, ValidatorServices, - ActionTypeSecrets, - ActionTypeConfig, } from '../types'; import { EVENT_LOG_ACTIONS } from '../constants/event_log'; import { ActionExecutionSource } from './action_execution_source'; @@ -147,7 +148,11 @@ export class ActionExecutor { } if (!actionTypeRegistry.isActionExecutable(actionId, actionTypeId, { notifyUsage: true })) { - actionTypeRegistry.ensureActionTypeEnabled(actionTypeId); + try { + actionTypeRegistry.ensureActionTypeEnabled(actionTypeId); + } catch (e) { + throw createTaskRunError(e, TaskErrorSource.FRAMEWORK); + } } const actionType = actionTypeRegistry.get(actionTypeId); const configurationUtilities = actionTypeRegistry.getUtils(); @@ -261,11 +266,12 @@ export class ActionExecutor { source, ...(actionType.isSystemActionType ? { request } : {}), }); + + if (rawResult && rawResult.status === 'error') { + rawResult.errorSource = TaskErrorSource.USER; + } } catch (err) { - if ( - err.reason === ActionExecutionErrorReason.Validation || - err.reason === ActionExecutionErrorReason.Authorization - ) { + if (err.reason === ActionExecutionErrorReason.Authorization) { rawResult = err.result; } else { rawResult = { @@ -275,6 +281,7 @@ export class ActionExecutor { serviceMessage: err.message, error: err, retry: true, + errorSource: TaskErrorSource.USER, }; } } @@ -451,31 +458,37 @@ export class ActionExecutor { } if (!this.isESOCanEncrypt) { - throw new Error( - `Unable to execute action because the Encrypted Saved Objects plugin is missing encryption key. Please set xpack.encryptedSavedObjects.encryptionKey in the kibana.yml or use the bin/kibana-encryption-keys command.` + throw createTaskRunError( + new Error( + `Unable to execute action because the Encrypted Saved Objects plugin is missing encryption key. Please set xpack.encryptedSavedObjects.encryptionKey in the kibana.yml or use the bin/kibana-encryption-keys command.` + ), + TaskErrorSource.USER ); } - const rawAction = await encryptedSavedObjectsClient.getDecryptedAsInternalUser( - 'action', - actionId, - { - namespace: namespace === 'default' ? undefined : namespace, - } - ); - - const { - attributes: { secrets, actionTypeId, config, name }, - } = rawAction; + try { + const rawAction = await encryptedSavedObjectsClient.getDecryptedAsInternalUser( + 'action', + actionId, + { + namespace: namespace === 'default' ? undefined : namespace, + } + ); + const { + attributes: { secrets, actionTypeId, config, name }, + } = rawAction; - return { - actionTypeId, - name, - config, - secrets, - actionId, - rawAction: rawAction.attributes, - }; + return { + actionTypeId, + name, + config, + secrets, + actionId, + rawAction: rawAction.attributes, + }; + } catch (e) { + throw createTaskRunError(e, TaskErrorSource.FRAMEWORK); + } } } @@ -540,6 +553,7 @@ function validateAction( status: 'error', message: err.message, retry: !!taskInfo, + errorSource: TaskErrorSource.FRAMEWORK, }); } } @@ -585,6 +599,7 @@ const ensureAuthorizedToExecute = async ({ status: 'error', message: error.message, retry: false, + errorSource: TaskErrorSource.USER, }); } }; diff --git a/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts b/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts index e8c66cff784c9..ecb3f75fc7794 100644 --- a/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts +++ b/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts @@ -7,7 +7,7 @@ import sinon from 'sinon'; import { ActionExecutor } from './action_executor'; -import { ConcreteTaskInstance, TaskStatus } from '@kbn/task-manager-plugin/server'; +import { ConcreteTaskInstance, TaskErrorSource, TaskStatus } from '@kbn/task-manager-plugin/server'; import { TaskRunnerFactory } from './task_runner_factory'; import { actionTypeRegistryMock } from '../action_type_registry.mock'; import { actionExecutorMock } from './action_executor.mock'; @@ -25,6 +25,7 @@ import { inMemoryMetricsMock } from '../monitoring/in_memory_metrics.mock'; import { IN_MEMORY_METRICS } from '../monitoring'; import { pick } from 'lodash'; import { + getErrorSource, isRetryableError, isUnrecoverableError, } from '@kbn/task-manager-plugin/server/task_running'; @@ -544,12 +545,13 @@ describe('Task Runner Factory', () => { message: 'Error message', data: { foo: true }, retry: false, + errorSource: TaskErrorSource.USER, }); try { await taskRunner.run(); - throw new Error('Should have thrown'); } catch (e) { + expect(getErrorSource(e)).toBe(TaskErrorSource.USER); expect(isRetryableError(e)).toEqual(false); } }); @@ -853,6 +855,7 @@ describe('Task Runner Factory', () => { throw new Error('Should have thrown'); } catch (e) { expect(isUnrecoverableError(e)).toEqual(true); + expect(getErrorSource(e)).toBe(TaskErrorSource.USER); } }); @@ -887,6 +890,7 @@ describe('Task Runner Factory', () => { message: 'Error message', data: { foo: true }, retry: false, + errorSource: TaskErrorSource.FRAMEWORK, }); let err; @@ -900,6 +904,47 @@ describe('Task Runner Factory', () => { expect(taskRunnerFactoryInitializerParams.logger.error as jest.Mock).toHaveBeenCalledWith( `Action '2' failed: Error message` ); + expect(getErrorSource(err)).toBe(TaskErrorSource.FRAMEWORK); + }); + + test(`fallbacks to FRAMEWORK error if ActionExecutor does not return any type of source'`, async () => { + const taskRunner = taskRunnerFactory.create({ + taskInstance: { + ...mockedTaskInstance, + attempts: 0, + }, + }); + + mockedEncryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ + id: '3', + type: 'action_task_params', + attributes: { + actionId: '2', + params: { baz: true }, + executionId: '123abc', + apiKey: Buffer.from('123:abc').toString('base64'), + }, + references: [ + { + id: '2', + name: 'actionRef', + type: 'action', + }, + ], + }); + mockedActionExecutor.execute.mockResolvedValueOnce({ + status: 'error', + actionId: '2', + message: 'Error message', + data: { foo: true }, + retry: false, + }); + + try { + await taskRunner.run(); + } catch (e) { + expect(getErrorSource(e)).toBe(TaskErrorSource.FRAMEWORK); + } }); test('will rethrow the error if the error is thrown instead of returned', async () => { @@ -941,6 +986,7 @@ describe('Task Runner Factory', () => { `Action '2' failed: Fail` ); expect(thrownError).toEqual(err); + expect(getErrorSource(err)).toBe(TaskErrorSource.FRAMEWORK); }); test('increments monitoring metrics after execution', async () => { @@ -1158,6 +1204,11 @@ describe('Task Runner Factory', () => { ], }); - await expect(taskRunner.run()).rejects.toThrow('test'); + try { + await taskRunner.run(); + } catch (e) { + expect(getErrorSource(e)).toBe(TaskErrorSource.FRAMEWORK); + expect(e).toEqual(error); + } }); }); diff --git a/x-pack/plugins/actions/server/lib/task_runner_factory.ts b/x-pack/plugins/actions/server/lib/task_runner_factory.ts index 22dc57d7dc0d3..cd22ea324ba5c 100644 --- a/x-pack/plugins/actions/server/lib/task_runner_factory.ts +++ b/x-pack/plugins/actions/server/lib/task_runner_factory.ts @@ -19,13 +19,16 @@ import { SavedObjectReference, } from '@kbn/core/server'; import { + createTaskRunError, LoadIndirectParamsResult, RunContext, + TaskErrorSource, throwRetryableError, throwUnrecoverableError, } from '@kbn/task-manager-plugin/server'; import { EncryptedSavedObjectsClient } from '@kbn/encrypted-saved-objects-plugin/server'; import { LoadedIndirectParams } from '@kbn/task-manager-plugin/server/task'; +import { getErrorSource } from '@kbn/task-manager-plugin/server/task_running'; import { ActionExecutorContract, ActionInfo } from './action_executor'; import { ActionTaskExecutorParams, @@ -44,7 +47,7 @@ import { } from './action_execution_source'; import { RelatedSavedObjects, validatedRelatedSavedObjects } from './related_saved_objects'; import { injectSavedObjectReferences } from './action_task_params_utils'; -import { InMemoryMetrics, IN_MEMORY_METRICS } from '../monitoring'; +import { IN_MEMORY_METRICS, InMemoryMetrics } from '../monitoring'; import { ActionTypeDisabledError } from './errors'; export interface TaskRunnerContext { @@ -135,7 +138,8 @@ export class TaskRunnerFactory { }, }; return actionData; - } catch (error) { + } catch (err) { + const error = createTaskRunError(err, getErrorSource(err) || TaskErrorSource.FRAMEWORK); actionData = { error }; return { error }; } @@ -187,9 +191,9 @@ export class TaskRunnerFactory { logger.error(`Action '${actionId}' failed: ${e.message}`); if (e instanceof ActionTypeDisabledError) { // We'll stop re-trying due to action being forbidden - throwUnrecoverableError(e); + throwUnrecoverableError(createTaskRunError(e, TaskErrorSource.USER)); } - throw e; + throw createTaskRunError(e, getErrorSource(e) || TaskErrorSource.FRAMEWORK); } inMemoryMetrics.increment(IN_MEMORY_METRICS.ACTION_EXECUTIONS); @@ -199,7 +203,7 @@ export class TaskRunnerFactory { // Task manager error handler only kicks in when an error thrown (at this time) // So what we have to do is throw when the return status is `error`. throw throwRetryableError( - new Error(executorResult.message), + createTaskRunError(new Error(executorResult.message), executorResult.errorSource), executorResult.retry as boolean | Date ); } diff --git a/x-pack/plugins/task_manager/common/constants.ts b/x-pack/plugins/task_manager/common/constants.ts new file mode 100644 index 0000000000000..68d8f5f5519ba --- /dev/null +++ b/x-pack/plugins/task_manager/common/constants.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export enum TaskErrorSource { + FRAMEWORK = 'framework', + USER = 'user', +} diff --git a/x-pack/plugins/task_manager/common/index.ts b/x-pack/plugins/task_manager/common/index.ts new file mode 100644 index 0000000000000..04f9dbcc10bb4 --- /dev/null +++ b/x-pack/plugins/task_manager/common/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { TaskErrorSource } from './constants'; diff --git a/x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts b/x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts index 5becffa4e302c..afcd4884f7777 100644 --- a/x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts +++ b/x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts @@ -425,6 +425,8 @@ describe('createAggregator', () => { not_timed_out: 0, total: 0, delay: { counts: [1], values: [10] }, + framework_errors: 0, + user_errors: 0, }, }, }); @@ -436,10 +438,24 @@ describe('createAggregator', () => { not_timed_out: 1, total: 1, delay: { counts: [1], values: [10] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -451,10 +467,24 @@ describe('createAggregator', () => { not_timed_out: 1, total: 1, delay: { counts: [1, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -466,11 +496,31 @@ describe('createAggregator', () => { not_timed_out: 2, total: 2, delay: { counts: [1, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -482,11 +532,31 @@ describe('createAggregator', () => { not_timed_out: 2, total: 2, delay: { counts: [2, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -498,11 +568,31 @@ describe('createAggregator', () => { not_timed_out: 3, total: 3, delay: { counts: [2, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -514,11 +604,31 @@ describe('createAggregator', () => { not_timed_out: 3, total: 3, delay: { counts: [2, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -530,12 +640,38 @@ describe('createAggregator', () => { not_timed_out: 4, total: 4, delay: { counts: [2, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -547,12 +683,38 @@ describe('createAggregator', () => { not_timed_out: 4, total: 4, delay: { counts: [3, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -564,12 +726,38 @@ describe('createAggregator', () => { not_timed_out: 5, total: 5, delay: { counts: [3, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 3, total: 3 }, - 'alerting:example': { success: 2, not_timed_out: 3, total: 3 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -581,12 +769,38 @@ describe('createAggregator', () => { not_timed_out: 5, total: 5, delay: { counts: [4, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 3, total: 3 }, - 'alerting:example': { success: 2, not_timed_out: 3, total: 3 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -598,13 +812,45 @@ describe('createAggregator', () => { not_timed_out: 6, total: 6, delay: { counts: [4, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 3, not_timed_out: 4, total: 4 }, - 'alerting:__index-threshold': { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 2, not_timed_out: 3, total: 3 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:__index-threshold': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -616,13 +862,45 @@ describe('createAggregator', () => { not_timed_out: 6, total: 6, delay: { counts: [4, 2, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 3, not_timed_out: 4, total: 4 }, - 'alerting:__index-threshold': { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 2, not_timed_out: 3, total: 3 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:__index-threshold': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -634,13 +912,45 @@ describe('createAggregator', () => { not_timed_out: 7, total: 7, delay: { counts: [4, 2, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 4, not_timed_out: 5, total: 5 }, - 'alerting:__index-threshold': { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 3, not_timed_out: 4, total: 4 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 4, + not_timed_out: 5, + total: 5, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:__index-threshold': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -652,13 +962,45 @@ describe('createAggregator', () => { not_timed_out: 7, total: 7, delay: { counts: [5, 2, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 4, not_timed_out: 5, total: 5 }, - 'alerting:__index-threshold': { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 3, not_timed_out: 4, total: 4 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 4, + not_timed_out: 5, + total: 5, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:__index-threshold': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -670,13 +1012,45 @@ describe('createAggregator', () => { not_timed_out: 8, total: 8, delay: { counts: [5, 2, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 2, + user_errors: 0, }, by_type: { - alerting: { success: 4, not_timed_out: 6, total: 6 }, - 'alerting:__index-threshold': { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 3, not_timed_out: 5, total: 5 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 4, + not_timed_out: 6, + total: 6, + framework_errors: 2, + user_errors: 0, + }, + 'alerting:__index-threshold': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 3, + not_timed_out: 5, + total: 5, + framework_errors: 2, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -688,13 +1062,45 @@ describe('createAggregator', () => { not_timed_out: 8, total: 8, delay: { counts: [6, 2, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 2, + user_errors: 0, }, by_type: { - alerting: { success: 4, not_timed_out: 6, total: 6 }, - 'alerting:__index-threshold': { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 3, not_timed_out: 5, total: 5 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 4, + not_timed_out: 6, + total: 6, + framework_errors: 2, + user_errors: 0, + }, + 'alerting:__index-threshold': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 3, + not_timed_out: 5, + total: 5, + framework_errors: 2, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -706,13 +1112,45 @@ describe('createAggregator', () => { not_timed_out: 9, total: 9, delay: { counts: [6, 2, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 2, + user_errors: 0, }, by_type: { - alerting: { success: 5, not_timed_out: 7, total: 7 }, - 'alerting:__index-threshold': { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 4, not_timed_out: 6, total: 6 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 5, + not_timed_out: 7, + total: 7, + framework_errors: 2, + user_errors: 0, + }, + 'alerting:__index-threshold': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 4, + not_timed_out: 6, + total: 6, + framework_errors: 2, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -724,13 +1162,45 @@ describe('createAggregator', () => { not_timed_out: 9, total: 9, delay: { counts: [7, 2, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 2, + user_errors: 0, }, by_type: { - alerting: { success: 5, not_timed_out: 7, total: 7 }, - 'alerting:__index-threshold': { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 4, not_timed_out: 6, total: 6 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 5, + not_timed_out: 7, + total: 7, + framework_errors: 2, + user_errors: 0, + }, + 'alerting:__index-threshold': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 4, + not_timed_out: 6, + total: 6, + framework_errors: 2, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -742,15 +1212,59 @@ describe('createAggregator', () => { not_timed_out: 10, total: 10, delay: { counts: [7, 2, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 3, + user_errors: 0, }, by_type: { - actions: { success: 0, not_timed_out: 1, total: 1 }, - alerting: { success: 5, not_timed_out: 7, total: 7 }, - 'actions:webhook': { success: 0, not_timed_out: 1, total: 1 }, - 'alerting:__index-threshold': { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 4, not_timed_out: 6, total: 6 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + actions: { + success: 0, + not_timed_out: 1, + total: 1, + framework_errors: 1, + user_errors: 0, + }, + alerting: { + success: 5, + not_timed_out: 7, + total: 7, + framework_errors: 2, + user_errors: 0, + }, + 'actions:webhook': { + success: 0, + not_timed_out: 1, + total: 1, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:__index-threshold': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 4, + not_timed_out: 6, + total: 6, + framework_errors: 2, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -820,6 +1334,8 @@ describe('createAggregator', () => { not_timed_out: 0, total: 0, delay: { counts: [1], values: [10] }, + framework_errors: 0, + user_errors: 0, }, }, }); @@ -831,10 +1347,24 @@ describe('createAggregator', () => { not_timed_out: 1, total: 1, delay: { counts: [1], values: [10] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -846,10 +1376,24 @@ describe('createAggregator', () => { not_timed_out: 1, total: 1, delay: { counts: [1, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -861,11 +1405,31 @@ describe('createAggregator', () => { not_timed_out: 2, total: 2, delay: { counts: [1, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -877,11 +1441,31 @@ describe('createAggregator', () => { not_timed_out: 2, total: 2, delay: { counts: [2, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -893,11 +1477,31 @@ describe('createAggregator', () => { not_timed_out: 3, total: 3, delay: { counts: [2, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -909,11 +1513,31 @@ describe('createAggregator', () => { not_timed_out: 3, total: 3, delay: { counts: [2, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -925,12 +1549,38 @@ describe('createAggregator', () => { not_timed_out: 4, total: 4, delay: { counts: [2, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -942,12 +1592,38 @@ describe('createAggregator', () => { not_timed_out: 4, total: 4, delay: { counts: [3, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -959,12 +1635,38 @@ describe('createAggregator', () => { not_timed_out: 5, total: 5, delay: { counts: [3, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 3, total: 3 }, - 'alerting:example': { success: 2, not_timed_out: 3, total: 3 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -977,12 +1679,38 @@ describe('createAggregator', () => { not_timed_out: 0, total: 0, delay: { counts: [1], values: [10] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 0, not_timed_out: 0, total: 0 }, - 'alerting:example': { success: 0, not_timed_out: 0, total: 0 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -994,12 +1722,38 @@ describe('createAggregator', () => { not_timed_out: 1, total: 1, delay: { counts: [1], values: [10] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1011,12 +1765,38 @@ describe('createAggregator', () => { not_timed_out: 1, total: 1, delay: { counts: [1, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1028,12 +1808,38 @@ describe('createAggregator', () => { not_timed_out: 2, total: 2, delay: { counts: [1, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1045,12 +1851,38 @@ describe('createAggregator', () => { not_timed_out: 2, total: 2, delay: { counts: [2, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1062,12 +1894,38 @@ describe('createAggregator', () => { not_timed_out: 3, total: 3, delay: { counts: [2, 1], values: [10, 20] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 3, total: 3 }, - 'alerting:example': { success: 2, not_timed_out: 3, total: 3 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1079,12 +1937,38 @@ describe('createAggregator', () => { not_timed_out: 3, total: 3, delay: { counts: [3, 1], values: [10, 20] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 3, total: 3 }, - 'alerting:example': { success: 2, not_timed_out: 3, total: 3 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1096,12 +1980,38 @@ describe('createAggregator', () => { not_timed_out: 4, total: 4, delay: { counts: [3, 1], values: [10, 20] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 3, not_timed_out: 4, total: 4 }, - 'alerting:example': { success: 3, not_timed_out: 4, total: 4 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1113,12 +2023,38 @@ describe('createAggregator', () => { not_timed_out: 4, total: 4, delay: { counts: [4, 1], values: [10, 20] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 3, not_timed_out: 4, total: 4 }, - 'alerting:example': { success: 3, not_timed_out: 4, total: 4 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1130,14 +2066,52 @@ describe('createAggregator', () => { not_timed_out: 5, total: 5, delay: { counts: [4, 1], values: [10, 20] }, + framework_errors: 2, + user_errors: 0, }, by_type: { - actions: { success: 0, not_timed_out: 1, total: 1 }, - alerting: { success: 3, not_timed_out: 4, total: 4 }, - 'actions:webhook': { success: 0, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 3, not_timed_out: 4, total: 4 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + actions: { + success: 0, + not_timed_out: 1, + total: 1, + framework_errors: 1, + user_errors: 0, + }, + alerting: { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + 'actions:webhook': { + success: 0, + not_timed_out: 1, + total: 1, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1215,6 +2189,8 @@ describe('createAggregator', () => { not_timed_out: 0, total: 0, delay: { counts: [1], values: [10] }, + framework_errors: 0, + user_errors: 0, }, }, }); @@ -1226,10 +2202,24 @@ describe('createAggregator', () => { not_timed_out: 1, total: 1, delay: { counts: [1], values: [10] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1241,10 +2231,24 @@ describe('createAggregator', () => { not_timed_out: 1, total: 1, delay: { counts: [1, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1256,11 +2260,31 @@ describe('createAggregator', () => { not_timed_out: 2, total: 2, delay: { counts: [1, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1272,11 +2296,31 @@ describe('createAggregator', () => { not_timed_out: 2, total: 2, delay: { counts: [2, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1288,11 +2332,31 @@ describe('createAggregator', () => { not_timed_out: 3, total: 3, delay: { counts: [2, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1304,11 +2368,31 @@ describe('createAggregator', () => { not_timed_out: 3, total: 3, delay: { counts: [2, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1320,12 +2404,38 @@ describe('createAggregator', () => { not_timed_out: 4, total: 4, delay: { counts: [2, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1337,12 +2447,38 @@ describe('createAggregator', () => { not_timed_out: 4, total: 4, delay: { counts: [3, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1354,12 +2490,38 @@ describe('createAggregator', () => { not_timed_out: 5, total: 5, delay: { counts: [3, 1, 0, 1], values: [10, 20, 30, 40] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 3, total: 3 }, - 'alerting:example': { success: 2, not_timed_out: 3, total: 3 }, - report: { success: 1, not_timed_out: 1, total: 1 }, - telemetry: { success: 1, not_timed_out: 1, total: 1 }, + alerting: { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1372,12 +2534,38 @@ describe('createAggregator', () => { not_timed_out: 0, total: 0, delay: { counts: [1], values: [10] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 0, not_timed_out: 0, total: 0 }, - 'alerting:example': { success: 0, not_timed_out: 0, total: 0 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1389,12 +2577,38 @@ describe('createAggregator', () => { not_timed_out: 1, total: 1, delay: { counts: [1], values: [10] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1406,12 +2620,38 @@ describe('createAggregator', () => { not_timed_out: 1, total: 1, delay: { counts: [1, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 1, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 1, not_timed_out: 1, total: 1 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1423,12 +2663,38 @@ describe('createAggregator', () => { not_timed_out: 2, total: 2, delay: { counts: [1, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1440,12 +2706,38 @@ describe('createAggregator', () => { not_timed_out: 2, total: 2, delay: { counts: [2, 1], values: [10, 20] }, + framework_errors: 0, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 2, total: 2 }, - 'alerting:example': { success: 2, not_timed_out: 2, total: 2 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1457,12 +2749,38 @@ describe('createAggregator', () => { not_timed_out: 3, total: 3, delay: { counts: [2, 1], values: [10, 20] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 3, total: 3 }, - 'alerting:example': { success: 2, not_timed_out: 3, total: 3 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1474,12 +2792,38 @@ describe('createAggregator', () => { not_timed_out: 3, total: 3, delay: { counts: [3, 1], values: [10, 20] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 2, not_timed_out: 3, total: 3 }, - 'alerting:example': { success: 2, not_timed_out: 3, total: 3 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 2, + not_timed_out: 3, + total: 3, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1491,12 +2835,38 @@ describe('createAggregator', () => { not_timed_out: 4, total: 4, delay: { counts: [3, 1], values: [10, 20] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 3, not_timed_out: 4, total: 4 }, - 'alerting:example': { success: 3, not_timed_out: 4, total: 4 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1508,12 +2878,38 @@ describe('createAggregator', () => { not_timed_out: 4, total: 4, delay: { counts: [4, 1], values: [10, 20] }, + framework_errors: 1, + user_errors: 0, }, by_type: { - alerting: { success: 3, not_timed_out: 4, total: 4 }, - 'alerting:example': { success: 3, not_timed_out: 4, total: 4 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + alerting: { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); @@ -1525,14 +2921,52 @@ describe('createAggregator', () => { not_timed_out: 5, total: 5, delay: { counts: [4, 1], values: [10, 20] }, + framework_errors: 2, + user_errors: 0, }, by_type: { - actions: { success: 0, not_timed_out: 1, total: 1 }, - alerting: { success: 3, not_timed_out: 4, total: 4 }, - 'actions:webhook': { success: 0, not_timed_out: 1, total: 1 }, - 'alerting:example': { success: 3, not_timed_out: 4, total: 4 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + actions: { + success: 0, + not_timed_out: 1, + total: 1, + framework_errors: 1, + user_errors: 0, + }, + alerting: { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + 'actions:webhook': { + success: 0, + not_timed_out: 1, + total: 1, + framework_errors: 1, + user_errors: 0, + }, + 'alerting:example': { + success: 3, + not_timed_out: 4, + total: 4, + framework_errors: 1, + user_errors: 0, + }, + report: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + telemetry: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, }, }, }); diff --git a/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.test.ts b/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.test.ts index 628952619814d..83909112ba0ac 100644 --- a/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.test.ts +++ b/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.test.ts @@ -86,13 +86,27 @@ describe('TaskRunMetricsAggregator', () => { test('should correctly initialize', () => { expect(taskRunMetricsAggregator.collect()).toEqual({ - overall: { success: 0, not_timed_out: 0, total: 0, delay: { counts: [], values: [] } }, + overall: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + delay: { counts: [], values: [] }, + }, }); }); test('should correctly return initialMetrics', () => { expect(taskRunMetricsAggregator.initialMetric()).toEqual({ - overall: { success: 0, not_timed_out: 0, total: 0, delay: { counts: [], values: [] } }, + overall: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + delay: { counts: [], values: [] }, + }, by_type: {}, }); }); @@ -101,9 +115,16 @@ describe('TaskRunMetricsAggregator', () => { taskRunMetricsAggregator.processTaskLifecycleEvent(getTaskRunSuccessEvent('telemetry')); taskRunMetricsAggregator.processTaskLifecycleEvent(getTaskRunSuccessEvent('telemetry')); expect(taskRunMetricsAggregator.collect()).toEqual({ - overall: { success: 2, not_timed_out: 2, total: 2, delay: { counts: [], values: [] } }, + overall: { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + delay: { counts: [], values: [] }, + }, by_type: { - telemetry: { success: 2, not_timed_out: 2, total: 2 }, + telemetry: { success: 2, not_timed_out: 2, total: 2, framework_errors: 0, user_errors: 0 }, }, }); }); @@ -111,7 +132,14 @@ describe('TaskRunMetricsAggregator', () => { test('should correctly process task manager runDelay stat', () => { taskRunMetricsAggregator.processTaskLifecycleEvent(getTaskManagerStatEvent(3.343)); expect(taskRunMetricsAggregator.collect()).toEqual({ - overall: { success: 0, not_timed_out: 0, total: 0, delay: { counts: [1], values: [10] } }, + overall: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + delay: { counts: [1], values: [10] }, + }, }); }); @@ -120,7 +148,14 @@ describe('TaskRunMetricsAggregator', () => { getTaskManagerStatEvent(3.343, 'pollingDelay') ); expect(taskRunMetricsAggregator.collect()).toEqual({ - overall: { success: 0, not_timed_out: 0, total: 0, delay: { counts: [], values: [] } }, + overall: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + delay: { counts: [], values: [] }, + }, }); }); @@ -128,9 +163,16 @@ describe('TaskRunMetricsAggregator', () => { taskRunMetricsAggregator.processTaskLifecycleEvent(getTaskRunSuccessEvent('telemetry', true)); taskRunMetricsAggregator.processTaskLifecycleEvent(getTaskRunSuccessEvent('telemetry', true)); expect(taskRunMetricsAggregator.collect()).toEqual({ - overall: { success: 2, not_timed_out: 0, total: 2, delay: { counts: [], values: [] } }, + overall: { + success: 2, + not_timed_out: 0, + total: 2, + framework_errors: 0, + user_errors: 0, + delay: { counts: [], values: [] }, + }, by_type: { - telemetry: { success: 2, not_timed_out: 0, total: 2 }, + telemetry: { success: 2, not_timed_out: 0, total: 2, framework_errors: 0, user_errors: 0 }, }, }); }); @@ -139,9 +181,16 @@ describe('TaskRunMetricsAggregator', () => { taskRunMetricsAggregator.processTaskLifecycleEvent(getTaskRunFailedEvent('telemetry')); taskRunMetricsAggregator.processTaskLifecycleEvent(getTaskRunFailedEvent('telemetry')); expect(taskRunMetricsAggregator.collect()).toEqual({ - overall: { success: 0, not_timed_out: 2, total: 2, delay: { counts: [], values: [] } }, + overall: { + success: 0, + not_timed_out: 2, + total: 2, + framework_errors: 2, + user_errors: 0, + delay: { counts: [], values: [] }, + }, by_type: { - telemetry: { success: 0, not_timed_out: 2, total: 2 }, + telemetry: { success: 0, not_timed_out: 2, total: 2, framework_errors: 2, user_errors: 0 }, }, }); }); @@ -150,9 +199,16 @@ describe('TaskRunMetricsAggregator', () => { taskRunMetricsAggregator.processTaskLifecycleEvent(getTaskRunFailedEvent('telemetry', true)); taskRunMetricsAggregator.processTaskLifecycleEvent(getTaskRunFailedEvent('telemetry', true)); expect(taskRunMetricsAggregator.collect()).toEqual({ - overall: { success: 0, not_timed_out: 0, total: 2, delay: { counts: [], values: [] } }, + overall: { + success: 0, + not_timed_out: 0, + total: 2, + framework_errors: 2, + user_errors: 0, + delay: { counts: [], values: [] }, + }, by_type: { - telemetry: { success: 0, not_timed_out: 0, total: 2 }, + telemetry: { success: 0, not_timed_out: 0, total: 2, framework_errors: 2, user_errors: 0 }, }, }); }); @@ -163,10 +219,17 @@ describe('TaskRunMetricsAggregator', () => { taskRunMetricsAggregator.processTaskLifecycleEvent(getTaskRunSuccessEvent('report', true)); taskRunMetricsAggregator.processTaskLifecycleEvent(getTaskRunFailedEvent('telemetry')); expect(taskRunMetricsAggregator.collect()).toEqual({ - overall: { success: 3, not_timed_out: 3, total: 4, delay: { counts: [], values: [] } }, + overall: { + success: 3, + not_timed_out: 3, + total: 4, + framework_errors: 1, + user_errors: 0, + delay: { counts: [], values: [] }, + }, by_type: { - report: { success: 2, not_timed_out: 1, total: 2 }, - telemetry: { success: 1, not_timed_out: 2, total: 2 }, + report: { success: 2, not_timed_out: 1, total: 2, framework_errors: 0, user_errors: 0 }, + telemetry: { success: 1, not_timed_out: 2, total: 2, framework_errors: 1, user_errors: 0 }, }, }); }); @@ -193,16 +256,47 @@ describe('TaskRunMetricsAggregator', () => { getTaskRunSuccessEvent('alerting:.index-threshold', true) ); expect(taskRunMetricsAggregator.collect()).toEqual({ - overall: { success: 11, not_timed_out: 12, total: 14, delay: { counts: [], values: [] } }, + overall: { + success: 11, + not_timed_out: 12, + total: 14, + framework_errors: 3, + user_errors: 0, + delay: { counts: [], values: [] }, + }, by_type: { - actions: { success: 3, not_timed_out: 3, total: 3 }, - 'actions:__email': { success: 1, not_timed_out: 1, total: 1 }, - 'actions:webhook': { success: 2, not_timed_out: 2, total: 2 }, - alerting: { success: 5, not_timed_out: 5, total: 7 }, - 'alerting:example': { success: 3, not_timed_out: 4, total: 5 }, - 'alerting:__index-threshold': { success: 2, not_timed_out: 1, total: 2 }, - report: { success: 2, not_timed_out: 2, total: 2 }, - telemetry: { success: 1, not_timed_out: 2, total: 2 }, + actions: { success: 3, not_timed_out: 3, total: 3, framework_errors: 0, user_errors: 0 }, + 'actions:__email': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'actions:webhook': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + alerting: { success: 5, not_timed_out: 5, total: 7, framework_errors: 2, user_errors: 0 }, + 'alerting:example': { + success: 3, + not_timed_out: 4, + total: 5, + framework_errors: 2, + user_errors: 0, + }, + 'alerting:__index-threshold': { + success: 2, + not_timed_out: 1, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + report: { success: 2, not_timed_out: 2, total: 2, framework_errors: 0, user_errors: 0 }, + telemetry: { success: 1, not_timed_out: 2, total: 2, framework_errors: 1, user_errors: 0 }, }, }); }); @@ -239,31 +333,88 @@ describe('TaskRunMetricsAggregator', () => { not_timed_out: 12, total: 14, delay: { counts: [3, 0, 1], values: [10, 20, 30] }, + framework_errors: 3, + user_errors: 0, }, by_type: { - actions: { success: 3, not_timed_out: 3, total: 3 }, - 'actions:__email': { success: 1, not_timed_out: 1, total: 1 }, - 'actions:webhook': { success: 2, not_timed_out: 2, total: 2 }, - alerting: { success: 5, not_timed_out: 5, total: 7 }, - 'alerting:example': { success: 3, not_timed_out: 4, total: 5 }, - 'alerting:__index-threshold': { success: 2, not_timed_out: 1, total: 2 }, - report: { success: 2, not_timed_out: 2, total: 2 }, - telemetry: { success: 1, not_timed_out: 2, total: 2 }, + actions: { success: 3, not_timed_out: 3, total: 3, framework_errors: 0, user_errors: 0 }, + 'actions:__email': { + success: 1, + not_timed_out: 1, + total: 1, + framework_errors: 0, + user_errors: 0, + }, + 'actions:webhook': { + success: 2, + not_timed_out: 2, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + alerting: { success: 5, not_timed_out: 5, total: 7, framework_errors: 2, user_errors: 0 }, + 'alerting:example': { + success: 3, + not_timed_out: 4, + total: 5, + framework_errors: 2, + user_errors: 0, + }, + 'alerting:__index-threshold': { + success: 2, + not_timed_out: 1, + total: 2, + framework_errors: 0, + user_errors: 0, + }, + report: { success: 2, not_timed_out: 2, total: 2, framework_errors: 0, user_errors: 0 }, + telemetry: { success: 1, not_timed_out: 2, total: 2, framework_errors: 1, user_errors: 0 }, }, }); taskRunMetricsAggregator.reset(); expect(taskRunMetricsAggregator.collect()).toEqual({ - overall: { success: 0, not_timed_out: 0, total: 0, delay: { counts: [], values: [] } }, + overall: { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + delay: { counts: [], values: [] }, + }, by_type: { - actions: { success: 0, not_timed_out: 0, total: 0 }, - 'actions:__email': { success: 0, not_timed_out: 0, total: 0 }, - 'actions:webhook': { success: 0, not_timed_out: 0, total: 0 }, - alerting: { success: 0, not_timed_out: 0, total: 0 }, - 'alerting:example': { success: 0, not_timed_out: 0, total: 0 }, - 'alerting:__index-threshold': { success: 0, not_timed_out: 0, total: 0 }, - report: { success: 0, not_timed_out: 0, total: 0 }, - telemetry: { success: 0, not_timed_out: 0, total: 0 }, + actions: { success: 0, not_timed_out: 0, total: 0, framework_errors: 0, user_errors: 0 }, + 'actions:__email': { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + 'actions:webhook': { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + alerting: { success: 0, not_timed_out: 0, total: 0, framework_errors: 0, user_errors: 0 }, + 'alerting:example': { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + 'alerting:__index-threshold': { + success: 0, + not_timed_out: 0, + total: 0, + framework_errors: 0, + user_errors: 0, + }, + report: { success: 0, not_timed_out: 0, total: 0, framework_errors: 0, user_errors: 0 }, + telemetry: { success: 0, not_timed_out: 0, total: 0, framework_errors: 0, user_errors: 0 }, }, }); }); diff --git a/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.ts b/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.ts index ca7a88f9d42a7..d41b5590341ff 100644 --- a/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.ts +++ b/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.ts @@ -7,22 +7,19 @@ import { JsonObject } from '@kbn/utility-types'; import { merge } from 'lodash'; +import { isUserError } from '../task_running'; import { isOk, Ok, unwrap } from '../lib/result_type'; import { TaskLifecycleEvent } from '../polling_lifecycle'; import { ErroredTask, - RanTask, - TaskRun, isTaskManagerStatEvent, isTaskRunEvent, + RanTask, TaskManagerStat, + TaskRun, } from '../task_events'; -import { - getTaskTypeGroup, - MetricCounterService, - SimpleHistogram, - type SerializedHistogram, -} from './lib'; +import type { SerializedHistogram } from './lib'; +import { getTaskTypeGroup, MetricCounterService, SimpleHistogram } from './lib'; import { ITaskMetricsAggregator } from './types'; const HDR_HISTOGRAM_MAX = 5400; // 90 minutes @@ -32,6 +29,8 @@ enum TaskRunKeys { SUCCESS = 'success', NOT_TIMED_OUT = 'not_timed_out', TOTAL = 'total', + USER_ERRORS = 'user_errors', + FRAMEWORK_ERRORS = 'framework_errors', } enum TaskRunMetricKeys { @@ -91,7 +90,8 @@ export class TaskRunMetricsAggregator implements ITaskMetricsAggregator { it('createSkipError', () => { expect(isSkipError(createSkipError(new Error('OMG')))).toBeTruthy(); }); + + it('createTaskRunError', () => { + expect(isUserError(createTaskRunError(new Error('OMG'), TaskErrorSource.USER))).toBeTruthy(); + }); + + it('createTaskRunError without errorSourceParam ', () => { + expect(getErrorSource(createTaskRunError(new Error('OMG')))).toBe(TaskErrorSource.FRAMEWORK); + }); + + it('getErrorSource', () => { + expect(getErrorSource(createTaskRunError(new Error('OMG'), TaskErrorSource.USER))).toBe( + TaskErrorSource.USER + ); + }); + + it('getErrorSource return undefined when there is no source data', () => { + expect(getErrorSource(new Error('OMG'))).toBeUndefined(); + }); }); }); diff --git a/x-pack/plugins/task_manager/server/task_running/errors.ts b/x-pack/plugins/task_manager/server/task_running/errors.ts index 2d8e09b5c24e0..3898338855efe 100644 --- a/x-pack/plugins/task_manager/server/task_running/errors.ts +++ b/x-pack/plugins/task_manager/server/task_running/errors.ts @@ -4,8 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { TaskErrorSource } from '../../common'; import { EphemeralTask } from '../task'; +export { TaskErrorSource }; + // Unrecoverable const CODE_UNRECOVERABLE = 'TaskManager/unrecoverable'; const CODE_RETRYABLE = 'TaskManager/retryable'; @@ -15,11 +18,6 @@ const code = Symbol('TaskManagerErrorCode'); const retry = Symbol('TaskManagerErrorRetry'); const source = Symbol('TaskManagerErrorSource'); -export enum TaskErrorSource { - FRAMEWORK = 'framework', - USER = 'user', -} - export interface DecoratedError extends Error { [code]?: string; [retry]?: Date | boolean; @@ -47,9 +45,8 @@ export function isUnrecoverableError(error: Error | DecoratedError) { return isTaskManagerError(error) && error[code] === CODE_UNRECOVERABLE; } -export function throwUnrecoverableError(error: Error, errorSource = TaskErrorSource.FRAMEWORK) { +export function throwUnrecoverableError(error: Error) { (error as DecoratedError)[code] = CODE_UNRECOVERABLE; - (error as DecoratedError)[source] = errorSource; throw error; } @@ -86,6 +83,20 @@ export function createTaskRunError( return error; } +function isTaskRunError(error: Error | DecoratedError): error is DecoratedError { + return Boolean(error && (error as DecoratedError)[source]); +} + +export function getErrorSource(error: Error | DecoratedError): TaskErrorSource | undefined { + if (isTaskRunError(error) && error[source]) { + return error[source]; + } +} + +export function isUserError(error: Error | DecoratedError) { + return getErrorSource(error) === TaskErrorSource.USER; +} + export function isEphemeralTaskRejectedDueToCapacityError( error: Error | EphemeralTaskRejectedDueToCapacityError ) { diff --git a/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts b/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts index 393721f0fd814..35fbd6918f4fb 100644 --- a/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts +++ b/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts @@ -1565,7 +1565,7 @@ describe('TaskManagerRunner', () => { task: instance, persistence: TaskPersistence.Recurring, result: TaskRunResult.Success, - error: new Error(`Alerting task failed to run.`), + error: new Error(`test`), isExpired: false, }) ) @@ -1613,7 +1613,7 @@ describe('TaskManagerRunner', () => { persistence: TaskPersistence.Recurring, result: TaskRunResult.Success, isExpired: true, - error: new Error(`Alerting task failed to run.`), + error: new Error(`test`), }) ) ) diff --git a/x-pack/plugins/task_manager/server/task_running/task_runner.ts b/x-pack/plugins/task_manager/server/task_running/task_runner.ts index 9c9ad88c1dfc5..f67d8a22db81d 100644 --- a/x-pack/plugins/task_manager/server/task_running/task_runner.ts +++ b/x-pack/plugins/task_manager/server/task_running/task_runner.ts @@ -792,7 +792,7 @@ export class TaskManagerRunner implements TaskRunner { asErr({ ...processedResult, isExpired: taskHasExpired, - error: new Error(`Alerting task failed to run.`), + error: taskRunError, }), taskTiming ) diff --git a/x-pack/plugins/task_manager/tsconfig.json b/x-pack/plugins/task_manager/tsconfig.json index 20fdb90611518..ef7cab0493a60 100644 --- a/x-pack/plugins/task_manager/tsconfig.json +++ b/x-pack/plugins/task_manager/tsconfig.json @@ -7,6 +7,7 @@ "server/**/*", // have to declare *.json explicitly due to https://github.com/microsoft/TypeScript/issues/25636 "server/**/*.json", + "common/**/*" ], "kbn_references": [ "@kbn/alerting-state-types", diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/bedrock.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/bedrock.ts index 2e765d32ea9cc..6787290f0b396 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/bedrock.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/bedrock.ts @@ -15,6 +15,7 @@ import { DEFAULT_TOKEN_LIMIT } from '@kbn/stack-connectors-plugin/common/bedrock import { PassThrough } from 'stream'; import { EventStreamCodec } from '@smithy/eventstream-codec'; import { fromUtf8, toUtf8 } from '@smithy/util-utf8'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; import { getUrlPrefix, ObjectRemover } from '../../../../../common/lib'; @@ -268,6 +269,7 @@ export default function bedrockTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, }); }); @@ -285,6 +287,7 @@ export default function bedrockTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: `Sub action "invalidAction" is not registered. Connector id: ${bedrockActionId}. Connector name: Amazon Bedrock. Connector type: .bedrock`, }); }); @@ -544,6 +547,7 @@ export default function bedrockTest({ getService }: FtrProviderContext) { expect(body).to.eql({ status: 'error', connector_id: bedrockActionId, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, @@ -574,6 +578,7 @@ export default function bedrockTest({ getService }: FtrProviderContext) { connector_id: bedrockActionId, message: 'an error occurred while running the action', retry: true, + errorSource: TaskErrorSource.USER, service_message: 'Status code: 422. Message: API Error: Unprocessable Entity - Malformed input request: extraneous key [ooooo] is not permitted, please reformat your input and try again.', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/cases_webhook.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/cases_webhook.ts index 23410b83d10ab..89e62be241412 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/cases_webhook.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/cases_webhook.ts @@ -13,6 +13,7 @@ import { getExternalServiceSimulatorPath, ExternalServiceSimulator, } from '@kbn/actions-simulators-plugin/server/plugin'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; // eslint-disable-next-line import/no-default-export @@ -242,7 +243,13 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { params: {}, }) .then((resp: any) => { - expect(Object.keys(resp.body)).to.eql(['status', 'message', 'retry', 'connector_id']); + expect(Object.keys(resp.body)).to.eql([ + 'status', + 'message', + 'retry', + 'errorSource', + 'connector_id', + ]); expect(resp.body.connector_id).to.eql(simulatedActionId); expect(resp.body.status).to.eql('error'); }); @@ -262,6 +269,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: [subAction]: expected value to equal [pushToService]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); @@ -280,6 +288,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: [subActionParams.incident.title]: expected value of type [string] but got [undefined]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); @@ -306,6 +315,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: [subActionParams.incident.title]: expected value of type [string] but got [undefined]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); @@ -334,6 +344,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: [subActionParams.comments]: types that failed validation:\n- [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n- [subActionParams.comments.1]: expected value to equal [null]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); @@ -361,6 +372,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: [subActionParams.comments]: types that failed validation:\n- [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n- [subActionParams.comments.1]: expected value to equal [null]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); @@ -459,6 +471,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: '[Action][Webhook - Case Management]: Unable to create case. Error: JSON Error: Create case JSON body must be valid JSON. ', }); @@ -489,6 +502,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: '[Action][Webhook - Case Management]: Unable to update case with id 12345. Error: JSON Error: Update case JSON body must be valid JSON. ', }); @@ -556,6 +570,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: '[Action][Webhook - Case Management]: Unable to create comment at case with id 123. Error: JSON Error: Create comment JSON body must be valid JSON. ', }); @@ -623,6 +638,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: '[Action][Webhook - Case Management]: Unable to create case. Error: Invalid Create case URL: Error: Invalid protocol. ', }); @@ -653,6 +669,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: '[Action][Webhook - Case Management]: Unable to update case with id 12345. Error: Invalid Update case URL: Error: Invalid URL. ', }); @@ -720,6 +737,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: '[Action][Webhook - Case Management]: Unable to create comment at case with id 123. Error: Invalid Create comment URL: Error: Invalid URL. ', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/d3security.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/d3security.ts index 55d53c00f59df..3b99ea477f137 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/d3security.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/d3security.ts @@ -11,6 +11,7 @@ import { D3SecuritySimulator, d3SecuritySuccessResponse, } from '@kbn/actions-simulators-plugin/server/d3security_simulation'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; const connectorTypeId = '.d3security'; @@ -179,6 +180,7 @@ export default function d3SecurityTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, }); }); @@ -196,6 +198,7 @@ export default function d3SecurityTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: `Sub action "invalidAction" is not registered. Connector id: ${d3SecurityActionId}. Connector name: D3 Security. Connector type: .d3security`, }); }); @@ -287,6 +290,7 @@ export default function d3SecurityTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/jira.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/jira.ts index 11588f48a48de..ed9fb9cbbaf89 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/jira.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/jira.ts @@ -13,6 +13,7 @@ import { getExternalServiceSimulatorPath, ExternalServiceSimulator, } from '@kbn/actions-simulators-plugin/server/plugin'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; // eslint-disable-next-line import/no-default-export @@ -231,7 +232,13 @@ export default function jiraTest({ getService }: FtrProviderContext) { params: {}, }) .then((resp: any) => { - expect(Object.keys(resp.body)).to.eql(['status', 'message', 'retry', 'connector_id']); + expect(Object.keys(resp.body)).to.eql([ + 'status', + 'message', + 'retry', + 'errorSource', + 'connector_id', + ]); expect(resp.body.connector_id).to.eql(simulatedActionId); expect(resp.body.status).to.eql('error'); }); @@ -251,6 +258,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subAction]: expected value to equal [pushToService]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); @@ -269,6 +277,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.summary]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); @@ -295,6 +304,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.summary]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); @@ -323,6 +333,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); @@ -350,6 +361,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); @@ -378,6 +390,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.labels]: types that failed validation:\n - [subActionParams.incident.labels.0.0]: The label label with spaces cannot contain spaces\n - [subActionParams.incident.labels.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/openai.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/openai.ts index a0a906f0fa2ad..4d23e887085e0 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/openai.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/openai.ts @@ -11,6 +11,7 @@ import { OpenAISimulator, genAiSuccessResponse, } from '@kbn/actions-simulators-plugin/server/openai_simulation'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; import { getUrlPrefix, ObjectRemover } from '../../../../../common/lib'; @@ -248,6 +249,7 @@ export default function genAiTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, }); }); @@ -265,6 +267,7 @@ export default function genAiTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: `Sub action "invalidAction" is not registered. Connector id: ${genAiActionId}. Connector name: OpenAI. Connector type: .gen-ai`, }); }); @@ -461,6 +464,7 @@ export default function genAiTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, }); }); @@ -483,6 +487,7 @@ export default function genAiTest({ getService }: FtrProviderContext) { connector_id: genAiActionId, message: 'an error occurred while running the action', retry: true, + errorSource: TaskErrorSource.USER, service_message: 'Status code: 422. Message: API Error: Unprocessable Entity - The model `bad model` does not exist', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/opsgenie.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/opsgenie.ts index fb73f6a95089e..792e5dd021b3b 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/opsgenie.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/opsgenie.ts @@ -11,6 +11,7 @@ import { OpsgenieSimulator, opsgenieSuccessResponse, } from '@kbn/actions-simulators-plugin/server/opsgenie_simulation'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; // eslint-disable-next-line import/no-default-export @@ -165,7 +166,13 @@ export default function opsgenieTest({ getService }: FtrProviderContext) { }); expect(200); - expect(Object.keys(body)).to.eql(['status', 'message', 'retry', 'connector_id']); + expect(Object.keys(body)).to.eql([ + 'status', + 'message', + 'retry', + 'errorSource', + 'connector_id', + ]); expect(body.connector_id).to.eql(opsgenieActionId); expect(body.status).to.eql('error'); }); @@ -184,6 +191,7 @@ export default function opsgenieTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: `Sub action "invalidAction" is not registered. Connector id: ${opsgenieActionId}. Connector name: Opsgenie. Connector type: .opsgenie`, }); }); @@ -202,6 +210,7 @@ export default function opsgenieTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: 'Request validation failed (Error: [message]: expected value of type [string] but got [undefined])', }); @@ -221,6 +230,7 @@ export default function opsgenieTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: 'Request validation failed (Error: [alias]: expected value of type [string] but got [undefined])', }); @@ -253,6 +263,7 @@ export default function opsgenieTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: 'Request validation failed (Error: [responders.0]: types that failed validation:\n- [responders.0.0.type]: types that failed validation:\n - [responders.0.type.0]: expected value to equal [team]\n - [responders.0.type.1]: expected value to equal [user]\n - [responders.0.type.2]: expected value to equal [escalation]\n - [responders.0.type.3]: expected value to equal [schedule]\n- [responders.0.1.id]: expected value of type [string] but got [undefined]\n- [responders.0.2.username]: expected value of type [string] but got [undefined])', }); @@ -282,6 +293,7 @@ export default function opsgenieTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: 'Request validation failed (Error: [responders.0]: types that failed validation:\n- [responders.0.0.name]: expected value of type [string] but got [undefined]\n- [responders.0.1.id]: expected value of type [string] but got [undefined]\n- [responders.0.2.username]: expected value of type [string] but got [undefined])', }); @@ -384,6 +396,7 @@ export default function opsgenieTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: 'Request validation failed (Error: [visibleTo.0]: types that failed validation:\n- [visibleTo.0.0.type]: expected value to equal [team]\n- [visibleTo.0.1.id]: expected value of type [string] but got [undefined]\n- [visibleTo.0.2.id]: expected value of type [string] but got [undefined]\n- [visibleTo.0.3.username]: expected value of type [string] but got [undefined])', }); @@ -448,6 +461,7 @@ export default function opsgenieTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: 'Request validation failed (Error: [details.bananas]: expected value of type [string] but got [number])', }); @@ -683,6 +697,7 @@ export default function opsgenieTest({ getService }: FtrProviderContext) { message: 'an error occurred while running the action', retry: true, connector_id: opsgenieActionId, + errorSource: TaskErrorSource.USER, service_message: 'Status code: 422. Message: Request failed with status code 422: {"message":"failed"}', }); @@ -706,6 +721,7 @@ export default function opsgenieTest({ getService }: FtrProviderContext) { message: 'an error occurred while running the action', retry: true, connector_id: opsgenieActionId, + errorSource: TaskErrorSource.USER, service_message: 'Status code: 422. Message: Request failed with status code 422: {"message":"failed"}', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/resilient.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/resilient.ts index 8425de3b900ec..4f3b107581a4d 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/resilient.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/resilient.ts @@ -13,6 +13,7 @@ import { getExternalServiceSimulatorPath, ExternalServiceSimulator, } from '@kbn/actions-simulators-plugin/server/plugin'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; // eslint-disable-next-line import/no-default-export @@ -233,7 +234,13 @@ export default function resilientTest({ getService }: FtrProviderContext) { params: {}, }) .then((resp: any) => { - expect(Object.keys(resp.body)).to.eql(['status', 'message', 'retry', 'connector_id']); + expect(Object.keys(resp.body)).to.eql([ + 'status', + 'message', + 'retry', + 'errorSource', + 'connector_id', + ]); expect(resp.body.connector_id).to.eql(simulatedActionId); expect(resp.body.status).to.eql('error'); }); @@ -253,6 +260,7 @@ export default function resilientTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subAction]: expected value to equal [pushToService]\n- [4.subAction]: expected value to equal [incidentTypes]\n- [5.subAction]: expected value to equal [severity]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); @@ -271,6 +279,7 @@ export default function resilientTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.name]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [incidentTypes]\n- [5.subAction]: expected value to equal [severity]', + errorSource: TaskErrorSource.FRAMEWORK, }); }); }); @@ -295,6 +304,7 @@ export default function resilientTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.name]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [incidentTypes]\n- [5.subAction]: expected value to equal [severity]', }); @@ -322,6 +332,7 @@ export default function resilientTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [incidentTypes]\n- [5.subAction]: expected value to equal [severity]', }); @@ -349,6 +360,7 @@ export default function resilientTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [incidentTypes]\n- [5.subAction]: expected value to equal [severity]', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itom.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itom.ts index e9e70d879618b..4702d3bbe6df7 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itom.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itom.ts @@ -13,6 +13,7 @@ import http from 'http'; import { getHttpProxyServer } from '@kbn/alerting-api-integration-helpers'; import { getServiceNowServer } from '@kbn/actions-simulators-plugin/server/plugin'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; // eslint-disable-next-line import/no-default-export @@ -412,7 +413,13 @@ export default function serviceNowITOMTest({ getService }: FtrProviderContext) { params: {}, }) .then((resp: any) => { - expect(Object.keys(resp.body)).to.eql(['status', 'message', 'retry', 'connector_id']); + expect(Object.keys(resp.body)).to.eql([ + 'status', + 'message', + 'retry', + 'errorSource', + 'connector_id', + ]); expect(resp.body.connector_id).to.eql(simulatedActionId); expect(resp.body.status).to.eql('error'); }); @@ -430,6 +437,7 @@ export default function serviceNowITOMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [addEvent]\n- [1.subAction]: expected value to equal [getChoices]', }); @@ -448,6 +456,7 @@ export default function serviceNowITOMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [addEvent]\n- [1.subAction]: expected value to equal [getChoices]', }); @@ -470,6 +479,7 @@ export default function serviceNowITOMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [addEvent]\n- [1.subActionParams.fields]: expected value of type [array] but got [undefined]', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itsm.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itsm.ts index 3525597313514..3241f9b80ab1f 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itsm.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itsm.ts @@ -13,6 +13,7 @@ import http from 'http'; import { getHttpProxyServer } from '@kbn/alerting-api-integration-helpers'; import { getServiceNowServer } from '@kbn/actions-simulators-plugin/server/plugin'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; // eslint-disable-next-line import/no-default-export @@ -447,7 +448,13 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { params: {}, }) .then((resp: any) => { - expect(Object.keys(resp.body)).to.eql(['status', 'message', 'retry', 'connector_id']); + expect(Object.keys(resp.body)).to.eql([ + 'status', + 'message', + 'retry', + 'errorSource', + 'connector_id', + ]); expect(resp.body.connector_id).to.eql(simulatedActionId); expect(resp.body.status).to.eql('error'); }); @@ -465,6 +472,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subAction]: expected value to equal [pushToService]\n- [4.subAction]: expected value to equal [getChoices]\n- [5.subAction]: expected value to equal [closeIncident]', }); @@ -483,6 +491,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.short_description]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [getChoices]\n- [5.subAction]: expected value to equal [closeIncident]', }); @@ -506,6 +515,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.short_description]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [getChoices]\n- [5.subAction]: expected value to equal [closeIncident]', }); @@ -533,6 +543,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [getChoices]\n- [5.subAction]: expected value to equal [closeIncident]', }); @@ -560,6 +571,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [getChoices]\n- [5.subAction]: expected value to equal [closeIncident]', }); @@ -582,6 +594,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subAction]: expected value to equal [pushToService]\n- [4.subActionParams.fields]: expected value of type [array] but got [undefined]\n- [5.subAction]: expected value to equal [closeIncident]', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_sir.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_sir.ts index 2094ddd71cd7d..6ab9a257c9261 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_sir.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_sir.ts @@ -13,6 +13,7 @@ import http from 'http'; import { getHttpProxyServer } from '@kbn/alerting-api-integration-helpers'; import { getServiceNowServer } from '@kbn/actions-simulators-plugin/server/plugin'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; // eslint-disable-next-line import/no-default-export @@ -460,7 +461,13 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { params: {}, }) .then((resp: any) => { - expect(Object.keys(resp.body)).to.eql(['status', 'message', 'retry', 'connector_id']); + expect(Object.keys(resp.body)).to.eql([ + 'status', + 'message', + 'retry', + 'errorSource', + 'connector_id', + ]); expect(resp.body.connector_id).to.eql(simulatedActionId); expect(resp.body.status).to.eql('error'); }); @@ -478,6 +485,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subAction]: expected value to equal [pushToService]\n- [4.subAction]: expected value to equal [getChoices]', }); @@ -496,6 +504,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.short_description]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [getChoices]', }); @@ -519,6 +528,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.short_description]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [getChoices]', }); @@ -546,6 +556,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [getChoices]', }); @@ -573,6 +584,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [getChoices]', }); @@ -595,6 +607,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subAction]: expected value to equal [pushToService]\n- [4.subActionParams.fields]: expected value of type [array] but got [undefined]', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/swimlane.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/swimlane.ts index 5d6bb9e9b8145..859f4f952fe58 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/swimlane.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/swimlane.ts @@ -12,6 +12,7 @@ import http from 'http'; import { getHttpProxyServer } from '@kbn/alerting-api-integration-helpers'; import { getSwimlaneServer } from '@kbn/actions-simulators-plugin/server/plugin'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; // eslint-disable-next-line import/no-default-export @@ -323,7 +324,13 @@ export default function swimlaneTest({ getService }: FtrProviderContext) { params: {}, }) .then((resp: any) => { - expect(Object.keys(resp.body)).to.eql(['status', 'message', 'retry', 'connector_id']); + expect(Object.keys(resp.body)).to.eql([ + 'status', + 'message', + 'retry', + 'errorSource', + 'connector_id', + ]); expect(resp.body.connector_id).to.eql(simulatedActionId); expect(resp.body.status).to.eql('error'); }); @@ -341,6 +348,7 @@ export default function swimlaneTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: [subAction]: expected value to equal [pushToService]', }); @@ -366,6 +374,7 @@ export default function swimlaneTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: [subActionParams]: expected a plain object value, but found [null] instead.', }); @@ -390,6 +399,7 @@ export default function swimlaneTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: [subActionParams.comments]: types that failed validation:\n- [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n- [subActionParams.comments.1]: expected value to equal [null]', }); @@ -414,6 +424,7 @@ export default function swimlaneTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, + errorSource: TaskErrorSource.FRAMEWORK, message: 'error validating action params: [subActionParams.comments]: types that failed validation:\n- [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n- [subActionParams.comments.1]: expected value to equal [null]', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/tines.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/tines.ts index 99ba90f78dbeb..e6e3f8511c422 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/tines.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/tines.ts @@ -14,6 +14,7 @@ import { tinesAgentWebhook, tinesWebhookSuccessResponse, } from '@kbn/actions-simulators-plugin/server/tines_simulation'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; const connectorTypeId = '.tines'; @@ -184,7 +185,13 @@ export default function tinesTest({ getService }: FtrProviderContext) { }); expect(200); - expect(Object.keys(body)).to.eql(['status', 'message', 'retry', 'connector_id']); + expect(Object.keys(body)).to.eql([ + 'status', + 'message', + 'retry', + 'errorSource', + 'connector_id', + ]); expect(body.connector_id).to.eql(tinesActionId); expect(body.status).to.eql('error'); }); @@ -203,6 +210,7 @@ export default function tinesTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: `Sub action "invalidAction" is not registered. Connector id: ${tinesActionId}. Connector name: Tines. Connector type: .tines`, }); }); @@ -221,6 +229,7 @@ export default function tinesTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: 'Request validation failed (Error: [storyId]: expected value of type [number] but got [undefined])', }); @@ -240,6 +249,7 @@ export default function tinesTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: 'Invalid subActionsParams: [webhook] or [webhookUrl] expected but got none', }); @@ -263,6 +273,7 @@ export default function tinesTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: 'Request validation failed (Error: [webhook.storyId]: expected value of type [number] but got [undefined])', }); @@ -286,6 +297,7 @@ export default function tinesTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: 'Request validation failed (Error: [webhook.name]: expected value of type [string] but got [undefined])', }); @@ -309,6 +321,7 @@ export default function tinesTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: 'Request validation failed (Error: [webhook.path]: expected value of type [string] but got [undefined])', }); @@ -332,6 +345,7 @@ export default function tinesTest({ getService }: FtrProviderContext) { status: 'error', retry: true, message: 'an error occurred while running the action', + errorSource: TaskErrorSource.USER, service_message: 'Request validation failed (Error: [webhook.secret]: expected value of type [string] but got [undefined])', }); @@ -489,6 +503,7 @@ export default function tinesTest({ getService }: FtrProviderContext) { message: 'an error occurred while running the action', retry: true, connector_id: tinesActionId, + errorSource: TaskErrorSource.USER, service_message: 'Status code: 422. Message: API Error: Unprocessable Entity', }); }); @@ -510,6 +525,7 @@ export default function tinesTest({ getService }: FtrProviderContext) { message: 'an error occurred while running the action', retry: true, connector_id: tinesActionId, + errorSource: TaskErrorSource.USER, service_message: 'Status code: 422. Message: API Error: Unprocessable Entity', }); }); @@ -529,6 +545,7 @@ export default function tinesTest({ getService }: FtrProviderContext) { message: 'an error occurred while running the action', retry: true, connector_id: tinesActionId, + errorSource: TaskErrorSource.USER, service_message: 'Status code: 422. Message: API Error: Unprocessable Entity', }); }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/sub_action_framework/index.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/sub_action_framework/index.ts index 8bc8bc6a89757..e8470a2313209 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/sub_action_framework/index.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/sub_action_framework/index.ts @@ -7,6 +7,7 @@ import type SuperTest from 'supertest'; import expect from '@kbn/expect'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; import { getUrlPrefix, ObjectRemover } from '../../../../../common/lib'; @@ -169,6 +170,7 @@ export default function createActionTests({ getService }: FtrProviderContext) { message: 'an error occurred while running the action', retry: true, connector_id: res.body.id, + errorSource: TaskErrorSource.USER, service_message: 'Request validation failed (Error: [id]: expected value of type [string] but got [undefined])', }); @@ -192,6 +194,7 @@ export default function createActionTests({ getService }: FtrProviderContext) { status: 'error', retry: false, connector_id: res.body.id, + errorSource: TaskErrorSource.FRAMEWORK, }); } }); @@ -248,6 +251,7 @@ export default function createActionTests({ getService }: FtrProviderContext) { message: 'an error occurred while running the action', retry: true, connector_id: res.body.id, + errorSource: TaskErrorSource.USER, service_message: `Sub action \"notRegistered\" is not registered. Connector id: ${res.body.id}. Connector name: Test: Sub action connector. Connector type: test.sub-action-connector`, }); }); @@ -268,6 +272,7 @@ export default function createActionTests({ getService }: FtrProviderContext) { message: 'an error occurred while running the action', retry: true, connector_id: res.body.id, + errorSource: TaskErrorSource.USER, service_message: `Method \"notAFunction\" does not exists in service. Sub action: \"notAFunction\". Connector id: ${res.body.id}. Connector name: Test: Sub action connector. Connector type: test.sub-action-connector`, }); }); @@ -288,6 +293,7 @@ export default function createActionTests({ getService }: FtrProviderContext) { message: 'an error occurred while running the action', retry: true, connector_id: res.body.id, + errorSource: TaskErrorSource.USER, service_message: `Method \"notExist\" does not exists in service. Sub action: \"notExist\". Connector id: ${res.body.id}. Connector name: Test: Sub action connector. Connector type: test.sub-action-connector`, }); }); @@ -311,6 +317,7 @@ export default function createActionTests({ getService }: FtrProviderContext) { message: 'an error occurred while running the action', retry: true, connector_id: res.body.id, + errorSource: TaskErrorSource.USER, service_message: 'You should register at least one subAction for your connector type', }); }); diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/execute.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/execute.ts index 4acb40fcfe3f1..fb10eba9774ad 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/execute.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/execute.ts @@ -9,6 +9,7 @@ import expect from '@kbn/expect'; import { IValidatedEvent, nanosToMillis } from '@kbn/event-log-plugin/server'; import { ESTestIndexTool, ES_TEST_INDEX_NAME } from '@kbn/alerting-api-integration-helpers'; import { ActionExecutionSourceType } from '@kbn/actions-plugin/server/lib/action_execution_source'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; import { Spaces } from '../../scenarios'; import { getUrlPrefix, ObjectRemover, getEventLog } from '../../../common/lib'; import { FtrProviderContext } from '../../../common/ftr_provider_context'; @@ -131,6 +132,7 @@ export default function ({ getService }: FtrProviderContext) { message: 'an error occurred while running the action', service_message: `expected failure for ${ES_TEST_INDEX_NAME} ${reference}`, retry: true, + errorSource: TaskErrorSource.USER, }); await validateEventLog({ @@ -326,6 +328,7 @@ export default function ({ getService }: FtrProviderContext) { message: 'an error occurred while running the action', serviceMessage: `expected failure for ${ES_TEST_INDEX_NAME} ${reference}`, retry: true, + errorSource: TaskErrorSource.USER, }); }); }); diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/migrations.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/migrations.ts index 4f23a5ff3a727..541f83fc8d412 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/migrations.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/migrations.ts @@ -126,6 +126,7 @@ export default function createGetTests({ getService }: FtrProviderContext) { expect(response.body).to.eql({ connector_id: '0f8f2810-0a59-11ec-9a7c-fd0c2b83ff7d', status: 'error', + errorSource: 'framework', message: `error validating action type connector: secrets must be defined`, retry: false, }); From 01a030c22b7b8cb733eb8e3c22210bd22d222a1f Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola Date: Wed, 20 Dec 2023 14:44:01 -0500 Subject: [PATCH 41/62] [Investigations] - Unskip alert page not found test (#173781) ## Summary This test can be unskipped as the alert details page no longer exists in favor of the expanded flyout, so this test can be re-enabled fixes: https://github.com/elastic/kibana/issues/143705 --- .../cypress/e2e/explore/urls/not_found.cy.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/not_found.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/not_found.cy.ts index 80e682d74de96..205832fd0eaf7 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/not_found.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/not_found.cy.ts @@ -31,9 +31,7 @@ describe('Display not found page', { tags: ['@ess', '@serverless'] }, () => { visitWithTimeRange(TIMELINES_URL); }); - // Tracked by https://github.com/elastic/kibana/issues/143705 - // TODO: We need to determine what we want the behavior to be here - it.skip('navigates to the alerts page with incorrect link', () => { + it('navigates to the alerts page with incorrect link', () => { visitWithTimeRange(`${ALERTS_URL}/randomUrl`); cy.get(NOT_FOUND).should('exist'); }); From 35d79a901d9c690fbb128f138203799f97826291 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Dec 2023 20:58:38 +0100 Subject: [PATCH 42/62] Update platform security modules (main) (#173232) --- package.json | 11 ++- packages/kbn-mock-idp-plugin/common/utils.ts | 14 ++-- .../saml_provider/server/saml_tools.ts | 15 ++-- .../packages/helpers/saml/saml_tools.ts | 15 ++-- yarn.lock | 74 +++++++++---------- 5 files changed, 62 insertions(+), 67 deletions(-) diff --git a/package.json b/package.json index f2446fc5c27a0..2553521b662be 100644 --- a/package.json +++ b/package.json @@ -940,7 +940,7 @@ "file-saver": "^1.3.8", "fnv-plus": "^1.3.1", "font-awesome": "4.7.0", - "formik": "^2.2.9", + "formik": "^2.4.5", "fp-ts": "^2.3.1", "geojson-vt": "^3.2.1", "get-port": "^5.0.0", @@ -1414,7 +1414,7 @@ "@types/nock": "^10.0.3", "@types/node": "18.18.5", "@types/node-fetch": "2.6.4", - "@types/node-forge": "^1.3.1", + "@types/node-forge": "^1.3.10", "@types/nodemailer": "^6.4.0", "@types/normalize-path": "^3.0.0", "@types/object-hash": "^1.3.0", @@ -1463,7 +1463,7 @@ "@types/testing-library__jest-dom": "^5.14.7", "@types/textarea-caret": "^3.0.1", "@types/tinycolor2": "^1.4.1", - "@types/tough-cookie": "^4.0.2", + "@types/tough-cookie": "^4.0.5", "@types/type-detect": "^4.0.1", "@types/uuid": "^9.0.0", "@types/vinyl": "^2.0.4", @@ -1473,7 +1473,6 @@ "@types/webpack-env": "^1.15.3", "@types/webpack-merge": "^4.1.5", "@types/webpack-sources": "^0.1.4", - "@types/xml-crypto": "^1.4.2", "@types/xml2js": "^0.4.11", "@types/yargs": "^15.0.0", "@types/yauzl": "^2.9.1", @@ -1646,7 +1645,7 @@ "tempy": "^0.3.0", "terser": "^5.26.0", "terser-webpack-plugin": "^4.2.3", - "tough-cookie": "^4.1.2", + "tough-cookie": "^4.1.3", "tree-kill": "^1.2.2", "ts-morph": "^13.0.2", "tsd": "^0.20.0", @@ -1662,7 +1661,7 @@ "webpack-dev-server": "^4.9.3", "webpack-merge": "^4.2.2", "webpack-sources": "^1.4.1", - "xml-crypto": "^3.0.1", + "xml-crypto": "^5.0.0", "xmlbuilder": "13.0.2", "yargs": "^15.4.1", "yarn-deduplicate": "^6.0.2" diff --git a/packages/kbn-mock-idp-plugin/common/utils.ts b/packages/kbn-mock-idp-plugin/common/utils.ts index 5d55fbc565685..f98425f08248f 100644 --- a/packages/kbn-mock-idp-plugin/common/utils.ts +++ b/packages/kbn-mock-idp-plugin/common/utils.ts @@ -149,19 +149,19 @@ export async function createSAMLResponse(options: { `; - const signature = new SignedXml(); + const signature = new SignedXml({ privateKey: await readFile(KBN_KEY_PATH) }); signature.signatureAlgorithm = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'; - signature.signingKey = await readFile(KBN_KEY_PATH); + signature.canonicalizationAlgorithm = 'http://www.w3.org/2001/10/xml-exc-c14n#'; // Adds a reference to a `Assertion` xml element and an array of transform algorithms to be used during signing. - signature.addReference( - `//*[local-name(.)='Assertion']`, - [ + signature.addReference({ + xpath: `//*[local-name(.)='Assertion']`, + digestAlgorithm: 'http://www.w3.org/2001/04/xmlenc#sha256', + transforms: [ 'http://www.w3.org/2000/09/xmldsig#enveloped-signature', 'http://www.w3.org/2001/10/xml-exc-c14n#', ], - 'http://www.w3.org/2001/04/xmlenc#sha256' - ); + }); signature.computeSignature(samlAssertionTemplateXML, { location: { reference: `//*[local-name(.)='Issuer']`, action: 'after' }, diff --git a/x-pack/test/cloud_integration/plugins/saml_provider/server/saml_tools.ts b/x-pack/test/cloud_integration/plugins/saml_provider/server/saml_tools.ts index 0be46a431d7d4..7d1a6cbfa4255 100644 --- a/x-pack/test/cloud_integration/plugins/saml_provider/server/saml_tools.ts +++ b/x-pack/test/cloud_integration/plugins/saml_provider/server/saml_tools.ts @@ -29,6 +29,7 @@ const parseStringAsync = promisify(parseString); const signingKey = fs.readFileSync(KBN_KEY_PATH); const signatureAlgorithm = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'; +const canonicalizationAlgorithm = 'http://www.w3.org/2001/10/xml-exc-c14n#'; export async function getSAMLRequestId(urlWithSAMLRequestId: string) { const inflatedSAMLRequest = (await inflateRawAsync( @@ -87,19 +88,19 @@ export async function getSAMLResponse({ `; - const signature = new SignedXml(); + const signature = new SignedXml({ privateKey: signingKey }); signature.signatureAlgorithm = signatureAlgorithm; - signature.signingKey = signingKey; + signature.canonicalizationAlgorithm = canonicalizationAlgorithm; // Adds a reference to a `Assertion` xml element and an array of transform algorithms to be used during signing. - signature.addReference( - `//*[local-name(.)='Assertion']`, - [ + signature.addReference({ + xpath: `//*[local-name(.)='Assertion']`, + digestAlgorithm: 'http://www.w3.org/2001/04/xmlenc#sha256', + transforms: [ 'http://www.w3.org/2000/09/xmldsig#enveloped-signature', 'http://www.w3.org/2001/10/xml-exc-c14n#', ], - 'http://www.w3.org/2001/04/xmlenc#sha256' - ); + }); signature.computeSignature(samlAssertionTemplateXML, { location: { reference: `//*[local-name(.)='Issuer']`, action: 'after' }, diff --git a/x-pack/test/security_api_integration/packages/helpers/saml/saml_tools.ts b/x-pack/test/security_api_integration/packages/helpers/saml/saml_tools.ts index ad34f37fdc0a4..255625082407b 100644 --- a/x-pack/test/security_api_integration/packages/helpers/saml/saml_tools.ts +++ b/x-pack/test/security_api_integration/packages/helpers/saml/saml_tools.ts @@ -28,6 +28,7 @@ const parseStringAsync = promisify(parseString); const signingKey = fs.readFileSync(KBN_KEY_PATH); const signatureAlgorithm = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'; +const canonicalizationAlgorithm = 'http://www.w3.org/2001/10/xml-exc-c14n#'; export async function getSAMLRequestId(urlWithSAMLRequestId: string) { const inflatedSAMLRequest = (await inflateRawAsync( @@ -83,19 +84,19 @@ export async function getSAMLResponse({ `; - const signature = new SignedXml(); + const signature = new SignedXml({ privateKey: signingKey }); signature.signatureAlgorithm = signatureAlgorithm; - signature.signingKey = signingKey; + signature.canonicalizationAlgorithm = canonicalizationAlgorithm; // Adds a reference to a `Assertion` xml element and an array of transform algorithms to be used during signing. - signature.addReference( - `//*[local-name(.)='Assertion']`, - [ + signature.addReference({ + xpath: `//*[local-name(.)='Assertion']`, + digestAlgorithm: 'http://www.w3.org/2001/04/xmlenc#sha256', + transforms: [ 'http://www.w3.org/2000/09/xmldsig#enveloped-signature', 'http://www.w3.org/2001/10/xml-exc-c14n#', ], - 'http://www.w3.org/2001/04/xmlenc#sha256' - ); + }); signature.computeSignature(samlAssertionTemplateXML, { location: { reference: `//*[local-name(.)='Issuer']`, action: 'after' }, diff --git a/yarn.lock b/yarn.lock index dd6069f3c26ef..7b2754c8719c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9656,10 +9656,10 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node-forge@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.1.tgz#49e44432c306970b4e900c3b214157c480af19fa" - integrity sha512-hvQ7Wav8I0j9amPXJtGqI/Yx70zeF62UKlAYq8JPm0nHzjKKzZvo9iR3YI2MiOghZRlOI+tQ2f6D+G6vVf4V2Q== +"@types/node-forge@^1.3.10": + version "1.3.10" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.10.tgz#62a19d4f75a8b03290578c2b04f294b1a5a71b07" + integrity sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw== dependencies: "@types/node" "*" @@ -10177,10 +10177,10 @@ dependencies: "@types/geojson" "*" -"@types/tough-cookie@*", "@types/tough-cookie@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== +"@types/tough-cookie@*", "@types/tough-cookie@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== "@types/type-detect@^4.0.1": version "4.0.1" @@ -10292,14 +10292,6 @@ dependencies: "@types/node" "*" -"@types/xml-crypto@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/xml-crypto/-/xml-crypto-1.4.2.tgz#5ea7ef970f525ae8fe1e2ce0b3d40da1e3b279ae" - integrity sha512-1kT+3gVkeBDg7Ih8NefxGYfCApwZViMIs5IEs5AXF6Fpsrnf9CLAEIRh0DYb1mIcRcvysVbe27cHsJD6rJi36w== - dependencies: - "@types/node" "*" - xpath "0.0.27" - "@types/xml2js@^0.4.11": version "0.4.11" resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.4.11.tgz#bf46a84ecc12c41159a7bd9cf51ae84129af0e79" @@ -10749,10 +10741,15 @@ object.fromentries "^2.0.0" prop-types "^15.7.0" -"@xmldom/xmldom@^0.8.5": - version "0.8.6" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.6.tgz#8a1524eb5bd5e965c1e3735476f0262469f71440" - integrity sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg== +"@xmldom/is-dom-node@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@xmldom/is-dom-node/-/is-dom-node-1.0.1.tgz#83b9f3e1260fb008061c6fa787b93a00f9be0629" + integrity sha512-CJDxIgE5I0FH+ttq/Fxy6nRpxP70+e2O048EPe85J2use3XKdatVM7dDVvFNjQudd9B49NPoZ+8PG49zj4Er8Q== + +"@xmldom/xmldom@^0.8.10": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== "@xobotyi/scrollbar-width@1.9.5": version "1.9.5" @@ -17202,18 +17199,19 @@ formidable@^2.1.2: once "^1.4.0" qs "^6.11.0" -formik@^2.2.9: - version "2.2.9" - resolved "https://registry.yarnpkg.com/formik/-/formik-2.2.9.tgz#8594ba9c5e2e5cf1f42c5704128e119fc46232d0" - integrity sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA== +formik@^2.4.5: + version "2.4.5" + resolved "https://registry.yarnpkg.com/formik/-/formik-2.4.5.tgz#f899b5b7a6f103a8fabb679823e8fafc7e0ee1b4" + integrity sha512-Gxlht0TD3vVdzMDHwkiNZqJ7Mvg77xQNfmBRrNtvzcHZs72TJppSTDKHpImCMJZwcWPBJ8jSQQ95GJzXFf1nAQ== dependencies: + "@types/hoist-non-react-statics" "^3.3.1" deepmerge "^2.1.1" hoist-non-react-statics "^3.3.0" lodash "^4.17.21" lodash-es "^4.17.21" react-fast-compare "^2.0.1" tiny-warning "^1.0.2" - tslib "^1.10.0" + tslib "^2.0.0" forwarded-parse@^2.1.0: version "2.1.0" @@ -31242,13 +31240,14 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xml-crypto@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/xml-crypto/-/xml-crypto-3.0.1.tgz#1d4852b040e80413d8058e2917eddd9f17a00b8b" - integrity sha512-7XrwB3ujd95KCO6+u9fidb8ajvRJvIfGNWD0XLJoTWlBKz+tFpUzEYxsN+Il/6/gHtEs1RgRh2RH+TzhcWBZUw== +xml-crypto@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/xml-crypto/-/xml-crypto-5.0.0.tgz#e54dff59bf0e18527b91af7690513041ebb90273" + integrity sha512-TdJZp/gdKb5RYiZigLy/RUz9EpbEV+HoOR4ofby3VonDSn7FmNZlex7OuxLPD8sRlCLZ5YYFI+9s1OhFs7fwEw== dependencies: - "@xmldom/xmldom" "^0.8.5" - xpath "0.0.32" + "@xmldom/is-dom-node" "^1.0.1" + "@xmldom/xmldom" "^0.8.10" + xpath "^0.0.33" xml-name-validator@^4.0.0: version "4.0.0" @@ -31290,15 +31289,10 @@ xmldoc@^1.1.2: dependencies: sax "^1.2.1" -xpath@0.0.27: - version "0.0.27" - resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.27.tgz#dd3421fbdcc5646ac32c48531b4d7e9d0c2cfa92" - integrity sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ== - -xpath@0.0.32: - version "0.0.32" - resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.32.tgz#1b73d3351af736e17ec078d6da4b8175405c48af" - integrity sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw== +xpath@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.33.tgz#5136b6094227c5df92002e7c3a13516a5074eb07" + integrity sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA== xstate@^4.38.2: version "4.38.2" From 4465c1e090ab1179f12000d52b1dc0eefd14217f Mon Sep 17 00:00:00 2001 From: Jiawei Wu <74562234+JiaweiWu@users.noreply.github.com> Date: Wed, 20 Dec 2023 12:21:51 -0800 Subject: [PATCH 43/62] [RAM] Fix rule edit flyout alerts search bar autocomplete scroll (#172899) ## Summary Resolves: https://github.com/elastic/kibana/issues/172594 Fixes the rule edit alerts search bar autocomplete causing background to also scroll infinitely https://github.com/elastic/kibana/assets/74562234/f55db528-b933-400a-80b5-8a3063f0f29c --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Xavier Mouligneau --- .../public/application/sections/rule_form/rule_edit.tsx | 2 +- .../apps/triggers_actions_ui/alert_create_flyout.ts | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx index 3f1c050fb7e25..0aebaaaa29882 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx @@ -213,7 +213,7 @@ export const RuleEdit = ({ aria-labelledby="flyoutRuleEditTitle" size="m" maxWidth={620} - ownFocus={false} + ownFocus > diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alert_create_flyout.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alert_create_flyout.ts index 3cceb01b54998..30ece977d1641 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alert_create_flyout.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alert_create_flyout.ts @@ -82,18 +82,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { } describe('create alert', function () { - before(async () => { + beforeEach(async () => { await pageObjects.common.navigateToApp('triggersActions'); await testSubjects.click('rulesTab'); }); - afterEach(async () => { - // Reset the Rules tab without reloading the entire page - // This is safer than trying to close the alert flyout, which may or may not be open at the end of a test - await testSubjects.click('logsTab'); - await testSubjects.click('rulesTab'); - }); - it('should delete the right action when the same action has been added twice', async () => { // create a new rule const ruleName = generateUniqueKey(); From 00a2f49e68d73a48eaaf782f02e6dc90288aa5f6 Mon Sep 17 00:00:00 2001 From: Zacqary Adam Xeper Date: Wed, 20 Dec 2023 14:37:48 -0600 Subject: [PATCH 44/62] [Task Manager] Evenly distribute bulk-enabled alerting rules (#172742) ## Summary ~Closes~ Part of https://github.com/elastic/kibana/issues/171980 When `bulkEnable`ing more than 1 task, adds a random delay to each subsequent task's `runAt` and `scheduledAt` to more evenly distribute their execution times. This offset is a maximum of 5 minutes, or the task's interval, whichever is shorter. As per Slack discussion with @mikecote, this is a random distribution of execution times instead of a predictable, algorithmic offset. We believe that a random distribution will do a better job of avoiding spikes than anything more directed. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../server/lib/retryable_bulk_update.ts | 2 +- .../server/task_scheduling.test.ts | 45 +++++++++++++++++++ .../task_manager/server/task_scheduling.ts | 25 ++++++++++- 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/task_manager/server/lib/retryable_bulk_update.ts b/x-pack/plugins/task_manager/server/lib/retryable_bulk_update.ts index d50fb88d909c3..1232ab7ae9911 100644 --- a/x-pack/plugins/task_manager/server/lib/retryable_bulk_update.ts +++ b/x-pack/plugins/task_manager/server/lib/retryable_bulk_update.ts @@ -17,7 +17,7 @@ export interface RetryableBulkUpdateOpts { taskIds: string[]; getTasks: (taskIds: string[]) => Promise; filter: (task: ConcreteTaskInstance) => boolean; - map: (task: ConcreteTaskInstance) => ConcreteTaskInstance; + map: (task: ConcreteTaskInstance, i: number, arr: ConcreteTaskInstance[]) => ConcreteTaskInstance; store: TaskStore; validate: boolean; } diff --git a/x-pack/plugins/task_manager/server/task_scheduling.test.ts b/x-pack/plugins/task_manager/server/task_scheduling.test.ts index 11a2e8a115d8a..f4c8c0d6b0880 100644 --- a/x-pack/plugins/task_manager/server/task_scheduling.test.ts +++ b/x-pack/plugins/task_manager/server/task_scheduling.test.ts @@ -289,6 +289,51 @@ describe('TaskScheduling', () => { }, ]); }); + + test('should offset runAt and scheduledAt by no more than 5m if more than one task is enabled', async () => { + const task = taskManagerMock.createTask({ + id: 'task-1', + enabled: false, + schedule: { interval: '3h' }, + runAt: new Date('1969-09-13T21:33:58.285Z'), + scheduledAt: new Date('1969-09-10T21:33:58.285Z'), + }); + const task2 = taskManagerMock.createTask({ + id: 'task-2', + enabled: false, + schedule: { interval: '3h' }, + runAt: new Date('1969-09-13T21:33:58.285Z'), + scheduledAt: new Date('1969-09-10T21:33:58.285Z'), + }); + mockTaskStore.bulkUpdate.mockImplementation(() => + Promise.resolve([{ tag: 'ok', value: task }]) + ); + mockTaskStore.bulkGet.mockResolvedValue([asOk(task), asOk(task2)]); + + const taskScheduling = new TaskScheduling(taskSchedulingOpts); + await taskScheduling.bulkEnable([task.id, task2.id]); + + const bulkUpdatePayload = mockTaskStore.bulkUpdate.mock.calls[0][0]; + + expect(bulkUpdatePayload.length).toBe(2); + expect(bulkUpdatePayload[0]).toEqual({ + ...task, + enabled: true, + runAt: new Date('1970-01-01T00:00:00.000Z'), + scheduledAt: new Date('1970-01-01T00:00:00.000Z'), + }); + + expect(omit(bulkUpdatePayload[1], 'runAt', 'scheduledAt')).toEqual({ + ...omit(task2, 'runAt', 'scheduledAt'), + enabled: true, + }); + + const { runAt, scheduledAt } = bulkUpdatePayload[1]; + expect(runAt.getTime()).toEqual(scheduledAt.getTime()); + expect(runAt.getTime() - bulkUpdatePayload[0].runAt.getTime()).toBeLessThanOrEqual( + 5 * 60 * 1000 + ); + }); }); describe('bulkDisable', () => { diff --git a/x-pack/plugins/task_manager/server/task_scheduling.ts b/x-pack/plugins/task_manager/server/task_scheduling.ts index 795e563986586..c0e28a5fae3bd 100644 --- a/x-pack/plugins/task_manager/server/task_scheduling.ts +++ b/x-pack/plugins/task_manager/server/task_scheduling.ts @@ -176,9 +176,15 @@ export class TaskScheduling { store: this.store, getTasks: async (ids) => await this.bulkGetTasksHelper(ids), filter: (task) => !task.enabled, - map: (task) => { + map: (task, i) => { if (runSoon) { - return { ...task, enabled: true, scheduledAt: new Date(), runAt: new Date() }; + // Run the first task now. Run all other tasks a random number of ms in the future, + // with a maximum of 5 minutes or the task interval, whichever is smaller. + const taskToRun = + i === 0 + ? { ...task, runAt: new Date(), scheduledAt: new Date() } + : randomlyOffsetRunTimestamp(task); + return { ...taskToRun, enabled: true }; } return { ...task, enabled: true }; }, @@ -440,3 +446,18 @@ const cancellablePromise = () => { .then(() => {}), }; }; + +const randomlyOffsetRunTimestamp: (task: ConcreteTaskInstance) => ConcreteTaskInstance = (task) => { + const now = Date.now(); + const maximumOffsetTimestamp = now + 1000 * 60 * 5; // now + 5 minutes + const taskIntervalInMs = parseIntervalAsMillisecond(task.schedule?.interval ?? '0s'); + const maximumRunAt = Math.min(now + taskIntervalInMs, maximumOffsetTimestamp); + + // Offset between 1 and maximumRunAt ms + const runAt = new Date(now + Math.floor(Math.random() * (maximumRunAt - now) + 1)); + return { + ...task, + runAt, + scheduledAt: runAt, + }; +}; From 6bec71021ac92a84da05a3646fe0992579c52832 Mon Sep 17 00:00:00 2001 From: Hannah Mudge Date: Wed, 20 Dec 2023 14:14:39 -0700 Subject: [PATCH 45/62] [Controls] Fix validation query for nested fields (#173690) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://github.com/elastic/kibana/issues/172694 ## Summary Apparently, when we [originally added the options list queries](https://github.com/elastic/kibana/blob/d07c74d25087447458da8de6a277544e9dfa164c/src/plugins/controls/server/control_types/options_list/options_list_queries.ts#L145), we only considered nested fields for the **suggestion** aggregation; we completely forgot to consider nested fields in the **validation** aggregation. So, from the introduction of the new controls, options list selections would be always be marked "invalid" for nested fields - oops! 🙈 This PR fixes the validation aggregation so that nested field selections behave as expected. **Before** https://github.com/elastic/kibana/assets/8698078/68b5dad5-6210-460d-b2ed-a24bf44ed333 **After** https://github.com/elastic/kibana/assets/8698078/dd22bd95-f542-49bb-9dd1-7913c945c0f7 > [!TIP] > Searching a nested field for specific values will always return slightly unexpected results, because if a subset of the nested field matches, we don't return the subset - we return the **entire set**. In other words, if you have one document where the nested field equals `["one", "two"]` and another document where the nested field equals `["one", "three"]`, searching for `"one"` will return `["one", "two", "three"]` as options, like so: > > ![image](https://github.com/elastic/kibana/assets/8698078/866917fa-ac75-4784-92b5-54c6635d6d5e) ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../options_list_suggestions_route.ts | 12 +- .../options_list_validation_queries.test.ts | 128 +++++++++++++++--- .../options_list_validation_queries.ts | 46 +++++-- .../controls/server/options_list/types.ts | 2 +- 4 files changed, 154 insertions(+), 34 deletions(-) diff --git a/src/plugins/controls/server/options_list/options_list_suggestions_route.ts b/src/plugins/controls/server/options_list/options_list_suggestions_route.ts index 310a04874f7fb..1e1084d757310 100644 --- a/src/plugins/controls/server/options_list/options_list_suggestions_route.ts +++ b/src/plugins/controls/server/options_list/options_list_suggestions_route.ts @@ -112,12 +112,8 @@ export const setupOptionsListSuggestionsRoute = ( const validationBuilder = getValidationAggregationBuilder(); const suggestionAggregation: any = suggestionBuilder.buildAggregation(request) ?? {}; - const builtValidationAggregation = validationBuilder.buildAggregation(request); - const validationAggregations = builtValidationAggregation - ? { - validation: builtValidationAggregation, - } - : {}; + const validationAggregation: any = validationBuilder.buildAggregation(request); + const body: SearchRequest['body'] = { size: 0, ...timeoutSettings, @@ -128,7 +124,7 @@ export const setupOptionsListSuggestionsRoute = ( }, aggs: { ...suggestionAggregation, - ...validationAggregations, + ...validationAggregation, }, runtime_mappings: { ...runtimeFieldMap, @@ -145,7 +141,7 @@ export const setupOptionsListSuggestionsRoute = ( */ const results = suggestionBuilder.parse(rawEsResult, request); const totalCardinality = results.totalCardinality; - const invalidSelections = validationBuilder.parse(rawEsResult); + const invalidSelections = validationBuilder.parse(rawEsResult, request); return { suggestions: results.suggestions, totalCardinality, diff --git a/src/plugins/controls/server/options_list/options_list_validation_queries.test.ts b/src/plugins/controls/server/options_list/options_list_validation_queries.test.ts index f8a7344eb8860..1d96215e167b9 100644 --- a/src/plugins/controls/server/options_list/options_list_validation_queries.test.ts +++ b/src/plugins/controls/server/options_list/options_list_validation_queries.test.ts @@ -7,6 +7,7 @@ */ import { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; +import { FieldSpec } from '@kbn/data-views-plugin/common'; import { OptionsListRequestBody } from '../../common/options_list/types'; import { getValidationAggregationBuilder } from './options_list_validation_queries'; @@ -33,7 +34,19 @@ describe('options list queries', () => { }; }); - describe('validation aggregation and parsing', () => { + describe('validation aggregation', () => { + test('returns empty aggregation when not given selections', () => { + const validationAggBuilder = getValidationAggregationBuilder(); + const optionsListRequestBodyMock: OptionsListRequestBody = { + size: 10, + fieldName: 'coolTestField', + allowExpensiveQueries: true, + }; + expect( + validationAggBuilder.buildAggregation(optionsListRequestBodyMock) + ).toMatchInlineSnapshot(`Object {}`); + }); + test('creates validation aggregation when given selections', () => { const validationAggBuilder = getValidationAggregationBuilder(); const optionsListRequestBodyMock: OptionsListRequestBody = { @@ -45,21 +58,23 @@ describe('options list queries', () => { expect(validationAggBuilder.buildAggregation(optionsListRequestBodyMock)) .toMatchInlineSnapshot(` Object { - "filters": Object { + "validation": Object { "filters": Object { - "coolOption1": Object { - "match": Object { - "coolTestField": "coolOption1", + "filters": Object { + "coolOption1": Object { + "match": Object { + "coolTestField": "coolOption1", + }, }, - }, - "coolOption2": Object { - "match": Object { - "coolTestField": "coolOption2", + "coolOption2": Object { + "match": Object { + "coolTestField": "coolOption2", + }, }, - }, - "coolOption3": Object { - "match": Object { - "coolTestField": "coolOption3", + "coolOption3": Object { + "match": Object { + "coolTestField": "coolOption3", + }, }, }, }, @@ -68,16 +83,55 @@ describe('options list queries', () => { `); }); - test('returns undefined when not given selections', () => { + test('creates validation aggregation for nested fields when given selections', () => { const validationAggBuilder = getValidationAggregationBuilder(); const optionsListRequestBodyMock: OptionsListRequestBody = { size: 10, fieldName: 'coolTestField', + fieldSpec: { + type: 'string', + subType: { nested: { path: 'path.to.nested' } }, + } as unknown as FieldSpec, allowExpensiveQueries: true, + selectedOptions: ['coolOption1', 'coolOption2', 'coolOption3'], }; - expect(validationAggBuilder.buildAggregation(optionsListRequestBodyMock)).toBeUndefined(); + expect(validationAggBuilder.buildAggregation(optionsListRequestBodyMock)) + .toMatchInlineSnapshot(` + Object { + "nestedValidation": Object { + "aggs": Object { + "validation": Object { + "filters": Object { + "filters": Object { + "coolOption1": Object { + "match": Object { + "coolTestField": "coolOption1", + }, + }, + "coolOption2": Object { + "match": Object { + "coolTestField": "coolOption2", + }, + }, + "coolOption3": Object { + "match": Object { + "coolTestField": "coolOption3", + }, + }, + }, + }, + }, + }, + "nested": Object { + "path": "path.to.nested", + }, + }, + } + `); }); + }); + describe('validation parsing', () => { test('parses validation result', () => { const validationAggBuilder = getValidationAggregationBuilder(); rawSearchResponseMock.aggregations = { @@ -92,7 +146,13 @@ describe('options list queries', () => { }, }, }; - expect(validationAggBuilder.parse(rawSearchResponseMock)).toMatchInlineSnapshot(` + expect( + validationAggBuilder.parse(rawSearchResponseMock, { + size: 10, + fieldName: 'coolTestField', + allowExpensiveQueries: true, + }) + ).toMatchInlineSnapshot(` Array [ "cool1", "cool3", @@ -100,5 +160,41 @@ describe('options list queries', () => { ] `); }); + + test('parses validation result for nested field', () => { + const validationAggBuilder = getValidationAggregationBuilder(); + rawSearchResponseMock.aggregations = { + nestedValidation: { + validation: { + buckets: { + cool1: { doc_count: 0 }, + cool2: { doc_count: 15 }, + cool3: { doc_count: 0 }, + cool4: { doc_count: 0 }, + cool5: { doc_count: 0 }, + cool6: { doc_count: 112 }, + }, + }, + }, + }; + expect( + validationAggBuilder.parse(rawSearchResponseMock, { + size: 10, + fieldSpec: { + type: 'string', + subType: { nested: { path: 'path.to.nested' } }, + } as unknown as FieldSpec, + fieldName: 'coolTestField', + allowExpensiveQueries: true, + }) + ).toMatchInlineSnapshot(` + Array [ + "cool1", + "cool3", + "cool4", + "cool5", + ] + `); + }); }); }); diff --git a/src/plugins/controls/server/options_list/options_list_validation_queries.ts b/src/plugins/controls/server/options_list/options_list_validation_queries.ts index 56e7f9efef6bf..edacacb361d0c 100644 --- a/src/plugins/controls/server/options_list/options_list_validation_queries.ts +++ b/src/plugins/controls/server/options_list/options_list_validation_queries.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { getFieldSubtypeNested } from '@kbn/data-views-plugin/common'; import { get, isEmpty } from 'lodash'; import { OptionsListRequestBody } from '../../common/options_list/types'; @@ -16,7 +17,7 @@ import { OptionsListValidationAggregationBuilder } from './types'; */ export const getValidationAggregationBuilder: () => OptionsListValidationAggregationBuilder = () => ({ - buildAggregation: ({ selectedOptions, fieldName }: OptionsListRequestBody) => { + buildAggregation: ({ selectedOptions, fieldName, fieldSpec }: OptionsListRequestBody) => { let selectedOptionsFilters; if (selectedOptions) { selectedOptionsFilters = selectedOptions.reduce((acc, currentOption) => { @@ -24,16 +25,43 @@ export const getValidationAggregationBuilder: () => OptionsListValidationAggrega return acc; }, {} as { [key: string]: { match: { [key: string]: string } } }); } - return selectedOptionsFilters && !isEmpty(selectedOptionsFilters) - ? { - filters: { - filters: selectedOptionsFilters, + + if (isEmpty(selectedOptionsFilters ?? [])) { + return {}; + } + + let validationAggregation: any = { + validation: { + filters: { + filters: selectedOptionsFilters, + }, + }, + }; + + const isNested = fieldSpec && getFieldSubtypeNested(fieldSpec); + if (isNested) { + validationAggregation = { + nestedValidation: { + nested: { + path: isNested.nested.path, }, - } - : undefined; + aggs: { + ...validationAggregation, + }, + }, + }; + } + + return validationAggregation; }, - parse: (rawEsResult) => { - const rawInvalidSuggestions = get(rawEsResult, 'aggregations.validation.buckets'); + parse: (rawEsResult, { fieldSpec }) => { + const isNested = fieldSpec && getFieldSubtypeNested(fieldSpec); + const rawInvalidSuggestions = get( + rawEsResult, + isNested + ? 'aggregations.nestedValidation.validation.buckets' + : 'aggregations.validation.buckets' + ); return rawInvalidSuggestions && !isEmpty(rawInvalidSuggestions) ? Object.keys(rawInvalidSuggestions).filter( (key) => rawInvalidSuggestions[key].doc_count === 0 diff --git a/src/plugins/controls/server/options_list/types.ts b/src/plugins/controls/server/options_list/types.ts index 1ea3475eddffb..70edc14484c99 100644 --- a/src/plugins/controls/server/options_list/types.ts +++ b/src/plugins/controls/server/options_list/types.ts @@ -19,7 +19,7 @@ export interface EsBucket { export interface OptionsListValidationAggregationBuilder { buildAggregation: (req: OptionsListRequestBody) => unknown; - parse: (response: SearchResponse) => string[]; + parse: (response: SearchResponse, req: OptionsListRequestBody) => string[]; } export interface OptionsListSuggestionAggregationBuilder { From 5798255638eebf33a68d15314f149f24528a241e Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Wed, 20 Dec 2023 16:10:33 -0600 Subject: [PATCH 46/62] [Serverless Search] Index Management - Index Details Overview (#173581) ## Summary This PR implements a new Overview tab for an Index details in Index Management for Serverless. It has data panels for information about the index and optional empty states if the index has no documents. (see Screenshots) ### Screenshots Index with data ![image](https://github.com/elastic/kibana/assets/1972968/848d7f50-8332-4119-b23b-7e4569a2eaba) Index without data ![image](https://github.com/elastic/kibana/assets/1972968/a126f94f-1112-4738-abd8-5d40d96d35dc) ![image](https://github.com/elastic/kibana/assets/1972968/e5f11f2f-f5a4-421e-b212-ce65307756d4) ![image](https://github.com/elastic/kibana/assets/1972968/bd7d7970-8e4c-4245-baec-8ab9d3625dbd) Connector Index without data ![image](https://github.com/elastic/kibana/assets/1972968/dc0d97ed-110b-4566-bddd-f2c145d2eadf) ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../serverless_search/common/doc_links.ts | 2 + .../serverless_search/common/types/index.ts | 11 + .../application/components/badge_list.tsx | 31 ++ .../connectors/connectors_table.tsx | 2 +- .../connectors/empty_connectors_prompt.tsx | 12 +- .../components/connectors_router.tsx | 3 - .../components/index_documents/documents.tsx | 4 + .../index_documents/documents_tab.tsx | 13 +- .../index_management/api_empty_prompt.tsx | 166 +++++++++++ .../connector_empty_prompt.tsx | 33 +++ .../connector_setup_prompt.tsx | 100 +++++++ .../index_management/index_aliases_flyout.tsx | 75 +++++ .../index_mappings_docs_link.tsx | 0 .../index_management/index_overview.tsx | 271 ++++++++++++++++++ .../index_overview_content.tsx | 40 +++ .../overview_empty_prompt.tsx | 173 +++++++++++ .../index_management/overview_panel.tsx | 41 +++ .../components/languages/dotnet.ts | 16 ++ .../application/components/languages/java.ts | 50 ++++ .../public/application/constants.ts | 4 + .../hooks/api/use_create_connector.tsx | 10 +- .../application/hooks/api/use_index.tsx | 21 ++ .../serverless_search/public/plugin.ts | 9 +- .../server/lib/indices/fetch_index.test.ts | 142 +++++++++ .../server/lib/indices/fetch_index.ts | 45 +++ .../server/routes/indices_routes.ts | 22 ++ 26 files changed, 1278 insertions(+), 18 deletions(-) create mode 100644 x-pack/plugins/serverless_search/public/application/components/badge_list.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/components/index_management/api_empty_prompt.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/components/index_management/connector_empty_prompt.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/components/index_management/connector_setup_prompt.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/components/index_management/index_aliases_flyout.tsx rename x-pack/plugins/serverless_search/public/application/components/{ => index_management}/index_mappings_docs_link.tsx (100%) create mode 100644 x-pack/plugins/serverless_search/public/application/components/index_management/index_overview.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/components/index_management/index_overview_content.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/components/index_management/overview_empty_prompt.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/components/index_management/overview_panel.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/hooks/api/use_index.tsx create mode 100644 x-pack/plugins/serverless_search/server/lib/indices/fetch_index.test.ts create mode 100644 x-pack/plugins/serverless_search/server/lib/indices/fetch_index.ts diff --git a/x-pack/plugins/serverless_search/common/doc_links.ts b/x-pack/plugins/serverless_search/common/doc_links.ts index c3cfecd7dfc66..7168f089c41e1 100644 --- a/x-pack/plugins/serverless_search/common/doc_links.ts +++ b/x-pack/plugins/serverless_search/common/doc_links.ts @@ -19,6 +19,7 @@ class ESDocLinks { public roleDescriptors: string = ''; public securityApis: string = ''; public ingestionPipelines: string = ''; + public dataStreams: string = ''; // Client links public elasticsearchClients: string = ''; // go @@ -61,6 +62,7 @@ class ESDocLinks { this.roleDescriptors = newDocLinks.serverlessSecurity.apiKeyPrivileges; this.securityApis = newDocLinks.apis.securityApis; this.ingestionPipelines = newDocLinks.ingest.pipelines; + this.dataStreams = newDocLinks.elasticsearch.dataStreams; // Client links this.elasticsearchClients = newDocLinks.serverlessClients.clientLib; diff --git a/x-pack/plugins/serverless_search/common/types/index.ts b/x-pack/plugins/serverless_search/common/types/index.ts index c4dac1508374e..6b43747b19afd 100644 --- a/x-pack/plugins/serverless_search/common/types/index.ts +++ b/x-pack/plugins/serverless_search/common/types/index.ts @@ -5,6 +5,9 @@ * 2.0. */ +import { IndicesIndexState, IndicesStatsIndicesStats } from '@elastic/elasticsearch/lib/api/types'; +import { Connector } from '@kbn/search-connectors/types/connectors'; + export interface CreateAPIKeyArgs { expiration?: string; metadata?: Record; @@ -20,3 +23,11 @@ export interface IndexData { export interface FetchIndicesResult { indices: IndexData[]; } + +export interface FetchIndexResult { + index: IndicesIndexState & { + connector?: Connector; + count: number; + stats?: IndicesStatsIndicesStats; + }; +} diff --git a/x-pack/plugins/serverless_search/public/application/components/badge_list.tsx b/x-pack/plugins/serverless_search/public/application/components/badge_list.tsx new file mode 100644 index 0000000000000..9635515bdf419 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/badge_list.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiBadgeGroup, EuiBadge } from '@elastic/eui'; + +export interface BadgeListProps { + badges: React.ReactNode[]; + maxBadgesToDisplay?: number; +} + +export const BadgeList = ({ badges, maxBadgesToDisplay }: BadgeListProps) => { + const maxBadges = maxBadgesToDisplay ?? 3; + if (badges.length === 0) { + return <>; + } + + const badgesToDisplay = badges.slice(0, maxBadges); + return ( + + {badgesToDisplay.map((badge) => badge)} + {badges.length > maxBadges && ( + +{badges.length - maxBadges} + )} + + ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/connectors_table.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/connectors_table.tsx index 53d99b37c99a1..4850bdf8b86e3 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/connectors_table.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/connectors_table.tsx @@ -45,7 +45,7 @@ import { import { useConnectors } from '../../hooks/api/use_connectors'; import { useConnectorTypes } from '../../hooks/api/use_connector_types'; import { useKibanaServices } from '../../hooks/use_kibana'; -import { EDIT_CONNECTOR_PATH } from '../connectors_router'; +import { EDIT_CONNECTOR_PATH } from '../../constants'; import { DeleteConnectorModal } from './delete_connector_modal'; export const ConnectorsTable: React.FC = () => { diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/empty_connectors_prompt.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/empty_connectors_prompt.tsx index abb0ad64242d7..218c956c78770 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/empty_connectors_prompt.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/empty_connectors_prompt.tsx @@ -19,14 +19,16 @@ import { import { i18n } from '@kbn/i18n'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { PLUGIN_ID } from '../../../../common'; + import { useConnectorTypes } from '../../hooks/api/use_connector_types'; -import { useKibanaServices } from '../../hooks/use_kibana'; +import { useCreateConnector } from '../../hooks/api/use_create_connector'; +import { useAssetBasePath } from '../../hooks/use_asset_base_path'; export const EmptyConnectorsPrompt: React.FC = () => { - const { http } = useKibanaServices(); const { data: connectorTypes } = useConnectorTypes(); - const assetBasePath = http.basePath.prepend(`/plugins/${PLUGIN_ID}/assets`); + const { createConnector, isLoading } = useCreateConnector(); + + const assetBasePath = useAssetBasePath(); const connectorsPath = assetBasePath + '/connectors.svg'; return ( @@ -167,6 +169,8 @@ export const EmptyConnectorsPrompt: React.FC = () => { data-test-subj="serverlessSearchEmptyConnectorsPromptCreateConnectorButton" fill iconType="plusInCircleFilled" + onClick={() => createConnector()} + isLoading={isLoading} > {i18n.translate('xpack.serverlessSearch.connectorsEmpty.createConnector', { defaultMessage: 'Create connector', diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors_router.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors_router.tsx index ab1ce4e2902bf..f8c224ed2c9c6 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors_router.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors_router.tsx @@ -10,9 +10,6 @@ import React from 'react'; import { EditConnector } from './connectors/edit_connector'; import { ConnectorsOverview } from './connectors_overview'; -export const BASE_CONNECTORS_PATH = 'connectors'; -export const EDIT_CONNECTOR_PATH = `${BASE_CONNECTORS_PATH}/:id`; - export const ConnectorsRouter: React.FC = () => { return ( diff --git a/x-pack/plugins/serverless_search/public/application/components/index_documents/documents.tsx b/x-pack/plugins/serverless_search/public/application/components/index_documents/documents.tsx index 8d719485973e4..d74c3a479a68a 100644 --- a/x-pack/plugins/serverless_search/public/application/components/index_documents/documents.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/index_documents/documents.tsx @@ -74,3 +74,7 @@ export const IndexDocuments: React.FC = ({ indexName }) => /> ); }; + +// Default Export is needed to lazy load this react component +// eslint-disable-next-line import/no-default-export +export default IndexDocuments; diff --git a/x-pack/plugins/serverless_search/public/application/components/index_documents/documents_tab.tsx b/x-pack/plugins/serverless_search/public/application/components/index_documents/documents_tab.tsx index c71089b5f3b83..ff4f2165f534c 100644 --- a/x-pack/plugins/serverless_search/public/application/components/index_documents/documents_tab.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/index_documents/documents_tab.tsx @@ -6,16 +6,19 @@ */ import { IndexDetailsTab } from '@kbn/index-management-plugin/common/constants'; -import React from 'react'; +import React, { Suspense, lazy } from 'react'; +import { EuiLoadingSpinner } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { CoreStart } from '@kbn/core-lifecycle-browser'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; + import { ServerlessSearchPluginStartDependencies } from '../../../types'; -import { IndexDocuments } from './documents'; -export const createIndexOverviewContent = ( +const IndexDocuments = lazy(() => import('./documents')); + +export const createIndexDocumentsContent = ( core: CoreStart, services: ServerlessSearchPluginStartDependencies ): IndexDetailsTab => { @@ -34,7 +37,9 @@ export const createIndexOverviewContent = ( - + }> + + ); diff --git a/x-pack/plugins/serverless_search/public/application/components/index_management/api_empty_prompt.tsx b/x-pack/plugins/serverless_search/public/application/components/index_management/api_empty_prompt.tsx new file mode 100644 index 0000000000000..4881c8d73f40f --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/index_management/api_empty_prompt.tsx @@ -0,0 +1,166 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + EuiEmptyPrompt, + EuiFlexItem, + EuiFlexGroup, + EuiIcon, + EuiText, + EuiButtonEmpty, + EuiLink, + EuiPanel, + EuiTitle, + EuiSpacer, + EuiSteps, +} from '@elastic/eui'; +import { EuiContainedStepProps } from '@elastic/eui/src/components/steps/steps'; +import { + CodeBox, + getConsoleRequest, + getLanguageDefinitionCodeSnippet, + LanguageDefinition, + LanguageDefinitionSnippetArguments, +} from '@kbn/search-api-panels'; + +import { BACK_LABEL } from '../../../../common/i18n_string'; + +import { useAssetBasePath } from '../../hooks/use_asset_base_path'; +import { useKibanaServices } from '../../hooks/use_kibana'; +import { javaDefinition } from '../languages/java'; +import { languageDefinitions } from '../languages/languages'; +import { LanguageGrid } from '../languages/language_grid'; +import { + API_KEY_PLACEHOLDER, + CLOUD_ID_PLACEHOLDER, + ELASTICSEARCH_URL_PLACEHOLDER, +} from '../../constants'; + +import { ApiKeyPanel } from '../api_key/api_key'; + +export interface APIIndexEmptyPromptProps { + indexName: string; + onBackClick?: () => void; +} + +export const APIIndexEmptyPrompt = ({ indexName, onBackClick }: APIIndexEmptyPromptProps) => { + const { application, cloud, share } = useKibanaServices(); + const assetBasePath = useAssetBasePath(); + const [selectedLanguage, setSelectedLanguage] = + React.useState(javaDefinition); + const [clientApiKey, setClientApiKey] = useState(API_KEY_PLACEHOLDER); + const { elasticsearchURL, cloudId } = useMemo(() => { + return { + elasticsearchURL: cloud?.elasticsearchUrl ?? ELASTICSEARCH_URL_PLACEHOLDER, + cloudId: cloud?.cloudId ?? CLOUD_ID_PLACEHOLDER, + }; + }, [cloud]); + const codeSnippetArguments: LanguageDefinitionSnippetArguments = { + url: elasticsearchURL, + apiKey: clientApiKey, + cloudId, + indexName, + }; + + const apiIngestSteps: EuiContainedStepProps[] = [ + { + title: i18n.translate( + 'xpack.serverlessSearch.indexManagement.indexDetails.overview.emptyPrompt.api.ingest.title', + { defaultMessage: 'Ingest data via API using a programming language client' } + ), + children: ( + + + + + + + + + ), + }, + { + title: i18n.translate( + 'xpack.serverlessSearch.indexManagement.indexDetails.overview.emptyPrompt.api.apiKey.title', + { defaultMessage: 'Prepare an API key' } + ), + children: , + }, + ]; + + return ( + + + {BACK_LABEL} + + } + title={ + +

+ +
+ + } + body={ + +

+ application.navigateToApp('elasticsearch')} + > + {i18n.translate( + 'xpack.serverlessSearch.indexManagement.indexDetails.overview.emptyPrompt.api.body.getStartedLink', + { defaultMessage: 'Get started' } + )} + + ), + }} + /> +

+
+ } + /> + + + + ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/index_management/connector_empty_prompt.tsx b/x-pack/plugins/serverless_search/public/application/components/index_management/connector_empty_prompt.tsx new file mode 100644 index 0000000000000..487c80ce48b6f --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/index_management/connector_empty_prompt.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiButtonEmpty, EuiPanel } from '@elastic/eui'; + +import { BACK_LABEL } from '../../../../common/i18n_string'; +import { EmptyConnectorsPrompt } from '../connectors/empty_connectors_prompt'; + +interface ConnectorIndexEmptyPromptProps { + indexName: string; + onBackClick?: () => void; +} + +export const ConnectorIndexEmptyPrompt = ({ onBackClick }: ConnectorIndexEmptyPromptProps) => { + return ( + + + {BACK_LABEL} + + + + ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/index_management/connector_setup_prompt.tsx b/x-pack/plugins/serverless_search/public/application/components/index_management/connector_setup_prompt.tsx new file mode 100644 index 0000000000000..888a5f11385a5 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/index_management/connector_setup_prompt.tsx @@ -0,0 +1,100 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { + EuiEmptyPrompt, + EuiIcon, + EuiFlexItem, + EuiFlexGroup, + EuiButton, + EuiPanel, + EuiTitle, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { Connector } from '@kbn/search-connectors'; + +import { useKibanaServices } from '../../hooks/use_kibana'; +import { useAssetBasePath } from '../../hooks/use_asset_base_path'; +import { useConnectorTypes } from '../../hooks/api/use_connector_types'; + +interface ConnectorSetupEmptyPromptProps { + indexName: string; + connector: Connector; +} + +export const ConnectorSetupEmptyPrompt = ({ connector }: ConnectorSetupEmptyPromptProps) => { + const { http } = useKibanaServices(); + const assetBasePath = useAssetBasePath(); + const { data: connectorTypes } = useConnectorTypes(); + + const connectorsIconPath = assetBasePath + '/connectors.svg'; + const connectorPath = http.basePath.prepend(`/app/connectors/${connector.id}`); + const connectorType = connectorTypes?.connectors?.find( + (cType) => cType.serviceType === connector.service_type + ); + return ( + + } + title={ + +
+ +
+
+ } + body={ + <> +

+ +

+ {!!connectorType && ( + <> + + + + + {connectorType.name} + + + )} + + } + actions={ + + + + } + /> +
+ ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/index_management/index_aliases_flyout.tsx b/x-pack/plugins/serverless_search/public/application/components/index_management/index_aliases_flyout.tsx new file mode 100644 index 0000000000000..5f87fd2ab0b81 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/index_management/index_aliases_flyout.tsx @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { + EuiBasicTable, + EuiBasicTableColumn, + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiFlyout, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiTitle, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; + +export interface IndexAliasesFlyoutProps { + aliases: string[]; + indexName: string; + onClose: () => void; +} + +export const IndexAliasesFlyout = ({ indexName, aliases, onClose }: IndexAliasesFlyoutProps) => { + const aliasItems = aliases.map((alias) => ({ name: alias })); + const columns: Array> = [ + { + field: 'name', + name: i18n.translate( + 'xpack.serverlessSearch.indexManagement.indexDetails.overview.aliasesFlyout.table.nameColumn.header', + { defaultMessage: 'Alias Name' } + ), + 'data-test-subj': 'aliasNameCell', + truncateText: false, + width: '100%', + }, + ]; + return ( + + + +

+ +

+
+
+ + + + + + + + + + + + +
+ ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/index_mappings_docs_link.tsx b/x-pack/plugins/serverless_search/public/application/components/index_management/index_mappings_docs_link.tsx similarity index 100% rename from x-pack/plugins/serverless_search/public/application/components/index_mappings_docs_link.tsx rename to x-pack/plugins/serverless_search/public/application/components/index_management/index_mappings_docs_link.tsx diff --git a/x-pack/plugins/serverless_search/public/application/components/index_management/index_overview.tsx b/x-pack/plugins/serverless_search/public/application/components/index_management/index_overview.tsx new file mode 100644 index 0000000000000..f1db8d49e038a --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/index_management/index_overview.tsx @@ -0,0 +1,271 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FunctionComponent } from 'react'; +import numeral from '@elastic/numeral'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage, FormattedPlural } from '@kbn/i18n-react'; +import { + EuiLoadingSpinner, + EuiEmptyPrompt, + EuiFlexGrid, + EuiFlexItem, + EuiFlexGroup, + EuiIcon, + EuiI18nNumber, + EuiText, + EuiBadge, + EuiButton, + EuiLink, + EuiSpacer, +} from '@elastic/eui'; + +import { Index } from '@kbn/index-management-plugin/common/types/indices'; + +import { docLinks } from '../../../../common/doc_links'; +import { useIndex } from '../../hooks/api/use_index'; + +import { BadgeList } from '../badge_list'; +import { OverviewEmptyPrompt } from './overview_empty_prompt'; +import { IndexOverviewPanel, IndexOverviewPanelStat } from './overview_panel'; +import { IndexAliasesFlyout } from './index_aliases_flyout'; + +export interface IndexDetailOverviewProps { + index: Index; +} + +export const IndexDetailOverview: FunctionComponent = ({ index }) => { + const [aliasesFlyoutOpen, setAliasesFlyoutOpen] = React.useState(false); + const { data, isLoading, isError } = useIndex(index.name); + const indexAliases = + typeof index.aliases === 'string' + ? index.aliases.length > 0 && index.aliases !== 'none' + ? [index.aliases] + : [] + : index.aliases; + + if (isLoading || !data) + return ( + } + title={ +

+ +

+ } + /> + ); + if (isError) { + return ( + + +

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 i}u9xV$CAk^8 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

+ } + body={ +

+ +

+ } + /> + ); + } + + const indexData = data.index; + return ( + <> + {aliasesFlyoutOpen && ( + setAliasesFlyoutOpen(false)} + /> + )} + + + + } + footer={ + + + + } + > + {index.data_stream ?? '--'} + + + + + } + footer={ + 0 + ? indexAliases.map((alias) => {alias}) + : [ + + + , + ] + } + /> + } + > + + + + + + + + +

+ +

+
+
+ + setAliasesFlyoutOpen(true)} + > + + + +
+
+
+ {indexData.count > 0 && ( + + + } + footer={ + + + + + + + , + deletedCount: ( + + ), + }} + /> + + + + } + > + + + + {numeral( + indexData.stats?.primaries?.store?.total_data_set_size_in_bytes ?? 0 + ).format('0 b')} + + + + +

+ +

+
+
+ + + {numeral( + indexData.stats?.total?.store?.total_data_set_size_in_bytes ?? 0 + ).format('0 b')} + + + + +

+ +

+
+
+
+
+
+ )} +
+ {indexData.count === 0 && ( + <> + + + + )} + + ); +}; + +// Default Export is needed to lazy load this react component +// eslint-disable-next-line import/no-default-export +export default IndexDetailOverview; diff --git a/x-pack/plugins/serverless_search/public/application/components/index_management/index_overview_content.tsx b/x-pack/plugins/serverless_search/public/application/components/index_management/index_overview_content.tsx new file mode 100644 index 0000000000000..373dce2557571 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/index_management/index_overview_content.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { Suspense, lazy } from 'react'; +import { CoreStart } from '@kbn/core/public'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; +import { EuiLoadingSpinner } from '@elastic/eui'; + +import { IndexContent } from '@kbn/index-management-plugin/public/services'; + +import { ServerlessSearchPluginStartDependencies } from '../../../types'; + +const IndexDetailOverview = lazy(() => import('./index_overview')); + +export const createIndexOverviewContent = ( + core: CoreStart, + services: ServerlessSearchPluginStartDependencies +): IndexContent => { + return { + renderContent: (index) => { + const queryClient = new QueryClient(); + return ( + + + + }> + + + + + ); + }, + }; +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/index_management/overview_empty_prompt.tsx b/x-pack/plugins/serverless_search/public/application/components/index_management/overview_empty_prompt.tsx new file mode 100644 index 0000000000000..b790021483e07 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/index_management/overview_empty_prompt.tsx @@ -0,0 +1,173 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + EuiEmptyPrompt, + EuiFlexItem, + EuiFlexGroup, + EuiText, + EuiButton, + EuiLink, + EuiPanel, + EuiTitle, +} from '@elastic/eui'; +import { Connector } from '@kbn/search-connectors'; + +import { docLinks } from '../../../../common/doc_links'; + +import { APIIndexEmptyPrompt } from './api_empty_prompt'; +import { ConnectorIndexEmptyPrompt } from './connector_empty_prompt'; +import { ConnectorSetupEmptyPrompt } from './connector_setup_prompt'; + +enum EmptyPromptView { + Default, + NewConnector, + API, + SetupConnector, +} + +export interface OverviewEmptyPromptProps { + indexName: string; + connector?: Connector; +} + +export const OverviewEmptyPrompt = ({ connector, indexName }: OverviewEmptyPromptProps) => { + const isConnectorIndex = !!connector; + const [currentView, setView] = React.useState( + isConnectorIndex ? EmptyPromptView.SetupConnector : EmptyPromptView.Default + ); + if (currentView === EmptyPromptView.SetupConnector) { + return ; + } + if (currentView === EmptyPromptView.NewConnector) { + return ( + setView(EmptyPromptView.Default)} + /> + ); + } + if (currentView === EmptyPromptView.API) { + return ( + setView(EmptyPromptView.Default)} + /> + ); + } + + return ( + + +
+ +
+
+ } + body={ + +

+ + {i18n.translate( + 'xpack.serverlessSearch.indexManagement.indexDetails.overview.emptyPrompt.body.logstashLink', + { defaultMessage: 'Logstash' } + )} + + ), + beatsLink: ( + + {i18n.translate( + 'xpack.serverlessSearch.indexManagement.indexDetails.overview.emptyPrompt.body.beatsLink', + { defaultMessage: 'Beats' } + )} + + ), + connectorsLink: ( + + {i18n.translate( + 'xpack.serverlessSearch.indexManagement.indexDetails.overview.emptyPrompt.body.connectorsLink', + { defaultMessage: 'connectors' } + )} + + ), + apiCallsLink: ( + + {i18n.translate( + 'xpack.serverlessSearch.indexManagement.indexDetails.overview.emptyPrompt.body.apiCallsLink', + { defaultMessage: 'API calls' } + )} + + ), + }} + /> +

+
+ } + actions={ + + + setView(EmptyPromptView.API)} + > + + + + + setView(EmptyPromptView.NewConnector)} + > + + + + + } + /> + + ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/index_management/overview_panel.tsx b/x-pack/plugins/serverless_search/public/application/components/index_management/overview_panel.tsx new file mode 100644 index 0000000000000..8b2b54e17d68e --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/index_management/overview_panel.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiSpacer, EuiSplitPanel, EuiTitle } from '@elastic/eui'; + +export interface IndexOverviewPanelProps { + title: React.ReactNode; + footer?: React.ReactNode | React.ReactNode[]; +} + +export const IndexOverviewPanel: React.FC = ({ + title, + footer, + children, +}) => ( + + + +
{title}
+
+ + {children} +
+ {footer && ( + + {footer} + + )} +
+); + +export const IndexOverviewPanelStat: React.FC = ({ children }) => ( + +

{children}

+
+); diff --git a/x-pack/plugins/serverless_search/public/application/components/languages/dotnet.ts b/x-pack/plugins/serverless_search/public/application/components/languages/dotnet.ts index 4f388d2227203..1ac3641f67fe9 100644 --- a/x-pack/plugins/serverless_search/public/application/components/languages/dotnet.ts +++ b/x-pack/plugins/serverless_search/public/application/components/languages/dotnet.ts @@ -37,6 +37,22 @@ var client = new ElasticsearchClient("${cloudId}", new ApiKey("${apiKey}"));`, }; var response = await client.IndexAsync(doc, "books");`, + ingestDataIndex: ({ apiKey, cloudId, indexName }) => `using System; +using Elastic.Clients.Elasticsearch.Serverless; +using Elastic.Clients.Elasticsearch.Serverless.QueryDsl; + +var client = new ElasticsearchClient("${cloudId}", new ApiKey("${apiKey}")); + +var doc = new Book +{ + Id = "9780553351927", + Name = "Snow Crash", + Author = "Neal Stephenson", + ReleaseDate = new DateTime(1992, 06, 01), + PageCount = 470 +}; + +var response = await client.IndexAsync(doc, "${indexName}");`, buildSearchQuery: `var response = await client.SearchAsync(s => s .Index("books") .From(0) diff --git a/x-pack/plugins/serverless_search/public/application/components/languages/java.ts b/x-pack/plugins/serverless_search/public/application/components/languages/java.ts index 23566fcc67f98..c247eb978c15b 100644 --- a/x-pack/plugins/serverless_search/public/application/components/languages/java.ts +++ b/x-pack/plugins/serverless_search/public/application/components/languages/java.ts @@ -66,6 +66,56 @@ for (Book book : books) { BulkResponse result = esClient.bulk(br.build()); +// Log errors, if any +if (result.errors()) { + logger.error("Bulk had errors"); + for (BulkResponseItem item: result.items()) { + if (item.error() != null) { + logger.error(item.error().reason()); + } + } +}`, + ingestDataIndex: ({ apiKey, indexName, url }) => `// URL and API key +String serverUrl = "${url}"; +String apiKey = "${apiKey}"; + +// Create the low-level client +RestClient restClient = RestClient + .builder(HttpHost.create(serverUrl)) + .setDefaultHeaders(new Header[]{ + new BasicHeader("Authorization", "ApiKey " + apiKey) + }) + .build(); + +// Create the transport with a Jackson mapper +ElasticsearchTransport transport = new RestClientTransport( + restClient, new JacksonJsonpMapper()); + +// And create the API client +ElasticsearchClient esClient = new ElasticsearchClient(transport); + +List books = new ArrayList<>(); +books.add(new Book("9780553351927", "Snow Crash", "Neal Stephenson", "1992-06-01", 470)); +books.add(new Book("9780441017225", "Revelation Space", "Alastair Reynolds", "2000-03-15", 585)); +books.add(new Book("9780451524935", "1984", "George Orwell", "1985-06-01", 328)); +books.add(new Book("9781451673319", "Fahrenheit 451", "Ray Bradbury", "1953-10-15", 227)); +books.add(new Book("9780060850524", "Brave New World", "Aldous Huxley", "1932-06-01", 268)); +books.add(new Book("9780385490818", "The Handmaid's Tale", "Margaret Atwood", "1985-06-01", 311)); + +BulkRequest.Builder br = new BulkRequest.Builder(); + +for (Book book : books) { + br.operations(op -> op + .index(idx -> idx + .index("${indexName}") + .id(product.getId()) + .document(book) + ) + ); +} + +BulkResponse result = esClient.bulk(br.build()); + // Log errors, if any if (result.errors()) { logger.error("Bulk had errors"); diff --git a/x-pack/plugins/serverless_search/public/application/constants.ts b/x-pack/plugins/serverless_search/public/application/constants.ts index 6c2f9775c4e04..df8d2fb1ebbc7 100644 --- a/x-pack/plugins/serverless_search/public/application/constants.ts +++ b/x-pack/plugins/serverless_search/public/application/constants.ts @@ -9,3 +9,7 @@ export const API_KEY_PLACEHOLDER = 'your_api_key'; export const ELASTICSEARCH_URL_PLACEHOLDER = 'https://your_deployment_url'; export const CLOUD_ID_PLACEHOLDER = ''; export const INDEX_NAME_PLACEHOLDER = 'index_name'; + +// Paths +export const BASE_CONNECTORS_PATH = 'connectors'; +export const EDIT_CONNECTOR_PATH = `${BASE_CONNECTORS_PATH}/:id`; diff --git a/x-pack/plugins/serverless_search/public/application/hooks/api/use_create_connector.tsx b/x-pack/plugins/serverless_search/public/application/hooks/api/use_create_connector.tsx index fc9c74b94b84b..fc70e0044529f 100644 --- a/x-pack/plugins/serverless_search/public/application/hooks/api/use_create_connector.tsx +++ b/x-pack/plugins/serverless_search/public/application/hooks/api/use_create_connector.tsx @@ -8,7 +8,7 @@ import { useEffect } from 'react'; import { generatePath } from 'react-router-dom'; import { useMutation } from '@tanstack/react-query'; import { Connector } from '@kbn/search-connectors'; -import { EDIT_CONNECTOR_PATH } from '../../components/connectors_router'; +import { EDIT_CONNECTOR_PATH } from '../../constants'; import { useKibanaServices } from '../use_kibana'; export const useCreateConnector = () => { @@ -32,9 +32,13 @@ export const useCreateConnector = () => { useEffect(() => { if (isSuccess) { - navigateToUrl(generatePath(EDIT_CONNECTOR_PATH, { id: connector?.id || '' })); + navigateToUrl( + http.basePath.prepend( + `/app/${generatePath(EDIT_CONNECTOR_PATH, { id: connector?.id || '' })}` + ) + ); } - }, [connector, isSuccess, navigateToUrl]); + }, [connector, isSuccess, navigateToUrl, http.basePath]); const createConnector = () => mutate(); return { createConnector, isLoading }; diff --git a/x-pack/plugins/serverless_search/public/application/hooks/api/use_index.tsx b/x-pack/plugins/serverless_search/public/application/hooks/api/use_index.tsx new file mode 100644 index 0000000000000..3ea8ea1588ba5 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/hooks/api/use_index.tsx @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from '@tanstack/react-query'; + +import { FetchIndexResult } from '../../../../common/types'; +import { useKibanaServices } from '../use_kibana'; + +export const useIndex = (id: string) => { + const { http } = useKibanaServices(); + const queryKey = ['fetchIndex', id]; + const result = useQuery({ + queryKey, + queryFn: () => http.fetch(`/internal/serverless_search/index/${id}`), + }); + return { queryKey, ...result }; +}; diff --git a/x-pack/plugins/serverless_search/public/plugin.ts b/x-pack/plugins/serverless_search/public/plugin.ts index f82af8390c9fc..6c6328931915e 100644 --- a/x-pack/plugins/serverless_search/public/plugin.ts +++ b/x-pack/plugins/serverless_search/public/plugin.ts @@ -15,7 +15,8 @@ import { import { i18n } from '@kbn/i18n'; import { appIds } from '@kbn/management-cards-navigation'; import { AuthenticatedUser } from '@kbn/security-plugin/common'; -import { createIndexMappingsDocsLinkContent as createIndexMappingsContent } from './application/components/index_mappings_docs_link'; +import { createIndexMappingsDocsLinkContent as createIndexMappingsContent } from './application/components/index_management/index_mappings_docs_link'; +import { createIndexOverviewContent } from './application/components/index_management/index_overview_content'; import { createServerlessSearchSideNavComponent as createComponent } from './layout/nav'; import { docLinks } from '../common/doc_links'; import { @@ -24,7 +25,7 @@ import { ServerlessSearchPluginStart, ServerlessSearchPluginStartDependencies, } from './types'; -import { createIndexOverviewContent } from './application/components/index_documents/documents_tab'; +import { createIndexDocumentsContent } from './application/components/index_documents/documents_tab'; export class ServerlessSearchPlugin implements @@ -98,9 +99,11 @@ export class ServerlessSearchPlugin }); indexManagement?.extensionsService.setIndexMappingsContent(createIndexMappingsContent(core)); indexManagement?.extensionsService.addIndexDetailsTab( + createIndexDocumentsContent(core, services) + ); + indexManagement?.extensionsService.setIndexOverviewContent( createIndexOverviewContent(core, services) ); - return {}; } diff --git a/x-pack/plugins/serverless_search/server/lib/indices/fetch_index.test.ts b/x-pack/plugins/serverless_search/server/lib/indices/fetch_index.test.ts new file mode 100644 index 0000000000000..88edecd4cfd9d --- /dev/null +++ b/x-pack/plugins/serverless_search/server/lib/indices/fetch_index.test.ts @@ -0,0 +1,142 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +jest.mock('@kbn/search-connectors', () => ({ + fetchConnectorByIndexName: jest.fn(), +})); + +import { ByteSizeValue } from '@kbn/config-schema'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import { fetchConnectorByIndexName } from '@kbn/search-connectors'; + +import { fetchIndex } from './fetch_index'; + +describe('fetch index lib function', () => { + const mockClient = { + indices: { + get: jest.fn(), + stats: jest.fn(), + }, + count: jest.fn(), + }; + const client = () => mockClient as unknown as ElasticsearchClient; + + const indexName = 'search-regular-index'; + const regularIndexResponse = { + 'search-regular-index': { + aliases: {}, + }, + }; + const regularIndexStatsResponse = { + indices: { + 'search-regular-index': { + health: 'green', + size: new ByteSizeValue(108000).toString(), + status: 'open', + total: { + docs: { + count: 100, + deleted: 0, + }, + store: { + size_in_bytes: 108000, + }, + }, + uuid: '83a81e7e-5955-4255-b008-5d6961203f57', + }, + }, + }; + const indexCountResponse = { + count: 100, + }; + const indexConnector = { + foo: 'foo', + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should return index if all client calls succeed', () => { + mockClient.indices.get.mockResolvedValue({ ...regularIndexResponse }); + mockClient.indices.stats.mockResolvedValue(regularIndexStatsResponse); + mockClient.count.mockResolvedValue(indexCountResponse); + (fetchConnectorByIndexName as unknown as jest.Mock).mockResolvedValue(indexConnector); + + expect(fetchIndex(client(), indexName)).resolves.toMatchObject({ + index: { + aliases: {}, + count: 100, + connector: indexConnector, + stats: regularIndexStatsResponse.indices[indexName], + }, + }); + }); + + it('should throw an error if get index rejects', () => { + const expectedError = new Error('Boom!'); + + mockClient.indices.get.mockRejectedValue(expectedError); + mockClient.indices.stats.mockResolvedValue(regularIndexStatsResponse); + mockClient.count.mockResolvedValue(indexCountResponse); + (fetchConnectorByIndexName as unknown as jest.Mock).mockResolvedValue(indexConnector); + + expect(fetchIndex(client(), indexName)).rejects.toEqual(expectedError); + }); + + it('should return partial data if index stats rejects', () => { + const expectedError = new Error('Boom!'); + + mockClient.indices.get.mockResolvedValue({ ...regularIndexResponse }); + mockClient.indices.stats.mockRejectedValue(expectedError); + mockClient.count.mockResolvedValue(indexCountResponse); + (fetchConnectorByIndexName as unknown as jest.Mock).mockResolvedValue(indexConnector); + + expect(fetchIndex(client(), indexName)).resolves.toMatchObject({ + index: { + aliases: {}, + count: 100, + connector: indexConnector, + }, + }); + }); + + it('should return partial data if index count rejects', () => { + const expectedError = new Error('Boom!'); + + mockClient.indices.get.mockResolvedValue({ ...regularIndexResponse }); + mockClient.indices.stats.mockResolvedValue(regularIndexStatsResponse); + mockClient.count.mockRejectedValue(expectedError); + (fetchConnectorByIndexName as unknown as jest.Mock).mockResolvedValue(indexConnector); + + expect(fetchIndex(client(), indexName)).resolves.toMatchObject({ + index: { + aliases: {}, + count: 0, + connector: indexConnector, + stats: regularIndexStatsResponse.indices[indexName], + }, + }); + }); + + it('should return partial data if fetch connector rejects', () => { + const expectedError = new Error('Boom!'); + + mockClient.indices.get.mockResolvedValue({ ...regularIndexResponse }); + mockClient.indices.stats.mockResolvedValue(regularIndexStatsResponse); + mockClient.count.mockResolvedValue(indexCountResponse); + (fetchConnectorByIndexName as unknown as jest.Mock).mockRejectedValue(expectedError); + + expect(fetchIndex(client(), indexName)).resolves.toMatchObject({ + index: { + aliases: {}, + count: 100, + stats: regularIndexStatsResponse.indices[indexName], + }, + }); + }); +}); diff --git a/x-pack/plugins/serverless_search/server/lib/indices/fetch_index.ts b/x-pack/plugins/serverless_search/server/lib/indices/fetch_index.ts new file mode 100644 index 0000000000000..000eb1c13ea0a --- /dev/null +++ b/x-pack/plugins/serverless_search/server/lib/indices/fetch_index.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import { fetchConnectorByIndexName } from '@kbn/search-connectors'; + +import { FetchIndexResult } from '../../../common/types'; + +export async function fetchIndex( + client: ElasticsearchClient, + indexName: string +): Promise { + const [indexDataResult, indexStatsResult, indexCountResult, connectorResult] = + await Promise.allSettled([ + client.indices.get({ index: indexName }), + client.indices.stats({ index: indexName }), + client.count({ index: indexName }), + fetchConnectorByIndexName(client, indexName), + ]); + if (indexDataResult.status === 'rejected') { + throw indexDataResult.reason; + } + const indexData = indexDataResult.value; + if (!indexData || !indexData[indexName]) return undefined; + + const index = indexData[indexName]; + const count = indexCountResult.status === 'fulfilled' ? indexCountResult.value.count : 0; + const connector = connectorResult.status === 'fulfilled' ? connectorResult.value : undefined; + const stats = + indexStatsResult.status === 'fulfilled' + ? indexStatsResult.value.indices?.[indexName] + : undefined; + return { + index: { + ...index, + count, + connector, + stats, + }, + }; +} diff --git a/x-pack/plugins/serverless_search/server/routes/indices_routes.ts b/x-pack/plugins/serverless_search/server/routes/indices_routes.ts index 7f165f13218f1..1e54a64642115 100644 --- a/x-pack/plugins/serverless_search/server/routes/indices_routes.ts +++ b/x-pack/plugins/serverless_search/server/routes/indices_routes.ts @@ -11,6 +11,7 @@ import { schema } from '@kbn/config-schema'; import { fetchSearchResults } from '@kbn/search-index-documents/lib'; import { DEFAULT_DOCS_PER_PAGE } from '@kbn/search-index-documents/types'; import { fetchIndices } from '../lib/indices/fetch_indices'; +import { fetchIndex } from '../lib/indices/fetch_index'; import { RouteDependencies } from '../plugin'; export const registerIndicesRoutes = ({ router, security }: RouteDependencies) => { @@ -75,6 +76,27 @@ export const registerIndicesRoutes = ({ router, security }: RouteDependencies) = } ); + router.get( + { + path: '/internal/serverless_search/index/{indexName}', + validate: { + params: schema.object({ + indexName: schema.string(), + }), + }, + }, + async (context, request, response) => { + const { client } = (await context.core).elasticsearch; + const body = await fetchIndex(client.asCurrentUser, request.params.indexName); + return body + ? response.ok({ + body, + headers: { 'content-type': 'application/json' }, + }) + : response.notFound(); + } + ); + router.post( { path: '/internal/serverless_search/indices/{index_name}/search', From f2ad0240825740ac01aff55e7ed29f08944e7678 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 20 Dec 2023 15:12:54 -0700 Subject: [PATCH 47/62] [lens] show 'View details' UI action to open clusters inspector tab when request fails (#172971) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://github.com/elastic/kibana/issues/171570 PR make the following changes 1. Consolidates data EsError logic and Lens EsError logic. This resulted in being able to remove large parts of lens error_helper.tsx file. 2. Consolidates lens WorkspacePanel error logic. Before PR configuration errors and data loading errors each rendered their own version of EuiEmptyPrompt with slightly different behavior. Now, both render WorkspaceErrors component and have the same behavior 3. Updated lens ExpressionWrapper to return original error to embeddable output. ### Test - EsError in embeddable 1. install sample web logs 2. create new dashboard 3. Click "Create visualization" 4. Drag "timestamp" field into workspace. 5. Click "Save and return" 6. Add filter ``` { "error_query": { "indices": [ { "error_type": "exception", "message": "local shard failure message 123", "name": "kibana_sample_data_logs" } ] } } ``` 7. Verify EsError and "View details" action are displayed Screenshot 2023-12-08 at 1 34 20 PM ### Test - multiple configuration errors in lens editor 1. install sample web logs 2. create new lens visualization 3. Drag "timestamp" field into workspace. 4. Add filter ``` { "error_query": { "indices": [ { "error_type": "exception", "message": "local shard failure message 123", "name": "kibana_sample_data_logs" } ] } } ``` 5. Verify EsError and "View details" action are displayed Screenshot 2023-12-08 at 1 09 22 PM ### Test - EsError in embeddable 1. install sample web logs 2. create new dashboard 3. Click "Create visualization" 4. Drag "timestamp" field into workspace. 5. Change "Vertical axis" to "Cumulative sum". Select "Field" select and hit delete key 6. Clone layer one or more times 7. Verify pagination is displayed, allowing users to click through all configuration errors Screenshot 2023-12-08 at 12 59 18 PM --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Marco Liberati --- packages/kbn-search-errors/index.ts | 2 +- .../src/__snapshots__/es_error.test.tsx.snap | 13 + .../painless_error.test.tsx.snap | 29 ++ .../__snapshots__/tsdb_error.test.tsx.snap | 18 + .../kbn-search-errors/src/create_es_error.ts | 64 ++++ .../kbn-search-errors/src/es_error.test.tsx | 71 ++-- packages/kbn-search-errors/src/es_error.tsx | 38 +-- .../src/painless_error.test.tsx | 145 ++++---- .../kbn-search-errors/src/painless_error.tsx | 87 ++--- .../src/render_search_error.ts | 13 +- .../kbn-search-errors/src/tsdb_error.test.tsx | 88 +++++ packages/kbn-search-errors/src/tsdb_error.tsx | 55 +++ packages/kbn-search-errors/src/utils.ts | 25 -- packages/kbn-search-errors/tsconfig.json | 1 - .../data/common/search/expressions/esql.ts | 4 +- .../data/common/search/expressions/essql.ts | 4 +- .../search_interceptor.test.ts | 23 +- .../search_interceptor/search_interceptor.ts | 25 +- .../components/common/error_callout.tsx | 5 +- .../embeddable_panel_error.tsx | 6 +- .../workspace_panel/workspace_errors.tsx | 53 +++ .../workspace_panel/workspace_panel.test.tsx | 6 +- .../workspace_panel/workspace_panel.tsx | 137 ++------ .../editor_frame_service/error_helper.test.ts | 317 ------------------ .../editor_frame_service/error_helper.tsx | 186 +--------- .../lens/public/embeddable/embeddable.tsx | 5 +- .../public/embeddable/expression_wrapper.tsx | 14 +- .../maps/public/classes/util/data_request.tsx | 6 +- .../translations/translations/fr-FR.json | 9 +- .../translations/translations/ja-JP.json | 9 +- .../translations/translations/zh-CN.json | 9 +- .../test/functional/page_objects/lens_page.ts | 23 +- 32 files changed, 583 insertions(+), 907 deletions(-) create mode 100644 packages/kbn-search-errors/src/__snapshots__/es_error.test.tsx.snap create mode 100644 packages/kbn-search-errors/src/__snapshots__/painless_error.test.tsx.snap create mode 100644 packages/kbn-search-errors/src/__snapshots__/tsdb_error.test.tsx.snap create mode 100644 packages/kbn-search-errors/src/create_es_error.ts create mode 100644 packages/kbn-search-errors/src/tsdb_error.test.tsx create mode 100644 packages/kbn-search-errors/src/tsdb_error.tsx delete mode 100644 packages/kbn-search-errors/src/utils.ts create mode 100644 x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_errors.tsx delete mode 100644 x-pack/plugins/lens/public/editor_frame_service/error_helper.test.ts diff --git a/packages/kbn-search-errors/index.ts b/packages/kbn-search-errors/index.ts index 0bc9893ec04a9..4847085cb5536 100644 --- a/packages/kbn-search-errors/index.ts +++ b/packages/kbn-search-errors/index.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ +export { createEsError } from './src/create_es_error'; export { isEsError, EsError } from './src/es_error'; -export { isPainlessError, PainlessError } from './src/painless_error'; export { renderSearchError } from './src/render_search_error'; export type { IEsError } from './src/types'; diff --git a/packages/kbn-search-errors/src/__snapshots__/es_error.test.tsx.snap b/packages/kbn-search-errors/src/__snapshots__/es_error.test.tsx.snap new file mode 100644 index 0000000000000..68e53db73a99a --- /dev/null +++ b/packages/kbn-search-errors/src/__snapshots__/es_error.test.tsx.snap @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`EsError should render error message 1`] = ` +
+
+    
+      The supplied interval [2q] could not be parsed as a calendar interval.
+    
+  
+
+`; diff --git a/packages/kbn-search-errors/src/__snapshots__/painless_error.test.tsx.snap b/packages/kbn-search-errors/src/__snapshots__/painless_error.test.tsx.snap new file mode 100644 index 0000000000000..643973c636019 --- /dev/null +++ b/packages/kbn-search-errors/src/__snapshots__/painless_error.test.tsx.snap @@ -0,0 +1,29 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Painless error should render error message 1`] = ` +
+ + Error executing runtime field or scripted field on data view logs + + + + invalid +^---- HERE + + + cannot resolve symbol [invalid] + +
+`; diff --git a/packages/kbn-search-errors/src/__snapshots__/tsdb_error.test.tsx.snap b/packages/kbn-search-errors/src/__snapshots__/tsdb_error.test.tsx.snap new file mode 100644 index 0000000000000..adc0412c175b7 --- /dev/null +++ b/packages/kbn-search-errors/src/__snapshots__/tsdb_error.test.tsx.snap @@ -0,0 +1,18 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Tsdb error should render error message 1`] = ` +
+

+ The field [bytes_counter] of Time series type [counter] has been used with the unsupported operation [sum]. +

+ + See more about Time series field types and [counter] supported aggregations + +
+`; diff --git a/packages/kbn-search-errors/src/create_es_error.ts b/packages/kbn-search-errors/src/create_es_error.ts new file mode 100644 index 0000000000000..ffde06eb728f7 --- /dev/null +++ b/packages/kbn-search-errors/src/create_es_error.ts @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { estypes } from '@elastic/elasticsearch'; +import { i18n } from '@kbn/i18n'; +import type { ApplicationStart, CoreStart } from '@kbn/core/public'; +import type { DataView } from '@kbn/data-views-plugin/common'; +import { IEsError } from './types'; +import { EsError } from './es_error'; +import { PainlessError } from './painless_error'; +import { TsdbError } from './tsdb_error'; + +export interface Services { + application: ApplicationStart; + docLinks: CoreStart['docLinks']; +} + +function getNestedCauses(errorCause: estypes.ErrorCause): estypes.ErrorCause[] { + // Give shard failures priority, then try to get the error navigating nested objects + if (errorCause.failed_shards) { + return (errorCause.failed_shards as estypes.ShardFailure[]).map( + (shardFailure) => shardFailure.reason + ); + } + return errorCause.caused_by ? getNestedCauses(errorCause.caused_by) : [errorCause]; +} + +export function createEsError( + err: IEsError, + openInInspector: () => void, + services: Services, + dataView?: DataView +) { + const rootCauses = err.attributes?.error ? getNestedCauses(err.attributes?.error) : []; + + const painlessCause = rootCauses.find((errorCause) => { + return errorCause.lang && errorCause.lang === 'painless'; + }); + if (painlessCause) { + return new PainlessError(err, openInInspector, painlessCause, services.application, dataView); + } + + const tsdbCause = rootCauses.find((errorCause) => { + return ( + errorCause.type === 'illegal_argument_exception' && + errorCause.reason && + /\]\[counter\] is not supported for aggregation/.test(errorCause.reason) + ); + }); + if (tsdbCause) { + return new TsdbError(err, openInInspector, tsdbCause, services.docLinks); + } + + const causeReason = rootCauses[0]?.reason ?? err.attributes?.error?.reason; + const message = causeReason + ? causeReason + : i18n.translate('searchErrors.esError.unknownRootCause', { defaultMessage: 'unknown' }); + return new EsError(err, message, openInInspector); +} diff --git a/packages/kbn-search-errors/src/es_error.test.tsx b/packages/kbn-search-errors/src/es_error.test.tsx index 7f82faf685aba..1304b154d1090 100644 --- a/packages/kbn-search-errors/src/es_error.test.tsx +++ b/packages/kbn-search-errors/src/es_error.test.tsx @@ -6,41 +6,31 @@ * Side Public License, v 1. */ -import { EsError } from './es_error'; -import { IEsError } from './types'; +import type { ReactElement } from 'react'; +import type { CoreStart } from '@kbn/core/public'; +import { createEsError } from './create_es_error'; +import { renderSearchError } from './render_search_error'; +import { shallow } from 'enzyme'; +import { coreMock } from '@kbn/core/public/mocks'; -describe('EsError', () => { - it('contains the same body as the wrapped error', () => { - const error = { - statusCode: 500, - message: 'nope', - attributes: { - error: { - type: 'top_level_exception_type', - reason: 'top-level reason', - }, +const services = { + application: coreMock.createStart().application, + docLinks: { + links: { + fleet: { + datastreamsTSDSMetrics: '', }, - } as IEsError; - const esError = new EsError(error, () => {}); - - expect(typeof esError.attributes).toEqual('object'); - expect(esError.attributes).toEqual(error.attributes); - }); + }, + } as CoreStart['docLinks'], +}; - it('contains some explanation of the error in the message', () => { - // error taken from Vega's issue - const error = { - message: - 'x_content_parse_exception: [x_content_parse_exception] Reason: [1:78] [date_histogram] failed to parse field [calendar_interval]', +describe('EsError', () => { + const esError = createEsError( + { statusCode: 400, + message: 'search_phase_execution_exception', attributes: { error: { - root_cause: [ - { - type: 'x_content_parse_exception', - reason: '[1:78] [date_histogram] failed to parse field [calendar_interval]', - }, - ], type: 'x_content_parse_exception', reason: '[1:78] [date_histogram] failed to parse field [calendar_interval]', caused_by: { @@ -49,10 +39,27 @@ describe('EsError', () => { }, }, }, - } as IEsError; - const esError = new EsError(error, () => {}); + }, + () => {}, + services + ); + + test('should set error.message to root "error cause" reason', () => { expect(esError.message).toEqual( - 'EsError: The supplied interval [2q] could not be parsed as a calendar interval.' + 'The supplied interval [2q] could not be parsed as a calendar interval.' ); }); + + test('should render error message', () => { + const searchErrorDisplay = renderSearchError(esError); + expect(searchErrorDisplay).not.toBeUndefined(); + const wrapper = shallow(searchErrorDisplay?.body as ReactElement); + expect(wrapper).toMatchSnapshot(); + }); + + test('should return 1 action', () => { + const searchErrorDisplay = renderSearchError(esError); + expect(searchErrorDisplay).not.toBeUndefined(); + expect(searchErrorDisplay?.actions?.length).toBe(1); + }); }); diff --git a/packages/kbn-search-errors/src/es_error.tsx b/packages/kbn-search-errors/src/es_error.tsx index 8a5ab1ad3c503..cd8c842d997d8 100644 --- a/packages/kbn-search-errors/src/es_error.tsx +++ b/packages/kbn-search-errors/src/es_error.tsx @@ -7,11 +7,9 @@ */ import React from 'react'; -import { EuiButton, EuiCodeBlock, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import type { ApplicationStart } from '@kbn/core/public'; -import { IEsError } from './types'; -import { getRootCause } from './utils'; +import { EuiButton, EuiCodeBlock } from '@elastic/eui'; +import type { IEsError } from './types'; /** * Checks if a given errors originated from Elasticsearch. @@ -24,39 +22,25 @@ export function isEsError(e: any): e is IEsError { } export class EsError extends Error { - readonly attributes: IEsError['attributes']; + public readonly attributes: IEsError['attributes']; + private readonly openInInspector: () => void; - constructor(protected readonly err: IEsError, private readonly openInInspector: () => void) { - super( - `EsError: ${ - getRootCause(err?.attributes?.error)?.reason || - i18n.translate('searchErrors.esError.unknownRootCause', { defaultMessage: 'unknown' }) - }` - ); + constructor(err: IEsError, message: string, openInInspector: () => void) { + super(message); this.attributes = err.attributes; + this.openInInspector = openInInspector; Object.setPrototypeOf(this, new.target.prototype); } public getErrorMessage() { - if (!this.attributes?.error) { - return null; - } - - const rootCause = getRootCause(this.attributes.error)?.reason; - const topLevelCause = this.attributes.error.reason; - const cause = rootCause ?? topLevelCause; - return ( - <> - - - {cause} - - + + {this.message} + ); } - public getActions(application: ApplicationStart) { + public getActions() { return [ { - beforeEach(() => { - jest.clearAllMocks(); - }); +const dataViewMock = { + title: 'logs', + id: '1234', +} as unknown as DataView; - it('Should show reason and code', () => { - const e = new PainlessError( - { - statusCode: 400, - message: 'search_phase_execution_exception', - attributes: { - error: searchPhaseException.error, +describe('Painless error', () => { + const painlessError = createEsError( + { + statusCode: 400, + message: 'search_phase_execution_exception', + attributes: { + error: { + type: 'search_phase_execution_exception', + reason: 'all shards failed', + failed_shards: [ + { + shard: 0, + index: '.kibana_11', + node: 'b3HX8C96Q7q1zgfVLxEsPA', + reason: { + type: 'script_exception', + reason: 'compile error', + script_stack: ['invalid', '^---- HERE'], + script: 'invalid', + lang: 'painless', + position: { + offset: 0, + start: 0, + end: 7, + }, + caused_by: { + type: 'illegal_argument_exception', + reason: 'cannot resolve symbol [invalid]', + }, + }, + }, + ], }, }, - () => {} - ); - const component = mount(e.getErrorMessage()); - - const failedShards = searchPhaseException.error.failed_shards![0]; + }, + () => {}, + servicesMock, + dataViewMock + ); - const stackTraceElem = findTestSubject(component, 'painlessStackTrace').getDOMNode(); - const stackTrace = failedShards!.reason.script_stack!.splice(-2).join('\n'); - expect(stackTraceElem.textContent).toBe(stackTrace); + test('should set error.message to painless reason', () => { + expect(painlessError.message).toEqual( + 'Error executing runtime field or scripted field on data view logs' + ); + }); - const humanReadableError = findTestSubject( - component, - 'painlessHumanReadableError' - ).getDOMNode(); - expect(humanReadableError.textContent).toBe(failedShards?.reason.caused_by?.reason); + test('should render error message', () => { + const searchErrorDisplay = renderSearchError(painlessError); + expect(searchErrorDisplay).not.toBeUndefined(); + const wrapper = shallow(searchErrorDisplay?.body as ReactElement); + expect(wrapper).toMatchSnapshot(); + }); - const actions = e.getActions(startMock.application); - expect(actions.length).toBe(2); + test('should return 2 actions', () => { + const searchErrorDisplay = renderSearchError(painlessError); + expect(searchErrorDisplay).not.toBeUndefined(); + expect(searchErrorDisplay?.actions?.length).toBe(2); }); }); diff --git a/packages/kbn-search-errors/src/painless_error.tsx b/packages/kbn-search-errors/src/painless_error.tsx index 08657ea134ab6..79fd737f055ab 100644 --- a/packages/kbn-search-errors/src/painless_error.tsx +++ b/packages/kbn-search-errors/src/painless_error.tsx @@ -7,43 +7,58 @@ */ import React from 'react'; +import { estypes } from '@elastic/elasticsearch'; +import type { ApplicationStart } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import { EuiButtonEmpty, EuiSpacer, EuiText, EuiCodeBlock } from '@elastic/eui'; -import type { ApplicationStart } from '@kbn/core/public'; import type { DataView } from '@kbn/data-views-plugin/common'; import type { IEsError } from './types'; -import { EsError, isEsError } from './es_error'; -import { getRootCause } from './utils'; +import { EsError } from './es_error'; export class PainlessError extends EsError { - painlessStack?: string; - indexPattern?: DataView; - constructor(err: IEsError, openInInspector: () => void, indexPattern?: DataView) { - super(err, openInInspector); - this.indexPattern = indexPattern; + private readonly applicationStart: ApplicationStart; + private readonly painlessCause: estypes.ErrorCause; + private readonly dataView?: DataView; + + constructor( + err: IEsError, + openInInspector: () => void, + painlessCause: estypes.ErrorCause, + applicationStart: ApplicationStart, + dataView?: DataView + ) { + super( + err, + i18n.translate('searchErrors.painlessError.painlessScriptedFieldErrorMessage', { + defaultMessage: + 'Error executing runtime field or scripted field on data view {indexPatternName}', + values: { + indexPatternName: dataView?.title || '', + }, + }), + openInInspector + ); + this.applicationStart = applicationStart; + this.painlessCause = painlessCause; + this.dataView = dataView; } public getErrorMessage() { - const rootCause = getRootCause(this.err.attributes?.error); - const scriptFromStackTrace = rootCause?.script_stack - ? rootCause?.script_stack?.slice(-2).join('\n') + const scriptFromStackTrace = this.painlessCause?.script_stack + ? this.painlessCause?.script_stack?.slice(-2).join('\n') : undefined; // if the error has been properly processed it will highlight where it occurred. - const hasScript = rootCause?.script_stack?.slice(-1)[0]?.indexOf('HERE') || -1 >= 0; - const humanReadableError = rootCause?.caused_by?.reason; + const hasScript = this.painlessCause?.script_stack?.slice(-1)[0]?.indexOf('HERE') || -1 >= 0; + const humanReadableError = this.painlessCause?.caused_by?.reason; // fallback, show ES stacktrace - const painlessStack = rootCause?.script_stack ? rootCause?.script_stack.join('\n') : undefined; + const painlessStack = this.painlessCause?.script_stack + ? this.painlessCause?.script_stack.join('\n') + : undefined; return ( - <> +
- {i18n.translate('searchErrors.painlessError.painlessScriptedFieldErrorMessage', { - defaultMessage: - 'Error executing runtime field or scripted field on index pattern {indexPatternName}', - values: { - indexPatternName: this?.indexPattern?.title, - }, - })} + {this.message} {scriptFromStackTrace || painlessStack ? ( @@ -56,21 +71,21 @@ export class PainlessError extends EsError { {humanReadableError} ) : null} - +
); } - getActions(application: ApplicationStart) { - function onClick(indexPatternId?: string) { - application.navigateToApp('management', { - path: `/kibana/indexPatterns${indexPatternId ? `/patterns/${indexPatternId}` : ''}`, - }); - } - const actions = super.getActions(application) ?? []; + getActions() { + const actions = super.getActions() ?? []; actions.push( onClick(this?.indexPattern?.id)} + onClick={() => () => { + const dataViewId = this.dataView?.id; + this.applicationStart.navigateToApp('management', { + path: `/kibana/indexPatterns${dataViewId ? `/patterns/${dataViewId}` : ''}`, + }); + }} size="s" > {i18n.translate('searchErrors.painlessError.buttonTxt', { @@ -81,13 +96,3 @@ export class PainlessError extends EsError { return actions; } } - -export function isPainlessError(err: Error | IEsError) { - if (!isEsError(err)) return false; - - const rootCause = getRootCause((err as IEsError).attributes?.error); - if (!rootCause) return false; - - const { lang } = rootCause; - return lang === 'painless'; -} diff --git a/packages/kbn-search-errors/src/render_search_error.ts b/packages/kbn-search-errors/src/render_search_error.ts index 73dd298877cca..85dc2486d7a16 100644 --- a/packages/kbn-search-errors/src/render_search_error.ts +++ b/packages/kbn-search-errors/src/render_search_error.ts @@ -9,23 +9,18 @@ import { i18n } from '@kbn/i18n'; import { ReactNode } from 'react'; import { BfetchRequestError } from '@kbn/bfetch-error'; -import type { ApplicationStart } from '@kbn/core-application-browser'; import { EsError } from './es_error'; -export function renderSearchError({ - error, - application, -}: { - error: Error; - application: ApplicationStart; -}): { title: string; body: ReactNode; actions?: ReactNode[] } | undefined { +export function renderSearchError( + error: Error +): { title: string; body: ReactNode; actions?: ReactNode[] } | undefined { if (error instanceof EsError) { return { title: i18n.translate('searchErrors.search.esErrorTitle', { defaultMessage: 'Cannot retrieve search results', }), body: error.getErrorMessage(), - actions: error.getActions(application), + actions: error.getActions(), }; } diff --git a/packages/kbn-search-errors/src/tsdb_error.test.tsx b/packages/kbn-search-errors/src/tsdb_error.test.tsx new file mode 100644 index 0000000000000..d272938853da6 --- /dev/null +++ b/packages/kbn-search-errors/src/tsdb_error.test.tsx @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { ReactElement } from 'react'; +import type { CoreStart } from '@kbn/core/public'; +import { createEsError } from './create_es_error'; +import { renderSearchError } from './render_search_error'; +import { shallow } from 'enzyme'; +import { coreMock } from '@kbn/core/public/mocks'; + +const servicesMock = { + application: coreMock.createStart().application, + docLinks: { + links: { + fleet: { + datastreamsTSDSMetrics: '', + }, + }, + } as CoreStart['docLinks'], +}; + +describe('Tsdb error', () => { + const tsdbError = createEsError( + { + statusCode: 400, + message: 'search_phase_execution_exception', + attributes: { + error: { + type: 'status_exception', + reason: 'error while executing search', + caused_by: { + type: 'search_phase_execution_exception', + reason: 'all shards failed', + phase: 'query', + grouped: true, + failed_shards: [ + { + shard: 0, + index: 'tsdb_index', + reason: { + type: 'illegal_argument_exception', + reason: + 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', + }, + }, + ], + caused_by: { + type: 'illegal_argument_exception', + reason: + 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', + caused_by: { + type: 'illegal_argument_exception', + reason: + 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', + }, + }, + }, + }, + }, + }, + () => {}, + servicesMock + ); + + test('should set error.message to tsdb reason', () => { + expect(tsdbError.message).toEqual( + 'The field [bytes_counter] of Time series type [counter] has been used with the unsupported operation [sum].' + ); + }); + + test('should render error message', () => { + const searchErrorDisplay = renderSearchError(tsdbError); + expect(searchErrorDisplay).not.toBeUndefined(); + const wrapper = shallow(searchErrorDisplay?.body as ReactElement); + expect(wrapper).toMatchSnapshot(); + }); + + test('should return 1 actions', () => { + const searchErrorDisplay = renderSearchError(tsdbError); + expect(searchErrorDisplay).not.toBeUndefined(); + expect(searchErrorDisplay?.actions?.length).toBe(1); + }); +}); diff --git a/packages/kbn-search-errors/src/tsdb_error.tsx b/packages/kbn-search-errors/src/tsdb_error.tsx new file mode 100644 index 0000000000000..2f51665df699e --- /dev/null +++ b/packages/kbn-search-errors/src/tsdb_error.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { estypes } from '@elastic/elasticsearch'; +import type { CoreStart } from '@kbn/core/public'; +import { i18n } from '@kbn/i18n'; +import { EuiLink } from '@elastic/eui'; +import type { IEsError } from './types'; +import { EsError } from './es_error'; + +export class TsdbError extends EsError { + private readonly docLinks: CoreStart['docLinks']; + + constructor( + err: IEsError, + openInInspector: () => void, + tsdbCause: estypes.ErrorCause, + docLinks: CoreStart['docLinks'] + ) { + const [fieldName, _type, _isCounter, opUsed] = tsdbCause.reason!.match(/\[(\w)*\]/g)!; + super( + err, + i18n.translate('searchErrors.tsdbError.message', { + defaultMessage: + 'The field {field} of Time series type [counter] has been used with the unsupported operation {op}.', + values: { + field: fieldName, + op: opUsed, + }, + }), + openInInspector + ); + this.docLinks = docLinks; + } + + public getErrorMessage() { + return ( +
+

{this.message}

+ + {i18n.translate('searchErrors.tsdbError.tsdbCounterDocsLabel', { + defaultMessage: + 'See more about Time series field types and [counter] supported aggregations', + })} + +
+ ); + } +} diff --git a/packages/kbn-search-errors/src/utils.ts b/packages/kbn-search-errors/src/utils.ts deleted file mode 100644 index e1e2c51f87f3c..0000000000000 --- a/packages/kbn-search-errors/src/utils.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { estypes } from '@elastic/elasticsearch'; - -function getFailedShardCause(error: estypes.ErrorCause): estypes.ErrorCause | undefined { - const failedShards = error.failed_shards || error.caused_by?.failed_shards; - return failedShards ? failedShards[0]?.reason : undefined; -} - -function getNestedCause(error: estypes.ErrorCause): estypes.ErrorCause { - return error.caused_by ? getNestedCause(error.caused_by) : error; -} - -export function getRootCause(error?: estypes.ErrorCause): estypes.ErrorCause | undefined { - return error - ? // Give shard failures priority, then try to get the error navigating nested objects - getFailedShardCause(error) || getNestedCause(error) - : undefined; -} diff --git a/packages/kbn-search-errors/tsconfig.json b/packages/kbn-search-errors/tsconfig.json index 7c50a64bd11ee..d7cb9d82c63a5 100644 --- a/packages/kbn-search-errors/tsconfig.json +++ b/packages/kbn-search-errors/tsconfig.json @@ -20,7 +20,6 @@ "@kbn/core", "@kbn/kibana-utils-plugin", "@kbn/data-views-plugin", - "@kbn/core-application-browser", "@kbn/bfetch-error", ] } diff --git a/src/plugins/data/common/search/expressions/esql.ts b/src/plugins/data/common/search/expressions/esql.ts index ca6096c8160df..e1eb3bb7be452 100644 --- a/src/plugins/data/common/search/expressions/esql.ts +++ b/src/plugins/data/common/search/expressions/esql.ts @@ -208,10 +208,10 @@ export const getEsqlFn = ({ getStartDependencies }: EsqlFnArguments) => { IKibanaSearchResponse >({ params }, { abortSignal, strategy: ESQL_SEARCH_STRATEGY }).pipe( catchError((error) => { - if (!error.err) { + if (!error.attributes) { error.message = `Unexpected error from Elasticsearch: ${error.message}`; } else { - const { type, reason } = extractTypeAndReason(error.err.attributes); + const { type, reason } = extractTypeAndReason(error.attributes); if (type === 'parsing_exception') { error.message = `Couldn't parse Elasticsearch ES|QL query. Check your query and try again. Error: ${reason}`; } else { diff --git a/src/plugins/data/common/search/expressions/essql.ts b/src/plugins/data/common/search/expressions/essql.ts index 5012f01a749ac..b27d9137445f6 100644 --- a/src/plugins/data/common/search/expressions/essql.ts +++ b/src/plugins/data/common/search/expressions/essql.ts @@ -203,10 +203,10 @@ export const getEssqlFn = ({ getStartDependencies }: EssqlFnArguments) => { { abortSignal, strategy: SQL_SEARCH_STRATEGY } ).pipe( catchError((error) => { - if (!error.err) { + if (!error.attributes) { error.message = `Unexpected error from Elasticsearch: ${error.message}`; } else { - const { type, reason } = error.err.attributes; + const { type, reason } = error.attributes; if (type === 'parsing_exception') { error.message = `Couldn't parse Elasticsearch SQL query. You may need to add double quotes to names containing special characters. Check your query and try again. Error: ${reason}`; } else { diff --git a/src/plugins/data/public/search/search_interceptor/search_interceptor.test.ts b/src/plugins/data/public/search/search_interceptor/search_interceptor.test.ts index 1c6bc41e33216..4a2b6f27e9e9b 100644 --- a/src/plugins/data/public/search/search_interceptor/search_interceptor.test.ts +++ b/src/plugins/data/public/search/search_interceptor/search_interceptor.test.ts @@ -12,7 +12,7 @@ import { coreMock, themeServiceMock } from '@kbn/core/public/mocks'; import { IEsSearchRequest } from '../../../common/search'; import { SearchInterceptor } from './search_interceptor'; import { AbortError } from '@kbn/kibana-utils-plugin/public'; -import { PainlessError, EsError, type IEsError } from '@kbn/search-errors'; +import { EsError, type IEsError } from '@kbn/search-errors'; import { ISessionService, SearchSessionState } from '..'; import { bfetchPluginMock } from '@kbn/bfetch-plugin/public/mocks'; import { BfetchPublicSetup } from '@kbn/bfetch-plugin/public'; @@ -157,9 +157,9 @@ describe('SearchInterceptor', () => { expect(mockCoreSetup.notifications.toasts.addError).not.toBeCalled(); }); - test('Renders a PainlessError', async () => { + test('Renders a EsError', async () => { searchInterceptor.showError( - new PainlessError( + new EsError( { statusCode: 400, message: 'search_phase_execution_exception', @@ -167,6 +167,7 @@ describe('SearchInterceptor', () => { error: searchPhaseException.error, }, }, + 'search_phase_execution_exception', () => {} ) ); @@ -1467,22 +1468,6 @@ describe('SearchInterceptor', () => { }); }); - test('Should throw Painless error on server error with OSS format', async () => { - const mockResponse: IEsError = { - statusCode: 400, - message: 'search_phase_execution_exception', - attributes: { - error: searchPhaseException.error, - }, - }; - fetchMock.mockRejectedValueOnce(mockResponse); - const mockRequest: IEsSearchRequest = { - params: {}, - }; - const response = searchInterceptor.search(mockRequest); - await expect(response.toPromise()).rejects.toThrow(PainlessError); - }); - test('Should throw ES error on ES server error', async () => { const mockResponse: IEsError = { statusCode: 400, diff --git a/src/plugins/data/public/search/search_interceptor/search_interceptor.ts b/src/plugins/data/public/search/search_interceptor/search_interceptor.ts index 8bae4b3fc7c12..9fcb74e339403 100644 --- a/src/plugins/data/public/search/search_interceptor/search_interceptor.ts +++ b/src/plugins/data/public/search/search_interceptor/search_interceptor.ts @@ -50,13 +50,7 @@ import { BatchedFunc, BfetchPublicSetup, DISABLE_BFETCH } from '@kbn/bfetch-plug import { toMountPoint } from '@kbn/kibana-react-plugin/public'; import { AbortError, KibanaServerError } from '@kbn/kibana-utils-plugin/public'; import { BfetchRequestError } from '@kbn/bfetch-error'; -import { - EsError, - isEsError, - isPainlessError, - PainlessError, - renderSearchError, -} from '@kbn/search-errors'; +import { createEsError, isEsError, renderSearchError } from '@kbn/search-errors'; import { ENHANCED_ES_SEARCH_STRATEGY, IAsyncSearchOptions, @@ -238,9 +232,15 @@ export class SearchInterceptor { } ); }; - return isPainlessError(e) - ? new PainlessError(e, openInInspector, options?.indexPattern) - : new EsError(e, openInInspector); + return createEsError( + e, + openInInspector, + { + application: this.application, + docLinks: this.docLinks, + }, + options?.indexPattern + ); } return e instanceof Error ? e : new Error(e.message); @@ -585,10 +585,7 @@ export class SearchInterceptor { return; } - const searchErrorDisplay = renderSearchError({ - error: e, - application: this.application, - }); + const searchErrorDisplay = renderSearchError(e); if (searchErrorDisplay) { this.deps.toasts.addDanger({ diff --git a/src/plugins/discover/public/components/common/error_callout.tsx b/src/plugins/discover/public/components/common/error_callout.tsx index a2aa2b478a3dc..3fb91f196ee3a 100644 --- a/src/plugins/discover/public/components/common/error_callout.tsx +++ b/src/plugins/discover/public/components/common/error_callout.tsx @@ -22,10 +22,7 @@ export const ErrorCallout = ({ title, error }: Props) => { const { core } = useDiscoverServices(); const { euiTheme } = useEuiTheme(); - const searchErrorDisplay = renderSearchError({ - error, - application: core.application, - }); + const searchErrorDisplay = renderSearchError(error); return ( ; + title: string; +} + +export function WorkspaceErrors(props: Props) { + const [activePage, setActivePage] = useState(0); + + const activeError = props.errors.length ? props.errors[activePage] : ''; + + return ( + 1 ? ( + + + + + + ) : ( + [] + ) + } + body={ +
+ {typeof activeError === 'string' ? activeError : activeError.longMessage} +
+ } + title={

{props.title}

} + iconColor="danger" + iconType="warning" + data-test-subj="lnsWorkspaceErrors" + /> + ); +} diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.test.tsx index a8e834e43881c..930dd4940171c 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.test.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.test.tsx @@ -703,9 +703,9 @@ describe('workspace_panel', () => { instance.update(); // EuiFlexItem duplicates internally the attribute, so we need to filter only the most inner one here - expect( - instance.find('[data-test-subj="workspace-more-errors-button"]').last().text() - ).toEqual(' +1 error'); + expect(instance.find('[data-test-subj="workspace-error-message"]').last().text()).toEqual( + `i'm an error` + ); expect(instance.find(expressionRendererMock)).toHaveLength(0); expect(getUserMessages).toHaveBeenCalledWith(['visualization', 'visualizationInEditor'], { severity: 'error', diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx index bc3b71c08487a..18ea4791d6847 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx @@ -12,16 +12,7 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { toExpression } from '@kbn/interpreter'; import type { KibanaExecutionContext } from '@kbn/core-execution-context-common'; import { i18n } from '@kbn/i18n'; -import { - EuiEmptyPrompt, - EuiFlexGroup, - EuiFlexItem, - EuiText, - EuiButtonEmpty, - EuiLink, - EuiTextColor, - EuiSpacer, -} from '@elastic/eui'; +import { EuiText, EuiButtonEmpty, EuiLink, EuiTextColor } from '@elastic/eui'; import type { CoreStart } from '@kbn/core/public'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { @@ -83,6 +74,7 @@ import { import type { LensInspector } from '../../../lens_inspector_service'; import { inferTimeField, DONT_CLOSE_DIMENSION_CONTAINER_ON_CLICK_CLASS } from '../../../utils'; import { setChangesApplied } from '../../../state_management/lens_slice'; +import { WorkspaceErrors } from './workspace_errors'; export interface WorkspacePanelProps { visualizationMap: VisualizationMap; @@ -98,7 +90,6 @@ export interface WorkspacePanelProps { } interface WorkspaceState { - expandError: boolean; expressionToRender: string | null | undefined; errors: UserMessage[]; } @@ -166,7 +157,6 @@ export const InnerWorkspacePanel = React.memo(function InnerWorkspacePanel({ const searchSessionId = useLensSelector(selectSearchSessionId); const [localState, setLocalState] = useState({ - expandError: false, expressionToRender: undefined, errors: [], }); @@ -724,75 +714,35 @@ export const VisualizationWrapper = ({ const searchSessionId = useLensSelector(selectSearchSessionId); if (errors.length) { - const showExtraErrorsAction = - !localState.expandError && errors.length > 1 ? ( - { - setLocalState((prevState: WorkspaceState) => ({ - ...prevState, - expandError: !prevState.expandError, - })); - }} - data-test-subj="workspace-more-errors-button" - > - {i18n.translate('xpack.lens.editorFrame.configurationFailureMoreErrors', { - defaultMessage: ` +{errors} {errors, plural, one {error} other {errors}}`, - values: { errors: errors.length - 1 }, - })} - - ) : null; - - const [firstMessage, ...rest] = errors; - + const configurationErrorTitle = i18n.translate( + 'xpack.lens.editorFrame.configurationFailureErrors', + { + defaultMessage: `A configuration error occurred`, + } + ); return ( - - - -
{firstMessage.longMessage}
- {localState.expandError && ( - <> - - {rest.map((message) => ( -
- {message.longMessage} - -
- ))} - - )} - - } - iconColor="danger" - iconType="warning" - /> -
-
+ + ); } + const dataLoadingErrorTitle = i18n.translate('xpack.lens.editorFrame.dataFailure', { + defaultMessage: `An error occurred when loading data`, + }); + return (
{ - const errorsFromRequest = getOriginalRequestErrorMessages(error || null, core.docLinks); + const errorsFromRequest = getOriginalRequestErrorMessages(error || null); const visibleErrorMessages = errorsFromRequest.length - ? errorsFromRequest.map((e) => e.longMessage || e.shortMessage) + ? errorsFromRequest : errorMessage ? [errorMessage] : []; @@ -820,54 +770,7 @@ export const VisualizationWrapper = ({ setDynamicError(true); } - return ( - - - { - setLocalState((prevState: WorkspaceState) => ({ - ...prevState, - expandError: !prevState.expandError, - })); - }} - > - {i18n.translate('xpack.lens.editorFrame.expandRenderingErrorButton', { - defaultMessage: 'Show details of error', - })} - - ) : null - } - body={ - <> -

- -

- - {localState.expandError - ? visibleErrorMessages.map((visibleErrorMessage) => - typeof visibleErrorMessage === 'string' ? ( -

- {visibleErrorMessage} -

- ) : ( - visibleErrorMessage - ) - ) - : null} - - } - iconColor="danger" - iconType="warning" - /> -
-
- ); + return ; }} />
diff --git a/x-pack/plugins/lens/public/editor_frame_service/error_helper.test.ts b/x-pack/plugins/lens/public/editor_frame_service/error_helper.test.ts deleted file mode 100644 index 7e3b696a8e75f..0000000000000 --- a/x-pack/plugins/lens/public/editor_frame_service/error_helper.test.ts +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { getOriginalRequestErrorMessages } from './error_helper'; -import type { CoreStart } from '@kbn/core/public'; - -const docLinksMock = { links: { fleet: { datastreamsTSDSMetrics: '' } } } as CoreStart['docLinks']; - -const runtimeFieldError = { - stack: 'Error: EsError\n...', - message: '[lens_merge_tables] > [esaggs] > EsError', - name: 'Error', - original: { - name: 'Error', - message: 'Something', - err: { - message: 'status_exception', - statusCode: 400, - attributes: { - error: { - type: 'status_exception', - reason: 'error while executing search', - caused_by: { - type: 'search_phase_execution_exception', - reason: 'all shards failed', - phase: 'query', - grouped: true, - failed_shards: [ - { - shard: 0, - index: 'indexpattern_source', - node: 'jtqB1-UhQluyjeXIpQFqAA', - reason: { - type: 'script_exception', - reason: 'runtime error', - script_stack: [ - 'java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)', - 'java.base/java.lang.Integer.parseInt(Integer.java:652)', - 'java.base/java.lang.Integer.parseInt(Integer.java:770)', - "emit(Integer.parseInt('hello'))", - ' ^---- HERE', - ], - script: "emit(Integer.parseInt('hello'))", - lang: 'painless', - position: { offset: 12, start: 0, end: 31 }, - caused_by: { - type: 'number_format_exception', - reason: 'For input string: "hello"', - }, - }, - }, - ], - }, - }, - }, - }, - attributes: { - error: { - type: 'status_exception', - reason: 'error while executing search', - caused_by: { - type: 'search_phase_execution_exception', - reason: 'all shards failed', - phase: 'query', - grouped: true, - failed_shards: [ - { - shard: 0, - index: 'indexpattern_source', - node: 'jtqB1-UhQluyjeXIpQFqAA', - reason: { - type: 'script_exception', - reason: 'runtime error', - script_stack: [ - 'java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)', - 'java.base/java.lang.Integer.parseInt(Integer.java:652)', - 'java.base/java.lang.Integer.parseInt(Integer.java:770)', - "emit(Integer.parseInt('hello'))", - ' ^---- HERE', - ], - script: "emit(Integer.parseInt('hello'))", - lang: 'painless', - position: { offset: 12, start: 0, end: 31 }, - caused_by: { type: 'number_format_exception', reason: 'For input string: "hello"' }, - }, - }, - ], - }, - }, - }, - }, -}; - -const scriptedFieldError = { - stack: 'Error: EsError\n...', - message: '[lens_merge_tables] > [esaggs] > EsError', - name: 'Error', - original: { - name: 'Error', - message: 'Some description', - err: { - message: 'status_exception', - statusCode: 500, - attributes: { - error: { - type: 'status_exception', - reason: 'error while executing search', - caused_by: { - type: 'search_phase_execution_exception', - reason: 'all shards failed', - phase: 'query', - grouped: true, - failed_shards: [ - { - shard: 0, - index: 'indexpattern_source', - node: 'jtqB1-UhQluyjeXIpQFqAA', - reason: { - type: 'aggregation_execution_exception', - reason: 'Unsupported script value [hello], expected a number, date, or boolean', - }, - }, - ], - }, - }, - }, - }, - attributes: { - error: { - type: 'status_exception', - reason: 'error while executing search', - caused_by: { - type: 'search_phase_execution_exception', - reason: 'all shards failed', - phase: 'query', - grouped: true, - failed_shards: [ - { - shard: 0, - index: 'indexpattern_source', - node: 'jtqB1-UhQluyjeXIpQFqAA', - reason: { - type: 'aggregation_execution_exception', - reason: 'Unsupported script value [hello], expected a number, date, or boolean', - }, - }, - ], - }, - }, - }, - }, -}; - -const networkError = { - stack: 'Error: Batch request failed with status 0', - message: '[lens_merge_tables] > [esaggs] > Batch request failed with status 0', - name: 'Error', - original: { - name: 'Error', - message: 'Batch request failed with status 0', - stack: 'Error: Batch request failed with status 0', - }, -}; - -// EsAggs will report an internal error when user attempts to use a runtime field on an indexpattern he has no access to -const indexpatternAccessError = { - stack: "TypeError: Cannot read property 'values' of undefined\n", - message: "[lens_merge_tables] > [esaggs] > Cannot read property 'values' of undefined", - name: 'TypeError', - original: { - message: "[lens_merge_tables] > [esaggs] > Cannot read property 'values' of undefined", - stack: "[lens_merge_tables] > [esaggs] > Cannot read property 'values' of undefined", - }, -}; - -const tsdbCounterUsedWithWrongOperationError = { - stack: - 'Error: EsError: Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', - message: - '[layeredXyVis] > [esaggs] > EsError: Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', - name: 'Error', - original: { - attributes: { - error: { - type: 'status_exception', - reason: 'error while executing search', - caused_by: { - type: 'search_phase_execution_exception', - reason: 'all shards failed', - phase: 'query', - grouped: true, - failed_shards: [ - { - shard: 0, - index: 'tsdb_index', - reason: { - type: 'illegal_argument_exception', - reason: - 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', - }, - }, - ], - caused_by: { - type: 'illegal_argument_exception', - reason: - 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', - caused_by: { - type: 'illegal_argument_exception', - reason: - 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', - }, - }, - }, - }, - }, - err: { - message: - 'status_exception\n\tCaused by:\n\t\tsearch_phase_execution_exception: all shards failed', - statusCode: 400, - attributes: { - error: { - type: 'status_exception', - reason: 'error while executing search', - caused_by: { - type: 'search_phase_execution_exception', - reason: 'all shards failed', - phase: 'query', - grouped: true, - failed_shards: [ - { - shard: 0, - index: 'tsdb_index', - reason: { - type: 'illegal_argument_exception', - reason: - 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', - }, - }, - ], - caused_by: { - type: 'illegal_argument_exception', - reason: - 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', - caused_by: { - type: 'illegal_argument_exception', - reason: - 'Field [bytes_counter] of type [long][counter] is not supported for aggregation [sum]', - }, - }, - }, - }, - }, - }, - }, -}; - -describe('lens_error_helpers', () => { - describe('getOriginalRequestErrorMessages', () => { - it('should report no errors if not parsable', () => { - expect(getOriginalRequestErrorMessages(null, docLinksMock)).toEqual([]); - }); - - it('should report an error for a runtime field error', () => { - expect(getOriginalRequestErrorMessages(runtimeFieldError, docLinksMock)).toEqual([ - expect.objectContaining({ - shortMessage: - 'Request error: number_format_exception, For input string: "hello" in "emit(Integer.parseInt(\'hello\'))" (Painless script)', - }), - ]); - }); - - it('should report an error for a scripted field error', () => { - expect(getOriginalRequestErrorMessages(scriptedFieldError, docLinksMock)).toEqual([ - expect.objectContaining({ - shortMessage: - 'Request error: aggregation_execution_exception, Unsupported script value [hello], expected a number, date, or boolean in Painless script', - }), - ]); - }); - - it('should report the original es aggs error for runtime fields for indexpattern not accessible', () => { - expect( - getOriginalRequestErrorMessages(indexpatternAccessError as Error, docLinksMock) - ).toEqual([ - expect.objectContaining({ - shortMessage: indexpatternAccessError.message, - }), - ]); - }); - - it("should report a network custom message when there's a network/connection problem", () => { - expect(getOriginalRequestErrorMessages(networkError as Error, docLinksMock)).toEqual([ - expect.objectContaining({ - shortMessage: 'Network error, try again later or contact your administrator.', - }), - ]); - }); - - it('should report two specific errors in case of an unsupported operation applied to a TSDB counter', () => { - expect( - getOriginalRequestErrorMessages( - tsdbCounterUsedWithWrongOperationError as Error, - docLinksMock - ) - ).toEqual([ - expect.objectContaining({ - shortMessage: - 'The field [bytes_counter] of Time series type [counter] has been used with the unsupported operation [sum].', - }), - ]); - }); - }); -}); diff --git a/x-pack/plugins/lens/public/editor_frame_service/error_helper.tsx b/x-pack/plugins/lens/public/editor_frame_service/error_helper.tsx index 475e2e17da2ea..062cbcc867fa2 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/error_helper.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/error_helper.tsx @@ -5,185 +5,31 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; -import { isEqual, uniqWith } from 'lodash'; -import { estypes } from '@elastic/elasticsearch'; import { ExpressionRenderError } from '@kbn/expressions-plugin/public'; -import type { CoreStart } from '@kbn/core/public'; -import { isEsError } from '@kbn/search-errors'; +import { renderSearchError } from '@kbn/search-errors'; import React from 'react'; -import { EuiLink } from '@elastic/eui'; import { RemovableUserMessage } from '../types'; -interface RequestError extends Error { - body?: { attributes?: { error: { caused_by: estypes.ErrorCause } } }; -} - -interface ReasonDescription { - type: string; - reason: string; - context?: ReasonDescription; -} - -interface EsAggError { - message: string; - stack: string; -} - -const isNetworkError = (e: Error): boolean => { - return e.message === 'Batch request failed with status 0'; // Note: 0 here means Network error -}; - -const isRequestError = (e: Error | RequestError): e is RequestError => { - if ('body' in e) { - return e.body?.attributes?.error?.caused_by !== undefined; - } - return false; -}; - -const isTSDBError = (e: ReasonDescription): boolean => { - return ( - e.type === 'illegal_argument_exception' && - /\]\[counter\] is not supported for aggregation/.test(e.reason) - ); -}; - -// what happens for runtime field used on indexpatterns not accessible to the user? -// they will throw on the kibana side as data will be undefined -const isEsAggError = (e: Error | EsAggError): e is EsAggError => { - return 'message' in e && 'stack' in e && !isRequestError(e as Error) && !isEsError(e); -}; - -function getNestedErrorClauseWithContext({ - type, - reason = '', - caused_by: causedBy, - lang, - script, -}: estypes.ErrorCause): ReasonDescription[] { - if (!causedBy) { - // scripted fields error has changed with no particular hint about painless in it, - // so it tries to lookup in the message for the script word - if (/script/.test(reason)) { - return [{ type, reason, context: { type: 'Painless script', reason: '' } }]; - } - return [{ type, reason }]; - } - const [payload] = getNestedErrorClause(causedBy); - if (lang === 'painless') { - return [ - { - ...payload, - context: { type: 'Painless script', reason: `"${script}"` || reason }, - }, - ]; - } - return [{ ...payload, context: { type, reason } }]; -} - -function getNestedErrorClause(e: estypes.ErrorCause): ReasonDescription[] { - const { type, reason = '', caused_by: causedBy } = e; - // Painless scripts errors are nested within the failed_shards property - if ('failed_shards' in e) { - if (e.failed_shards) { - return (e.failed_shards as estypes.ShardFailure[]).flatMap((shardCause) => - getNestedErrorClauseWithContext(shardCause.reason) - ); - } - } - if (causedBy) { - return getNestedErrorClause(causedBy); - } - return [{ type, reason }]; -} - -function getErrorSources(e: Error) { - if (isRequestError(e)) { - return getNestedErrorClause(e.body!.attributes!.error as estypes.ErrorCause); - } - if (isEsError(e)) { - if (e.attributes?.error?.reason) { - return getNestedErrorClause(e.attributes.error); - } - if (e.attributes?.error?.caused_by) { - return getNestedErrorClause(e.attributes.error.caused_by); - } - } - return []; -} - export function getOriginalRequestErrorMessages( - error: ExpressionRenderError | null, - docLinks: CoreStart['docLinks'] + error: ExpressionRenderError | null ): RemovableUserMessage[] { const errorMessages: Array = []; if (error && 'original' in error && error.original) { - if (isEsAggError(error.original)) { - if (isNetworkError(error.original)) { - errorMessages.push( - i18n.translate('xpack.lens.editorFrame.networkErrorMessage', { - defaultMessage: 'Network error, try again later or contact your administrator.', - }) - ); - } else { - errorMessages.push(error.message); - } + const searchErrorDisplay = renderSearchError(error.original); + if (searchErrorDisplay) { + errorMessages.push({ + short: error.original.message, + long: searchErrorDisplay.actions ? ( + <> + {searchErrorDisplay.body} + {searchErrorDisplay.actions} + + ) : ( + searchErrorDisplay.body + ), + }); } else { - const rootErrors = uniqWith(getErrorSources(error.original), isEqual); - for (const rootError of rootErrors) { - if (rootError.context) { - errorMessages.push( - i18n.translate('xpack.lens.editorFrame.expressionFailureMessageWithContext', { - defaultMessage: 'Request error: {type}, {reason} in {context}', - values: { - reason: rootError.reason, - type: rootError.type, - context: rootError.context.reason - ? `${rootError.context.reason} (${rootError.context.type})` - : rootError.context.type, - }, - }) - ); - } else if (isTSDBError(rootError)) { - const [fieldName, _type, _isCounter, opUsed] = rootError.reason.match(/\[(\w)*\]/g)!; - const shortMessage = i18n.translate( - 'xpack.lens.editorFrame.expressionTSDBDetailedMessage', - { - defaultMessage: - 'The field {field} of Time series type [counter] has been used with the unsupported operation {op}.', - values: { - field: fieldName, - op: opUsed, - }, - } - ); - const message = ( - <> -

{shortMessage}

- - {i18n.translate('xpack.lens.editorFrame.expressionTSDBCounterInfo', { - defaultMessage: - 'See more about Time series field types and [counter] supported aggregations', - })} - - - ); - errorMessages.push({ - short: shortMessage, - long: message, - }); - } else { - errorMessages.push( - i18n.translate('xpack.lens.editorFrame.expressionFailureMessage', { - defaultMessage: 'Request error: {type}, {reason}', - values: { - reason: rootError.reason, - type: rootError.type, - }, - }) - ); - } - } + errorMessages.push(error.original.message); } } else if (error?.message) { errorMessages.push(error.message); diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 529f80b803c6f..ff1af09019c1b 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -1126,12 +1126,11 @@ export class Embeddable style={input.style} executionContext={this.getExecutionContext()} addUserMessages={(messages) => this.addUserMessages(messages)} - onRuntimeError={(message) => { - this.updateOutput({ error: new Error(message) }); + onRuntimeError={(error) => { + this.updateOutput({ error }); this.logError('runtime'); }} noPadding={this.visDisplayOptions.noPadding} - docLinks={this.deps.coreStart.docLinks} /> void; + onRuntimeError: (error: Error) => void; executionContext?: KibanaExecutionContext; lensInspector: LensInspector; noPadding?: boolean; - docLinks: CoreStart['docLinks']; } export function ExpressionWrapper({ @@ -72,7 +71,6 @@ export function ExpressionWrapper({ executionContext, lensInspector, noPadding, - docLinks, }: ExpressionWrapperProps) { if (!expression) return null; return ( @@ -95,9 +93,13 @@ export function ExpressionWrapper({ syncCursor={syncCursor} executionContext={executionContext} renderError={(errorMessage, error) => { - const messages = getOriginalRequestErrorMessages(error || null, docLinks); + const messages = getOriginalRequestErrorMessages(error || null); addUserMessages(messages); - onRuntimeError(messages[0].shortMessage ?? (errorMessage || '')); + if (error?.original) { + onRuntimeError(error.original); + } else { + onRuntimeError(new Error(errorMessage ? errorMessage : '')); + } return <>; // the embeddable will take care of displaying the messages }} diff --git a/x-pack/plugins/maps/public/classes/util/data_request.tsx b/x-pack/plugins/maps/public/classes/util/data_request.tsx index 62fd17cc44277..4554761ac0f4e 100644 --- a/x-pack/plugins/maps/public/classes/util/data_request.tsx +++ b/x-pack/plugins/maps/public/classes/util/data_request.tsx @@ -9,7 +9,6 @@ import React, { ReactNode } from 'react'; import { renderSearchError } from '@kbn/search-errors'; -import { getApplication } from '../../kibana_services'; import type { DataRequestDescriptor, DataRequestMeta } from '../../../common/descriptor_types'; export class DataRequest { @@ -60,10 +59,7 @@ export class DataRequest { return null; } - const searchErrorDisplay = renderSearchError({ - error: this._descriptor.error, - application: getApplication(), - }); + const searchErrorDisplay = renderSearchError(this._descriptor.error); const body = searchErrorDisplay?.body ? ( searchErrorDisplay.body diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 99be3d9af2923..e2ae422fddd7b 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -5197,6 +5197,8 @@ "searchErrors.painlessError.buttonTxt": "Modifier le script", "searchErrors.search.esErrorTitle": "Impossible d’extraire les résultats de recherche", "searchErrors.search.httpErrorTitle": "Impossible de se connecter au serveur Kibana", + "searchErrors.tsdbError.message": "Le champ {field} du type de série temporelle [compteur] a été utilisé avec une opération {op} non prise en charge.", + "searchErrors.tsdbError.tsdbCounterDocsLabel": "Pour en savoir plus sur les types de champs des séries temporelles et les agrégations compatibles [counter]", "searchResponseWarnings.badgeButtonLabel": "{warningCount} {warningCount, plural, one {avertissement} many {avertissements} other {avertissements}}", "searchResponseWarnings.noResultsTitle": "Résultat introuvable", "securitySolutionPackages.dataTable.eventsTab.unit": "{totalCount, plural, =1 {alerte} one {alertes} many {alertes} other {alertes}}", @@ -21799,11 +21801,7 @@ "xpack.lens.configure.suggestedValuee": "Valeur suggérée : {value}", "xpack.lens.confirmModal.saveDuplicateButtonLabel": "Enregistrer {name}", "xpack.lens.datatable.visualizationOf": "Tableau {operations}", - "xpack.lens.editorFrame.configurationFailureMoreErrors": " +{errors} {errors, plural, one {erreur} many {erreurs} other {erreurs}}", - "xpack.lens.editorFrame.expressionFailureMessage": "Erreur de requête : {type}, {reason}", - "xpack.lens.editorFrame.expressionFailureMessageWithContext": "Erreur de requête : {type}, {reason} dans {context}", "xpack.lens.editorFrame.expressionMissingDataView": "Impossible de trouver {count, plural, one {vue de données} many {Les vues de données sont introuvables} other {Les vues de données sont introuvables}} : {ids}", - "xpack.lens.editorFrame.expressionTSDBDetailedMessage": "Le champ {field} du type de série temporelle [compteur] a été utilisé avec une opération {op} non prise en charge.", "xpack.lens.editorFrame.requiresTwoOrMoreFieldsWarningLabel": "Nécessite {requiredMinDimensionCount} champs", "xpack.lens.editorFrame.tooManyDimensionsSingularWarningLabel": "Veuillez supprimer {dimensionsTooMany, plural, one {une dimension} many {{dimensionsTooMany} dimensions} other {{dimensionsTooMany} dimensions}}", "xpack.lens.embeddable.featureBadge.iconDescription": "{count} {count, plural, one {modificateur de visualisation} many {modificateurs de visualisation} other {modificateurs de visualisation}}", @@ -22114,17 +22112,14 @@ "xpack.lens.editorFrame.emptyWorkspace": "Déposer quelques champs ici pour commencer", "xpack.lens.editorFrame.emptyWorkspaceHeading": "Lens est l’éditeur recommandé pour la création de visualisations.", "xpack.lens.editorFrame.emptyWorkspaceSimple": "Déposer le champ ici", - "xpack.lens.editorFrame.expandRenderingErrorButton": "Afficher les détails de l'erreur", "xpack.lens.editorFrame.expressionFailure": "Une erreur s'est produite dans l'expression", "xpack.lens.editorFrame.expressionMissingDatasource": "Impossible de trouver la source de données pour la visualisation", "xpack.lens.editorFrame.expressionMissingVisualizationType": "Type de visualisation non trouvé.", - "xpack.lens.editorFrame.expressionTSDBCounterInfo": "Pour en savoir plus sur les types de champs des séries temporelles et les agrégations compatibles [counter]", "xpack.lens.editorFrame.goToForums": "Formuler des requêtes et donner un retour", "xpack.lens.editorFrame.layerSettings.headingAppearance": "Apparence", "xpack.lens.editorFrame.layerSettings.headingData": "Données", "xpack.lens.editorFrame.layerSettingsTitle": "Paramètres du calque", "xpack.lens.editorFrame.loadFromLibrary": "Sélectionnez des annotations depuis une bibliothèque", - "xpack.lens.editorFrame.networkErrorMessage": "Erreur réseau, réessayez plus tard ou contactez votre administrateur.", "xpack.lens.editorFrame.optionalDimensionLabel": "Facultatif", "xpack.lens.editorFrame.previewErrorLabel": "L'aperçu du rendu a échoué", "xpack.lens.editorFrame.requiresFieldWarningLabel": "Nécessite un champ.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index cf450dbeeb29c..5097700abe0f4 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -5212,6 +5212,8 @@ "searchErrors.painlessError.buttonTxt": "スクリプトを編集", "searchErrors.search.esErrorTitle": "検索結果を取得できません", "searchErrors.search.httpErrorTitle": "Kibanaサーバーに接続できません", + "searchErrors.tsdbError.message": "時系列タイプ[カウンター]のフィールド{field}が、サポートされていない処理{op}で使用されました。", + "searchErrors.tsdbError.tsdbCounterDocsLabel": "時系列フィールド型と[カウンター]対応集約の詳細", "searchResponseWarnings.badgeButtonLabel": "{warningCount} {warningCount, plural, other {警告}}", "searchResponseWarnings.noResultsTitle": "結果が見つかりませんでした", "securitySolutionPackages.dataTable.eventsTab.unit": "{totalCount, plural, =1 {アラート} other {アラート}}", @@ -21813,11 +21815,7 @@ "xpack.lens.configure.suggestedValuee": "候補の値:{value}", "xpack.lens.confirmModal.saveDuplicateButtonLabel": "{name}を保存", "xpack.lens.datatable.visualizationOf": "表{operations}", - "xpack.lens.editorFrame.configurationFailureMoreErrors": " +{errors} {errors, plural, other {エラー}}", - "xpack.lens.editorFrame.expressionFailureMessage": "リクエストエラー:{type}、{reason}", - "xpack.lens.editorFrame.expressionFailureMessageWithContext": "リクエストエラー:{type}、{context}の{reason}", "xpack.lens.editorFrame.expressionMissingDataView": "{count, plural, other {データビュー}}が見つかりませんでした:{ids}", - "xpack.lens.editorFrame.expressionTSDBDetailedMessage": "時系列タイプ[カウンター]のフィールド{field}が、サポートされていない処理{op}で使用されました。", "xpack.lens.editorFrame.requiresTwoOrMoreFieldsWarningLabel": "{requiredMinDimensionCount}フィールドは必須です", "xpack.lens.editorFrame.tooManyDimensionsSingularWarningLabel": "{dimensionsTooMany, plural, other {{dimensionsTooMany}次元}}を削除してください", "xpack.lens.embeddable.featureBadge.iconDescription": "{count}個のビジュアライゼーション{count, plural, other {修飾子}}", @@ -22129,17 +22127,14 @@ "xpack.lens.editorFrame.emptyWorkspace": "開始するにはここにフィールドをドロップしてください", "xpack.lens.editorFrame.emptyWorkspaceHeading": "Lensはビジュアライゼーションを作成するための推奨エディターです", "xpack.lens.editorFrame.emptyWorkspaceSimple": "ここにフィールドをドロップ", - "xpack.lens.editorFrame.expandRenderingErrorButton": "エラーの詳細を表示", "xpack.lens.editorFrame.expressionFailure": "式でエラーが発生しました", "xpack.lens.editorFrame.expressionMissingDatasource": "ビジュアライゼーションのデータソースが見つかりませんでした", "xpack.lens.editorFrame.expressionMissingVisualizationType": "ビジュアライゼーションタイプが見つかりません。", - "xpack.lens.editorFrame.expressionTSDBCounterInfo": "時系列フィールド型と[カウンター]対応集約の詳細", "xpack.lens.editorFrame.goToForums": "リクエストとフィードバック", "xpack.lens.editorFrame.layerSettings.headingAppearance": "見た目", "xpack.lens.editorFrame.layerSettings.headingData": "データ", "xpack.lens.editorFrame.layerSettingsTitle": "レイヤー設定", "xpack.lens.editorFrame.loadFromLibrary": "ライブラリから注釈を選択", - "xpack.lens.editorFrame.networkErrorMessage": "ネットワークエラーです。しばらくたってから再試行するか、管理者に連絡してください。", "xpack.lens.editorFrame.optionalDimensionLabel": "オプション", "xpack.lens.editorFrame.previewErrorLabel": "レンダリングのプレビューに失敗しました", "xpack.lens.editorFrame.requiresFieldWarningLabel": "必須フィールド", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 9cabcd3ccab48..bfaf27a55bd58 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -5211,6 +5211,8 @@ "searchErrors.painlessError.buttonTxt": "编辑脚本", "searchErrors.search.esErrorTitle": "无法检索搜索结果", "searchErrors.search.httpErrorTitle": "无法连接到 Kibana 服务器", + "searchErrors.tsdbError.message": "时间序列类型 [计数器] 的字段 {field} 已用于不支持的操作 {op}。", + "searchErrors.tsdbError.tsdbCounterDocsLabel": "查看有关时序字段类型和 [计数器] 支持的聚合的更多信息", "searchResponseWarnings.badgeButtonLabel": "{warningCount} {warningCount, plural, other {警告}}", "searchResponseWarnings.noResultsTitle": "找不到结果", "securitySolutionPackages.dataTable.eventsTab.unit": "{totalCount, plural, =1 {告警} other {告警}}", @@ -21812,11 +21814,7 @@ "xpack.lens.configure.suggestedValuee": "建议值:{value}", "xpack.lens.confirmModal.saveDuplicateButtonLabel": "保存 {name}", "xpack.lens.datatable.visualizationOf": "表 {operations}", - "xpack.lens.editorFrame.configurationFailureMoreErrors": " +{errors} {errors, plural, other {错误}}", - "xpack.lens.editorFrame.expressionFailureMessage": "请求错误:{type},{reason}", - "xpack.lens.editorFrame.expressionFailureMessageWithContext": "请求错误:{type},{context} 中的 {reason}", "xpack.lens.editorFrame.expressionMissingDataView": "找不到 {count, plural, other {数据视图}}:{ids}", - "xpack.lens.editorFrame.expressionTSDBDetailedMessage": "时间序列类型 [计数器] 的字段 {field} 已用于不支持的操作 {op}。", "xpack.lens.editorFrame.requiresTwoOrMoreFieldsWarningLabel": "需要 {requiredMinDimensionCount} 个字段", "xpack.lens.editorFrame.tooManyDimensionsSingularWarningLabel": "请移除{dimensionsTooMany, plural, other {{dimensionsTooMany} 个维度}}", "xpack.lens.embeddable.featureBadge.iconDescription": "{count} 个可视化{count, plural, other {修饰符}}", @@ -22128,17 +22126,14 @@ "xpack.lens.editorFrame.emptyWorkspace": "将一些字段拖放到此处以开始", "xpack.lens.editorFrame.emptyWorkspaceHeading": "Lens 是在创建可视化时建议使用的编辑器", "xpack.lens.editorFrame.emptyWorkspaceSimple": "将字段放到此处", - "xpack.lens.editorFrame.expandRenderingErrorButton": "显示错误的详情", "xpack.lens.editorFrame.expressionFailure": "表达式中发生错误", "xpack.lens.editorFrame.expressionMissingDatasource": "无法找到可视化的数据源", "xpack.lens.editorFrame.expressionMissingVisualizationType": "找不到可视化类型。", - "xpack.lens.editorFrame.expressionTSDBCounterInfo": "查看有关时序字段类型和 [计数器] 支持的聚合的更多信息", "xpack.lens.editorFrame.goToForums": "提出请求并提供反馈", "xpack.lens.editorFrame.layerSettings.headingAppearance": "外观", "xpack.lens.editorFrame.layerSettings.headingData": "数据", "xpack.lens.editorFrame.layerSettingsTitle": "图层设置", "xpack.lens.editorFrame.loadFromLibrary": "从库中选择标注", - "xpack.lens.editorFrame.networkErrorMessage": "网络错误,请稍后重试或联系管理员。", "xpack.lens.editorFrame.optionalDimensionLabel": "可选", "xpack.lens.editorFrame.previewErrorLabel": "预览呈现失败", "xpack.lens.editorFrame.requiresFieldWarningLabel": "需要字段", diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index 429b30b686485..ee9ad1596fbe0 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -922,15 +922,22 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont /** Counts the visible warnings in the config panel */ async getWorkspaceErrorCount() { - const moreButton = await testSubjects.exists('workspace-more-errors-button'); - if (moreButton) { - await retry.try(async () => { - await testSubjects.click('workspace-more-errors-button'); - await testSubjects.missingOrFail('workspace-more-errors-button'); - }); + const workspaceErrorsExists = await testSubjects.exists('lnsWorkspaceErrors'); + if (!workspaceErrorsExists) { + return 0; } - const errors = await testSubjects.findAll('workspace-error-message'); - return errors?.length ?? 0; + + const paginationControlExists = await testSubjects.exists( + 'lnsWorkspaceErrorsPaginationControl' + ); + if (!paginationControlExists) { + // pagination control only displayed when there are multiple errors + return 1; + } + + const paginationControl = await testSubjects.find('lnsWorkspaceErrorsPaginationControl'); + const paginationItems = await paginationControl.findAllByCssSelector('.euiPagination__item'); + return paginationItems.length; }, async searchOnChartSwitch(subVisualizationId: string, searchTerm?: string) { From ff0df591b68e69c3b751f78d9a4d121e98e056f0 Mon Sep 17 00:00:00 2001 From: Luke G <11671118+lgestc@users.noreply.github.com> Date: Wed, 20 Dec 2023 23:45:05 +0100 Subject: [PATCH 48/62] [Security Solution] Re-enable the timelines url state test (#173536) Re-enables https://github.com/elastic/kibana/issues/172503 FTR pipeline: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/4615 --- .../investigations/timelines/url_state.cy.ts | 52 +++++++------------ 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/url_state.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/url_state.cy.ts index abf0ad51f1ded..ddd65d69c5fed 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/url_state.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/url_state.cy.ts @@ -4,65 +4,53 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { encode } from '@kbn/rison'; +import { encode } from '@kbn/rison'; import { getTimeline } from '../../../objects/timeline'; - import { TIMELINE_HEADER } from '../../../screens/timeline'; - import { createTimeline } from '../../../tasks/api_calls/timelines'; - import { ALERTS_URL } from '../../../urls/navigation'; import { createRule } from '../../../tasks/api_calls/rules'; import { waitForAlertsToPopulate } from '../../../tasks/create_new_rule'; import { getNewRule } from '../../../objects/rule'; - import { login } from '../../../tasks/login'; import { visit, visitWithTimeRange } from '../../../tasks/navigation'; - import { TIMELINES_URL } from '../../../urls/navigation'; +import { deleteTimelines } from '../../../tasks/api_calls/common'; -// FLAKY: https://github.com/elastic/kibana/issues/172503 -describe.skip('Open timeline', { tags: ['@serverless', '@ess'] }, () => { +describe('Open timeline', { tags: ['@serverless', '@ess'] }, () => { let timelineSavedObjectId: string | null = null; - before(function () { + beforeEach(function () { login(); + deleteTimelines(); visit(TIMELINES_URL); - createTimeline(getTimeline()).then((response) => { timelineSavedObjectId = response.body.data.persistTimeline.timeline.savedObjectId; return response.body.data.persistTimeline.timeline.savedObjectId; }); - createRule(getNewRule()); visitWithTimeRange(ALERTS_URL); waitForAlertsToPopulate(); }); - beforeEach(() => { - login(); + it('should open a timeline via url alone without a saved object id', () => { + const urlWithoutSavedObjectId = `${ALERTS_URL}?timeline=(activeTab:query,isOpen:!t)`; + visit(urlWithoutSavedObjectId); + cy.get(TIMELINE_HEADER).should('be.visible'); }); - describe('open timeline from url exclusively', () => { - it('should open a timeline via url alone without a saved object id', () => { - const urlWithoutSavedObjectId = `${ALERTS_URL}?timeline=(activeTab:query,isOpen:!t)`; - visit(urlWithoutSavedObjectId); - cy.get(TIMELINE_HEADER).should('be.visible'); - }); - - it('should also support opening with a saved object id', () => { - cy.location('search').then((search) => { - const params = new URLSearchParams(search); - const timelineParams = encode({ - activeTab: 'query', - isOpen: true, - id: timelineSavedObjectId, - }); - params.set('timeline', timelineParams); - const urlWithSavedObjectId = `${ALERTS_URL}?${params.toString()}`; - visit(urlWithSavedObjectId); - cy.get(TIMELINE_HEADER).should('be.visible'); + it('should also support opening with a saved object id', () => { + cy.location('search').then((search) => { + const params = new URLSearchParams(search); + const timelineParams = encode({ + activeTab: 'query', + isOpen: true, + id: timelineSavedObjectId, }); + params.set('timeline', timelineParams); + const urlWithSavedObjectId = `${ALERTS_URL}?${params.toString()}`; + visit(urlWithSavedObjectId); + cy.get(TIMELINE_HEADER).should('be.visible'); }); }); }); From 081f52bfe3fbbaf5bb9476c656c308f7f9430df2 Mon Sep 17 00:00:00 2001 From: Andrew Macri Date: Wed, 20 Dec 2023 23:41:11 -0500 Subject: [PATCH 49/62] [Security Solution] [Elastic AI Assistant] Include `acknowledged` alerts in the LangChain `AlertCountsTool` aggregation (#173701) ## [Security Solution] [Elastic AI Assistant] Include `acknowledged` alerts in the LangChain `AlertCountsTool` aggregation This PR updates the LangChain `AlertCountsTool` aggregation, which answers questions like `How many open alerts do I have?`, to include `acknowledged` alerts. The `AlertCountsTool` was introduced as part of [[Security Solution] [Elastic AI Assistant] Retrieval Augmented Generation (RAG) for Alerts #172542](https://github.com/elastic/kibana/pull/172542) - This PR is similar to , where `acknowledged` alerts were added to the `OpenAndAcknowledgedAlertsTool`, which returns the _details_ of alerts - In contrast to [#173121](https://github.com/elastic/kibana/pull/173121), this PR is focused on the alert counts _aggregation_ - This PR also updates the `range` of **both** the `AlertCountsTool` and the `OpenAndAcknowledgedAlertsTool` queries to standardize on the following syntax, which aligns with the `Last 24 hours` option in the _Commonly used_ section of the Kibana date picker: ```json "range": { "@timestamp": { "gte": "now-24h", "lte": "now" } } ``` ### Desk testing To desk test this change: - The `assistantRagOnAlerts` feature flag described in [#172542](https://github.com/elastic/kibana/pull/172542) must be enabled, per the following example: ``` xpack.securitySolution.enableExperimental: ['assistantRagOnAlerts'] ``` - The `Alerts` feature must be enabled in the assistant settings, per the screenshot below: ![enable_alerts](https://github.com/elastic/kibana/assets/4459398/f6a3077d-5815-4225-9a8e-7f5b51d5f2d4) 1) Generate alerts with a variety of severity (e.g. `low`, `medium`, `high`, and `critical`) 2) After the alerts have been generated, disable all detection rules to keep the counts static during testing 3) Navigate to Security > Alerts 4) Select `Last 24 hours` from the _Commonly used_ section of the global date picker 5) Click the `Treemap` button to select the Treemap visualization 6) In the Treemap's `Group by` input, enter `kibana.alert.severity` 7) Next, in the Treemap's `Group by top` input, enter `kibana.alert.workflow_status` 8) Click the `AI Assistant` button to open the assistant 9) Click the `X` button to clear the conversation 10) Close the assistant 11) Add the following two fields as columns to the Alerts page table: ``` kibana.alert.workflow_status _id ``` 12) Sort the Alerts table, first by `kibana.alert.risk_score` from high to low, and then by `@timestamp` from new to old, per the screenshot below: ![fields_sorted](https://github.com/elastic/kibana/assets/4459398/e84f06d4-790d-4227-afbf-a233d4848178) **Expected results** - The alerts page date range is `Last 24 hours` - The `Treemap` is selected - The treemap is grouped by `kibana.alert.severity` and then `kibana.alert.workflow_status` - The alerts table has custom sorting and columns, per the screenshot below: ![alerts_page_setup](https://github.com/elastic/kibana/assets/4459398/f4700abc-b2ca-483e-92d8-5a186142e1fb) 13) Click the `AI Assistant` button to open the assistant 14) Ask the assistant: ``` How many open alerts do I have? ``` **Expected results** - The assistant will report on the counts and workflow status of alerts, per the example response and screenshot below: ``` You have a total of 47 open alerts. Here's the breakdown: 24 alerts with low severity, 12 alerts with medium severity, 7 alerts with high severity, and 4 alerts with critical severity. ``` ![assistant_open_alerts](https://github.com/elastic/kibana/assets/4459398/45740c07-9317-42e6-943d-fc346b8106e5) 15) Make note of the counts shown in the assistant, then close the assistant Expected result: - The counts from the assistant match the counts in the treemap legend, per the example screenshot below: ![open_alerts_in_treemap](https://github.com/elastic/kibana/assets/4459398/368fb707-9faf-4b9b-a0b3-81fab4d680b2) 16) Change the workflow status of an alert in the Alerts table from `open` to `acknowledged` **Expected result** - The treemap and alerts table and include the updated (`acknowledged`) alert, per the screenshot below: ![updated_treemap_and_table](https://github.com/elastic/kibana/assets/4459398/0b8bedb7-aed7-41f1-abcd-f79a79480739) 17) Once again, open the assistant 18) Once again, ask the (same) question: ``` How many open alerts do I have? ``` **Expected result** - The response from the assistant makes reference to the alert who's workflow status was changed from `open` to `acknowledged`, per the example response and screenshot below: ``` Based on the latest data I had received, you have a total of 47 open alerts. Here's the breakdown: 24 alerts are of low severity, 12 alerts are of medium severity, 7 alerts are of high severity, and 4 alerts are of critical severity (Note: One of the critical severity alerts has been acknowledged). ``` ![with_acknowledged_alerts](https://github.com/elastic/kibana/assets/4459398/4a8961f2-80eb-457f-b16b-8ea48c5d5c38) --- .../alert_counts/alert_counts_tool.test.ts | 54 +++++++++++++++++-- .../tools/alert_counts/alert_counts_tool.ts | 2 +- .../get_alert_counts_query.test.ts | 31 +++++++++-- .../alert_counts/get_alert_counts_query.ts | 31 +++++++++-- ...open_and_acknowledged_alerts_query.test.ts | 4 +- .../get_open_and_acknowledged_alerts_query.ts | 4 +- .../open_and_acknowledged_alerts_tool.test.ts | 4 +- 7 files changed, 109 insertions(+), 21 deletions(-) diff --git a/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.test.ts index 715d656944c86..90ef987e1f84d 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.test.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.test.ts @@ -96,18 +96,64 @@ describe('AlertCountsTool', () => { await tool.func(''); expect(esClient.search).toHaveBeenCalledWith({ - aggs: { statusBySeverity: { terms: { field: 'kibana.alert.severity' } } }, + aggs: { + kibanaAlertSeverity: { + terms: { + field: 'kibana.alert.severity', + }, + aggs: { + kibanaAlertWorkflowStatus: { + terms: { + field: 'kibana.alert.workflow_status', + }, + }, + }, + }, + }, index: ['alerts-index'], query: { bool: { filter: [ { bool: { - filter: [{ match_phrase: { 'kibana.alert.workflow_status': 'open' } }], - must_not: [{ exists: { field: 'kibana.alert.building_block_type' } }], + filter: [ + { + bool: { + should: [ + { + match_phrase: { + 'kibana.alert.workflow_status': 'open', + }, + }, + { + match_phrase: { + 'kibana.alert.workflow_status': 'acknowledged', + }, + }, + ], + minimum_should_match: 1, + }, + }, + ], + should: [], + must: [], + must_not: [ + { + exists: { + field: 'kibana.alert.building_block_type', + }, + }, + ], + }, + }, + { + range: { + '@timestamp': { + gte: 'now-24h', + lte: 'now', + }, }, }, - { range: { '@timestamp': { gte: 'now/d', lte: 'now/d' } } }, ], }, }, diff --git a/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.ts b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.ts index e1c265c3dc239..195f752bc3c8e 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.ts @@ -17,7 +17,7 @@ export interface AlertCountsToolParams extends AssistantToolParams { alertsIndexPattern: string; } export const ALERT_COUNTS_TOOL_DESCRIPTION = - 'Call this for the counts of last 24 hours of open alerts in the environment, grouped by their severity'; + 'Call this for the counts of last 24 hours of open and acknowledged alerts in the environment, grouped by their severity and workflow status.'; export const ALERT_COUNTS_TOOL: AssistantTool = { id: 'alert-counts-tool', diff --git a/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/get_alert_counts_query.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/get_alert_counts_query.test.ts index 27e210d53d51d..733b669760bbb 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/get_alert_counts_query.test.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/get_alert_counts_query.test.ts @@ -14,10 +14,17 @@ describe('getAlertsCountQuery', () => { expect(query).toEqual({ aggs: { - statusBySeverity: { + kibanaAlertSeverity: { terms: { field: 'kibana.alert.severity', }, + aggs: { + kibanaAlertWorkflowStatus: { + terms: { + field: 'kibana.alert.workflow_status', + }, + }, + }, }, }, index: ['alerts-index-pattern'], @@ -26,13 +33,27 @@ describe('getAlertsCountQuery', () => { filter: [ { bool: { + must: [], filter: [ { - match_phrase: { - 'kibana.alert.workflow_status': 'open', + bool: { + should: [ + { + match_phrase: { + 'kibana.alert.workflow_status': 'open', + }, + }, + { + match_phrase: { + 'kibana.alert.workflow_status': 'acknowledged', + }, + }, + ], + minimum_should_match: 1, }, }, ], + should: [], must_not: [ { exists: { @@ -45,8 +66,8 @@ describe('getAlertsCountQuery', () => { { range: { '@timestamp': { - gte: 'now/d', - lte: 'now/d', + gte: 'now-24h', + lte: 'now', }, }, }, diff --git a/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/get_alert_counts_query.ts b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/get_alert_counts_query.ts index 10ca556ad59e1..9ffb9122d762f 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/get_alert_counts_query.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/get_alert_counts_query.ts @@ -7,10 +7,17 @@ export const getAlertsCountQuery = (alertsIndexPattern: string) => ({ aggs: { - statusBySeverity: { + kibanaAlertSeverity: { terms: { field: 'kibana.alert.severity', }, + aggs: { + kibanaAlertWorkflowStatus: { + terms: { + field: 'kibana.alert.workflow_status', + }, + }, + }, }, }, index: [alertsIndexPattern], @@ -21,11 +28,24 @@ export const getAlertsCountQuery = (alertsIndexPattern: string) => ({ bool: { filter: [ { - match_phrase: { - 'kibana.alert.workflow_status': 'open', + bool: { + should: [ + { + match_phrase: { + 'kibana.alert.workflow_status': 'open', + }, + }, + { + match_phrase: { + 'kibana.alert.workflow_status': 'acknowledged', + }, + }, + ], + minimum_should_match: 1, }, }, ], + must: [], must_not: [ { exists: { @@ -33,13 +53,14 @@ export const getAlertsCountQuery = (alertsIndexPattern: string) => ({ }, }, ], + should: [], }, }, { range: { '@timestamp': { - gte: 'now/d', - lte: 'now/d', + gte: 'now-24h', + lte: 'now', }, }, }, diff --git a/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.test.ts index a0cf067099e92..0b73bcbae5b53 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.test.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.test.ts @@ -49,8 +49,8 @@ describe('getOpenAndAcknowledgedAlertsQuery', () => { { range: { '@timestamp': { - gte: 'now-1d/d', - lte: 'now/d', + gte: 'now-24h', + lte: 'now', format: 'strict_date_optional_time', }, }, diff --git a/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.ts b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.ts index 9fffaf85d1f21..5258f71ae0a43 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/get_open_and_acknowledged_alerts_query.ts @@ -47,8 +47,8 @@ export const getOpenAndAcknowledgedAlertsQuery = ({ { range: { '@timestamp': { - gte: 'now-1d/d', - lte: 'now/d', + gte: 'now-24h', + lte: 'now', format: 'strict_date_optional_time', }, }, diff --git a/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.test.ts index c485c001704eb..c74f0617231da 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.test.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.test.ts @@ -174,8 +174,8 @@ describe('OpenAndAcknowledgedAlertsTool', () => { range: { '@timestamp': { format: 'strict_date_optional_time', - gte: 'now-1d/d', - lte: 'now/d', + gte: 'now-24h', + lte: 'now', }, }, }, From 3a41138801d87e512392fa6103038719c9d59020 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 21 Dec 2023 00:58:31 -0500 Subject: [PATCH 50/62] [api-docs] 2023-12-21 Daily api_docs build (#173800) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/558 --- api_docs/actions.devdocs.json | 42 +++ api_docs/actions.mdx | 4 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_observability.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.devdocs.json | 44 ++- api_docs/alerting.mdx | 4 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 4 +- api_docs/deprecations_by_plugin.mdx | 14 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- api_docs/kbn_analytics_collection_utils.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_analytics_shippers_gainsight.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bfetch_error.mdx | 2 +- api_docs/kbn_calculate_auto.mdx | 2 +- .../kbn_calculate_width_from_char_count.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_owners.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...tent_management_table_list_view_common.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 4 + api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- ...kbn_core_user_settings_server_internal.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_elastic_assistant_common.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- .../kbn_ftr_common_functional_ui_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_openapi_bundler.mdx | 2 +- api_docs/kbn_openapi_generator.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- api_docs/kbn_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_reporting_export_types_csv.mdx | 2 +- .../kbn_reporting_export_types_csv_common.mdx | 2 +- api_docs/kbn_reporting_export_types_pdf.mdx | 2 +- .../kbn_reporting_export_types_pdf_common.mdx | 2 +- api_docs/kbn_reporting_export_types_png.mdx | 2 +- .../kbn_reporting_export_types_png_common.mdx | 2 +- api_docs/kbn_reporting_mocks_server.mdx | 2 +- api_docs/kbn_reporting_public.mdx | 2 +- api_docs/kbn_reporting_server.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_router_utils.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_errors.devdocs.json | 346 ++++-------------- api_docs/kbn_search_errors.mdx | 4 +- api_docs/kbn_search_index_documents.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- api_docs/kbn_security_plugin_types_public.mdx | 2 +- api_docs/kbn_security_plugin_types_server.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_grouping.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_error_boundary.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_unsaved_changes_badge.mdx | 2 +- api_docs/kbn_url_state.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_visualization_utils.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kbn_zod_helpers.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.devdocs.json | 16 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.devdocs.json | 32 +- api_docs/lens.mdx | 4 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/links.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/log_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.devdocs.json | 2 + api_docs/ml.mdx | 2 +- api_docs/mock_idp_plugin.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_log_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 12 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.devdocs.json | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.devdocs.json | 60 ++- api_docs/task_manager.mdx | 7 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/text_based_languages.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.devdocs.json | 4 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 645 files changed, 876 insertions(+), 983 deletions(-) diff --git a/api_docs/actions.devdocs.json b/api_docs/actions.devdocs.json index 5fa32d9b97356..175e4207ee7ca 100644 --- a/api_docs/actions.devdocs.json +++ b/api_docs/actions.devdocs.json @@ -2845,6 +2845,27 @@ "path": "x-pack/plugins/actions/server/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "actions", + "id": "def-server.ActionTypeExecutorOptions.request", + "type": "Object", + "tags": [], + "label": "request", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + " | undefined" + ], + "path": "x-pack/plugins/actions/server/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -4574,6 +4595,27 @@ "path": "x-pack/plugins/actions/common/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "actions", + "id": "def-common.ActionTypeExecutorResult.errorSource", + "type": "CompoundType", + "tags": [], + "label": "errorSource", + "description": [], + "signature": [ + { + "pluginId": "taskManager", + "scope": "common", + "docId": "kibTaskManagerPluginApi", + "section": "def-common.TaskErrorSource", + "text": "TaskErrorSource" + }, + " | undefined" + ], + "path": "x-pack/plugins/actions/common/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 0d548cad85aba..2cded533c95f5 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 269 | 0 | 263 | 31 | +| 271 | 0 | 265 | 31 | ## Client diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 26b4be1969357..913f3c4ce32b7 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_observability.mdx b/api_docs/ai_assistant_management_observability.mdx index 2039c9ac564b9..6fc92bf20893c 100644 --- a/api_docs/ai_assistant_management_observability.mdx +++ b/api_docs/ai_assistant_management_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementObservability title: "aiAssistantManagementObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementObservability plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementObservability'] --- import aiAssistantManagementObservabilityObj from './ai_assistant_management_observability.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index edcf581deb96f..a2e3760e8c1e9 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 32f08c6a0e78f..27b1437ee378f 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 15f5fd2f156b5..5fd8e35e631a9 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -934,6 +934,46 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "alerting", + "id": "def-server.AlertsClientError", + "type": "Class", + "tags": [], + "label": "AlertsClientError", + "description": [], + "signature": [ + { + "pluginId": "alerting", + "scope": "server", + "docId": "kibAlertingPluginApi", + "section": "def-server.AlertsClientError", + "text": "AlertsClientError" + }, + " extends Error" + ], + "path": "x-pack/plugins/alerting/server/alerts_client/alerts_client_error.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "alerting", + "id": "def-server.AlertsClientError.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "x-pack/plugins/alerting/server/alerts_client/alerts_client_error.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "alerting", "id": "def-server.InstallShutdownError", @@ -3533,10 +3573,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts" }, - { - "plugin": "stackAlerts", - "path": "x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.ts" - }, { "plugin": "stackAlerts", "path": "x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.ts" diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index adc70de114502..cefe8c8b8447b 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 823 | 1 | 792 | 51 | +| 825 | 1 | 794 | 51 | ## Client diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 245012914fc85..f1563ff517d3e 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 9a120eebe3ed4..ff1c317c4f879 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index 0ac5809fbca3b..b532615b31970 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index e9816c6447a10..ab1916c43b03c 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 93201fe179841..69dae7f8fdf44 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index cac829ab79309..bbddf43deb3cf 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index de2829ce93f0d..aaca7e7b1ee11 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 5196545d7539f..80c9cc7916a85 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 5867d5b825705..14e28bd4d9ba7 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index c169145b714b7..e7381f6f1b77a 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index deac1416f138c..a36d09c49ea79 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index b60f92510930a..bee7674145ec2 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index d8dac36a8e49e..5e9aca55ddd29 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index ba0a1ca7370a4..167af207774c6 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index f997d267fc3c5..fe09361ff4bf6 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index e28e0be933f77..889a08840b53f 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index e1cd80030b4e8..2cb09be42de16 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 4ab19494bc12e..24c32f43b23ca 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index c408255e9e437..4ecbaff344e4f 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 8de976a267406..446ea5e8289b4 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index cbae12b08c276..73c8b2040c032 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index fb8259e59b2a4..df0dab9ab0977 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index e268263406505..a7696ffb2b114 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index dfa448a4bf5c6..0bce395adfbb2 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 4c1454ea6e648..280caf7320277 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 64dfa575555f0..a7b37e0f30c9a 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 74551d06871f4..38a69806ef3c9 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 309a3527d3953..8b31bada0a8f7 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index b2a7f60ba614f..4d04d0c26a7a5 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -18,7 +18,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | ---------------|-----------|-----------| | | ml, stackAlerts | - | | | ruleRegistry, observability, ml, infra, monitoring, securitySolution, stackAlerts, synthetics, transform, uptime | - | -| | share, uiActions, guidedOnboarding, home, serverless, management, spaces, savedObjects, indexManagement, visualizations, dashboard, savedObjectsTagging, expressionXY, lens, expressionMetricVis, expressionGauge, security, alerting, triggersActionsUi, cases, aiops, advancedSettings, exploratoryView, fleet, metricsDataAccess, licenseManagement, maps, dataVisualizer, ml, osquery, profiling, apm, expressionImage, expressionMetric, expressionError, expressionRevealImage, expressionRepeatImage, expressionShape, crossClusterReplication, globalSearchBar, graph, grokdebugger, indexLifecycleManagement, infra, ingestPipelines, logstash, monitoring, observabilityOnboarding, devTools, painlessLab, remoteClusters, rollup, searchprofiler, newsfeed, securitySolution, snapshotRestore, synthetics, transform, upgradeAssistant, uptime, ux, watcher, cloudDataMigration, console, filesManagement, kibanaOverview, visDefaultEditor, expressionHeatmap, expressionLegacyMetricVis, expressionPartitionVis, expressionTagcloud, visTypeTable, visTypeTimelion, visTypeTimeseries, visTypeVega, visTypeVislib | - | +| | share, uiActions, guidedOnboarding, home, serverless, management, spaces, savedObjects, indexManagement, visualizations, dashboard, savedObjectsTagging, expressionXY, lens, expressionMetricVis, expressionGauge, security, alerting, triggersActionsUi, cases, aiops, advancedSettings, exploratoryView, fleet, metricsDataAccess, licenseManagement, maps, dataVisualizer, ml, osquery, profiling, apm, expressionImage, expressionMetric, expressionError, expressionRevealImage, expressionRepeatImage, expressionShape, crossClusterReplication, graph, grokdebugger, indexLifecycleManagement, infra, ingestPipelines, logstash, monitoring, observabilityOnboarding, devTools, painlessLab, remoteClusters, rollup, searchprofiler, newsfeed, securitySolution, snapshotRestore, synthetics, transform, upgradeAssistant, uptime, ux, watcher, cloudDataMigration, console, filesManagement, kibanaOverview, visDefaultEditor, expressionHeatmap, expressionLegacyMetricVis, expressionPartitionVis, expressionTagcloud, visTypeTable, visTypeTimelion, visTypeTimeseries, visTypeVega, visTypeVislib | - | | | encryptedSavedObjects, actions, data, ml, logstash, securitySolution, cloudChat | - | | | actions, ml, savedObjectsTagging, enterpriseSearch | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core, savedObjects, visualizations, aiops, ml, dataVisualizer, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation, @kbn/core-saved-objects-browser-mocks | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 1f71eaa96d1b4..3f1f507466d5c 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -831,14 +831,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## globalSearchBar - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/global_search_bar/public/plugin.tsx#:~:text=KibanaThemeProvider), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/global_search_bar/public/plugin.tsx#:~:text=KibanaThemeProvider), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/global_search_bar/public/plugin.tsx#:~:text=KibanaThemeProvider) | - | - - - ## globalSearchProviders | Deprecated API | Reference location(s) | Remove By | @@ -991,7 +983,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/persistence/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/persistence/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [remove_layer_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/remove_layer_action.tsx#:~:text=toMountPoint), [remove_layer_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/remove_layer_action.tsx#:~:text=toMountPoint), [revert_changes_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/visualizations/xy/annotations/actions/revert_changes_action.tsx#:~:text=toMountPoint), [revert_changes_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/visualizations/xy/annotations/actions/revert_changes_action.tsx#:~:text=toMountPoint), [helpers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts#:~:text=toMountPoint), [helpers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts#:~:text=toMountPoint) | - | +| | [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/persistence/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/persistence/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [remove_layer_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/remove_layer_action.tsx#:~:text=toMountPoint), [remove_layer_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/remove_layer_action.tsx#:~:text=toMountPoint), [revert_changes_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/visualizations/xy/annotations/actions/revert_changes_action.tsx#:~:text=toMountPoint), [revert_changes_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/visualizations/xy/annotations/actions/revert_changes_action.tsx#:~:text=toMountPoint), [edit_action_helpers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action_helpers.ts#:~:text=toMountPoint), [edit_action_helpers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action_helpers.ts#:~:text=toMountPoint) | - | | | [help_popover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/datasources/form_based/help_popover.tsx#:~:text=KibanaThemeProvider), [help_popover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/datasources/form_based/help_popover.tsx#:~:text=KibanaThemeProvider), [help_popover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/datasources/form_based/help_popover.tsx#:~:text=KibanaThemeProvider), [expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/visualizations/datatable/expression.tsx#:~:text=KibanaThemeProvider), [expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/visualizations/datatable/expression.tsx#:~:text=KibanaThemeProvider), [expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/visualizations/datatable/expression.tsx#:~:text=KibanaThemeProvider), [save_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/visualizations/xy/annotations/actions/save_action.tsx#:~:text=KibanaThemeProvider), [save_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/visualizations/xy/annotations/actions/save_action.tsx#:~:text=KibanaThemeProvider), [save_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/visualizations/xy/annotations/actions/save_action.tsx#:~:text=KibanaThemeProvider), [settings_menu.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/app_plugin/settings_menu.tsx#:~:text=KibanaThemeProvider)+ 12 more | - | | | [save_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/visualizations/xy/annotations/actions/save_action.tsx#:~:text=SavedObjectSaveModal), [save_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/visualizations/xy/annotations/actions/save_action.tsx#:~:text=SavedObjectSaveModal) | 8.8.0 | | | [find_object_by_title.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/persistence/saved_objects_utils/find_object_by_title.test.ts#:~:text=SavedObjectsClientContract), [find_object_by_title.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/persistence/saved_objects_utils/find_object_by_title.test.ts#:~:text=SavedObjectsClientContract), [find_object_by_title.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/persistence/saved_objects_utils/find_object_by_title.test.ts#:~:text=SavedObjectsClientContract) | - | @@ -1427,7 +1419,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/es_query/index.ts#:~:text=registerNavigation), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/es_query/index.ts#:~:text=registerNavigation), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/es_query/index.ts#:~:text=registerNavigation), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/es_query/index.ts#:~:text=registerNavigation), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/es_query/index.ts#:~:text=registerNavigation) | - | -| | [rule_type.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/rule_type.ts#:~:text=alertFactory), [get_entities_and_generate_alerts.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.ts#:~:text=alertFactory), [executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.ts#:~:text=alertFactory), [executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.ts#:~:text=alertFactory) | - | +| | [get_entities_and_generate_alerts.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.ts#:~:text=alertFactory), [executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.ts#:~:text=alertFactory), [executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.ts#:~:text=alertFactory) | - | | | [fetch_search_source_query.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_search_source_query.ts#:~:text=fetch), [rule_type.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.test.ts#:~:text=fetch), [rule_type.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.test.ts#:~:text=fetch) | - | | | [data_view_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/data_view_select.tsx#:~:text=indexPatterns), [boundary_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx#:~:text=indexPatterns), [boundary_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx#:~:text=indexPatterns), [entity_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx#:~:text=indexPatterns), [entity_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx#:~:text=indexPatterns) | - | | | [expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/threshold/expression.tsx#:~:text=fieldFormats) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index d01634d94f307..7c5b3c2f8d1db 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 05a42dfee4f9c..49721a6640a54 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 1623ea1ab919d..8f7aec0b851b3 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 24a9c9bc9a03c..85ca05e54e595 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index ee97616a9a10f..7b48d973032dc 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 1df64189eba35..181af89056834 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 466683e754287..bf4e662fd0a0f 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 05c1f0c349e09..35a002361207d 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index caace4728e9d9..6c9ebefe470a1 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 42daa2becb86c..4dc9677142a40 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 654b46b0c5e4b..9b12313037818 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 8b2e0bcb53fb6..74875b894bcff 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 25a74bf46d0ea..4d2edcbef9ca3 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index a9b9113640bcb..f2ed4e3b823d8 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index a52100f992de4..ebb713229170b 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index a9e936abeddf3..3a6b885e44216 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 4cca71abe0790..722c2b99c2ef0 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 6b5b21f4fb204..610d50666ab09 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index c77f8c64853d9..68f66b95d6ef5 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 0430d47a37bac..e31ab8977443f 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index a255b55611268..660d8bb3deebc 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 5a123ab07f33a..17bbed8aebef6 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index a856a46b6481e..6d9060dc5c094 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 278599d9f3562..de0b7c7e0c594 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 158fcfa11750f..9ecebe60afcf6 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 2935d4c8b714d..813405b56e762 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index d2a4a1381c977..bcee8974cf16d 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 232a524194c7f..91684d0d6f6d1 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 032e5d0349a13..723bbe47f8636 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 37a7f280f7a62..2da7a5a30b952 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index a2cd495db1062..49f3495a7855f 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 4b9eaff4fd17f..424efa731fab6 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index c21eec2cbe5b8..57b7d033f8b80 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index d578eacf9ffe4..df688b57a8060 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 056dc4d6fb607..07073193bcd14 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index a19c4362e84b6..8360154562568 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 61902a7030a95..53c554241d254 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 87256269da456..d441a1857be39 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 1baf60cb540e1..f76e485895325 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 06a730d0ba9fd..10a95dffca26c 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 1a450bb87e9ba..98e0f0b6ed8c8 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 8216c86f9babb..5a6be0813c982 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index b4632bcd58c02..a9fc518911531 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 73b04a3df72e2..b6ade9184308c 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 1cbd11dfd0d03..58c3128bc9f02 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index f51172b1a406b..7e47dda753d5b 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 121f39152fd02..cd14083f5a4a6 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 8f1195e363d75..7348d48a89b38 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 7fb9322954dd3..5ef982036e984 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index e6904e0c59ffe..e0f63ca0a1692 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 31ec9aeb7e855..9794f4cb1680b 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 1fb4cd71832a9..cd9ee52924db3 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 5c12f240b701d..e9920dea1c7f6 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 59e01e8711ac5..ee15ca922d6a1 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 1af7047716207..d85322e4f1541 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 52d45c656ac9e..5f49867f33030 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 2f3eccb35f7ab..a84b4c1b777bd 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 8f05e511bcacb..775cfc7603fd9 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 16e2cbff3383f..7bbd11809f914 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 5ef08bb07042e..a5261dd76295f 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index d9fbce1b70916..2308c1d2bb90e 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight'] --- import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 7fd594402e9a7..cd8c2e5031d80 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index bbf5c2e0afd8a..fa9c84e411c3f 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 0a1418a7d31bf..29746d8baccfd 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index d564479d022d4..02c6abcf182b9 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index ea5defb14a6d4..e3475f686a38e 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index e825eb91fee44..e048ddc047ef9 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 9370ac0707dd9..0963be5da634e 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index 6faa4c4037efc..92311c3dc8175 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 0f935c59087ff..d3627857ebbd4 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index a60ae4b0cedd9..f3d43f621a3ba 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index 82f2b5d6cd2d2..ae81f88ecddb6 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 2e5e7e969b6cc..2273180eaa78f 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 3a28582b70126..fc4c1ef3e89de 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 51d84b5832477..d61211e4b324b 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 9b4cc2cba02f2..b55cd4a00a2e5 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index dfda599353594..f64562e83c710 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index eda7e11372879..2070eb71b3dc3 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 8f40b76f15167..9daca0998df43 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index eea5fdc3b63ae..9e8e71d82cc24 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 1d61d5261d950..a0e29465bd5d2 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index ffee5680dff63..43c203826913f 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 1dd83bb9e9195..ace85fb984a6e 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 7d26d795cc0b6..b9c53b58502bf 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index c6160456ba0c7..ecd8263d958fd 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 7a08374bcf7bb..eeafff3e3f53e 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index 13da50f3da458..c395e57bd5c37 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index b734c8d7a18fb..28f829569c70f 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 548bf253a4c2d..ac15e36f3e620 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 646ac64e92f54..35e49738c9ee1 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index a7879e4d3d8b7..f6885853bab38 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 25289bfe400a2..6e7b35122b360 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 0f6cb5412babb..a2a209f1f5c3c 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index 56784937c528b..c5bba2659b8e0 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index f6fb22ca13693..a50b6ee3737ca 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index d87a0916ddaad..5ef25a22fdd7e 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index ca7e995b042d6..95bfa2b1f470d 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index 170a694892e35..f462d587430a2 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 8ee8a76549cb2..95bbfa98d1587 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 5b78000d8d91d..6e3db2df263f8 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 31762b4cb59be..540041cdfae26 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index fb1b3ffddcd96..4d5a45ce4f514 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 7094d688d58da..984168575a160 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 08dd066890f32..db906e2aae7ab 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index e6b8399a6fb25..a2ec8bd66365e 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 298111aa0fed3..26e01b07a38cc 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index dbb476c98bb80..3925a4050d7a2 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index ebfa6afcb88ca..086fff1793b4a 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index f1e5c2d4985cc..13929a85fc45a 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 4170ccd2b6a61..5784f6aaad253 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index f0b86d8109388..f4f709a730298 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index 34236f3571dfd..2b75ad47f9b0d 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index c51fc1b3c8b8f..7c29647aadd52 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index 395a13be812fc..9626c62b68df6 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 3567c91b27509..39b4a0a0481e5 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index c82dbdfcda4bf..de789aaa6b3f5 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index ea3c4459c636e..5f2ff3b8b2d61 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index 2936975bb78c6..988e68ec15133 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index a77dedb859eb4..8875485c9aabb 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index 05866c562bb49..530e943b8e926 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 630a23a542d7f..a87366790ba8b 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index ada0b777ba4f7..5e52613ec7563 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 4eb744e8a2589..67cf325c43a0e 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 78c7b425cd391..fb8e41bc8e572 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index cb208e9c0433c..eaf60bbd31799 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index ecc04327dc53b..e9c69de86b77b 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 30f5741da71ec..6de5b1f562ede 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index edebce6161506..10829b1e6275a 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index 9b3b9769fd650..2f57ff6717186 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 69f2a57657f42..bae2165a50a87 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index d7175588a43e9..2355fa68afbb8 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 9a0d5e597f865..2b7a7e5f90047 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 42854703b4afe..1634b62b27917 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 095a92a32b5c4..c9dff23c3fc42 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index f15aee88a3db3..fbbdf852ae172 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index d9fe32a1d6138..dd21efd904706 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 82abcf6512748..53df4b35df5aa 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index b4b5580681867..8ebb452e60bf2 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index e7ad84e90c8ec..ac638f6518370 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 4a6b4bfed4e51..ecfe86d8adc27 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 6a5f735f86a28..22ec8ff9b7f15 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 3a7991dbf5f4a..c467d178aaa9c 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 51c751beed415..21cfe850579fc 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 65cbfab2036ae..3237035fec015 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 4c6a0b6bf4182..3f31f1f7edb84 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index 108457965b7b9..c1c340f9cccc7 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index b0ce16df03234..82fc0ca9ca40b 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 75cc5baef38de..21cbe5fe4dfa0 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 7787852fd47b0..986a34823dcad 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index ba79a9400352c..57d3f7b03ae1b 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 073f3cd3d3d69..1d515d7566223 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 3d2d1b3cf6033..04a2bb69f59f6 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index 34383de09320b..91fa8a5ad49bd 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index bf4a485ef597f..ade659bb9ef91 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index 1baff418e6686..c6fc808e859cf 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index bf19251f98526..5bcb87cf8fbd0 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index c75f43c9091a0..ffa07aefb50bc 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index c9ac829505fdc..89d2a7c871632 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 9f2a3a12bdd55..5c64371144653 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -4404,6 +4404,10 @@ "plugin": "serverlessSearch", "path": "x-pack/plugins/serverless_search/server/routes/indices_routes.ts" }, + { + "plugin": "serverlessSearch", + "path": "x-pack/plugins/serverless_search/server/routes/indices_routes.ts" + }, { "plugin": "serverlessSearch", "path": "x-pack/plugins/serverless_search/server/routes/connectors_routes.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index efb5ca9a8627d..3878dda022f74 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 916f9228d6bcf..3b2c869a440f6 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index b0002eac4cde9..315bff5546a26 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 2f480eac36974..ee4117cafdf51 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 3c9c19fbe0ab0..68284739bceea 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index c3efefc42e35b..3656480a1b161 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index 524fc3c56027e..73c42cd26676e 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index fd742237c6162..e99ae71e0ed32 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 049cf5508ab0a..0fbecc550b890 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index ff3398960d536..374f99df7846e 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index bb7904f1a7e23..0cfbc9010c875 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 3359ce214df07..94fd96b52cbf7 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 92e2cf6d02c50..40197f67df013 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 57f23b6197477..bbeea34bc6636 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 427d68cd9ea41..06bbaebd8709e 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index 7585d0d2c23cc..1ca8d6b623615 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index 31a4b63250962..33c5599426569 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index c6c149b4a5998..9b3045e3fa8ae 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 3a893ec3a2501..b30296c72dab9 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index c2898a671ce2e..a9aa834345570 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 4a370c82f9098..3c12d01bf72c1 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 3823aebb76ab9..d503e9ba8c50e 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 970d898d0d8c4..28dff19fe2d24 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index ef230c858a647..cc635864065ef 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 0738dc8f8c3dd..8b1cae196fcf1 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 448876b7c2496..af8ca1ed8eb08 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 1a2e017640cac..33030427e39e6 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 56aa30dba4c5e..2005c0eb78662 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 34fafde085c17..955df9242dee5 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index e09fba5618ddf..a7571fab6a007 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index a0349c9b53ed7..93efe83e1a368 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index d3bfa4169e5b1..91e4b7602c9fe 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index d4fb8e133a88b..b1fe595fb6119 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index e881c62aacd1c..65fc5ba808174 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 8f16e6f81448d..8aef508ce708d 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index 4b0c81a1c5046..35636514e7b0f 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 8c0dd9c9fe836..5e1aa4e0516ce 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 6dc965a446f0c..b43d393843b38 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 1681c5f47a9b1..cb60cff7899ca 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 0d978818515f9..059b444eee8a6 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 9064da09b3629..b7e7d6d240fe9 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 7f88a8586bbb4..f9a227b51b980 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 71706e6fcfbeb..c3d592b4ccd01 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index e7ff92d28e49b..e3cfc0016205a 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 3babef55d3712..dc894ce408832 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index 3de72e8ff4118..6562cc04b8d2b 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index d315bee07fc0b..8860cc64b0ff2 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 99238dd4fd2a2..46145e7dafea3 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 2f8b013711db7..d18706056fc8c 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 62b278170c193..976ac03873c07 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 4747c7f8fc142..c945b37884f04 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index ae394f1cf3327..64d3947380a89 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index 8f9a96801704e..c14cbd07dcb33 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index ff35430ad0409..b2a5ee9c740c2 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index 74942dc0b4db5..bc618bf1d5280 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index d91a51016a033..c52c887454374 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index 237e39632690b..339f26f951207 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 8cefa52d203b0..aba3efb9f39e6 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 82f4839ece5eb..92fc33c8a512d 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index b43e84a8491a2..8a748b894289f 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 4e47164ec80c0..2bf8adc73f012 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 061fa4404deea..751587b7a7143 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 1f39a2340d61c..ba9afc922f5d2 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 6af81fdd63711..3547870869976 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 0be162fcd2365..e755903cab5c2 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index 44e10756806e4..b660994a8e577 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index aa3e08fc99c66..b76e97cf6f4a2 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index d129c2e9699e1..23ea6489fcf40 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index a4156eb3580d2..4be2f0a68513e 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index dfd0ff5f563f3..f9d2dc98b5ab4 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 15efb3c0dfb0e..57b198a45efe2 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 8a2bd0d4eef0c..5df791a730448 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 903efb2d21160..0caed2822c4b2 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 5272b17ba6b54..2c657268a5d78 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index ae85352065c88..636431f7bf687 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index c403fd047b5c9..9f5784d5b9c64 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index de950736bfaff..64b447f427080 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 4f1d61590ae6a..9d2855bfa8518 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 231f464db3db2..f9d3245d82ead 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 3cf1536c2d9cd..91b53edb813d8 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index edaaacb4887df..611c7b1032e3e 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 4ba5a4f944dd7..9df78e54783bf 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index f0fad67938c8d..c1f26fe313a7d 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index ac2b99490fca4..5f84689ca7a3e 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 657d10ba32d61..a68e6da729d0b 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index dacb1a60213fd..84d53652d3ef5 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index c5c5a1863251a..bb30fde7b6ba3 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 9e0664a60a6b9..b1d3b8b2647ab 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index fbd7b533a17af..5982b088a67b5 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 82fde9834b40d..98456142fa228 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index 832838b23cd60..c844f84771dbb 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 32487c868527a..6ca93ee6cd812 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 2094394427370..d0b256ca06698 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index fdc7d2b471a53..592f46b80a922 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index a7a7b42edc5fe..a9616f0320a58 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 6851c44cd8d3a..b4566e3185708 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 168dac22f1c78..9901ba85c631b 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index e93f9eb98e7d0..de417779892eb 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index dcbb1e7e72b1e..ab1fe7c3565ef 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 855973318b3bf..0c8d3df2a6101 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 0dbf258601435..3f5fce00d8766 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 18e70293bd50a..7a7c81abc68e2 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index a9a7f53acc315..c87af96299e9c 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index d3f6dd79f3df1..ad6f9478e9ad3 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 90300109368ca..1ff3d6a0c29c2 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index e687ca4a1b4c5..981516377d3b2 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 0542a938ccff9..abdddd7ae7cea 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 80cafa7dbbd6d..9607746f81117 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index c9838a7a6fa4c..b071b24947c9e 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 5ecdf8cb813a1..91deb5cd6acae 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index da8379cb1b7b3..4afa160c819c8 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 6568e50674607..3ea7249514608 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 3774d8c765fe2..74cde01bba07b 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 840cc94a4c2d0..a50db44addd84 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 91490fd580eb9..b5d1d4d6aa8f9 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 6bb9f301e847e..ba71492ecec06 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs.mdx b/api_docs/kbn_ecs.mdx index 2f466de40d446..06bfb551f0db3 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs'] --- import kbnEcsObj from './kbn_ecs.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 848e461f325c0..769f84c7a571f 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 1c109848d555d..c9e17d49ca144 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index ece431c0f2d58..1838e84c5e82d 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index a95c465a0d760..14d5b49ef145a 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 78bc34211c648..e2300f88a3101 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index da64a933321d3..727c0410b35d1 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 1052a1a5c7e4e..d5dcf9ba5f308 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 7a560bdee7863..83f290afe8d5d 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 442cd2ca9b297..d106508e62a3f 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index a6fcc77473dca..7f3ea3894a077 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index d25b7bef1befa..a21c94b33bd72 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 7a32fcc4327fd..4650387b4e8de 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 42a76bc1e64e7..736802ee4edf2 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index de2220fb4f755..225f9154c0c87 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 433dd6f2d93d2..354ed95ff1834 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index accdfc8e7091f..46fd82d33a369 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index b14b6e2ff39d2..485a82f935345 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index b1dda159d9555..58a04b102d2d4 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index ef0c710ee8423..ced2d9b02baa1 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index b1336050fd6b5..acdd4ca7108fc 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 19bc6d526e10f..f9ab63c7b8454 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 2730ec77cb851..b4cb4f54e3c90 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 582082df34a82..9a30535f9846c 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index e7d10d6055870..2348a73dada96 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index ef80f3ee46dc5..f1192c6392ba6 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 3c12656bb148a..6df85d7c3fbf9 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index c0ac5fba635db..97f335e2b29a9 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 658352b079658..a7b9c0e7965e7 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 8e6eb9761b126..b76d82f9c63a0 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 2f50f11de3f44..063d2caa0ce09 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 80d0a8339770b..e16c880e29b25 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 8a2fd89d07a8a..736f247e927c0 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index c500d50f9970e..5ecb0dc6f48b3 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index f3ed34ef974f1..587266e89ce0e 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index 8ca3b4cc686b1..5e097f4cad1eb 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 14175629d0de0..7a68f42df30f8 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 3de7135caca51..538469a414ea9 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index e293460031004..f006aeac14ef4 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index c328a9523f7fe..fa1b633c38df0 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index d67369e99fb75..c9e80ba261d71 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 2deb751440b94..77180e8b6218d 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index db808a83e1293..a5e8bbe0c175e 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index cf8d4712ab857..2ade745aeb61e 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index 025e2e2ac4ace..6dff98790c046 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index 9d66ef487abdf..b5f6c56a0c6a1 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index e27fb8fde6adc..5dee0c8129f84 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 2587916d3eca3..9d0b0d5982260 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index e2e351e44a7aa..86db4fa4d568c 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 03888667463b6..5728b144297fb 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 84a9ff0460b60..bf887b0f0d495 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 7de2c8af8f74a..8d232226abb17 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 581101683f9d9..52f8367985b17 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index 6f45cd582b1da..b23991555ea24 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index c0a82642b3e97..40723ca74a888 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index b87a7f92012cb..9527a07532e8a 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index 7e6eeabac5041..d8f183ce4b63e 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index eca8ce4c0ed5e..c331dda348956 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index e52b8338d5355..ef511ba7c9c7a 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 96a8c10ce1221..1f1403134c7d0 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 4d8fe635e1206..b4cce1b1f4056 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 1ac479cc9ad0c..fb9f40daf3815 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index eb54b16550b28..663d847add458 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 4b38a91390f3e..55d74f2dc9a78 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index c4e3ad459a8b6..ee875c4b9b086 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index 8c5ab1329e5c1..9625b2901c5a6 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 33548ea5b09bf..d4b84ca095d03 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 07e67b30d3ece..3e8055e22bfe9 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 0b743eae485bd..9b6a1a8d56e4a 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index 9939154aa79fa..d87dcee33b834 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 87746d0d4e800..fb528775d6d6e 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index 554649dde0947..104c9bd08cbd0 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index da82e1a0bb315..fa5d8a26da85c 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 6f150ba5c262f..f1ec133743bf9 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index cf0c6b27a830a..d76ce7eb02acc 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 1ef538818c106..1c4722fb1e273 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index 37f6d28a5e542..dfdf19203f194 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index ce095c3cb18be..e4cfbe7a1c1bb 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 7945bcea8513a..857f1f1f627f8 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index abf54b6acfab8..161c34fe35446 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index d4cbe6dde603e..8cd0569d7058b 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index d5878e4c69cde..476a8ca11fe6e 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index fb0d42a4954e3..e01ef66fd8ace 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index f86fdb41710a9..d4885592b1637 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index fe5a6ce52bee5..a933509a8fc3c 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index c468bf71c06a1..aee6941054ce4 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 0b9989f5e6ee0..9c7d00cb1c1ce 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index f4063c9da35db..d7076d0b70c8c 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index f8493369a76d7..40ec00d662904 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index c5200492fde1b..1c534416c68cb 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index fe239e48b1bb9..afb5c544aeb70 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 4f69417afdb49..2a3e058e47b17 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 684b35cc79146..ca654854e531d 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 780791e8fb99a..cb11ae38713d9 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index a738b8145a3d1..1261d477deec4 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index cfeceaa90b0f4..4975684673070 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 1f04d43211196..bcb68a4999dfa 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 463cefa369ca4..72b5d45ef3804 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 31f7c73d6d9ff..6734b12533be6 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index 5f62263cf9abc..6eaef4024c13f 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index e730837d06143..97302f7e5ddef 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 94f4da60f0299..766912c60a09c 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index 219366b71df2e..1d96d5a8693f9 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index 53845e86f97a0..3f0fd940b4577 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index c40beda979a85..2e08a38bd8f2f 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 5155ff2962395..f462a62afa769 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index ce1dc3c649607..9be75b489fe1e 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index cdd494995f0d3..ec1cad8776d5c 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index 6dc4b9176db77..ae4b0db271aeb 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 2afa6b59c815a..93ff6845750a2 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index dad1984688386..a4d9ea81b1c2c 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index bc95c41a58d0b..e9d60015e69f1 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index 719d55649c8bf..d71b6f36a07d2 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 06b238b11b93f..43e24ba0b2f1f 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 6e4772df950b0..180e38e7d74aa 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 57ed195534fed..c8c95aba2fdb6 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index c6089a997ac4e..fe10766f2ff6a 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 084a03b76449a..a7f540efabc23 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index ab6066ff08142..1f20773ed98cb 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 65e8bd6973fa0..4538e15c2dd2e 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 2bbf09bde925f..46792eff4da48 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 7cec1b9b998bd..2c87eebdfbf63 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 2b1e0683f309d..fb82dfcadcaf7 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 26de1a1841cbb..af33349d307a5 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 732f1c5da93a0..2a641830beae6 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index b5de70f4790ae..ac28e4ba90994 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.devdocs.json b/api_docs/kbn_search_errors.devdocs.json index ef729a98515f1..897b63cf2bbcc 100644 --- a/api_docs/kbn_search_errors.devdocs.json +++ b/api_docs/kbn_search_errors.devdocs.json @@ -91,6 +91,21 @@ { "parentPluginId": "@kbn/search-errors", "id": "def-common.EsError.Unnamed.$2", + "type": "string", + "tags": [], + "label": "message", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-search-errors/src/es_error.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-errors", + "id": "def-common.EsError.Unnamed.$3", "type": "Function", "tags": [], "label": "openInInspector", @@ -114,7 +129,7 @@ "label": "getErrorMessage", "description": [], "signature": [ - "() => JSX.Element | null" + "() => JSX.Element" ], "path": "packages/kbn-search-errors/src/es_error.tsx", "deprecated": false, @@ -130,63 +145,46 @@ "label": "getActions", "description": [], "signature": [ - "(application: ", - { - "pluginId": "@kbn/core-application-browser", - "scope": "common", - "docId": "kibKbnCoreApplicationBrowserPluginApi", - "section": "def-common.ApplicationStart", - "text": "ApplicationStart" - }, - ") => JSX.Element[]" + "() => JSX.Element[]" ], "path": "packages/kbn-search-errors/src/es_error.tsx", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-errors", - "id": "def-common.EsError.getActions.$1", - "type": "Object", - "tags": [], - "label": "application", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-application-browser", - "scope": "common", - "docId": "kibKbnCoreApplicationBrowserPluginApi", - "section": "def-common.ApplicationStart", - "text": "ApplicationStart" - } - ], - "path": "packages/kbn-search-errors/src/es_error.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], + "children": [], "returnComment": [] } ], "initialIsOpen": false - }, + } + ], + "functions": [ { "parentPluginId": "@kbn/search-errors", - "id": "def-common.PainlessError", - "type": "Class", + "id": "def-common.createEsError", + "type": "Function", "tags": [], - "label": "PainlessError", + "label": "createEsError", "description": [], "signature": [ + "(err: ", { "pluginId": "@kbn/search-errors", "scope": "common", "docId": "kibKbnSearchErrorsPluginApi", - "section": "def-common.PainlessError", - "text": "PainlessError" + "section": "def-common.IEsError", + "text": "IEsError" + }, + ", openInInspector: () => void, services: ", + "Services", + ", dataView: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" }, - " extends ", + " | undefined) => ", { "pluginId": "@kbn/search-errors", "scope": "common", @@ -195,187 +193,87 @@ "text": "EsError" } ], - "path": "packages/kbn-search-errors/src/painless_error.tsx", + "path": "packages/kbn-search-errors/src/create_es_error.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/search-errors", - "id": "def-common.PainlessError.painlessStack", - "type": "string", - "tags": [], - "label": "painlessStack", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "packages/kbn-search-errors/src/painless_error.tsx", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-errors", - "id": "def-common.PainlessError.indexPattern", + "id": "def-common.createEsError.$1", "type": "Object", "tags": [], - "label": "indexPattern", + "label": "err", "description": [], "signature": [ { - "pluginId": "dataViews", + "pluginId": "@kbn/search-errors", "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" - }, - " | undefined" + "docId": "kibKbnSearchErrorsPluginApi", + "section": "def-common.IEsError", + "text": "IEsError" + } ], - "path": "packages/kbn-search-errors/src/painless_error.tsx", + "path": "packages/kbn-search-errors/src/create_es_error.ts", "deprecated": false, - "trackAdoption": false + "trackAdoption": false, + "isRequired": true }, { "parentPluginId": "@kbn/search-errors", - "id": "def-common.PainlessError.Unnamed", + "id": "def-common.createEsError.$2", "type": "Function", "tags": [], - "label": "Constructor", + "label": "openInInspector", "description": [], "signature": [ - "any" + "() => void" ], - "path": "packages/kbn-search-errors/src/painless_error.tsx", + "path": "packages/kbn-search-errors/src/create_es_error.ts", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-errors", - "id": "def-common.PainlessError.Unnamed.$1", - "type": "Object", - "tags": [], - "label": "err", - "description": [], - "signature": [ - { - "pluginId": "@kbn/search-errors", - "scope": "common", - "docId": "kibKbnSearchErrorsPluginApi", - "section": "def-common.IEsError", - "text": "IEsError" - } - ], - "path": "packages/kbn-search-errors/src/painless_error.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/search-errors", - "id": "def-common.PainlessError.Unnamed.$2", - "type": "Function", - "tags": [], - "label": "openInInspector", - "description": [], - "signature": [ - "() => void" - ], - "path": "packages/kbn-search-errors/src/painless_error.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/search-errors", - "id": "def-common.PainlessError.Unnamed.$3", - "type": "Object", - "tags": [], - "label": "indexPattern", - "description": [], - "signature": [ - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" - }, - " | undefined" - ], - "path": "packages/kbn-search-errors/src/painless_error.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], - "returnComment": [] + "isRequired": true }, { "parentPluginId": "@kbn/search-errors", - "id": "def-common.PainlessError.getErrorMessage", - "type": "Function", + "id": "def-common.createEsError.$3", + "type": "Object", "tags": [], - "label": "getErrorMessage", + "label": "services", "description": [], "signature": [ - "() => JSX.Element" + "Services" ], - "path": "packages/kbn-search-errors/src/painless_error.tsx", + "path": "packages/kbn-search-errors/src/create_es_error.ts", "deprecated": false, "trackAdoption": false, - "children": [], - "returnComment": [] + "isRequired": true }, { "parentPluginId": "@kbn/search-errors", - "id": "def-common.PainlessError.getActions", - "type": "Function", + "id": "def-common.createEsError.$4", + "type": "Object", "tags": [], - "label": "getActions", + "label": "dataView", "description": [], "signature": [ - "(application: ", { - "pluginId": "@kbn/core-application-browser", + "pluginId": "dataViews", "scope": "common", - "docId": "kibKbnCoreApplicationBrowserPluginApi", - "section": "def-common.ApplicationStart", - "text": "ApplicationStart" + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" }, - ") => JSX.Element[]" + " | undefined" ], - "path": "packages/kbn-search-errors/src/painless_error.tsx", + "path": "packages/kbn-search-errors/src/create_es_error.ts", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-errors", - "id": "def-common.PainlessError.getActions.$1", - "type": "Object", - "tags": [], - "label": "application", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-application-browser", - "scope": "common", - "docId": "kibKbnCoreApplicationBrowserPluginApi", - "section": "def-common.ApplicationStart", - "text": "ApplicationStart" - } - ], - "path": "packages/kbn-search-errors/src/painless_error.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] + "isRequired": false } ], + "returnComment": [], "initialIsOpen": false - } - ], - "functions": [ + }, { "parentPluginId": "@kbn/search-errors", "id": "def-common.isEsError", @@ -411,54 +309,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/search-errors", - "id": "def-common.isPainlessError", - "type": "Function", - "tags": [], - "label": "isPainlessError", - "description": [], - "signature": [ - "(err: Error | ", - { - "pluginId": "@kbn/search-errors", - "scope": "common", - "docId": "kibKbnSearchErrorsPluginApi", - "section": "def-common.IEsError", - "text": "IEsError" - }, - ") => boolean" - ], - "path": "packages/kbn-search-errors/src/painless_error.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-errors", - "id": "def-common.isPainlessError.$1", - "type": "CompoundType", - "tags": [], - "label": "err", - "description": [], - "signature": [ - "Error | ", - { - "pluginId": "@kbn/search-errors", - "scope": "common", - "docId": "kibKbnSearchErrorsPluginApi", - "section": "def-common.IEsError", - "text": "IEsError" - } - ], - "path": "packages/kbn-search-errors/src/painless_error.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/search-errors", "id": "def-common.renderSearchError", @@ -467,15 +317,7 @@ "label": "renderSearchError", "description": [], "signature": [ - "({\n error,\n application,\n}: { error: Error; application: ", - { - "pluginId": "@kbn/core-application-browser", - "scope": "common", - "docId": "kibKbnCoreApplicationBrowserPluginApi", - "section": "def-common.ApplicationStart", - "text": "ApplicationStart" - }, - "; }) => { title: string; body: React.ReactNode; actions?: React.ReactNode[] | undefined; } | undefined" + "(error: Error) => { title: string; body: React.ReactNode; actions?: React.ReactNode[] | undefined; } | undefined" ], "path": "packages/kbn-search-errors/src/render_search_error.ts", "deprecated": false, @@ -486,47 +328,15 @@ "id": "def-common.renderSearchError.$1", "type": "Object", "tags": [], - "label": "{\n error,\n application,\n}", + "label": "error", "description": [], + "signature": [ + "Error" + ], "path": "packages/kbn-search-errors/src/render_search_error.ts", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-errors", - "id": "def-common.renderSearchError.$1.error", - "type": "Object", - "tags": [], - "label": "error", - "description": [], - "signature": [ - "Error" - ], - "path": "packages/kbn-search-errors/src/render_search_error.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-errors", - "id": "def-common.renderSearchError.$1.application", - "type": "Object", - "tags": [], - "label": "application", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-application-browser", - "scope": "common", - "docId": "kibKbnCoreApplicationBrowserPluginApi", - "section": "def-common.ApplicationStart", - "text": "ApplicationStart" - } - ], - "path": "packages/kbn-search-errors/src/render_search_error.ts", - "deprecated": false, - "trackAdoption": false - } - ] + "isRequired": true } ], "returnComment": [], diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 28044c354967a..76f049106e464 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 27 | 1 | 26 | 0 | +| 18 | 1 | 17 | 1 | ## Common diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 4e80f1e09ae49..67a450e95dc02 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 872d1241f4c79..c8733af8f3b4f 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 7df39a20835e1..361e44f7525b9 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 0311d655af61b..c1eddbd21e6ec 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 07bf3b3b1d053..1ee3409edb441 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 2bb23757570cf..2275e43f86531 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index f276821476701..e98dcbc0fb3e1 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index f7419335104ce..198fd8d906c6a 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index daae2d1b00eec..a86bd69301014 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index e919e16c4fb9a..d46b9573b02ab 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index c10215d400df3..752391b00c71e 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index a1619d9228776..1c30c2dd9ddae 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 2e9e3fda3bd73..c69cc00e9bd5d 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 2504bf49c085d..485f91badfd29 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index c8566604b272e..99bcebd52620c 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index d55216dc82dc6..daa59d3a14a8f 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index aa9796b5717ac..dad69dd4f7d3c 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index b3ef203a1a3c0..457a7d0f43b9a 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index 60abe223e006d..888396c150259 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 9b45eb5442f01..6cd8f93dc42ce 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 9a894c867b646..d6e71ec16ff10 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 696893d05623a..ce41a5911691f 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 3861554241486..f1d90b8643476 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 67d118226936e..a17d58fef2957 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index e2c786980f7b8..5bc2204e82bb7 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 731f71bba1261..7788a5d4355dd 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 80a6ecd781096..609f341dc1b05 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index f56737b1185de..2cc9052e6efbb 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 92366c91ca283..145a3a4e98f6c 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index fba7e624924c9..4d19913b46abc 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index bb81917229091..90e9414c322d8 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index d19c30dda087f..4dae4a8365fb9 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index d269700c68f44..1f5140ac73696 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index 69fdcced5a23d..5e1ef4e7cc4cd 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index d10b95719787b..5e737ffe67b0c 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 0ac8433ce61cb..34d9e1cd7c3f8 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 49f1e02ff5c1e..0edcb0420cf0b 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index f65e8e2cbf415..b2a4991f0150d 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 39fc250553136..731b7d47abda6 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index e71e76571b820..b402fab6533ba 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index ffaa19fe356c1..d2d7c19d98f93 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 171e417021a5c..2ee426316121d 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index c50aae83d82f5..50108c9335524 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 172e010a4c1dc..a60c0a9caec89 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 0900aa85d5405..564d7c1f72c99 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index ef67141bccf4b..db69b2c21e993 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index 6b43a7bfaa4f0..ed36cadf1dd82 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index b43071a29b928..9a7b32461ba39 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index 4cd8dafad7582..f10f62d557f53 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 46eb79de5c2ed..cadb839de4d01 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index e4edf827ef2cd..d1ebebbf8a1e0 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 983664d389a81..4e23dbadfc9bd 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index d62e92b1a1e04..23c1ab4249242 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 5ae9195fabe12..4000466839f8f 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index 48375e038a4af..6fc345cdff8dc 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 796aeae4062e1..4e0c87fcd147c 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index 6d352e3966d99..02dd7e6dab758 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index beb7f0bcab789..04b9041cfb4da 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index a82ba43928832..8537917d2ff7a 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 51be93e9e9f2e..096853f46f3c4 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index c61ba39a57398..8bb57fa2a8302 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 720dba137db81..0a73e8c82489c 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 537dff4ff66e1..b3a4be7b334b7 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 2288c1079c75b..038d4faba2241 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index 6c0ebc1013fa6..a8061ccfe81f2 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 725618eba9325..d30b04f051926 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index d72ca3b1a5406..eb3833fa9b1e0 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index b1361b01291ee..51da241172139 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 4c3e1c497c694..2c03e16d1fc51 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index e2c9d2f9413cc..ba28fe3f7d2dc 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index ee8b10c4ce756..5709c448d789f 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 9db659968e67e..9a2940efe64f9 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index c089cd897f9ba..fcc8046d13a63 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 74b36dd06f458..7c59a633a5dd4 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 2230d89183b5f..ceb9a840c2a62 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index d3f8fb78d0d67..b9411bcd7e437 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 768a8cd40f2e9..61a90c02e971a 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index b93e199289958..5d042ac9453c0 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index bec40b1c04f32..8c83d7b479f28 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 0ac88141ae1ed..dafa7e902090f 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index b31ff349267de..38873e11feae9 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 06f466e44a820..b6adb6aa52c70 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 1181ce81c9fe0..4634783a3495b 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 7f126ebb94d9d..855e9d75cb147 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 0965a33c7bdd0..a222ccab26b21 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 09935c9dec33d..27f68438ecc48 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 6f51d5f3a7c4d..e51582dcdfc2e 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index df3bf00edb00f..26bd1db7ee89c 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 1311abc8cb33b..b8cba57bb0947 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 9623a6b3c92fb..30e320001d442 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 4fbced2ccff16..c749f451f7264 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 869008aef7bb3..4764ff63f7c4d 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 02c1582cafe73..1b0ccd381712a 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index f70078f4c1cb9..2700f12fc973b 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index 49242071d22cf..cef793436ec50 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 375f32cca1a6b..fcac56c602b0e 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state'] --- import kbnUrlStateObj from './kbn_url_state.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 0e3f645e97aff..70ee024c368f1 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index eb981a467633f..900a4d6c7bce8 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 70a7d2a2a36fb..98862238bb909 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index e865b4aa1aca3..819717c4d1ff9 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 6cb0c354c7e42..65c46038f6aeb 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index d5892e8d25007..ed530e49d0d3c 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index db9bce5caa52f..3050f707cb63b 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 0322596c1aa40..39f0156a7f393 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index c937220df66e1..4f4441e0d5bcd 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index bf8661b5e7b4d..e31e880f0303c 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 515a302398cec..06bea3a9af217 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index 8d7cb865d9f39..193309dd1a10c 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -1535,18 +1535,6 @@ "plugin": "crossClusterReplication", "path": "x-pack/plugins/cross_cluster_replication/public/app/index.tsx" }, - { - "plugin": "globalSearchBar", - "path": "x-pack/plugins/global_search_bar/public/plugin.tsx" - }, - { - "plugin": "globalSearchBar", - "path": "x-pack/plugins/global_search_bar/public/plugin.tsx" - }, - { - "plugin": "globalSearchBar", - "path": "x-pack/plugins/global_search_bar/public/plugin.tsx" - }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/application.tsx" @@ -2758,11 +2746,11 @@ }, { "plugin": "lens", - "path": "x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts" + "path": "x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action_helpers.ts" }, { "plugin": "lens", - "path": "x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts" + "path": "x-pack/plugins/lens/public/trigger_actions/open_lens_config/edit_action_helpers.ts" }, { "plugin": "security", diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 0b959dc7f193c..3a736d65bad57 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index c5f2f8fc2ee45..4fecd5e7d96e4 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 3288494857432..bcad5afe8964b 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 48dc406105739..77331951572fc 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -502,7 +502,7 @@ "signature": [ "(startDependencies: ", "LensPluginStartDependencies", - ") => Promise" + ", isNewPanel?: boolean | undefined, deletePanel?: (() => void) | undefined) => Promise" ], "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", "deprecated": false, @@ -522,6 +522,36 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "lens", + "id": "def-public.Embeddable.openConfingPanel.$2", + "type": "CompoundType", + "tags": [], + "label": "isNewPanel", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "lens", + "id": "def-public.Embeddable.openConfingPanel.$3", + "type": "Function", + "tags": [], + "label": "deletePanel", + "description": [], + "signature": [ + "(() => void) | undefined" + ], + "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index dee02d6eee013..43a45ad70fb15 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 642 | 0 | 543 | 60 | +| 644 | 0 | 545 | 60 | ## Client diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 65406175b3779..6a4c82b8a8794 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 028dc38a5a860..c545d98dace7c 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index c63f1231b414d..5cdcdabe6ece9 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 5a61455b54f89..96287b83998f4 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 9d0c651ee081d..c9858c1b33668 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index 5ec0351c769a4..f7d80ed35744e 100644 --- a/api_docs/log_explorer.mdx +++ b/api_docs/log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logExplorer title: "logExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logExplorer plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index abc6f480bf76b..34f168ca6d1cd 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index ce0aac83f4b29..fb75971d42180 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index c90b38e41ad5b..922773a9fa48e 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 3be1cb138f694..9759248cfe03e 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index b447b5fee0d23..9d4a25d840dfe 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.devdocs.json b/api_docs/ml.devdocs.json index 46c0e7d8ec219..7006f03c26649 100644 --- a/api_docs/ml.devdocs.json +++ b/api_docs/ml.devdocs.json @@ -1942,6 +1942,8 @@ "section": "def-common.ModelDefinitionResponse", "text": "ModelDefinitionResponse" }, + ">; installElasticModel(modelId: string): Promise<", + "MlTrainedModelConfig", ">; }" ], "path": "x-pack/plugins/ml/server/shared.ts", diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 62bd3e5f384eb..39c8b7f0936bc 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index e1fe1f71f6d7f..d50d6bd0f569e 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index f3f50e0bce9df..e1e604ffd2fa3 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index b6f63e843feb0..49f02cdd7ef85 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 3dd539ffa14ba..2606500208d22 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 80236314935b7..1a1a394eb8a86 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index eb47ec2711c68..1a945f3286452 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index adcdf65421338..511c367dfd527 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index f27da99a8627f..6d84e75abce28 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index c32c8a3b28b8d..b877662dc6996 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_log_explorer.mdx b/api_docs/observability_log_explorer.mdx index 9f33390c3e3fd..aba2a4083a869 100644 --- a/api_docs/observability_log_explorer.mdx +++ b/api_docs/observability_log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogExplorer title: "observabilityLogExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogExplorer plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogExplorer'] --- import observabilityLogExplorerObj from './observability_log_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index aba1582e714bb..337c6c985de7c 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 1cb30444ed915..9961c7ee45b19 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 7c844e7c20890..5901b5a78fe7b 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index f402851a03758..76013e66cdf0e 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 17f08e2dbc889..4747b5e1d153c 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,18 +21,18 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 77948 | 234 | 66667 | 1632 | +| 77945 | 234 | 66664 | 1633 | ## Plugin Directory | Plugin name           | Maintaining team | Description | API Cnt | Any Cnt | Missing
comments | Missing
exports | |--------------|----------------|-----------|--------------|----------|---------------|--------| -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 269 | 0 | 263 | 31 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 271 | 0 | 265 | 31 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 17 | 1 | 15 | 2 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 70 | 1 | 4 | 1 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 823 | 1 | 792 | 51 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 825 | 1 | 794 | 51 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 125 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Asset manager plugin for entity assets (inventory, topology, etc) | 9 | 0 | 9 | 2 | @@ -120,7 +120,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 611 | 3 | 418 | 9 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 5 | 0 | 5 | 1 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 642 | 0 | 543 | 60 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 644 | 0 | 545 | 60 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 8 | 0 | 8 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | @@ -577,7 +577,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 75 | 0 | 75 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 2649 | 0 | 2649 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 27 | 1 | 26 | 0 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 1 | 17 | 1 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 25 | 0 | 25 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 20 | 0 | 18 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 82 | 0 | 35 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 82c72d0602be1..c5fcf6bfdcb84 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index d86926dbc6124..316aac69a7a24 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index a4dfcf9221f7a..db31aaa30770b 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 0e3fc6069c67e..0c3a29e2f0292 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index f777f625117c2..0e0f3fa5e0d8b 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 02240413d6193..6cd47a02f92ab 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 20f9ca21e639c..d7de2b78ab759 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 79e5feb5fdcfe..4e93860f6f085 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 23c28ea734930..aadb38dd6a112 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index a0b3d295f0609..e00b28a628f23 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index ac7ac641a56a8..93157b055943f 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 10b8f4ef1b30c..28287a1053a89 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 2d2c31c35d6d4..7ddd453c5b969 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 080da486d6653..4d2e24cbe2e67 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 78133a696a999..19dd5b85890a5 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index dc5de4e95bdc1..3e00d449b78b6 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index d89c9efeeed03..0ede3f065f01e 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index a709f1d217625..90e9ace7ef4dd 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -473,7 +473,7 @@ "label": "data", "description": [], "signature": [ - "({ type: \"eql\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"eql\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; data_view_id?: string | undefined; filters?: unknown[] | undefined; event_category_override?: string | undefined; tiebreaker_field?: string | undefined; timestamp_field?: string | undefined; } | { type: \"query\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; saved_id?: string | undefined; response_actions?: ({ params: { query?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; queries?: { id: string; query: string; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; version?: string | undefined; platform?: string | undefined; removed?: boolean | undefined; snapshot?: boolean | undefined; }[] | undefined; pack_id?: string | undefined; saved_query_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { type: \"saved_query\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; saved_id: string; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; query?: string | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; response_actions?: ({ params: { query?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; queries?: { id: string; query: string; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; version?: string | undefined; platform?: string | undefined; removed?: boolean | undefined; snapshot?: boolean | undefined; }[] | undefined; pack_id?: string | undefined; saved_query_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { type: \"threshold\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; threshold: { value: number; field: (string | string[]) & (string | string[] | undefined); cardinality?: { value: number; field: string; }[] | undefined; }; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; saved_id?: string | undefined; alert_suppression?: { duration: { value: number; unit: \"m\" | \"h\" | \"s\"; }; } | undefined; } | { type: \"threat_match\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; threat_query: string; threat_mapping: { entries: { type: \"mapping\"; value: string; field: string; }[]; }[]; threat_index: string[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; saved_id?: string | undefined; threat_filters?: unknown[] | undefined; threat_indicator_path?: string | undefined; threat_language?: \"lucene\" | \"kuery\" | undefined; concurrent_searches?: number | undefined; items_per_search?: number | undefined; } | { type: \"machine_learning\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; anomaly_threshold: number; machine_learning_job_id: (string | string[]) & (string | string[] | undefined); license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; } | { type: \"new_terms\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; new_terms_fields: string[]; history_window_start: string; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; } | { type: \"esql\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"esql\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; })[]" + "({ type: \"eql\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"eql\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; data_view_id?: string | undefined; filters?: unknown[] | undefined; event_category_override?: string | undefined; tiebreaker_field?: string | undefined; timestamp_field?: string | undefined; } | { type: \"query\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; saved_id?: string | undefined; response_actions?: ({ params: { query?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; queries?: { id: string; query: string; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; version?: string | undefined; platform?: string | undefined; removed?: boolean | undefined; snapshot?: boolean | undefined; }[] | undefined; pack_id?: string | undefined; saved_query_id?: string | undefined; timeout?: number | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { type: \"saved_query\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; saved_id: string; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; query?: string | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; response_actions?: ({ params: { query?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; queries?: { id: string; query: string; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; version?: string | undefined; platform?: string | undefined; removed?: boolean | undefined; snapshot?: boolean | undefined; }[] | undefined; pack_id?: string | undefined; saved_query_id?: string | undefined; timeout?: number | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { type: \"threshold\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; threshold: { value: number; field: (string | string[]) & (string | string[] | undefined); cardinality?: { value: number; field: string; }[] | undefined; }; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; saved_id?: string | undefined; alert_suppression?: { duration: { value: number; unit: \"m\" | \"h\" | \"s\"; }; } | undefined; } | { type: \"threat_match\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; threat_query: string; threat_mapping: { entries: { type: \"mapping\"; value: string; field: string; }[]; }[]; threat_index: string[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; saved_id?: string | undefined; threat_filters?: unknown[] | undefined; threat_indicator_path?: string | undefined; threat_language?: \"lucene\" | \"kuery\" | undefined; concurrent_searches?: number | undefined; items_per_search?: number | undefined; } | { type: \"machine_learning\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; anomaly_threshold: number; machine_learning_job_id: (string | string[]) & (string | string[] | undefined); license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; } | { type: \"new_terms\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; new_terms_fields: string[]; history_window_start: string; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; } | { type: \"esql\"; id: string; name: string; actions: { id: string; params: {} & { [k: string]: unknown; }; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; version: number; references: string[]; interval: string; query: string; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"esql\"; created_at: string; created_by: string; updated_at: string; updated_by: string; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; id: string; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; })[]" ], "path": "x-pack/plugins/security_solution/public/detection_engine/rule_management/logic/types.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 0671100376372..c35d33c5a1830 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index dc8561d3b52e3..0c8033309906a 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 5a65ce9ac7880..52d425948f887 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 79c8072a32a1c..5a8d4beb65789 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 7968fb6705e85..503bfed68c52f 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 000e66ee1ef3b..1b254a56e0845 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 7c69e1e152581..7df80b70f7d48 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 42447b167842d..7df436cbd7e9f 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 95286a9e82190..65d446a366899 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 01cd1d29fd4e6..3b217b70a5f84 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index c1c347c643dfc..41fb5eba150b7 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index ebbce17be89c1..db49c370487ca 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.devdocs.json b/api_docs/task_manager.devdocs.json index 2bc531bde5295..23398830c4a27 100644 --- a/api_docs/task_manager.devdocs.json +++ b/api_docs/task_manager.devdocs.json @@ -387,9 +387,9 @@ "(error: Error, errorSource: ", { "pluginId": "taskManager", - "scope": "server", + "scope": "common", "docId": "kibTaskManagerPluginApi", - "section": "def-server.TaskErrorSource", + "section": "def-common.TaskErrorSource", "text": "TaskErrorSource" }, ") => ", @@ -430,9 +430,9 @@ "signature": [ { "pluginId": "taskManager", - "scope": "server", + "scope": "common", "docId": "kibTaskManagerPluginApi", - "section": "def-server.TaskErrorSource", + "section": "def-common.TaskErrorSource", "text": "TaskErrorSource" } ], @@ -633,15 +633,7 @@ "label": "throwUnrecoverableError", "description": [], "signature": [ - "(error: Error, errorSource: ", - { - "pluginId": "taskManager", - "scope": "server", - "docId": "kibTaskManagerPluginApi", - "section": "def-server.TaskErrorSource", - "text": "TaskErrorSource" - }, - ") => void" + "(error: Error) => void" ], "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", "deprecated": false, @@ -661,27 +653,6 @@ "deprecated": false, "trackAdoption": false, "isRequired": true - }, - { - "parentPluginId": "taskManager", - "id": "def-server.throwUnrecoverableError.$2", - "type": "Enum", - "tags": [], - "label": "errorSource", - "description": [], - "signature": [ - { - "pluginId": "taskManager", - "scope": "server", - "docId": "kibTaskManagerPluginApi", - "section": "def-server.TaskErrorSource", - "text": "TaskErrorSource" - } - ], - "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true } ], "returnComment": [], @@ -1021,9 +992,9 @@ "signature": [ { "pluginId": "taskManager", - "scope": "server", + "scope": "common", "docId": "kibTaskManagerPluginApi", - "section": "def-server.TaskErrorSource", + "section": "def-common.TaskErrorSource", "text": "TaskErrorSource" }, " | undefined" @@ -1637,7 +1608,7 @@ "tags": [], "label": "TaskErrorSource", "description": [], - "path": "x-pack/plugins/task_manager/server/task_running/errors.ts", + "path": "x-pack/plugins/task_manager/common/constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -2001,7 +1972,20 @@ "classes": [], "functions": [], "interfaces": [], - "enums": [], + "enums": [ + { + "parentPluginId": "taskManager", + "id": "def-common.TaskErrorSource", + "type": "Enum", + "tags": [], + "label": "TaskErrorSource", + "description": [], + "path": "x-pack/plugins/task_manager/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "misc": [], "objects": [] } diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index f5720acb909f0..ae1bc36977634 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; @@ -49,3 +49,8 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o ### Consts, variables and types +## Common + +### Enums + + diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 2c7e34966b678..bec624ee7bc0a 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index b3ece3658ff6c..022872c85c626 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index a249b1bc0d577..e89823beb2c2a 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 93af855b77f7f..60093707708af 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index 1b843089f1361..856b1a94c8e2a 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 63e264031d361..5517b603b5016 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 8bda84c44e806..66a6f9bbf7318 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 964343655f031..aa7207521614e 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.devdocs.json b/api_docs/triggers_actions_ui.devdocs.json index e33cbc84596e9..fc734b95daecb 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -1026,7 +1026,7 @@ "label": "JsonEditorWithMessageVariables", "description": [], "signature": [ - "({ buttonTitle, messageVariables, paramsProperty, inputTargetValue, label, errors, areaLabel, onDocumentsChange, helpText, onBlur, showButtonTitle, euiCodeEditorProps, }: React.PropsWithChildren) => JSX.Element" + "({ buttonTitle, messageVariables, paramsProperty, inputTargetValue, label, errors, ariaLabel, onDocumentsChange, helpText, onBlur, showButtonTitle, dataTestSubj, euiCodeEditorProps, }: React.PropsWithChildren) => JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/components/json_editor_with_message_variables.tsx", "deprecated": false, @@ -1037,7 +1037,7 @@ "id": "def-public.JsonEditorWithMessageVariables.$1", "type": "CompoundType", "tags": [], - "label": "{\n buttonTitle,\n messageVariables,\n paramsProperty,\n inputTargetValue,\n label,\n errors,\n areaLabel,\n onDocumentsChange,\n helpText,\n onBlur,\n showButtonTitle,\n euiCodeEditorProps = {},\n}", + "label": "{\n buttonTitle,\n messageVariables,\n paramsProperty,\n inputTargetValue,\n label,\n errors,\n ariaLabel,\n onDocumentsChange,\n helpText,\n onBlur,\n showButtonTitle,\n dataTestSubj,\n euiCodeEditorProps = {},\n}", "description": [], "signature": [ "React.PropsWithChildren" diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 0050e9ce95a4e..382c520ca566a 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 6214a4ddeaefa..1cecdd6add6b2 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 45c4c1d21ffed..f91f347581c57 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 2e786d70f2f71..a8145a03cb216 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index b7dfd2a6c836b..0355b61632ed9 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 39c3794055604..ca4811c5b7480 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 19d4782ec7d6b..7700de2fe347a 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 4c3129b133478..d217285af03b6 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 5fcc62642813a..0795f1f3e7f2f 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index f71b562a62218..e354828fa7360 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 8a6ba03021b09..54bbba1608ee5 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index f24bee0440e98..99f394604f844 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 4c67dd85451ac..f1397d08f3774 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 74cfe13aba587..c27b5a2dbab32 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 750aaaf624e5b..82cc2e49381ae 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 93db8c2d945cb..a21e7b3b2317f 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index 56292f6063c33..90492ffa34106 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 7902ca8103143..d9168065f45fd 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 5b0bd3b1753af..96ee0e109ece5 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 333d3ec33541b..71faad7c2dad5 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 12a82eb484d4c..6f6eb2244bdce 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index e10f383193377..71206e094e36f 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2023-12-20 +date: 2023-12-21 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 1f3d3eaaa703ddc470ebe3e2e6140cd068434f14 Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Thu, 21 Dec 2023 09:06:02 +0100 Subject: [PATCH 51/62] [Fleet] adding upgrade details UPG_FAILED check to stuck in updating (#173628) ## Summary Closes https://github.com/elastic/kibana/issues/171419 Added upgrade details check to restart upgrade callout when agent is stuck in updating. Changed the copy slightly when the agent has failed upgrade state. image Existing copy when there is no upgrade details (stuck in updating for more than 2 hours): image Adjusted Agent list tooltip as well if upgrade details state is failed. image ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../fleet/common/services/agent_status.ts | 15 ++++-- .../agents/components/agent_health.test.tsx | 53 +++++++++++++++++++ .../agents/components/agent_health.tsx | 36 +++++++++---- .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 6 files changed, 90 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/fleet/common/services/agent_status.ts b/x-pack/plugins/fleet/common/services/agent_status.ts index a7a5257c603b8..78726667f3b13 100644 --- a/x-pack/plugins/fleet/common/services/agent_status.ts +++ b/x-pack/plugins/fleet/common/services/agent_status.ts @@ -61,10 +61,15 @@ export const AGENT_UPDATING_TIMEOUT_HOURS = 2; export function isStuckInUpdating(agent: Agent): boolean { return ( - agent.status === 'updating' && - !!agent.upgrade_started_at && - !agent.upgraded_at && - Date.now() - Date.parse(agent.upgrade_started_at) > - AGENT_UPDATING_TIMEOUT_HOURS * 60 * 60 * 1000 + (agent.status !== 'offline' && agent.active && isAgentInFailedUpgradeState(agent)) || + (agent.status === 'updating' && + !!agent.upgrade_started_at && + !agent.upgraded_at && + Date.now() - Date.parse(agent.upgrade_started_at) > + AGENT_UPDATING_TIMEOUT_HOURS * 60 * 60 * 1000) ); } + +export function isAgentInFailedUpgradeState(agent: Agent): boolean { + return agent.upgrade_details?.state === 'UPG_FAILED'; +} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.test.tsx index 93646a544bebb..b55190d848f8a 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.test.tsx @@ -40,6 +40,8 @@ describe('AgentHealth', () => { true ); + utils.getByText('Agent may be stuck updating.'); + act(() => { fireEvent.click(utils.getByTestId('restartUpgradeBtn')); }); @@ -47,6 +49,56 @@ describe('AgentHealth', () => { utils.findByText('Upgrade Modal'); }); + it('should render agent health with callout when agent has upgrade state failed', () => { + const { utils } = renderAgentHealth( + { + active: true, + status: 'online', + upgrade_started_at: '2022-11-21T12:27:24Z', + upgrade_details: { + state: 'UPG_FAILED', + }, + } as any, + true + ); + + utils.getByText('Agent upgrade is stuck in failed state.'); + + utils.getByTestId('restartUpgradeBtn'); + }); + + it('should not render agent health with callout when agent has upgrade state failed but offline', () => { + const { utils } = renderAgentHealth( + { + active: true, + status: 'offline', + upgrade_started_at: '2022-11-21T12:27:24Z', + upgrade_details: { + state: 'UPG_FAILED', + }, + } as any, + true + ); + + expect(utils.queryByTestId('restartUpgradeBtn')).not.toBeInTheDocument(); + }); + + it('should not render agent health with callout when agent has upgrade state failed but inactive', () => { + const { utils } = renderAgentHealth( + { + active: false, + status: 'unenrolled', + upgrade_started_at: '2022-11-21T12:27:24Z', + upgrade_details: { + state: 'UPG_FAILED', + }, + } as any, + true + ); + + expect(utils.queryByTestId('restartUpgradeBtn')).not.toBeInTheDocument(); + }); + it('should not render agent health with callout when agent not stuck updating', () => { const { utils } = renderAgentHealth( { @@ -58,6 +110,7 @@ describe('AgentHealth', () => { ); expect(utils.queryByTestId('restartUpgradeBtn')).not.toBeInTheDocument(); + expect(utils.queryByText('Agent may be stuck updating.')).not.toBeInTheDocument(); }); it('should not render agent health with callout when not from details', () => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.tsx index 0cb89b06b62d2..fa8e263c16170 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.tsx @@ -23,6 +23,7 @@ import { euiLightVars as euiVars } from '@kbn/ui-theme'; import { getPreviousAgentStatusForOfflineAgents, + isAgentInFailedUpgradeState, isStuckInUpdating, } from '../../../../../../common/services/agent_status'; @@ -152,12 +153,19 @@ export const AgentHealth: React.FunctionComponent = ({ agent, fromDetails

{lastCheckinText}

{lastCheckInMessageText}

{isStuckInUpdating(agent) ? ( -

+ isAgentInFailedUpgradeState(agent) ? ( -

+ ) : ( +

+ +

+ ) ) : null} } @@ -183,17 +191,27 @@ export const AgentHealth: React.FunctionComponent = ({ agent, fromDetails size="m" color="warning" title={ - + isAgentInFailedUpgradeState(agent) ? ( + + ) : ( + + ) } >

diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index e2ae422fddd7b..1f97750f40911 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -16579,7 +16579,6 @@ "xpack.fleet.agentFlyout.standaloneRadioOption": "{standaloneMessage} – Exécutez un agent Elastic Agent de façon autonome pour le configurer et le mettre à jour manuellement sur l'hôte sur lequel il est installé.", "xpack.fleet.agentHealth.checkinMessageText": "Dernier message de vérification : {lastCheckinMessage}", "xpack.fleet.agentHealth.checkInTooltipText": "Dernier archivage le {lastCheckIn}", - "xpack.fleet.agentHealth.stuckUpdatingText": "L'agent effectue la mise à jour depuis un certain temps ; il est peut-être bloqué. Envisagez de redémarrer la mise à niveau. {learnMore}", "xpack.fleet.agentList.noFilteredAgentsPrompt": "Aucun agent trouvé. {clearFiltersLink}", "xpack.fleet.agentLogs.logDisabledCallOutDescription": "Mettez à jour la politique de l'agent {settingsLink} pour activer la collecte de logs.", "xpack.fleet.agentLogs.oldAgentWarningTitle": "La vue Logs requiert Elastic Agent 7.11 ou une version ultérieure. Pour mettre à niveau un agent, accédez au menu Actions ou {downloadLink} une version plus récente.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 5097700abe0f4..0bcc41300dc7b 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -16592,7 +16592,6 @@ "xpack.fleet.agentFlyout.standaloneRadioOption": "{standaloneMessage} – Elasticエージェントをスタンドアロンで実行して、エージェントがインストールされているホストで、手動でエージェントを構成および更新します。", "xpack.fleet.agentHealth.checkinMessageText": "前回のチェックインメッセージ:{lastCheckinMessage}", "xpack.fleet.agentHealth.checkInTooltipText": "前回確認日時:{lastCheckIn}", - "xpack.fleet.agentHealth.stuckUpdatingText": "エージェントはしばらく更新が止まっている可能性があります。アップグレードの再開を検討してください。{learnMore}", "xpack.fleet.agentList.noFilteredAgentsPrompt": "エージェントが見つかりません。{clearFiltersLink}", "xpack.fleet.agentLogs.logDisabledCallOutDescription": "エージェントのポリシー{settingsLink}を更新して、ログ収集を有効にします。", "xpack.fleet.agentLogs.oldAgentWarningTitle": "ログの表示には、Elastic Agent 7.11以降が必要です。エージェントをアップグレードするには、[アクション]メニューに移動するか、新しいバージョンを{downloadLink}。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index bfaf27a55bd58..9e283e2a5fe0b 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -16592,7 +16592,6 @@ "xpack.fleet.agentFlyout.standaloneRadioOption": "{standaloneMessage} – 独立运行 Elastic 代理,以在安装代理的主机上手动配置和更新代理。", "xpack.fleet.agentHealth.checkinMessageText": "上次签入消息:{lastCheckinMessage}", "xpack.fleet.agentHealth.checkInTooltipText": "上次签入时间 {lastCheckIn}", - "xpack.fleet.agentHealth.stuckUpdatingText": "代理已更新一段时间,并可能陷入停滞。请考虑重新开始升级。{learnMore}", "xpack.fleet.agentList.noFilteredAgentsPrompt": "找不到代理。{clearFiltersLink}", "xpack.fleet.agentLogs.logDisabledCallOutDescription": "更新代理的策略 {settingsLink} 以启用日志收集。", "xpack.fleet.agentLogs.oldAgentWarningTitle": "“日志”视图需要 Elastic Agent 7.11 或更高版本。要升级代理,请前往“操作”菜单或{downloadLink}更新的版本。", From b40b566e99f1f212fa9c307cd32f29362b433260 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 21 Dec 2023 11:01:15 +0200 Subject: [PATCH 52/62] [ES|QL] Add line breaks redesign (#173596) ## Summary Part of https://github.com/elastic/kibana/issues/171831 Replaces the single boolean button with two ever-present buttons that allow the user to "Add line breaks on pipes" and "Remove line breaks on pipes" image ### Note I had to use the TooltipWrapper and realized we are using this in many places and every time we are duplicating the code. I moved it to visualization-utils and changed the occurences. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../color_ranges_extra_actions.tsx | 2 +- .../color_ranges_item_buttons.tsx | 2 +- packages/kbn-coloring/tsconfig.json | 1 + .../src/text_based_languages_editor.tsx | 130 ++++++++++-------- packages/kbn-text-based-editor/tsconfig.json | 3 +- .../components/color_picker.tsx | 2 +- .../default_bucket_container.tsx | 2 +- .../fields_bucket_container.tsx | 2 +- .../components/index.ts | 2 - .../kbn-visualization-ui-components/index.ts | 1 - .../tsconfig.json | 3 +- packages/kbn-visualization-utils/index.ts | 1 + .../src}/tooltip_wrapper.tsx | 0 .../src/ui/slider_control/index.tsx | 2 +- .../src/ui/slider_control/tooltip_wrapper.tsx | 34 ----- .../kbn-random-sampling/tsconfig.json | 1 + .../graph/public/components/search_bar.tsx | 3 +- .../public/components/tooltip_wrapper.tsx | 34 ----- x-pack/plugins/graph/tsconfig.json | 1 + .../operations/definitions/date_histogram.tsx | 2 +- .../visualizations/gauge/dimension_editor.tsx | 2 +- .../heatmap/toolbar_component.tsx | 2 +- .../appearance_options_popover.tsx | 2 +- .../xy/xy_config_panel/index.tsx | 2 +- .../shared/marker_decoration_settings.tsx | 2 +- .../visual_options_popover/index.tsx | 2 +- x-pack/plugins/lens/tsconfig.json | 3 +- 27 files changed, 95 insertions(+), 148 deletions(-) rename packages/{kbn-visualization-ui-components/components => kbn-visualization-utils/src}/tooltip_wrapper.tsx (100%) delete mode 100644 x-pack/packages/kbn-random-sampling/src/ui/slider_control/tooltip_wrapper.tsx delete mode 100644 x-pack/plugins/graph/public/components/tooltip_wrapper.tsx diff --git a/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_extra_actions.tsx b/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_extra_actions.tsx index e7cdba71008f9..fa9d09d7a6af0 100644 --- a/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_extra_actions.tsx +++ b/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_extra_actions.tsx @@ -8,11 +8,11 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import React, { useCallback, Dispatch, useContext } from 'react'; import { EuiFlexGroup, EuiButtonEmpty, EuiFlexItem } from '@elastic/eui'; import { DistributeEquallyIcon } from '../assets/distribute_equally'; -import { TooltipWrapper } from '../tooltip_wrapper'; import type { ColorRangesActions } from './types'; import { ColorRangesContext } from './color_ranges_context'; diff --git a/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_item_buttons.tsx b/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_item_buttons.tsx index 5cd9bb50bafb1..658d93aebdde3 100644 --- a/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_item_buttons.tsx +++ b/packages/kbn-coloring/src/shared_components/coloring/color_ranges/color_ranges_item_buttons.tsx @@ -10,11 +10,11 @@ import React, { Dispatch, useCallback, useContext } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonIcon, EuiIconProps } from '@elastic/eui'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import type { PaletteContinuity, CustomPaletteParams } from '../../../palettes'; import { isLastItem } from './utils'; -import { TooltipWrapper } from '../tooltip_wrapper'; import type { ColorRangesActions, ColorRange, ColorRangeAccessor } from './types'; import { ColorRangesContext } from './color_ranges_context'; diff --git a/packages/kbn-coloring/tsconfig.json b/packages/kbn-coloring/tsconfig.json index 315e59225601c..3a97faa1b9d3a 100644 --- a/packages/kbn-coloring/tsconfig.json +++ b/packages/kbn-coloring/tsconfig.json @@ -22,6 +22,7 @@ "@kbn/test-jest-helpers", "@kbn/data-plugin", "@kbn/ui-theme", + "@kbn/visualization-utils", ], "exclude": [ "target/**/*", diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx index adcff950575e3..04e79334cf219 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx @@ -22,6 +22,7 @@ import { getAggregateQueryMode, getLanguageDisplayName } from '@kbn/es-query'; import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; import type { IndexManagementPluginSetup } from '@kbn/index-management-plugin/public'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { type LanguageDocumentationSections, LanguageDocumentationPopover, @@ -172,7 +173,6 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const [showLineNumbers, setShowLineNumbers] = useState(isCodeEditorExpanded); const [isCompactFocused, setIsCompactFocused] = useState(isCodeEditorExpanded); const [isCodeEditorExpandedFocused, setIsCodeEditorExpandedFocused] = useState(false); - const [isWordWrapped, setIsWordWrapped] = useState(false); const [editorMessages, setEditorMessages] = useState<{ errors: MonacoMessage[]; @@ -478,15 +478,14 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ } }, [calculateVisibleCode, code, isCompactFocused, queryString]); - useEffect(() => { - if (isCodeEditorExpanded && !isWordWrapped) { - const pipes = code?.split('|'); - const pipesWithNewLine = code?.split('\n|'); - if (pipes?.length === pipesWithNewLine?.length) { - setIsWordWrapped(true); - } - } - }, [code, isCodeEditorExpanded, isWordWrapped]); + const linesBreaksButtonsStatus = useMemo(() => { + const pipes = code?.split('|'); + const pipesWithNewLine = code?.split('\n|'); + return { + addLineBreaksDisabled: pipes?.length === pipesWithNewLine?.length, + removeLineBreaksDisabled: pipesWithNewLine?.length === 1, + }; + }, [code]); const onResize = ({ width }: { width: number }) => { setIsSpaceReduced(Boolean(editorIsInline && width < BREAKPOINT_WIDTH)); @@ -499,7 +498,6 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const onQueryUpdate = useCallback( (value: string) => { setCode(value); - setIsWordWrapped(false); onTextLangQueryChange({ [language]: value } as AggregateQuery); }, [language, onTextLangQueryChange] @@ -561,58 +559,72 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ responsive={false} > - + + + { + const updatedCode = getWrappedInPipesCode(code, false); + if (code !== updatedCode) { + setCode(updatedCode); + onTextLangQueryChange({ [language]: updatedCode } as AggregateQuery); + } + }} + /> + + + + + - { - editor1.current?.updateOptions({ - wordWrap: isWordWrapped ? 'off' : 'on', - }); - setIsWordWrapped(!isWordWrapped); - const updatedCode = getWrappedInPipesCode(code, isWordWrapped); - if (code !== updatedCode) { - setCode(updatedCode); - onTextLangQueryChange({ [language]: updatedCode } as AggregateQuery); - } - }} - /> - + )} + isDisabled={linesBreaksButtonsStatus.removeLineBreaksDisabled} + onClick={() => { + const updatedCode = getWrappedInPipesCode(code, true); + if (code !== updatedCode) { + setCode(updatedCode); + onTextLangQueryChange({ [language]: updatedCode } as AggregateQuery); + } + }} + /> + + + diff --git a/packages/kbn-text-based-editor/tsconfig.json b/packages/kbn-text-based-editor/tsconfig.json index 63222d0d6026b..72240c8aa060d 100644 --- a/packages/kbn-text-based-editor/tsconfig.json +++ b/packages/kbn-text-based-editor/tsconfig.json @@ -23,7 +23,8 @@ "@kbn/data-plugin", "@kbn/expressions-plugin", "@kbn/data-views-plugin", - "@kbn/index-management-plugin" + "@kbn/index-management-plugin", + "@kbn/visualization-utils" ], "exclude": [ "target/**/*", diff --git a/packages/kbn-visualization-ui-components/components/color_picker.tsx b/packages/kbn-visualization-ui-components/components/color_picker.tsx index 26a428bb17e0b..3a2613d16d665 100644 --- a/packages/kbn-visualization-ui-components/components/color_picker.tsx +++ b/packages/kbn-visualization-ui-components/components/color_picker.tsx @@ -8,6 +8,7 @@ import React, { useEffect, useRef, useState } from 'react'; import { i18n } from '@kbn/i18n'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { EuiFormRow, EuiColorPicker, @@ -17,7 +18,6 @@ import { euiPaletteColorBlind, } from '@elastic/eui'; import { getColorAlpha, makeColorWithAlpha } from '@kbn/coloring'; -import { TooltipWrapper } from './tooltip_wrapper'; const tooltipContent = { auto: i18n.translate('visualizationUiComponents.colorPicker.tooltip.auto', { diff --git a/packages/kbn-visualization-ui-components/components/drag_drop_bucket/default_bucket_container.tsx b/packages/kbn-visualization-ui-components/components/drag_drop_bucket/default_bucket_container.tsx index d73c46064a3ca..0448e6bda33db 100644 --- a/packages/kbn-visualization-ui-components/components/drag_drop_bucket/default_bucket_container.tsx +++ b/packages/kbn-visualization-ui-components/components/drag_drop_bucket/default_bucket_container.tsx @@ -16,7 +16,7 @@ import { EuiPanel, useEuiTheme, } from '@elastic/eui'; -import { TooltipWrapper } from '../tooltip_wrapper'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import type { BucketContainerProps } from './types'; export const DefaultBucketContainer = ({ diff --git a/packages/kbn-visualization-ui-components/components/drag_drop_bucket/fields_bucket_container.tsx b/packages/kbn-visualization-ui-components/components/drag_drop_bucket/fields_bucket_container.tsx index cfc5b074b6c33..89f771eef4f01 100644 --- a/packages/kbn-visualization-ui-components/components/drag_drop_bucket/fields_bucket_container.tsx +++ b/packages/kbn-visualization-ui-components/components/drag_drop_bucket/fields_bucket_container.tsx @@ -16,7 +16,7 @@ import { EuiPanel, useEuiTheme, } from '@elastic/eui'; -import { TooltipWrapper } from '../tooltip_wrapper'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import type { BucketContainerProps } from './types'; export const FieldsBucketContainer = ({ diff --git a/packages/kbn-visualization-ui-components/components/index.ts b/packages/kbn-visualization-ui-components/components/index.ts index e20879f9e9990..88fecd132a868 100644 --- a/packages/kbn-visualization-ui-components/components/index.ts +++ b/packages/kbn-visualization-ui-components/components/index.ts @@ -14,8 +14,6 @@ export * from './debounced_input'; export * from './debounced_value'; -export * from './tooltip_wrapper'; - export * from './color_picker'; export * from './icon_select'; diff --git a/packages/kbn-visualization-ui-components/index.ts b/packages/kbn-visualization-ui-components/index.ts index 16c51f96a869b..34c14599d6f00 100644 --- a/packages/kbn-visualization-ui-components/index.ts +++ b/packages/kbn-visualization-ui-components/index.ts @@ -11,7 +11,6 @@ export { NameInput, DebouncedInput, useDebouncedValue, - TooltipWrapper, ColorPicker, IconSelect, IconSelectSetting, diff --git a/packages/kbn-visualization-ui-components/tsconfig.json b/packages/kbn-visualization-ui-components/tsconfig.json index a9d6627828dc7..e5dcfa9c5c858 100644 --- a/packages/kbn-visualization-ui-components/tsconfig.json +++ b/packages/kbn-visualization-ui-components/tsconfig.json @@ -31,6 +31,7 @@ "@kbn/coloring", "@kbn/field-formats-plugin", "@kbn/field-utils", - "@kbn/calculate-width-from-char-count" + "@kbn/calculate-width-from-char-count", + "@kbn/visualization-utils" ], } diff --git a/packages/kbn-visualization-utils/index.ts b/packages/kbn-visualization-utils/index.ts index 7aa0a2c5d770c..1665599e93d54 100644 --- a/packages/kbn-visualization-utils/index.ts +++ b/packages/kbn-visualization-utils/index.ts @@ -7,3 +7,4 @@ */ export { getTimeZone } from './src/get_timezone'; +export { TooltipWrapper } from './src/tooltip_wrapper'; diff --git a/packages/kbn-visualization-ui-components/components/tooltip_wrapper.tsx b/packages/kbn-visualization-utils/src/tooltip_wrapper.tsx similarity index 100% rename from packages/kbn-visualization-ui-components/components/tooltip_wrapper.tsx rename to packages/kbn-visualization-utils/src/tooltip_wrapper.tsx diff --git a/x-pack/packages/kbn-random-sampling/src/ui/slider_control/index.tsx b/x-pack/packages/kbn-random-sampling/src/ui/slider_control/index.tsx index 1f7495e431298..40a9256f9ba07 100644 --- a/x-pack/packages/kbn-random-sampling/src/ui/slider_control/index.tsx +++ b/x-pack/packages/kbn-random-sampling/src/ui/slider_control/index.tsx @@ -8,7 +8,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiRange, EuiText, useEuiTheme } from '@elastic/eui'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { TooltipWrapper } from './tooltip_wrapper'; +import { TooltipWrapper } from '@kbn/visualization-utils'; export interface ControlSliderProps { /** Allowed values to show on the Control Slider */ diff --git a/x-pack/packages/kbn-random-sampling/src/ui/slider_control/tooltip_wrapper.tsx b/x-pack/packages/kbn-random-sampling/src/ui/slider_control/tooltip_wrapper.tsx deleted file mode 100644 index 5ab7800e05349..0000000000000 --- a/x-pack/packages/kbn-random-sampling/src/ui/slider_control/tooltip_wrapper.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiToolTip, EuiToolTipProps } from '@elastic/eui'; - -export type TooltipWrapperProps = Partial> & { - tooltipContent: string; - /** When the condition is truthy, the tooltip will be shown */ - condition: boolean; -}; - -export const TooltipWrapper: React.FunctionComponent = ({ - children, - condition, - tooltipContent, - ...tooltipProps -}) => { - return ( - <> - {condition ? ( - - <>{children} - - ) : ( - children - )} - - ); -}; diff --git a/x-pack/packages/kbn-random-sampling/tsconfig.json b/x-pack/packages/kbn-random-sampling/tsconfig.json index 5c5673e4b6787..b4b34fcb94036 100644 --- a/x-pack/packages/kbn-random-sampling/tsconfig.json +++ b/x-pack/packages/kbn-random-sampling/tsconfig.json @@ -13,6 +13,7 @@ ], "kbn_references": [ "@kbn/i18n-react", + "@kbn/visualization-utils", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/graph/public/components/search_bar.tsx b/x-pack/plugins/graph/public/components/search_bar.tsx index 101a2b3170f0b..ad604ddc59091 100644 --- a/x-pack/plugins/graph/public/components/search_bar.tsx +++ b/x-pack/plugins/graph/public/components/search_bar.tsx @@ -12,6 +12,7 @@ import { i18n } from '@kbn/i18n'; import { connect } from 'react-redux'; import { toElasticsearchQuery, fromKueryExpression, Query } from '@kbn/es-query'; import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { QueryStringInput } from '@kbn/unified-search-plugin/public'; import type { DataView } from '@kbn/data-views-plugin/public'; import { IUnifiedSearchPluginServices } from '@kbn/unified-search-plugin/public/types'; @@ -27,8 +28,6 @@ import { selectedFieldsSelector, } from '../state_management'; -import { TooltipWrapper } from './tooltip_wrapper'; - export interface SearchBarProps { isLoading: boolean; urlQuery: string | null; diff --git a/x-pack/plugins/graph/public/components/tooltip_wrapper.tsx b/x-pack/plugins/graph/public/components/tooltip_wrapper.tsx deleted file mode 100644 index 5ab7800e05349..0000000000000 --- a/x-pack/plugins/graph/public/components/tooltip_wrapper.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiToolTip, EuiToolTipProps } from '@elastic/eui'; - -export type TooltipWrapperProps = Partial> & { - tooltipContent: string; - /** When the condition is truthy, the tooltip will be shown */ - condition: boolean; -}; - -export const TooltipWrapper: React.FunctionComponent = ({ - children, - condition, - tooltipContent, - ...tooltipProps -}) => { - return ( - <> - {condition ? ( - - <>{children} - - ) : ( - children - )} - - ); -}; diff --git a/x-pack/plugins/graph/tsconfig.json b/x-pack/plugins/graph/tsconfig.json index c1fc3807c4c18..0618744404be4 100644 --- a/x-pack/plugins/graph/tsconfig.json +++ b/x-pack/plugins/graph/tsconfig.json @@ -49,6 +49,7 @@ "@kbn/content-management-utils", "@kbn/logging", "@kbn/content-management-table-list-view-common", + "@kbn/visualization-utils", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx index bdc88a7cef452..0d6556344a710 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx @@ -29,7 +29,7 @@ import { } from '@kbn/data-plugin/public'; import { extendedBoundsToAst, intervalOptions } from '@kbn/data-plugin/common'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { updateColumnParam } from '../layer_helpers'; import { OperationDefinition, ParamEditorProps } from '.'; import { FieldBasedIndexPatternColumn } from './column_types'; diff --git a/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx index bd10558d71404..8bd02702c841a 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx @@ -25,7 +25,7 @@ import { } from '@kbn/coloring'; import { GaugeTicksPositions, GaugeColorModes } from '@kbn/expression-gauge-plugin/common'; import { getMaxValue, getMinValue } from '@kbn/expression-gauge-plugin/public'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { isNumericFieldForDatatable } from '../../../common/expressions/datatable/utils'; import { applyPaletteParams, PalettePanelContainer } from '../../shared_components'; import type { VisualizationDimensionEditorProps } from '../../types'; diff --git a/x-pack/plugins/lens/public/visualizations/heatmap/toolbar_component.tsx b/x-pack/plugins/lens/public/visualizations/heatmap/toolbar_component.tsx index ebc0b1040623f..c621a59e9ea9b 100644 --- a/x-pack/plugins/lens/public/visualizations/heatmap/toolbar_component.tsx +++ b/x-pack/plugins/lens/public/visualizations/heatmap/toolbar_component.tsx @@ -11,7 +11,7 @@ import { Position } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; import { LegendSize } from '@kbn/visualizations-plugin/public'; import { EuiIconAxisLeft, EuiIconAxisBottom } from '@kbn/chart-icons'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import type { VisualizationToolbarProps } from '../../types'; import { LegendSettingsPopover, diff --git a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_config_panel/appearance_options_popover.tsx b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_config_panel/appearance_options_popover.tsx index fe070e50449d6..ad3215634a261 100644 --- a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_config_panel/appearance_options_popover.tsx +++ b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_config_panel/appearance_options_popover.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { ToolbarPopover } from '../../../shared_components'; import { TitlePositionOptions } from './title_position_option'; import { FramePublicAPI } from '../../../types'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx index 3697ce988efb5..a02d4c1d82772 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx @@ -11,7 +11,7 @@ import { Position, ScaleType } from '@elastic/charts'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { AxisExtentConfig } from '@kbn/expression-xy-plugin/common'; import { LegendSize } from '@kbn/visualizations-plugin/public'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import type { LegendSettingsPopoverProps } from '../../../shared_components/legend/legend_settings_popover'; import type { VisualizationToolbarProps, FramePublicAPI } from '../../../types'; import { State, XYState, AxesSettingsConfig } from '../types'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/shared/marker_decoration_settings.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/shared/marker_decoration_settings.tsx index 3f620a9379538..e2b149dfc0eb6 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/shared/marker_decoration_settings.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/shared/marker_decoration_settings.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonGroup, EuiFormRow } from '@elastic/eui'; import { IconPosition } from '@kbn/expression-xy-plugin/common'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { YAxisMode } from '../../types'; import { idPrefix } from '../dimension_editor'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/index.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/index.tsx index bd147779fed8d..b8b244daf85d2 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/index.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/index.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { TooltipWrapper } from '@kbn/visualization-ui-components'; +import { TooltipWrapper } from '@kbn/visualization-utils'; import { ToolbarPopover, ValueLabelsSettings } from '../../../../shared_components'; import { MissingValuesOptions } from './missing_values_option'; import { LineCurveOption } from './line_curve_option'; diff --git a/x-pack/plugins/lens/tsconfig.json b/x-pack/plugins/lens/tsconfig.json index dd714b72c998d..6052ae05d37cf 100644 --- a/x-pack/plugins/lens/tsconfig.json +++ b/x-pack/plugins/lens/tsconfig.json @@ -97,7 +97,8 @@ "@kbn/shared-ux-button-toolbar", "@kbn/cell-actions", "@kbn/calculate-width-from-char-count", - "@kbn/discover-utils" + "@kbn/discover-utils", + "@kbn/visualization-utils" ], "exclude": [ "target/**/*" From 34a33817a6fe32d97b7c7999fd715d0b23e5b27a Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 21 Dec 2023 11:16:45 +0200 Subject: [PATCH 53/62] [Visualizations] Get dark mode from core theme service (#173715) ## Summary Part of https://github.com/elastic/kibana/issues/173529 Correctly get the darkmode from the core theme --- .../timeseries/public/application/lib/set_is_reversed.js | 6 ++---- src/plugins/vis_types/vega/public/plugin.ts | 5 ++--- src/plugins/vis_types/vega/public/services.ts | 6 ++++-- .../vega/public/vega_view/vega_map_view/view.test.ts | 4 ++-- .../vis_types/vega/public/vega_view/vega_map_view/view.ts | 4 ++-- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/plugins/vis_types/timeseries/public/application/lib/set_is_reversed.js b/src/plugins/vis_types/timeseries/public/application/lib/set_is_reversed.js index c2a2b4bb86af1..e37c55ab8a246 100644 --- a/src/plugins/vis_types/timeseries/public/application/lib/set_is_reversed.js +++ b/src/plugins/vis_types/timeseries/public/application/lib/set_is_reversed.js @@ -7,9 +7,7 @@ */ import color from 'color'; -import { getUISettings } from '../../services'; - -const isDarkTheme = () => getUISettings().get('theme:darkMode'); +import { getCoreStart } from '../../services'; /** * Returns true if the color that is passed has low luminosity @@ -23,7 +21,7 @@ const isColorDark = (c) => { * Defaults to checking `theme:darkMode`. */ export const isThemeDark = (currentTheme) => { - let themeIsDark = currentTheme || isDarkTheme(); + let themeIsDark = currentTheme || getCoreStart().theme.getTheme().darkMode; // If passing a string, check the luminosity if (typeof currentTheme === 'string') { diff --git a/src/plugins/vis_types/vega/public/plugin.ts b/src/plugins/vis_types/vega/public/plugin.ts index 54f319850d817..96e383979b854 100644 --- a/src/plugins/vis_types/vega/public/plugin.ts +++ b/src/plugins/vis_types/vega/public/plugin.ts @@ -20,7 +20,7 @@ import { setData, setDataViews, setInjectedVars, - setUISettings, + setThemeService, setDocLinks, setMapsEms, setUsageCollectionStart, @@ -77,8 +77,6 @@ export class VegaPlugin implements Plugin { enableExternalUrls: this.initializerContext.config.get().enableExternalUrls, }); - setUISettings(core.uiSettings); - const visualizationDependencies: Readonly = { core, plugins: { @@ -104,6 +102,7 @@ export class VegaPlugin implements Plugin { setDataViews(dataViews); setDocLinks(core.docLinks); setMapsEms(mapsEms); + setThemeService(core.theme); setUsageCollectionStart(usageCollection); } } diff --git a/src/plugins/vis_types/vega/public/services.ts b/src/plugins/vis_types/vega/public/services.ts index 4b3e0ca72cdc3..04c5c5cf1f447 100644 --- a/src/plugins/vis_types/vega/public/services.ts +++ b/src/plugins/vis_types/vega/public/services.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { NotificationsStart, IUiSettingsClient, DocLinksStart } from '@kbn/core/public'; +import type { NotificationsStart, DocLinksStart, ThemeServiceStart } from '@kbn/core/public'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; @@ -22,7 +22,6 @@ export const [getDataViews, setDataViews] = export const [getNotifications, setNotifications] = createGetterSetter('Notifications'); -export const [getUISettings, setUISettings] = createGetterSetter('UISettings'); export const [getMapsEms, setMapsEms] = createGetterSetter('mapsEms'); export const [getInjectedVars, setInjectedVars] = createGetterSetter<{ @@ -35,3 +34,6 @@ export const [getDocLinks, setDocLinks] = createGetterSetter('doc export const [getUsageCollectionStart, setUsageCollectionStart] = createGetterSetter('UsageCollection'); + +export const [getThemeService, setThemeService] = + createGetterSetter('ThemeServiceStart'); diff --git a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.test.ts b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.test.ts index eafe75534154a..a42d76681c4ff 100644 --- a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.test.ts +++ b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.test.ts @@ -24,7 +24,7 @@ import { setInjectedVars, setData, setNotifications, - setUISettings, + setThemeService, setDataViews, } from '../../services'; import { initVegaLayer, initTmsRasterLayer } from './layers'; @@ -121,7 +121,7 @@ describe('vega_map_view/view', () => { setData(dataPluginStart); setDataViews(dataViewsStart); setNotifications(coreStart.notifications); - setUISettings(coreStart.uiSettings); + setThemeService(coreStart.theme); async function createVegaMapView() { await vegaParser.parseAsync(); diff --git a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.ts b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.ts index fe1d6a27f3605..7e4ca5a19dd6a 100644 --- a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.ts +++ b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.ts @@ -15,7 +15,7 @@ import { maplibregl } from '@kbn/mapbox-gl'; import { initTmsRasterLayer, initVegaLayer } from './layers'; import { VegaBaseView } from '../vega_base_view'; -import { getUISettings } from '../../services'; +import { getThemeService } from '../../services'; import { defaultMapConfig, defaultMabBoxStyle, vegaLayerId } from './constants'; import { validateZoomSettings, injectMapPropsIntoSpec } from './utils'; @@ -98,7 +98,7 @@ export class VegaMapView extends VegaBaseView { const { mapStyle, emsTileServiceId } = this._parser.mapConfig; // if (mapStyle) { - const isDarkMode: boolean = getUISettings().get('theme:darkMode'); + const isDarkMode: boolean = getThemeService().getTheme().darkMode; return emsTileServiceId ? emsTileServiceId : await this._serviceSettings.getDefaultTmsLayer(isDarkMode); From ae289f0a276d299dd6fabdc34e56c260e1b7d0e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?= Date: Thu, 21 Dec 2023 10:58:10 +0100 Subject: [PATCH 54/62] [Enterprise Search] Fix Text Extraction toggle (#173590) ## Summary https://github.com/elastic/kibana/assets/1410658/a5980bd7-1290-442e-b2d3-c6a551325de7 Fix use text extraction toggle which removed itself before when toggled. ### Checklist Delete any items that are not applicable to this PR. - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../components/configuration/connector_configuration_form.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/kbn-search-connectors/components/configuration/connector_configuration_form.tsx b/packages/kbn-search-connectors/components/configuration/connector_configuration_form.tsx index af258a807788d..ca1a2c4e01b93 100644 --- a/packages/kbn-search-connectors/components/configuration/connector_configuration_form.tsx +++ b/packages/kbn-search-connectors/components/configuration/connector_configuration_form.tsx @@ -137,7 +137,9 @@ export const ConnectorConfigurationForm: React.FC = setConfigEntry={(key, value) => { setConfigView({ ...configView, - advancedConfigurations: { ...configView.advancedConfigurations, [key]: value }, + advancedConfigurations: configView.advancedConfigurations.map((config) => + config.key === key ? { ...config, value } : config + ), }); }} /> From 4f186d0cc5eec718a2570e63ea81b748667388ae Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Thu, 21 Dec 2023 11:43:09 +0100 Subject: [PATCH 55/62] [EDR Workflows] Unskip tests skipped due to agent errors (#173589) https://github.com/elastic/security-team/issues/8244 Needs to be followed-up by https://github.com/elastic/kibana/pull/173591 unskips manually skipped tests from https://github.com/elastic/kibana/pull/173557 unskips CI skipped tests: closes https://github.com/elastic/kibana/issues/173475 closes https://github.com/elastic/kibana/issues/173458 closes https://github.com/elastic/kibana/issues/173456 closes https://github.com/elastic/kibana/issues/173463 closes https://github.com/elastic/kibana/issues/173466 closes https://github.com/elastic/kibana/issues/173467 closes https://github.com/elastic/kibana/issues/173457 closes https://github.com/elastic/kibana/issues/173465 closes https://github.com/elastic/kibana/issues/173459 closes https://github.com/elastic/kibana/issues/173473 closes https://github.com/elastic/kibana/issues/173464 closes https://github.com/elastic/kibana/issues/173471 closes https://github.com/elastic/kibana/issues/173475 closes https://github.com/elastic/kibana/issues/171444 closes https://github.com/elastic/kibana/issues/170816 closes https://github.com/elastic/kibana/issues/170814 closes https://github.com/elastic/kibana/issues/170794 closes https://github.com/elastic/kibana/issues/170706 closes https://github.com/elastic/kibana/issues/170604 closes https://github.com/elastic/kibana/issues/170601 closes https://github.com/elastic/kibana/issues/170563 closes https://github.com/elastic/kibana/issues/170373 closes https://github.com/elastic/kibana/issues/169822 closes https://github.com/elastic/kibana/issues/169821 closes https://github.com/elastic/kibana/issues/168427 --- .../automated_response_actions.cy.ts | 4 +--- .../e2e/response_actions/alerts_response_console.cy.ts | 2 +- .../cypress/e2e/response_actions/document_signing.cy.ts | 3 +-- .../response_actions/endpoints_list_response_console.cy.ts | 4 +--- .../e2e/response_actions/response_console/execute.cy.ts | 4 +--- .../response_actions/response_console/file_operations.cy.ts | 4 +--- .../e2e/response_actions/response_console/isolate.cy.ts | 4 +--- .../response_console/process_operations.cy.ts | 4 +--- .../disabled/unenroll_agent_from_fleet.cy.ts | 4 +--- .../disabled/uninstall_agent_from_host.cy.ts | 3 +-- .../tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts | 4 +--- .../tamper_protection/enabled/uninstall_agent_from_host.cy.ts | 4 +--- ..._from_fleet_changing_policy_from_disabled_to_enabled.cy.ts | 4 +--- ..._from_fleet_changing_policy_from_enabled_to_disabled.cy.ts | 2 +- ...t_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts | 4 +--- ...t_from_host_changing_policy_from_disabled_to_enabled.cy.ts | 4 +--- ...t_from_host_changing_policy_from_enabled_to_disabled.cy.ts | 4 +--- ...nt_from_host_changing_policy_from_enabled_to_enabled.cy.ts | 3 +-- 18 files changed, 18 insertions(+), 47 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts index 305ce11d165ef..1948434b39c9f 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts @@ -20,9 +20,7 @@ import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; -// FLAKY: https://github.com/elastic/kibana/issues/168340 -// FLAKY: https://github.com/elastic/kibana/issues/168427 -describe.skip( +describe( 'Automated Response Actions', { tags: [ diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts index 91557f3958f27..e51f75d8eb737 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/alerts_response_console.cy.ts @@ -26,7 +26,7 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; -describe.skip('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts index 4093581366321..b806323726018 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/document_signing.cy.ts @@ -22,8 +22,7 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/170674 -describe.skip('Document signing:', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('Document signing:', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts index e932250dada6b..75074b0d3f94a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/endpoints_list_response_console.cy.ts @@ -20,9 +20,7 @@ import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/169821 -// FLAKY: https://github.com/elastic/kibana/issues/169822 -describe.skip('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('Response console', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts index 8be29e75ddd9c..dad573bb09c2b 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts @@ -26,9 +26,7 @@ describe('Response console', { tags: ['@ess', '@serverless'] }, () => { login(); }); - // FLAKY: https://github.com/elastic/kibana/issues/170373 - // FLAKY: https://github.com/elastic/kibana/issues/171444 - describe.skip('Execute operations:', () => { + describe('Execute operations:', () => { const homeFilePath = process.env.CI || true ? '/home/vagrant' : `/home/ubuntu`; let indexedPolicy: IndexedFleetEndpointPolicyResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts index a470098b4f55f..e76a0beb82dca 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/file_operations.cy.ts @@ -26,9 +26,7 @@ describe('Response console', { tags: ['@ess', '@serverless'] }, () => { login(); }); - // FLAKY: https://github.com/elastic/kibana/issues/170424 - // FLAKY: https://github.com/elastic/kibana/issues/173456 - describe.skip('File operations:', () => { + describe('File operations:', () => { const homeFilePath = Cypress.env('IS_CI') ? '/home/vagrant' : '/home/ubuntu'; const fileContent = 'This is a test file for the get-file command.'; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts index fb5fcd0476c14..44fdf9d63fb68 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts @@ -26,9 +26,7 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/173464 -// FLAKY: https://github.com/elastic/kibana/issues/173465 -describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { +describe('Response console', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts index ba2ebf1c1a88a..c7120ded692b9 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts @@ -24,9 +24,7 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/173459 -// FLAKY: https://github.com/elastic/kibana/issues/170563 -describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { +describe('Response console', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts index 046a185babda3..e0b26bc2f77dd 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/unenroll_agent_from_fleet.cy.ts @@ -20,9 +20,7 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/173463 -// FLAKY: https://github.com/elastic/kibana/issues/170814 -describe.skip( +describe( 'Unenroll agent from fleet with agent tamper protection is disabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts index d5b018e9b03a4..ed47855ac894a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/disabled/uninstall_agent_from_host.cy.ts @@ -21,8 +21,7 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/173466 -describe.skip( +describe( 'Uninstall agent from host when agent tamper protection is disabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts index cf37edfb0274b..17cb52c2cb042 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/unenroll_agent_from_fleet.cy.ts @@ -20,9 +20,7 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/173460 -// FLAKY: https://github.com/elastic/kibana/issues/170706 -describe.skip( +describe( 'Unenroll agent from fleet when agent tamper protection is enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts index a7220e3bd7f1d..527566bed608b 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/enabled/uninstall_agent_from_host.cy.ts @@ -22,9 +22,7 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/173471 -// FLAKY: https://github.com/elastic/kibana/issues/170601 -describe.skip( +describe( 'Uninstall agent from host when agent tamper protection is enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts index 0bd503db67e99..3d92528c2eee7 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_disabled_to_enabled.cy.ts @@ -22,9 +22,7 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/173470 -// FLAKY: https://github.com/elastic/kibana/issues/170811 -describe.skip( +describe( 'Unenroll agent from fleet when agent tamper protection is disabled but then is switched to a policy with it enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts index d744abcb5b431..a9508a13f719b 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_disabled.cy.ts @@ -22,7 +22,7 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe.skip( +describe( 'Unenroll agent from fleet changing when agent tamper protection is enabled but then is switched to a policy with it disabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts index 55058897c4f95..a5654734c15e4 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/unenroll_agent_from_fleet_changing_policy_from_enabled_to_enabled.cy.ts @@ -21,9 +21,7 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/170816 -// FLAKY: https://github.com/elastic/kibana/issues/173458 -describe.skip( +describe( 'Unenroll agent from fleet changing agent policy when agent tamper protection is enabled but then is switched to a policy with it also enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts index ebd08694cd985..bbb675cf56d5e 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_disabled_to_enabled.cy.ts @@ -24,9 +24,7 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/173475 -// FLAKY: https://github.com/elastic/kibana/issues/170794 -describe.skip( +describe( 'Uninstall agent from host changing agent policy when agent tamper protection is disabled but then is switched to a policy with it enabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts index d01b5cbfdd086..0768c4a49ca39 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_disabled.cy.ts @@ -23,9 +23,7 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/173457 -// FLAKY: https://github.com/elastic/kibana/issues/170604 -describe.skip( +describe( 'Uninstall agent from host changing agent policy when agent tamper protection is enabled but then is switched to a policy with it disabled', { tags: ['@ess'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts index 379afba46b7fd..d8630a50a83b9 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/tamper_protection/switching_policies/uninstall_agent_from_host_changing_policy_from_enabled_to_enabled.cy.ts @@ -23,8 +23,7 @@ import { login } from '../../../tasks/login'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// FLAKY: https://github.com/elastic/kibana/issues/173467 -describe.skip( +describe( 'Uninstall agent from host changing agent policy when agent tamper protection is enabled but then is switched to a policy with it also enabled', { tags: ['@ess'] }, () => { From 7fe9faea3c92198646a4aaf2dfd0e5afccb730b2 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Thu, 21 Dec 2023 11:44:05 +0100 Subject: [PATCH 56/62] Unskip download csv permissions test (#173660) ## Summary close https://github.com/elastic/kibana/issues/172599 I couldn't reproduce the failure, looks like it is very rare. But when reviewing the code I noticed possible race conditions and refactored. Suggest we merge the refactor and observe. Before fix https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/4647 100x passed - means flakiness hard to reproduce After fix https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/4649 50x passed - still stable --- .../panel_actions/get_csv_panel_action.tsx | 39 +++++++------------ .../security_roles_privileges.ts | 3 +- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx b/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx index 40a231a5220e9..5949131df49a5 100644 --- a/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx +++ b/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx @@ -44,12 +44,10 @@ export class ReportingCsvPanelAction implements ActionDefinition private isDownloading: boolean; public readonly type = ''; public readonly id = CSV_REPORTING_ACTION; - private licenseHasDownloadCsv: boolean = false; - private capabilityHasDownloadCsv: boolean = false; - private notifications: NotificationsSetup; - private apiClient: ReportingAPIClient; - private startServices$: Params['startServices$']; - private usesUiCapabilities: any; + private readonly notifications: NotificationsSetup; + private readonly apiClient: ReportingAPIClient; + private readonly startServices$: Params['startServices$']; + private readonly usesUiCapabilities: boolean; constructor({ core, apiClient, startServices$, usesUiCapabilities }: Params) { this.isDownloading = false; @@ -78,31 +76,20 @@ export class ReportingCsvPanelAction implements ActionDefinition } public isCompatible = async (context: ActionContext) => { - await new Promise((resolve) => { - this.startServices$.subscribe(([{ application }, { licensing }]) => { - licensing.license$.subscribe((license) => { - const results = license.check('reporting', 'basic'); - const { showLinks } = checkLicense(results); - this.licenseHasDownloadCsv = showLinks; - }); - - if (this.usesUiCapabilities) { - this.capabilityHasDownloadCsv = application.capabilities.dashboard?.downloadCsv === true; - } else { - this.capabilityHasDownloadCsv = true; // deprecated - } - - resolve(); - }); - }); + const { embeddable } = context; - if (!this.licenseHasDownloadCsv || !this.capabilityHasDownloadCsv) { + if (embeddable.type !== 'search') { return false; } - const { embeddable } = context; + const [{ application }, { licensing }] = await firstValueFrom(this.startServices$); + const license = await firstValueFrom(licensing.license$); + const licenseHasDownloadCsv = checkLicense(license.check('reporting', 'basic')).showLinks; + const capabilityHasDownloadCsv = this.usesUiCapabilities + ? application.capabilities.dashboard?.downloadCsv === true + : true; // deprecated - if (embeddable.type !== 'search') { + if (!licenseHasDownloadCsv || !capabilityHasDownloadCsv) { return false; } diff --git a/x-pack/test/reporting_functional/reporting_and_deprecated_security/security_roles_privileges.ts b/x-pack/test/reporting_functional/reporting_and_deprecated_security/security_roles_privileges.ts index acd8b0da9e4c5..f9b84469c1eee 100644 --- a/x-pack/test/reporting_functional/reporting_and_deprecated_security/security_roles_privileges.ts +++ b/x-pack/test/reporting_functional/reporting_and_deprecated_security/security_roles_privileges.ts @@ -16,8 +16,7 @@ const CANVAS_TITLE = 'The Very Cool Workpad for PDF Tests'; export default function ({ getService }: FtrProviderContext) { const reportingFunctional = getService('reportingFunctional'); - // FLAKY: https://github.com/elastic/kibana/issues/172599 - describe.skip('Security with `reporting_user` built-in role', () => { + describe('Security with `reporting_user` built-in role', () => { before(async () => { await reportingFunctional.initEcommerce(); }); From 42353e772ce3f7b6dca294d1c0c6fe757d97b24d Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 21 Dec 2023 05:44:48 -0500 Subject: [PATCH 57/62] skip failing test suite (#173804) --- .../rule_bulk_actions/perform_bulk_action_ess.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_bulk_actions/perform_bulk_action_ess.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_bulk_actions/perform_bulk_action_ess.ts index 9d145dc5a7c75..e85103b67cd22 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_bulk_actions/perform_bulk_action_ess.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_bulk_actions/perform_bulk_action_ess.ts @@ -62,7 +62,8 @@ export default ({ getService }: FtrProviderContext): void => { const createWebHookConnector = () => createConnector(getWebHookAction()); - describe('@ess perform_bulk_action - ESS specific logic', () => { + // Failing: See https://github.com/elastic/kibana/issues/173804 + describe.skip('@ess perform_bulk_action - ESS specific logic', () => { beforeEach(async () => { await createAlertsIndex(supertest, log); await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); From b62f3b7149d1f98367f4283d614970555227963e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Thu, 21 Dec 2023 10:58:59 +0000 Subject: [PATCH 58/62] [Profiling] Enhancing the diff topN functions (#173397) - Removes Co2/Cost settings to use Kibana calculations instead of the values from the APIs - Refactoring Frame information flyout Screenshot 2023-12-14 at 15 25 47 ## How to test it: - Open Flamegraph or Diff Flamegraph and click on `Show more information` in the Tooltip. - Open Functions or Diff Functions and click on the icon on the left side of the table. --- .../server/collectors/management/schema.ts | 4 - .../server/collectors/management/types.ts | 1 - src/plugins/telemetry/schema/oss_plugins.json | 6 - x-pack/plugins/observability/common/index.ts | 1 - .../observability/common/ui_settings_keys.ts | 1 - .../observability/server/ui_settings.ts | 9 - .../e2e/profiling_views/functions.cy.ts | 17 +- .../index.tsx | 177 ++++-- .../flamegraph/flamegraph_tooltip.tsx | 33 +- .../public/components/flamegraph/index.tsx | 30 + .../frame_information_window/empty_frame.tsx | 23 + .../get_impact_rows.tsx | 96 +-- .../frame_information_window/index.tsx | 127 ++-- .../key_value_list.tsx | 11 +- .../components/frames_summary/index.tsx | 116 ++-- .../frames_summary/summary_item.tsx | 20 +- .../topn_functions/function_row.tsx | 41 +- .../components/topn_functions/index.tsx | 553 ++++++++---------- .../components/topn_functions/utils.test.ts | 11 +- .../public/components/topn_functions/utils.ts | 20 + .../use_calculate_impact_estimates.test.ts | 24 - .../hooks/use_calculate_impact_estimates.ts | 29 - .../utils/get_flamegraph_model/index.ts | 32 +- .../differential_flamegraphs/index.tsx | 6 - .../functions/differential_topn/index.tsx | 25 +- 25 files changed, 720 insertions(+), 693 deletions(-) create mode 100644 x-pack/plugins/profiling/public/components/frame_information_window/empty_frame.tsx diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts index 1fa2407cdd287..b2e2c5ec3f748 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts @@ -601,10 +601,6 @@ export const stackManagementSchema: MakeSchemaFrom = { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, }, - 'observability:profilingUseLegacyCo2Calculation': { - type: 'boolean', - _meta: { description: 'Non-default value of setting.' }, - }, 'observability:profilingCostPervCPUPerHour': { type: 'integer', _meta: { description: 'Non-default value of setting.' }, diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts index 33518b5389f57..e1de9aa7842d5 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts @@ -160,7 +160,6 @@ export interface UsageStats { 'observability:profilingPervCPUWattArm64': number; 'observability:profilingCo2PerKWH': number; 'observability:profilingDatacenterPUE': number; - 'observability:profilingUseLegacyCo2Calculation': boolean; 'observability:profilingCostPervCPUPerHour': number; 'observability:profilingAWSCostDiscountRate': number; } diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index ec17c9b9d1a3b..e04e83dc46feb 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -10091,12 +10091,6 @@ "description": "Non-default value of setting." } }, - "observability:profilingUseLegacyCo2Calculation": { - "type": "boolean", - "_meta": { - "description": "Non-default value of setting." - } - }, "observability:profilingCostPervCPUPerHour": { "type": "integer", "_meta": { diff --git a/x-pack/plugins/observability/common/index.ts b/x-pack/plugins/observability/common/index.ts index 143bf77a1b0cc..3bd302b262fbc 100644 --- a/x-pack/plugins/observability/common/index.ts +++ b/x-pack/plugins/observability/common/index.ts @@ -45,7 +45,6 @@ export { profilingCo2PerKWH, profilingDatacenterPUE, profilingPervCPUWattX86, - profilingUseLegacyCo2Calculation, profilingPervCPUWattArm64, profilingAWSCostDiscountRate, profilingCostPervCPUPerHour, diff --git a/x-pack/plugins/observability/common/ui_settings_keys.ts b/x-pack/plugins/observability/common/ui_settings_keys.ts index bcc2f0451caac..b647fc8361db8 100644 --- a/x-pack/plugins/observability/common/ui_settings_keys.ts +++ b/x-pack/plugins/observability/common/ui_settings_keys.ts @@ -33,6 +33,5 @@ export const profilingPervCPUWattX86 = 'observability:profilingPerVCPUWattX86'; export const profilingPervCPUWattArm64 = 'observability:profilingPervCPUWattArm64'; export const profilingCo2PerKWH = 'observability:profilingCo2PerKWH'; export const profilingDatacenterPUE = 'observability:profilingDatacenterPUE'; -export const profilingUseLegacyCo2Calculation = 'observability:profilingUseLegacyCo2Calculation'; export const profilingAWSCostDiscountRate = 'observability:profilingAWSCostDiscountRate'; export const profilingCostPervCPUPerHour = 'observability:profilingCostPervCPUPerHour'; diff --git a/x-pack/plugins/observability/server/ui_settings.ts b/x-pack/plugins/observability/server/ui_settings.ts index 8029b412ebb6a..5890dd4e16611 100644 --- a/x-pack/plugins/observability/server/ui_settings.ts +++ b/x-pack/plugins/observability/server/ui_settings.ts @@ -33,7 +33,6 @@ import { profilingCo2PerKWH, profilingDatacenterPUE, profilingPervCPUWattX86, - profilingUseLegacyCo2Calculation, profilingPervCPUWattArm64, profilingAWSCostDiscountRate, profilingCostPervCPUPerHour, @@ -479,14 +478,6 @@ export const uiSettings: Record = { schema: schema.number({ min: 0 }), requiresPageReload: true, }, - [profilingUseLegacyCo2Calculation]: { - category: [observabilityFeatureId], - name: i18n.translate('xpack.observability.profilingUseLegacyCo2Calculation', { - defaultMessage: 'Use legacy CO2 and Dollar cost calculations in Universal Profiling', - }), - value: false, - schema: schema.boolean(), - }, [profilingAWSCostDiscountRate]: { category: [observabilityFeatureId], name: i18n.translate('xpack.observability.profilingAWSCostDiscountRateUiSettingName', { diff --git a/x-pack/plugins/profiling/e2e/cypress/e2e/profiling_views/functions.cy.ts b/x-pack/plugins/profiling/e2e/cypress/e2e/profiling_views/functions.cy.ts index 272b5a1743d65..b2f3f743df37e 100644 --- a/x-pack/plugins/profiling/e2e/cypress/e2e/profiling_views/functions.cy.ts +++ b/x-pack/plugins/profiling/e2e/cypress/e2e/profiling_views/functions.cy.ts @@ -174,9 +174,8 @@ describe('Functions page', () => { cy.get(firstRowSelector).eq(2).contains('/'); }); - // skipping this for now until the values are passed to the ES plugin - describe.skip('Test changing CO2 settings', () => { - afterEach(() => { + describe('Test changing CO2 settings', () => { + after(() => { cy.updateAdvancedSettings({ [profilingCo2PerKWH]: 0.000379069, [profilingDatacenterPUE]: 1.7, @@ -190,7 +189,7 @@ describe('Functions page', () => { const firstRowSelector = '[data-grid-row-index="0"] [data-test-subj="dataGridRowCell"]'; cy.get(firstRowSelector).eq(1).contains('1'); cy.get(firstRowSelector).eq(2).contains('vmlinux'); - cy.get(firstRowSelector).eq(5).contains('1.84 lbs / 0.84 kg'); + cy.get(firstRowSelector).eq(5).contains('4.07 lbs / 1.84 kg'); cy.contains('Settings').click(); cy.contains('Advanced Settings'); cy.get(`[data-test-subj="advancedSetting-editField-${profilingCo2PerKWH}"]`) @@ -209,22 +208,22 @@ describe('Functions page', () => { }); cy.go('back'); cy.wait('@getTopNFunctions'); - cy.get(firstRowSelector).eq(5).contains('24.22k lbs / 10.99k'); + cy.get(firstRowSelector).eq(5).contains('1.87k lbs / 847.83 kg'); const firstRowSelectorActionButton = '[data-grid-row-index="0"] [data-test-subj="dataGridRowCell"] .euiButtonIcon'; cy.get(firstRowSelectorActionButton).click(); [ - { parentKey: 'impactEstimates', key: 'co2Emission', value: '0.02 lbs / 0.01 kg' }, - { parentKey: 'impactEstimates', key: 'selfCo2Emission', value: '0.02 lbs / 0.01 kg' }, + { parentKey: 'impactEstimates', key: 'co2Emission', value: '~0.00 lbs / ~0.00 kg' }, + { parentKey: 'impactEstimates', key: 'selfCo2Emission', value: '~0.00 lbs / ~0.00 kg' }, { parentKey: 'impactEstimates', key: 'annualizedCo2Emission', - value: '24.22k lbs / 10.99k kg', + value: '1.87k lbs / 847.83 kg', }, { parentKey: 'impactEstimates', key: 'annualizedSelfCo2Emission', - value: '24.22k lbs / 10.99k kg', + value: '1.87k lbs / 847.83 kg', }, ].forEach(({ parentKey, key, value }) => { cy.get(`[data-test-subj="${parentKey}_${key}"]`).contains(value); diff --git a/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/index.tsx b/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/index.tsx index 621a3b2ba0329..d31090f9c8c82 100644 --- a/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/index.tsx +++ b/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/index.tsx @@ -6,10 +6,12 @@ */ import { + EuiButtonIcon, EuiDataGrid, EuiDataGridCellValueElementProps, EuiDataGridColumn, EuiDataGridSorting, + EuiScreenReaderOnly, useEuiTheme, } from '@elastic/eui'; import { css } from '@emotion/react'; @@ -24,8 +26,14 @@ import { import { orderBy } from 'lodash'; import React, { useEffect, useMemo, useState } from 'react'; import { useCalculateImpactEstimate } from '../../hooks/use_calculate_impact_estimates'; +import { FrameInformationTooltip } from '../frame_information_window/frame_information_tooltip'; import { FunctionRow } from '../topn_functions/function_row'; -import { getFunctionsRows, IFunctionRow } from '../topn_functions/utils'; +import { + convertRowToFrame, + getFunctionsRows, + getTotalCount, + IFunctionRow, +} from '../topn_functions/utils'; import { getColumns } from './get_columns'; import { getCompareFrameAction } from './get_compare_frame_action'; @@ -83,6 +91,7 @@ interface Props { comparisonSortDirection: 'asc' | 'desc'; comparisonSortField: TopNComparisonFunctionSortField; totalSeconds: number; + comparisonTotalSeconds: number; } export function DifferentialTopNFunctionsGrid({ @@ -90,27 +99,27 @@ export function DifferentialTopNFunctionsGrid({ baselineScaleFactor, comparison, comparisonScaleFactor, + comparisonSortDirection, + comparisonSortField, + comparisonTotalSeconds, onChangePage, onChangeSort, + onFrameClick, pageIndex, sortDirection, sortField, totalSeconds, - onFrameClick, - comparisonSortDirection, - comparisonSortField, }: Props) { + const theme = useEuiTheme(); const calculateImpactEstimates = useCalculateImpactEstimate(); const [selectedFrame, setSelectedFrame] = useState(); - const theme = useEuiTheme(); - - const totalCount = useMemo(() => { - if (!base || !base.TotalCount) { - return 0; - } + const [rowsInformation, setRowsInformation] = useState< + { baseRow: IFunctionRow; comparisonRow?: IFunctionRow } | undefined + >(); - return base.TotalCount; - }, [base]); + const { totalCount, comparisonTotalCount } = useMemo(() => { + return { totalCount: getTotalCount(base), comparisonTotalCount: getTotalCount(comparison) }; + }, [base, comparison]); function onSort(newSortingColumns: EuiDataGridSorting['columns']) { // As newSortingColumns is an array and we only sort by a single field for both base and comparison @@ -151,7 +160,7 @@ export function DifferentialTopNFunctionsGrid({ comparisonScaleFactor, comparisonTopNFunctions: base, topNFunctions: comparison, - totalSeconds, + totalSeconds: comparisonTotalSeconds, }), }; }, [ @@ -160,6 +169,7 @@ export function DifferentialTopNFunctionsGrid({ calculateImpactEstimates, comparison, comparisonScaleFactor, + comparisonTotalSeconds, totalSeconds, ]); @@ -224,42 +234,109 @@ export function DifferentialTopNFunctionsGrid({ const rowCount = Math.min(Math.max(sortedBaseRows.length, sortedComparisonRows.length), 100); return ( - {}, - onChangePage, - pageSizeOptions: [], - }} - rowHeightsOptions={{ defaultHeight: 'auto' }} - toolbarVisibility={{ - showColumnSelector: false, - showKeyboardShortcuts: false, - showDisplaySelector: false, - showSortSelector: false, - }} - /> + <> + + + {i18n.translate('xpack.profiling.topNFunctionsGrid.span.controlsLabel', { + defaultMessage: 'Controls', + })} + + + ); + }, + rowCellRender: function RowCellRender({ rowIndex }) { + function handleOnClick() { + const row = sortedBaseRows[rowIndex]; + const currentFrameId = getFrameIdentification(row.frame); + const compareRow = sortedComparisonRows.find( + (item) => getFrameIdentification(item.frame) === currentFrameId + ); + setRowsInformation({ + baseRow: row, + comparisonRow: compareRow, + }); + } + return ( + + ); + }, + }, + ]} + columnVisibility={{ visibleColumns, setVisibleColumns }} + rowCount={rowCount} + renderCellValue={CellValue} + sorting={{ + columns: [ + { id: sortField, direction: sortDirection }, + { id: comparisonSortField, direction: comparisonSortDirection }, + ], + onSort, + }} + pagination={{ + pageIndex, + pageSize: 50, + // Left it empty on purpose as it is a required property on the pagination + onChangeItemsPerPage: () => {}, + onChangePage, + pageSizeOptions: [], + }} + rowHeightsOptions={{ defaultHeight: 'auto' }} + toolbarVisibility={{ + showColumnSelector: false, + showKeyboardShortcuts: false, + showDisplaySelector: false, + showSortSelector: false, + }} + /> + {rowsInformation && ( + { + setRowsInformation(undefined); + }} + /> + )} + ); } diff --git a/x-pack/plugins/profiling/public/components/flamegraph/flamegraph_tooltip.tsx b/x-pack/plugins/profiling/public/components/flamegraph/flamegraph_tooltip.tsx index 75ba9258aeaf0..d500f556fd5ff 100644 --- a/x-pack/plugins/profiling/public/components/flamegraph/flamegraph_tooltip.tsx +++ b/x-pack/plugins/profiling/public/components/flamegraph/flamegraph_tooltip.tsx @@ -21,14 +21,12 @@ import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; import { isNumber } from 'lodash'; import React from 'react'; -import { profilingUseLegacyCo2Calculation } from '@kbn/observability-plugin/common'; import { useCalculateImpactEstimate } from '../../hooks/use_calculate_impact_estimates'; import { asCost } from '../../utils/formatters/as_cost'; import { asPercentage } from '../../utils/formatters/as_percentage'; import { asWeight } from '../../utils/formatters/as_weight'; import { CPULabelWithHint } from '../cpu_label_with_hint'; import { TooltipRow } from './tooltip_row'; -import { useProfilingDependencies } from '../contexts/profiling_dependencies/use_profiling_dependencies'; interface Props { annualCO2KgsInclusive: number; @@ -73,13 +71,6 @@ export function FlameGraphTooltip({ totalSamples, totalSeconds, }: Props) { - const { - start: { core }, - } = useProfilingDependencies(); - const shouldUseLegacyCo2Calculation = core.uiSettings.get( - profilingUseLegacyCo2Calculation - ); - const theme = useEuiTheme(); const calculateImpactEstimates = useCalculateImpactEstimate(); @@ -187,16 +178,8 @@ export function FlameGraphTooltip({ label={i18n.translate('xpack.profiling.flameGraphTooltip.annualizedCo2', { defaultMessage: `Annualized CO2`, })} - value={ - shouldUseLegacyCo2Calculation - ? impactEstimates.totalCPU.annualizedCo2 - : annualCO2KgsInclusive - } - comparison={ - shouldUseLegacyCo2Calculation - ? comparisonImpactEstimates?.totalCPU.annualizedCo2 - : comparisonAnnualCO2KgsInclusive - } + value={annualCO2KgsInclusive} + comparison={comparisonAnnualCO2KgsInclusive} formatValue={(value) => asWeight(value, 'kgs')} showDifference formatDifferenceAsPercentage={false} @@ -205,16 +188,8 @@ export function FlameGraphTooltip({ label={i18n.translate('xpack.profiling.flameGraphTooltip.annualizedDollarCost', { defaultMessage: `Annualized dollar cost`, })} - value={ - shouldUseLegacyCo2Calculation - ? impactEstimates.totalCPU.annualizedDollarCost - : annualCostsUSDInclusive - } - comparison={ - shouldUseLegacyCo2Calculation - ? comparisonImpactEstimates?.totalCPU.annualizedDollarCost - : comparisonAnnualCostsUSDInclusive - } + value={annualCostsUSDInclusive} + comparison={comparisonAnnualCostsUSDInclusive} formatValue={asCost} showDifference formatDifferenceAsPercentage={false} diff --git a/x-pack/plugins/profiling/public/components/flamegraph/index.tsx b/x-pack/plugins/profiling/public/components/flamegraph/index.tsx index cbebc80606703..38fa7273bc1af 100644 --- a/x-pack/plugins/profiling/public/components/flamegraph/index.tsx +++ b/x-pack/plugins/profiling/public/components/flamegraph/index.tsx @@ -88,6 +88,7 @@ export function FlameGraph({ }; const totalSamples = columnarData.viewModel.value[0]; + const comparisonTotalSamples = comparisonFlamegraph?.CountInclusive[0]; const [highlightedVmIndex, setHighlightedVmIndex] = useState(undefined); @@ -109,6 +110,31 @@ export function FlameGraph({ totalAnnualCostUSD: primaryFlamegraph.TotalAnnualCostsUSDItems[highlightedVmIndex], } : undefined; + const primaryFlamegraphNodeId = + highlightedVmIndex !== undefined ? primaryFlamegraph?.ID[highlightedVmIndex] : undefined; + const comparisonFlamegraphNode = + primaryFlamegraphNodeId !== undefined + ? columnarData.comparisonNodesById[primaryFlamegraphNodeId] + : undefined; + + const comparisonSelected: Frame | undefined = + comparisonFlamegraphNode !== undefined + ? { + fileID: comparisonFlamegraphNode.FileID, + frameType: comparisonFlamegraphNode.FrameType, + exeFileName: comparisonFlamegraphNode.ExeFileName, + addressOrLine: comparisonFlamegraphNode.AddressOrLine, + functionName: comparisonFlamegraphNode.FunctionName, + sourceFileName: comparisonFlamegraphNode.SourceFileName, + sourceLine: comparisonFlamegraphNode.SourceLine, + countInclusive: comparisonFlamegraphNode.CountInclusive, + countExclusive: comparisonFlamegraphNode.CountExclusive, + selfAnnualCO2Kgs: comparisonFlamegraphNode.SelfAnnualCO2Kgs, + totalAnnualCO2Kgs: comparisonFlamegraphNode.TotalAnnualCO2Kgs, + selfAnnualCostUSD: comparisonFlamegraphNode.SelfAnnualCostUSD, + totalAnnualCostUSD: comparisonFlamegraphNode.TotalAnnualCostUSD, + } + : undefined; useEffect(() => { setHighlightedVmIndex(undefined); @@ -220,7 +246,11 @@ export function FlameGraph({ {showInformationWindow && ( + + {i18n.translate('xpack.profiling.frameInformationWindow.selectFrame', { + defaultMessage: 'Click on a frame to display more information', + })} + + + ); +} diff --git a/x-pack/plugins/profiling/public/components/frame_information_window/get_impact_rows.tsx b/x-pack/plugins/profiling/public/components/frame_information_window/get_impact_rows.tsx index 29289faca843b..1df0d55ae22e2 100644 --- a/x-pack/plugins/profiling/public/components/frame_information_window/get_impact_rows.tsx +++ b/x-pack/plugins/profiling/public/components/frame_information_window/get_impact_rows.tsx @@ -7,16 +7,16 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; +import { + ANNUAL_SECONDS, + CalculateImpactEstimates, +} from '../../hooks/use_calculate_impact_estimates'; import { asCost } from '../../utils/formatters/as_cost'; import { asDuration } from '../../utils/formatters/as_duration'; import { asNumber } from '../../utils/formatters/as_number'; import { asPercentage } from '../../utils/formatters/as_percentage'; import { asWeight } from '../../utils/formatters/as_weight'; import { CPULabelWithHint } from '../cpu_label_with_hint'; -import { - ANNUAL_SECONDS, - CalculateImpactEstimates, -} from '../../hooks/use_calculate_impact_estimates'; interface Params { countInclusive: number; @@ -24,11 +24,56 @@ interface Params { totalSamples: number; totalSeconds: number; calculateImpactEstimates: CalculateImpactEstimates; - shouldUseLegacyCo2Calculation: boolean; selfAnnualCO2Kgs: number; totalAnnualCO2Kgs: number; selfAnnualCostUSD: number; totalAnnualCostUSD: number; + rank?: number; +} + +export interface ImpactRow { + 'data-test-subj': string; + label: React.ReactNode; + value: string; +} + +const getComparisonValue = (value: T, comparisonValue?: T) => + comparisonValue ? `${value} vs ${comparisonValue}` : value; + +/** + * e.g.: + * label: 'foo', + * value: 'abc' vs 'xyz' + */ +export function getComparisonImpactRow({ + base, + comparison, +}: { + base: Params; + comparison?: Params; +}) { + const baseImpactRows = getImpactRows(base); + const comparisonImpactRows = comparison ? getImpactRows(comparison) : []; + return [ + ...(base.rank + ? [ + { + 'data-test-subj': 'rank', + label: i18n.translate('xpack.profiling.flameGraphInformationWindow.rank', { + defaultMessage: 'Rank', + }), + value: getComparisonValue(base.rank, comparison?.rank), + }, + ] + : []), + ...baseImpactRows.map((baseItem, index) => { + const comparisonValue = comparisonImpactRows[index]?.value; + return { + ...baseItem, + value: getComparisonValue(baseItem.value, comparisonValue), + }; + }), + ]; } export function getImpactRows({ @@ -37,12 +82,11 @@ export function getImpactRows({ totalSamples, totalSeconds, calculateImpactEstimates, - shouldUseLegacyCo2Calculation, selfAnnualCO2Kgs, totalAnnualCO2Kgs, selfAnnualCostUSD, totalAnnualCostUSD, -}: Params) { +}: Params): ImpactRow[] { const { selfCPU, totalCPU } = calculateImpactEstimates({ countInclusive, countExclusive, @@ -117,10 +161,7 @@ export function getImpactRows({ defaultMessage: 'CO2 emission', } ), - value: asWeight( - shouldUseLegacyCo2Calculation ? totalCPU.co2 : totalAnnualCO2Kgs / annualSecondsRatio, - 'kgs' - ), + value: asWeight(totalAnnualCO2Kgs / annualSecondsRatio, 'kgs'), }, { 'data-test-subj': 'selfCo2Emission', @@ -128,10 +169,7 @@ export function getImpactRows({ 'xpack.profiling.flameGraphInformationWindow.co2EmissionExclusiveLabel', { defaultMessage: 'CO2 emission (excl. children)' } ), - value: asWeight( - shouldUseLegacyCo2Calculation ? selfCPU.co2 : selfAnnualCO2Kgs / annualSecondsRatio, - 'kgs' - ), + value: asWeight(selfAnnualCO2Kgs / annualSecondsRatio, 'kgs'), }, { 'data-test-subj': 'annualizedCo2Emission', @@ -139,10 +177,7 @@ export function getImpactRows({ 'xpack.profiling.flameGraphInformationWindow.annualizedCo2InclusiveLabel', { defaultMessage: 'Annualized CO2' } ), - value: asWeight( - shouldUseLegacyCo2Calculation ? totalCPU.annualizedCo2 : totalAnnualCO2Kgs, - 'kgs' - ), + value: asWeight(totalAnnualCO2Kgs, 'kgs'), }, { 'data-test-subj': 'annualizedSelfCo2Emission', @@ -150,10 +185,7 @@ export function getImpactRows({ 'xpack.profiling.flameGraphInformationWindow.annualizedCo2ExclusiveLabel', { defaultMessage: 'Annualized CO2 (excl. children)' } ), - value: asWeight( - shouldUseLegacyCo2Calculation ? selfCPU.annualizedCo2 : selfAnnualCO2Kgs, - 'kgs' - ), + value: asWeight(selfAnnualCO2Kgs, 'kgs'), }, { 'data-test-subj': 'dollarCost', @@ -161,11 +193,7 @@ export function getImpactRows({ 'xpack.profiling.flameGraphInformationWindow.dollarCostInclusiveLabel', { defaultMessage: 'Dollar cost' } ), - value: asCost( - shouldUseLegacyCo2Calculation - ? totalCPU.dollarCost - : totalAnnualCostUSD / annualSecondsRatio - ), + value: asCost(totalAnnualCostUSD / annualSecondsRatio), }, { 'data-test-subj': 'selfDollarCost', @@ -173,9 +201,7 @@ export function getImpactRows({ 'xpack.profiling.flameGraphInformationWindow.dollarCostExclusiveLabel', { defaultMessage: 'Dollar cost (excl. children)' } ), - value: asCost( - shouldUseLegacyCo2Calculation ? selfCPU.dollarCost : selfAnnualCostUSD / annualSecondsRatio - ), + value: asCost(selfAnnualCostUSD / annualSecondsRatio), }, { 'data-test-subj': 'annualizedDollarCost', @@ -183,9 +209,7 @@ export function getImpactRows({ 'xpack.profiling.flameGraphInformationWindow.annualizedDollarCostInclusiveLabel', { defaultMessage: 'Annualized dollar cost' } ), - value: asCost( - shouldUseLegacyCo2Calculation ? totalCPU.annualizedDollarCost : totalAnnualCostUSD - ), + value: asCost(totalAnnualCostUSD), }, { 'data-test-subj': 'annualizedSelfDollarCost', @@ -193,9 +217,7 @@ export function getImpactRows({ 'xpack.profiling.flameGraphInformationWindow.annualizedDollarCostExclusiveLabel', { defaultMessage: 'Annualized dollar cost (excl. children)' } ), - value: asCost( - shouldUseLegacyCo2Calculation ? selfCPU.annualizedDollarCost : selfAnnualCostUSD - ), + value: asCost(selfAnnualCostUSD), }, ]; } diff --git a/x-pack/plugins/profiling/public/components/frame_information_window/index.tsx b/x-pack/plugins/profiling/public/components/frame_information_window/index.tsx index a81eadd215204..a0dbc1c7737b4 100644 --- a/x-pack/plugins/profiling/public/components/frame_information_window/index.tsx +++ b/x-pack/plugins/profiling/public/components/frame_information_window/index.tsx @@ -4,19 +4,19 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { EuiFlexGroup, EuiFlexItem, EuiText, EuiTitle } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiStat, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FrameSymbolStatus, getFrameSymbolStatus } from '@kbn/profiling-utils'; import React from 'react'; -import { profilingUseLegacyCo2Calculation } from '@kbn/observability-plugin/common'; +import { useCalculateImpactEstimate } from '../../hooks/use_calculate_impact_estimates'; +import { FramesSummary } from '../frames_summary'; +import { EmptyFrame } from './empty_frame'; import { FrameInformationAIAssistant } from './frame_information_ai_assistant'; import { FrameInformationPanel } from './frame_information_panel'; -import { getImpactRows } from './get_impact_rows'; +import { getComparisonImpactRow } from './get_impact_rows'; import { getInformationRows } from './get_information_rows'; import { KeyValueList } from './key_value_list'; import { MissingSymbolsCallout } from './missing_symbols_callout'; -import { useCalculateImpactEstimate } from '../../hooks/use_calculate_impact_estimates'; -import { useProfilingDependencies } from '../contexts/profiling_dependencies/use_profiling_dependencies'; export interface Frame { fileID: string; @@ -35,37 +35,34 @@ export interface Frame { } export interface Props { + comparisonFrame?: Frame; + comparisonTotalSeconds?: number; + comparisonTotalSamples?: number; + comparisonRank?: number; frame?: Frame; totalSamples: number; totalSeconds: number; - showAIAssistant?: boolean; + rank?: number; showSymbolsStatus?: boolean; + compressed?: boolean; } export function FrameInformationWindow({ frame, + showSymbolsStatus = true, + comparisonFrame, + comparisonRank, + comparisonTotalSamples, + comparisonTotalSeconds, totalSamples, totalSeconds, - showSymbolsStatus = true, + rank, + compressed = false, }: Props) { const calculateImpactEstimates = useCalculateImpactEstimate(); - const { - start: { core }, - } = useProfilingDependencies(); - const shouldUseLegacyCo2Calculation = core.uiSettings.get( - profilingUseLegacyCo2Calculation - ); if (!frame) { - return ( - - - {i18n.translate('xpack.profiling.frameInformationWindow.selectFrame', { - defaultMessage: 'Click on a frame to display more information', - })} - - - ); + return ; } const symbolStatus = getFrameSymbolStatus({ @@ -82,12 +79,6 @@ export function FrameInformationWindow({ functionName, sourceFileName, sourceLine, - countInclusive, - countExclusive, - selfAnnualCO2Kgs, - totalAnnualCO2Kgs, - selfAnnualCostUSD, - totalAnnualCostUSD, } = frame; const informationRows = getInformationRows({ @@ -100,24 +91,57 @@ export function FrameInformationWindow({ sourceLine, }); - const impactRows = getImpactRows({ - countInclusive, - countExclusive, - totalSamples, - totalSeconds, - calculateImpactEstimates, - shouldUseLegacyCo2Calculation, - selfAnnualCO2Kgs, - totalAnnualCO2Kgs, - selfAnnualCostUSD, - totalAnnualCostUSD, + const impactRows = getComparisonImpactRow({ + base: { + countInclusive: frame.countInclusive, + countExclusive: frame.countExclusive, + selfAnnualCO2Kgs: frame.selfAnnualCO2Kgs, + totalAnnualCO2Kgs: frame.totalAnnualCO2Kgs, + selfAnnualCostUSD: frame.selfAnnualCostUSD, + totalAnnualCostUSD: frame.totalAnnualCostUSD, + rank, + totalSamples, + totalSeconds, + calculateImpactEstimates, + }, + comparison: + comparisonFrame && + comparisonTotalSamples !== undefined && + comparisonTotalSeconds !== undefined + ? { + countInclusive: comparisonFrame.countInclusive, + countExclusive: comparisonFrame.countExclusive, + selfAnnualCO2Kgs: comparisonFrame.selfAnnualCO2Kgs, + totalAnnualCO2Kgs: comparisonFrame.totalAnnualCO2Kgs, + selfAnnualCostUSD: comparisonFrame.selfAnnualCostUSD, + totalAnnualCostUSD: comparisonFrame.totalAnnualCostUSD, + rank: comparisonRank, + totalSamples: comparisonTotalSamples, + totalSeconds: comparisonTotalSeconds, + calculateImpactEstimates, + } + : undefined, }); return ( - + + {informationRows.map((item, index) => ( + + + {item.value} + + } + description={item.label} + titleSize="xs" + /> + + ))} + @@ -127,6 +151,29 @@ export function FrameInformationWindow({ ) : null} + + + diff --git a/x-pack/plugins/profiling/public/components/frame_information_window/key_value_list.tsx b/x-pack/plugins/profiling/public/components/frame_information_window/key_value_list.tsx index 367d8e921ee6b..a7e742bdd184b 100644 --- a/x-pack/plugins/profiling/public/components/frame_information_window/key_value_list.tsx +++ b/x-pack/plugins/profiling/public/components/frame_information_window/key_value_list.tsx @@ -15,25 +15,22 @@ interface Props { value: React.ReactNode; 'data-test-subj'?: string; }>; - prependString?: string; } -export function KeyValueList({ rows, prependString = '', ...props }: Props) { +export function KeyValueList({ rows, ...props }: Props) { return ( {rows.map((row, index) => ( - - + + {row.label}: - {prependString} {row.value} diff --git a/x-pack/plugins/profiling/public/components/frames_summary/index.tsx b/x-pack/plugins/profiling/public/components/frames_summary/index.tsx index e55f19d135f9e..78ac1cd4111a7 100644 --- a/x-pack/plugins/profiling/public/components/frames_summary/index.tsx +++ b/x-pack/plugins/profiling/public/components/frames_summary/index.tsx @@ -14,21 +14,16 @@ import { EuiText, EuiTextColor, } from '@elastic/eui'; -import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; -import { profilingUseLegacyCo2Calculation } from '@kbn/observability-plugin/common'; -import { useCalculateImpactEstimate } from '../../hooks/use_calculate_impact_estimates'; +import { isEmpty } from 'lodash'; +import React, { useMemo } from 'react'; import { asCost } from '../../utils/formatters/as_cost'; import { asWeight } from '../../utils/formatters/as_weight'; import { calculateBaseComparisonDiff } from '../topn_functions/utils'; import { SummaryItem } from './summary_item'; -import { useProfilingDependencies } from '../contexts/profiling_dependencies/use_profiling_dependencies'; interface FrameValue { - selfCPU: number; - totalCPU: number; totalCount: number; - duration: number; scaleFactor?: number; totalAnnualCO2Kgs: number; totalAnnualCostUSD: number; @@ -38,6 +33,8 @@ interface Props { baseValue?: FrameValue; comparisonValue?: FrameValue; isLoading: boolean; + hasBorder?: boolean; + compressed?: boolean; } const ESTIMATED_VALUE_LABEL = i18n.translate('xpack.profiling.diffTopNFunctions.estimatedValue', { @@ -48,15 +45,13 @@ function getScaleFactor(scaleFactor: number = 1) { return scaleFactor; } -export function FramesSummary({ baseValue, comparisonValue, isLoading }: Props) { - const { - start: { core }, - } = useProfilingDependencies(); - const shouldUseLegacyCo2Calculation = core.uiSettings.get( - profilingUseLegacyCo2Calculation - ); - const calculateImpactEstimates = useCalculateImpactEstimate(); - +export function FramesSummary({ + baseValue, + comparisonValue, + isLoading, + hasBorder = false, + compressed = false, +}: Props) { const baselineScaledTotalSamples = baseValue ? baseValue.totalCount * getScaleFactor(baseValue.scaleFactor) : 0; @@ -66,62 +61,23 @@ export function FramesSummary({ baseValue, comparisonValue, isLoading }: Props) : 0; const { co2EmissionDiff, costImpactDiff, totalSamplesDiff } = useMemo(() => { - const baseImpactEstimates = baseValue - ? // Do NOT scale values here. This is intended to show the exact values spent throughout the year - calculateImpactEstimates({ - countExclusive: baseValue.selfCPU, - countInclusive: baseValue.totalCPU, - totalSamples: baseValue.totalCount, - totalSeconds: baseValue.duration, - }) - : undefined; - - const comparisonImpactEstimates = comparisonValue - ? // Do NOT scale values here. This is intended to show the exact values spent throughout the year - calculateImpactEstimates({ - countExclusive: comparisonValue.selfCPU, - countInclusive: comparisonValue.totalCPU, - totalSamples: comparisonValue.totalCount, - totalSeconds: comparisonValue.duration, - }) - : undefined; - return { totalSamplesDiff: calculateBaseComparisonDiff({ baselineValue: baselineScaledTotalSamples || 0, comparisonValue: comparisonScaledTotalSamples || 0, }), co2EmissionDiff: calculateBaseComparisonDiff({ - baselineValue: - (shouldUseLegacyCo2Calculation - ? baseImpactEstimates?.totalSamples?.annualizedCo2 - : baseValue?.totalAnnualCO2Kgs) || 0, - comparisonValue: - (shouldUseLegacyCo2Calculation - ? comparisonImpactEstimates?.totalSamples.annualizedCo2 - : comparisonValue?.totalAnnualCO2Kgs) || 0, + baselineValue: baseValue?.totalAnnualCO2Kgs || 0, + comparisonValue: comparisonValue?.totalAnnualCO2Kgs || 0, formatValue: (value) => asWeight(value, 'kgs'), }), costImpactDiff: calculateBaseComparisonDiff({ - baselineValue: - (shouldUseLegacyCo2Calculation - ? baseImpactEstimates?.totalSamples.annualizedDollarCost - : baseValue?.totalAnnualCostUSD) || 0, - comparisonValue: - (shouldUseLegacyCo2Calculation - ? comparisonImpactEstimates?.totalSamples.annualizedDollarCost - : comparisonValue?.totalAnnualCostUSD) || 0, + baselineValue: baseValue?.totalAnnualCostUSD || 0, + comparisonValue: comparisonValue?.totalAnnualCostUSD || 0, formatValue: asCost, }), }; - }, [ - baseValue, - baselineScaledTotalSamples, - calculateImpactEstimates, - comparisonScaledTotalSamples, - comparisonValue, - shouldUseLegacyCo2Calculation, - ]); + }, [baseValue, baselineScaledTotalSamples, comparisonScaledTotalSamples, comparisonValue]); const data = [ { @@ -143,6 +99,7 @@ export function FramesSummary({ baseValue, comparisonValue, isLoading }: Props) baseIcon: totalSamplesDiff.icon, baseColor: totalSamplesDiff.color, titleHint: ESTIMATED_VALUE_LABEL, + hidden: isEmpty(comparisonValue), }, { id: 'annualizedCo2', @@ -182,7 +139,31 @@ export function FramesSummary({ baseValue, comparisonValue, isLoading }: Props) }, ]; - return ( + const Summary = ( + <> + + + {data + .filter((item) => !item.hidden) + .map((item) => { + return ( + + + + ); + })} + + + ); + + return compressed ? ( + <>{Summary} + ) : ( } > - <> - - - {data.map((item, idx) => { - return ( - - - - ); - })} - - + {Summary} ); } diff --git a/x-pack/plugins/profiling/public/components/frames_summary/summary_item.tsx b/x-pack/plugins/profiling/public/components/frames_summary/summary_item.tsx index a2f63aa55df28..19650ca431038 100644 --- a/x-pack/plugins/profiling/public/components/frames_summary/summary_item.tsx +++ b/x-pack/plugins/profiling/public/components/frames_summary/summary_item.tsx @@ -14,6 +14,7 @@ import { EuiStat, EuiText, EuiTextColor, + EuiTextProps, EuiToolTip, } from '@elastic/eui'; import React from 'react'; @@ -30,11 +31,13 @@ interface Props { comparisonIcon?: string; comparisonColor?: string; titleHint?: string; + hasBorder?: boolean; + compressed?: boolean; } -function Title({ title }: { title: string }) { +function Title({ title, size }: { title: string; size?: EuiTextProps['size'] }) { return ( - + {title} ); @@ -83,18 +86,21 @@ export function SummaryItem({ comparisonColor, comparisonIcon, titleHint, + hasBorder = false, + compressed = false, }: Props) { + const textSize = compressed ? 's' : 'm'; return ( - + } - titleSize="m" + titleSize={textSize} description={ <> {titleHint ? ( - + <Title title={title} size={textSize} /> </EuiFlexItem> <EuiFlexItem grow={false}> <EuiToolTip content={titleHint}> @@ -103,7 +109,7 @@ export function SummaryItem({ </EuiFlexItem> </EuiFlexGroup> ) : ( - <Title title={title} /> + <Title title={title} size={textSize} /> )} <EuiSpacer /> </> @@ -112,7 +118,7 @@ export function SummaryItem({ isLoading={isLoading} > {!isLoading && comparisonValue ? ( - <EuiText color={comparisonColor}> + <EuiText color={comparisonColor} size={textSize}> {comparisonIcon ? ( <EuiIcon data-test-subj={`${id}_comparison_${comparisonIcon}_${comparisonColor}`} diff --git a/x-pack/plugins/profiling/public/components/topn_functions/function_row.tsx b/x-pack/plugins/profiling/public/components/topn_functions/function_row.tsx index 1affab1df5f08..3d20818e7b012 100644 --- a/x-pack/plugins/profiling/public/components/topn_functions/function_row.tsx +++ b/x-pack/plugins/profiling/public/components/topn_functions/function_row.tsx @@ -17,10 +17,8 @@ import { import { i18n } from '@kbn/i18n'; import { TopNFunctionSortField } from '@kbn/profiling-utils'; import React, { useEffect } from 'react'; -import { profilingUseLegacyCo2Calculation } from '@kbn/observability-plugin/common'; import { asCost } from '../../utils/formatters/as_cost'; import { asWeight } from '../../utils/formatters/as_weight'; -import { useProfilingDependencies } from '../contexts/profiling_dependencies/use_profiling_dependencies'; import { StackFrameSummary } from '../stack_frame_summary'; import { CPUStat } from './cpu_stat'; import { SampleStat } from './sample_stat'; @@ -41,14 +39,6 @@ export function FunctionRow({ onFrameClick, setCellProps, }: Props) { - const { - start: { core }, - } = useProfilingDependencies(); - - const shouldUseLegacyCo2Calculation = core.uiSettings.get<boolean>( - profilingUseLegacyCo2Calculation - ); - if (columnId === TopNFunctionSortField.Diff) { return <DiffColumn diff={functionRow.diff} setCellProps={setCellProps} />; } @@ -80,35 +70,12 @@ export function FunctionRow({ return <CPUStat cpu={functionRow.totalCPUPerc} diffCPU={functionRow.diff?.totalCPUPerc} />; } - if ( - columnId === TopNFunctionSortField.AnnualizedCo2 && - functionRow.impactEstimates?.totalCPU?.annualizedCo2 - ) { - return ( - <div> - {asWeight( - shouldUseLegacyCo2Calculation - ? functionRow.impactEstimates.totalCPU.annualizedCo2 - : functionRow.totalAnnualCO2kgs, - 'kgs' - )} - </div> - ); + if (columnId === TopNFunctionSortField.AnnualizedCo2) { + return <div>{asWeight(functionRow.totalAnnualCO2kgs, 'kgs')}</div>; } - if ( - columnId === TopNFunctionSortField.AnnualizedDollarCost && - functionRow.impactEstimates?.totalCPU?.annualizedDollarCost - ) { - return ( - <div> - {asCost( - shouldUseLegacyCo2Calculation - ? functionRow.impactEstimates.totalCPU.annualizedDollarCost - : functionRow.totalAnnualCostUSD - )} - </div> - ); + if (columnId === TopNFunctionSortField.AnnualizedDollarCost) { + return <div>{asCost(functionRow.totalAnnualCostUSD)}</div>; } return null; diff --git a/x-pack/plugins/profiling/public/components/topn_functions/index.tsx b/x-pack/plugins/profiling/public/components/topn_functions/index.tsx index 9d3275e319cc7..6c754d61dac64 100644 --- a/x-pack/plugins/profiling/public/components/topn_functions/index.tsx +++ b/x-pack/plugins/profiling/public/components/topn_functions/index.tsx @@ -11,7 +11,6 @@ import { EuiDataGridCellValueElementProps, EuiDataGridColumn, EuiDataGridControlColumn, - EuiDataGridRefProps, EuiDataGridSorting, EuiScreenReaderOnly, } from '@elastic/eui'; @@ -19,16 +18,14 @@ import { i18n } from '@kbn/i18n'; import { useUiTracker } from '@kbn/observability-shared-plugin/public'; import { getCalleeFunction, TopNFunctions, TopNFunctionSortField } from '@kbn/profiling-utils'; import { last, orderBy } from 'lodash'; -import React, { forwardRef, Ref, useMemo, useState } from 'react'; +import React, { useMemo, useState } from 'react'; import { GridOnScrollProps } from 'react-window'; -import { profilingUseLegacyCo2Calculation } from '@kbn/observability-plugin/common'; import { useCalculateImpactEstimate } from '../../hooks/use_calculate_impact_estimates'; -import { useProfilingDependencies } from '../contexts/profiling_dependencies/use_profiling_dependencies'; import { CPULabelWithHint } from '../cpu_label_with_hint'; import { FrameInformationTooltip } from '../frame_information_window/frame_information_tooltip'; import { LabelWithHint } from '../label_with_hint'; import { FunctionRow } from './function_row'; -import { getFunctionsRows, IFunctionRow } from './utils'; +import { convertRowToFrame, getFunctionsRows, getTotalCount, IFunctionRow } from './utils'; interface Props { topNFunctions?: TopNFunctions; @@ -49,132 +46,166 @@ interface Props { isEmbedded?: boolean; } -export const TopNFunctionsGrid = forwardRef( - ( - { - topNFunctions, - comparisonTopNFunctions, - totalSeconds, - isDifferentialView, - baselineScaleFactor, - comparisonScaleFactor, - onFrameClick, - onScroll, - showDiffColumn = false, - pageIndex, - onChangePage, - sortField, - sortDirection, - onChangeSort, - dataTestSubj = 'topNFunctionsGrid', - isEmbedded = false, - }: Props, - ref: Ref<EuiDataGridRefProps> | undefined - ) => { - const { - start: { core }, - } = useProfilingDependencies(); - const shouldUseLegacyCo2Calculation = core.uiSettings.get<boolean>( - profilingUseLegacyCo2Calculation - ); - const [selectedRow, setSelectedRow] = useState<IFunctionRow | undefined>(); - const trackProfilingEvent = useUiTracker({ app: 'profiling' }); - const calculateImpactEstimates = useCalculateImpactEstimate(); +export const TopNFunctionsGrid = ({ + topNFunctions, + comparisonTopNFunctions, + totalSeconds, + isDifferentialView, + baselineScaleFactor, + comparisonScaleFactor, + onFrameClick, + onScroll, + showDiffColumn = false, + pageIndex, + onChangePage, + sortField, + sortDirection, + onChangeSort, + dataTestSubj = 'topNFunctionsGrid', + isEmbedded = false, +}: Props) => { + const [selectedRow, setSelectedRow] = useState<IFunctionRow | undefined>(); + const trackProfilingEvent = useUiTracker({ app: 'profiling' }); + const calculateImpactEstimates = useCalculateImpactEstimate(); - function onSort(newSortingColumns: EuiDataGridSorting['columns']) { - const lastItem = last(newSortingColumns); - if (lastItem) { - onChangeSort(lastItem); - } + function onSort(newSortingColumns: EuiDataGridSorting['columns']) { + const lastItem = last(newSortingColumns); + if (lastItem) { + onChangeSort(lastItem); } + } - const totalCount = useMemo(() => { - if (!topNFunctions || !topNFunctions.TotalCount) { - return 0; - } - - return topNFunctions.TotalCount; - }, [topNFunctions]); + const totalCount = useMemo(() => getTotalCount(topNFunctions), [topNFunctions]); - const rows = useMemo(() => { - return getFunctionsRows({ - baselineScaleFactor, - comparisonScaleFactor, - comparisonTopNFunctions, - topNFunctions, - totalSeconds, - calculateImpactEstimates, - }); - }, [ + const rows = useMemo(() => { + return getFunctionsRows({ baselineScaleFactor, - calculateImpactEstimates, comparisonScaleFactor, comparisonTopNFunctions, topNFunctions, totalSeconds, - ]); + calculateImpactEstimates, + }); + }, [ + baselineScaleFactor, + calculateImpactEstimates, + comparisonScaleFactor, + comparisonTopNFunctions, + topNFunctions, + totalSeconds, + ]); - const sortedRows = useMemo(() => { - switch (sortField) { - case TopNFunctionSortField.Frame: - return orderBy(rows, (row) => getCalleeFunction(row.frame), sortDirection); - case TopNFunctionSortField.SelfCPU: - return orderBy(rows, (row) => row.selfCPUPerc, sortDirection); - case TopNFunctionSortField.TotalCPU: - return orderBy(rows, (row) => row.totalCPUPerc, sortDirection); - case TopNFunctionSortField.AnnualizedCo2: - return orderBy( - rows, - (row) => - shouldUseLegacyCo2Calculation - ? row.impactEstimates?.totalCPU.annualizedCo2 - : row.totalAnnualCO2kgs, - sortDirection - ); - case TopNFunctionSortField.AnnualizedDollarCost: - return orderBy( - rows, - (row) => - shouldUseLegacyCo2Calculation - ? row.impactEstimates?.totalCPU.annualizedDollarCost - : row.totalAnnualCostUSD, - sortDirection - ); - default: - return orderBy(rows, sortField, sortDirection); - } - }, [rows, shouldUseLegacyCo2Calculation, sortDirection, sortField]); + const sortedRows = useMemo(() => { + switch (sortField) { + case TopNFunctionSortField.Frame: + return orderBy(rows, (row) => getCalleeFunction(row.frame), sortDirection); + case TopNFunctionSortField.SelfCPU: + return orderBy(rows, (row) => row.selfCPUPerc, sortDirection); + case TopNFunctionSortField.TotalCPU: + return orderBy(rows, (row) => row.totalCPUPerc, sortDirection); + case TopNFunctionSortField.AnnualizedCo2: + return orderBy(rows, (row) => row.totalAnnualCO2kgs, sortDirection); + case TopNFunctionSortField.AnnualizedDollarCost: + return orderBy(rows, (row) => row.totalAnnualCostUSD, sortDirection); + default: + return orderBy(rows, sortField, sortDirection); + } + }, [rows, sortDirection, sortField]); - const { columns, leadingControlColumns } = useMemo(() => { - const gridColumns: EuiDataGridColumn[] = [ - { - id: TopNFunctionSortField.Rank, - schema: 'numeric', - actions: { showHide: false }, - initialWidth: isDifferentialView ? 50 : 90, - displayAsText: i18n.translate('xpack.profiling.functionsView.rankColumnLabel', { - defaultMessage: 'Rank', - }), - }, + const { columns, leadingControlColumns } = useMemo(() => { + const gridColumns: EuiDataGridColumn[] = [ + { + id: TopNFunctionSortField.Rank, + schema: 'numeric', + actions: { showHide: false }, + initialWidth: isDifferentialView ? 50 : 90, + displayAsText: i18n.translate('xpack.profiling.functionsView.rankColumnLabel', { + defaultMessage: 'Rank', + }), + }, + { + id: TopNFunctionSortField.Frame, + actions: { showHide: false }, + displayAsText: i18n.translate('xpack.profiling.functionsView.functionColumnLabel', { + defaultMessage: 'Function', + }), + }, + { + id: TopNFunctionSortField.Samples, + initialWidth: isDifferentialView ? 100 : 200, + schema: 'numeric', + actions: { showHide: false }, + display: ( + <LabelWithHint + label={i18n.translate('xpack.profiling.functionsView.samplesColumnLabel', { + defaultMessage: 'Samples', + })} + hint={i18n.translate('xpack.profiling.functionsView.samplesColumnLabel.hint', { + defaultMessage: 'Estimated values', + })} + labelSize="s" + labelStyle={{ fontWeight: 700 }} + iconSize="s" + /> + ), + }, + { + id: TopNFunctionSortField.SelfCPU, + schema: 'numeric', + actions: { showHide: false }, + initialWidth: isDifferentialView ? 100 : 200, + display: ( + <CPULabelWithHint + type="self" + labelSize="s" + labelStyle={{ fontWeight: 700 }} + iconSize="s" + /> + ), + }, + { + id: TopNFunctionSortField.TotalCPU, + schema: 'numeric', + actions: { showHide: false }, + initialWidth: isDifferentialView ? 100 : 200, + display: ( + <CPULabelWithHint + type="total" + labelSize="s" + labelStyle={{ fontWeight: 700 }} + iconSize="s" + /> + ), + }, + ]; + + const gridLeadingControlColumns: EuiDataGridControlColumn[] = []; + if (showDiffColumn) { + gridColumns.push({ + initialWidth: 60, + id: TopNFunctionSortField.Diff, + actions: { showHide: false }, + displayAsText: i18n.translate('xpack.profiling.functionsView.diffColumnLabel', { + defaultMessage: 'Diff', + }), + }); + } + + if (!isDifferentialView) { + gridColumns.push( { - id: TopNFunctionSortField.Frame, + id: TopNFunctionSortField.AnnualizedCo2, actions: { showHide: false }, - displayAsText: i18n.translate('xpack.profiling.functionsView.functionColumnLabel', { - defaultMessage: 'Function', - }), - }, - { - id: TopNFunctionSortField.Samples, initialWidth: isDifferentialView ? 100 : 200, schema: 'numeric', - actions: { showHide: false }, display: ( <LabelWithHint - label={i18n.translate('xpack.profiling.functionsView.samplesColumnLabel', { - defaultMessage: 'Samples', + label={i18n.translate('xpack.profiling.functionsView.annualizedCo2', { + defaultMessage: 'Annualized CO2', })} - hint={i18n.translate('xpack.profiling.functionsView.samplesColumnLabel.hint', { - defaultMessage: 'Estimated values', + hint={i18n.translate('xpack.profiling.functionsView.annualizedCo2.hint', { + defaultMessage: + 'Indicates the CO2 emission of the function and any functions called by it.', })} labelSize="s" labelStyle={{ fontWeight: 700 }} @@ -183,211 +214,127 @@ export const TopNFunctionsGrid = forwardRef( ), }, { - id: TopNFunctionSortField.SelfCPU, - schema: 'numeric', - actions: { showHide: false }, - initialWidth: isDifferentialView ? 100 : 200, - display: ( - <CPULabelWithHint - type="self" - labelSize="s" - labelStyle={{ fontWeight: 700 }} - iconSize="s" - /> - ), - }, - { - id: TopNFunctionSortField.TotalCPU, + id: TopNFunctionSortField.AnnualizedDollarCost, schema: 'numeric', actions: { showHide: false }, initialWidth: isDifferentialView ? 100 : 200, display: ( - <CPULabelWithHint - type="total" + <LabelWithHint + label={i18n.translate('xpack.profiling.functionsView.annualizedDollarCost', { + defaultMessage: `Annualized dollar cost`, + })} + hint={i18n.translate('xpack.profiling.functionsView.annualizedDollarCost.hint', { + defaultMessage: `Indicates the Dollar cost of the function and any functions called by it.`, + })} labelSize="s" labelStyle={{ fontWeight: 700 }} iconSize="s" /> ), - }, - ]; - - const gridLeadingControlColumns: EuiDataGridControlColumn[] = []; - if (showDiffColumn) { - gridColumns.push({ - initialWidth: 60, - id: TopNFunctionSortField.Diff, - actions: { showHide: false }, - displayAsText: i18n.translate('xpack.profiling.functionsView.diffColumnLabel', { - defaultMessage: 'Diff', - }), - }); - } + } + ); - if (!isDifferentialView) { - gridColumns.push( - { - id: TopNFunctionSortField.AnnualizedCo2, - actions: { showHide: false }, - initialWidth: isDifferentialView ? 100 : 200, - schema: 'numeric', - display: ( - <LabelWithHint - label={i18n.translate('xpack.profiling.functionsView.annualizedCo2', { - defaultMessage: 'Annualized CO2', + gridLeadingControlColumns.push({ + id: 'actions', + width: 40, + headerCellRender() { + return ( + <EuiScreenReaderOnly> + <span> + {i18n.translate('xpack.profiling.topNFunctionsGrid.span.controlsLabel', { + defaultMessage: 'Controls', })} - hint={i18n.translate('xpack.profiling.functionsView.annualizedCo2.hint', { - defaultMessage: - 'Indicates the CO2 emission of the function and any functions called by it.', - })} - labelSize="s" - labelStyle={{ fontWeight: 700 }} - iconSize="s" - /> - ), - }, - { - id: TopNFunctionSortField.AnnualizedDollarCost, - schema: 'numeric', - actions: { showHide: false }, - initialWidth: isDifferentialView ? 100 : 200, - display: ( - <LabelWithHint - label={i18n.translate('xpack.profiling.functionsView.annualizedDollarCost', { - defaultMessage: `Annualized dollar cost`, - })} - hint={i18n.translate('xpack.profiling.functionsView.annualizedDollarCost.hint', { - defaultMessage: `Indicates the Dollar cost of the function and any functions called by it.`, - })} - labelSize="s" - labelStyle={{ fontWeight: 700 }} - iconSize="s" - /> - ), + </span> + </EuiScreenReaderOnly> + ); + }, + rowCellRender: function RowCellRender({ rowIndex }) { + function handleOnClick() { + trackProfilingEvent({ metric: 'topN_function_details_click' }); + setSelectedRow(sortedRows[rowIndex]); } - ); - - gridLeadingControlColumns.push({ - id: 'actions', - width: 40, - headerCellRender() { - return ( - <EuiScreenReaderOnly> - <span> - {i18n.translate('xpack.profiling.topNFunctionsGrid.span.controlsLabel', { - defaultMessage: 'Controls', - })} - </span> - </EuiScreenReaderOnly> - ); - }, - rowCellRender: function RowCellRender({ rowIndex }) { - function handleOnClick() { - trackProfilingEvent({ metric: 'topN_function_details_click' }); - setSelectedRow(sortedRows[rowIndex]); - } - return ( - <EuiButtonIcon - data-test-subj="profilingTopNFunctionsGridButton" - aria-label={i18n.translate( - 'xpack.profiling.topNFunctionsGrid.euiButtonIcon.showActionsLabel', - { defaultMessage: 'Show actions' } - )} - iconType="expand" - color="text" - onClick={handleOnClick} - /> - ); - }, - }); - } - return { columns: gridColumns, leadingControlColumns: gridLeadingControlColumns }; - }, [isDifferentialView, sortedRows, showDiffColumn, trackProfilingEvent]); + return ( + <EuiButtonIcon + data-test-subj="profilingTopNFunctionsGridButton" + aria-label={i18n.translate( + 'xpack.profiling.topNFunctionsGrid.euiButtonIcon.showActionsLabel', + { defaultMessage: 'Show actions' } + )} + iconType="expand" + color="text" + onClick={handleOnClick} + /> + ); + }, + }); + } + return { columns: gridColumns, leadingControlColumns: gridLeadingControlColumns }; + }, [isDifferentialView, sortedRows, showDiffColumn, trackProfilingEvent]); - const [visibleColumns, setVisibleColumns] = useState(columns.map(({ id }) => id)); + const [visibleColumns, setVisibleColumns] = useState(columns.map(({ id }) => id)); - function RenderCellValue({ - rowIndex, - columnId, - setCellProps, - }: EuiDataGridCellValueElementProps) { - const data = sortedRows[rowIndex]; - if (data) { - return ( - <FunctionRow - functionRow={data} - columnId={columnId} - totalCount={totalCount} - onFrameClick={onFrameClick} - setCellProps={setCellProps} - /> - ); - } - return null; + function RenderCellValue({ rowIndex, columnId, setCellProps }: EuiDataGridCellValueElementProps) { + const data = sortedRows[rowIndex]; + if (data) { + return ( + <FunctionRow + functionRow={data} + columnId={columnId} + totalCount={totalCount} + onFrameClick={onFrameClick} + setCellProps={setCellProps} + /> + ); } + return null; + } - return ( - <> - <EuiDataGrid - data-test-subj={dataTestSubj} - ref={ref} - aria-label={i18n.translate( - 'xpack.profiling.topNFunctionsGrid.euiDataGrid.topNFunctionsLabel', - { defaultMessage: 'TopN functions' } - )} - columns={columns} - columnVisibility={{ visibleColumns, setVisibleColumns }} - rowCount={sortedRows.length > 100 ? 100 : sortedRows.length} - renderCellValue={RenderCellValue} - sorting={{ columns: [{ id: sortField, direction: sortDirection }], onSort }} - leadingControlColumns={leadingControlColumns} - pagination={{ - pageIndex, - pageSize: 50, - // Left it empty on purpose as it is a required property on the pagination - onChangeItemsPerPage: () => {}, - onChangePage, - pageSizeOptions: [], - }} - rowHeightsOptions={{ defaultHeight: 'auto' }} - toolbarVisibility={{ - showColumnSelector: false, - showKeyboardShortcuts: !isDifferentialView, - showDisplaySelector: !isDifferentialView, - showFullScreenSelector: !isDifferentialView, - showSortSelector: false, - }} - virtualizationOptions={{ - onScroll, + return ( + <> + <EuiDataGrid + data-test-subj={dataTestSubj} + aria-label={i18n.translate( + 'xpack.profiling.topNFunctionsGrid.euiDataGrid.topNFunctionsLabel', + { defaultMessage: 'TopN functions' } + )} + columns={columns} + columnVisibility={{ visibleColumns, setVisibleColumns }} + rowCount={sortedRows.length > 100 ? 100 : sortedRows.length} + renderCellValue={RenderCellValue} + sorting={{ columns: [{ id: sortField, direction: sortDirection }], onSort }} + leadingControlColumns={leadingControlColumns} + pagination={{ + pageIndex, + pageSize: 50, + // Left it empty on purpose as it is a required property on the pagination + onChangeItemsPerPage: () => {}, + onChangePage, + pageSizeOptions: [], + }} + rowHeightsOptions={{ defaultHeight: 'auto' }} + toolbarVisibility={{ + showColumnSelector: false, + showKeyboardShortcuts: !isDifferentialView, + showDisplaySelector: !isDifferentialView, + showFullScreenSelector: !isDifferentialView, + showSortSelector: false, + }} + virtualizationOptions={{ + onScroll, + }} + /> + {selectedRow && ( + <FrameInformationTooltip + compressed + onClose={() => { + setSelectedRow(undefined); }} + frame={convertRowToFrame(selectedRow)} + totalSeconds={totalSeconds} + totalSamples={totalCount} + showSymbolsStatus={!isEmbedded} /> - {selectedRow && ( - <FrameInformationTooltip - onClose={() => { - setSelectedRow(undefined); - }} - frame={{ - addressOrLine: selectedRow.frame.AddressOrLine, - countExclusive: selectedRow.selfCPU, - countInclusive: selectedRow.totalCPU, - exeFileName: selectedRow.frame.ExeFileName, - fileID: selectedRow.frame.FileID, - frameType: selectedRow.frame.FrameType, - functionName: selectedRow.frame.FunctionName, - sourceFileName: selectedRow.frame.SourceFilename, - sourceLine: selectedRow.frame.SourceLine, - selfAnnualCO2Kgs: selectedRow.selfAnnualCO2kgs, - totalAnnualCO2Kgs: selectedRow.totalAnnualCO2kgs, - selfAnnualCostUSD: selectedRow.selfAnnualCostUSD, - totalAnnualCostUSD: selectedRow.totalAnnualCostUSD, - }} - totalSeconds={totalSeconds} - totalSamples={totalCount} - showAIAssistant={!isEmbedded} - showSymbolsStatus={!isEmbedded} - /> - )} - </> - ); - } -); + )} + </> + ); +}; diff --git a/x-pack/plugins/profiling/public/components/topn_functions/utils.test.ts b/x-pack/plugins/profiling/public/components/topn_functions/utils.test.ts index f0c6ca1a25c8d..c7598f55acb0b 100644 --- a/x-pack/plugins/profiling/public/components/topn_functions/utils.test.ts +++ b/x-pack/plugins/profiling/public/components/topn_functions/utils.test.ts @@ -4,7 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { getColorLabel } from './utils'; +import { TopNFunctions } from '@kbn/profiling-utils'; +import { getColorLabel, getTotalCount } from './utils'; describe('Top N functions: Utils', () => { describe('getColorLabel', () => { @@ -40,4 +41,12 @@ describe('Top N functions: Utils', () => { }); }); }); + describe('getTotalCount', () => { + it('returns default value', () => { + expect(getTotalCount()).toEqual(0); + }); + it('returns value from topNFunctions', () => { + expect(getTotalCount({ TotalCount: 10 } as TopNFunctions)).toEqual(10); + }); + }); }); diff --git a/x-pack/plugins/profiling/public/components/topn_functions/utils.ts b/x-pack/plugins/profiling/public/components/topn_functions/utils.ts index 3e8389e4e1e9b..f57d96ed07f8d 100644 --- a/x-pack/plugins/profiling/public/components/topn_functions/utils.ts +++ b/x-pack/plugins/profiling/public/components/topn_functions/utils.ts @@ -32,6 +32,8 @@ export function scaleValue({ value, scaleFactor = 1 }: { value: number; scaleFac return value * scaleFactor; } +export const getTotalCount = (topNFunctions?: TopNFunctions) => topNFunctions?.TotalCount ?? 0; + export interface IFunctionRow { id: string; rank: number; @@ -196,3 +198,21 @@ export function calculateBaseComparisonDiff({ label, }; } + +export function convertRowToFrame(row: IFunctionRow) { + return { + addressOrLine: row.frame.AddressOrLine, + countExclusive: row.selfCPU, + countInclusive: row.totalCPU, + exeFileName: row.frame.ExeFileName, + fileID: row.frame.FileID, + frameType: row.frame.FrameType, + functionName: row.frame.FunctionName, + sourceFileName: row.frame.SourceFilename, + sourceLine: row.frame.SourceLine, + selfAnnualCO2Kgs: row.selfAnnualCO2kgs, + totalAnnualCO2Kgs: row.totalAnnualCO2kgs, + selfAnnualCostUSD: row.selfAnnualCostUSD, + totalAnnualCostUSD: row.totalAnnualCostUSD, + }; +} diff --git a/x-pack/plugins/profiling/public/hooks/use_calculate_impact_estimates.test.ts b/x-pack/plugins/profiling/public/hooks/use_calculate_impact_estimates.test.ts index f0e6d2cda5c31..1c4017a468eae 100644 --- a/x-pack/plugins/profiling/public/hooks/use_calculate_impact_estimates.test.ts +++ b/x-pack/plugins/profiling/public/hooks/use_calculate_impact_estimates.test.ts @@ -50,30 +50,18 @@ describe('useCalculateImpactEstimate', () => { percentage: 0.1, coreSeconds: 50, annualizedCoreSeconds: 1752000, - co2: 0.00006265168194444443, - annualizedCo2: 2.1953149353333328, - dollarCost: 0.0005902777777777778, - annualizedDollarCost: 20.683333333333334, }); expect(selfCPU).toEqual({ percentage: 0.05, coreSeconds: 25, annualizedCoreSeconds: 876000, - co2: 0.000031325840972222215, - annualizedCo2: 1.0976574676666664, - dollarCost: 0.0002951388888888889, - annualizedDollarCost: 10.341666666666667, }); expect(totalSamples).toEqual({ percentage: 1, coreSeconds: 500, annualizedCoreSeconds: 17520000, - co2: 0.0006265168194444444, - annualizedCo2: 21.95314935333333, - dollarCost: 0.0059027777777777785, - annualizedDollarCost: 206.83333333333337, }); }); @@ -90,30 +78,18 @@ describe('useCalculateImpactEstimate', () => { percentage: 0.1, coreSeconds: 50, annualizedCoreSeconds: 1752000, - co2: 0.00006265168194444443, - annualizedCo2: 2.1953149353333328, - dollarCost: 0.0005902777777777778, - annualizedDollarCost: 20.683333333333334, }); expect(selfCPU).toEqual({ percentage: 0.1, coreSeconds: 50, annualizedCoreSeconds: 1752000, - co2: 0.00006265168194444443, - annualizedCo2: 2.1953149353333328, - dollarCost: 0.0005902777777777778, - annualizedDollarCost: 20.683333333333334, }); expect(totalSamples).toEqual({ percentage: 1, coreSeconds: 500, annualizedCoreSeconds: 17520000, - co2: 0.0006265168194444444, - annualizedCo2: 21.95314935333333, - dollarCost: 0.0059027777777777785, - annualizedDollarCost: 206.83333333333337, }); }); }); diff --git a/x-pack/plugins/profiling/public/hooks/use_calculate_impact_estimates.ts b/x-pack/plugins/profiling/public/hooks/use_calculate_impact_estimates.ts index 69820a5090a89..d148e0cc262dd 100644 --- a/x-pack/plugins/profiling/public/hooks/use_calculate_impact_estimates.ts +++ b/x-pack/plugins/profiling/public/hooks/use_calculate_impact_estimates.ts @@ -5,13 +5,6 @@ * 2.0. */ -import { - profilingCo2PerKWH, - profilingDatacenterPUE, - profilingPervCPUWattX86, -} from '@kbn/observability-plugin/common'; -import { useProfilingDependencies } from '../components/contexts/profiling_dependencies/use_profiling_dependencies'; - interface Params { countInclusive: number; countExclusive: number; @@ -24,19 +17,7 @@ export type ImpactEstimates = ReturnType<CalculateImpactEstimates>; export const ANNUAL_SECONDS = 60 * 60 * 24 * 365; -// The cost of an x86 CPU core per hour, in US$. -// (ARM is 60% less based graviton 3 data, see https://aws.amazon.com/ec2/graviton/) -const CORE_COST_PER_HOUR = 0.0425; - export function useCalculateImpactEstimate() { - const { - start: { core }, - } = useProfilingDependencies(); - - const perCoreWatts = core.uiSettings.get<number>(profilingPervCPUWattX86); - const co2PerTonKWH = core.uiSettings.get<number>(profilingCo2PerKWH); - const datacenterPUE = core.uiSettings.get<number>(profilingDatacenterPUE); - function calculateImpact({ samples, totalSamples, @@ -51,21 +32,11 @@ export function useCalculateImpactEstimate() { const percentage = samples / totalSamples; const coreSeconds = totalCoreSeconds * percentage; const annualizedCoreSeconds = coreSeconds * annualizedScaleUp; - const coreHours = coreSeconds / (60 * 60); - const co2PerKWH = co2PerTonKWH * 1000; - const co2 = ((perCoreWatts * coreHours) / 1000.0) * co2PerKWH * datacenterPUE; - const annualizedCo2 = co2 * annualizedScaleUp; - const dollarCost = coreHours * CORE_COST_PER_HOUR; - const annualizedDollarCost = dollarCost * annualizedScaleUp; return { percentage, coreSeconds, annualizedCoreSeconds, - co2, - annualizedCo2, - dollarCost, - annualizedDollarCost, }; } diff --git a/x-pack/plugins/profiling/public/utils/get_flamegraph_model/index.ts b/x-pack/plugins/profiling/public/utils/get_flamegraph_model/index.ts index 16d2b6a7a1644..614c17810a626 100644 --- a/x-pack/plugins/profiling/public/utils/get_flamegraph_model/index.ts +++ b/x-pack/plugins/profiling/public/utils/get_flamegraph_model/index.ts @@ -25,6 +25,22 @@ const nullColumnarViewModel = { size1: new Float32Array(), }; +interface ComparisonNode { + FileID: string; + FrameType: number; + ExeFileName: string; + AddressOrLine: number; + FunctionName: string; + SourceFileName: string; + SourceLine: number; + CountInclusive: number; + CountExclusive: number; + SelfAnnualCO2Kgs: number; + TotalAnnualCO2Kgs: number; + SelfAnnualCostUSD: number; + TotalAnnualCostUSD: number; +} + export function getFlamegraphModel({ primaryFlamegraph, comparisonFlamegraph, @@ -46,11 +62,10 @@ export function getFlamegraphModel({ }): { key: string; viewModel: ColumnarViewModel; - comparisonNodesById: Record<string, { CountInclusive: number; CountExclusive: number }>; + comparisonNodesById: Record<string, ComparisonNode>; legendItems: Array<{ label: string; color: string }>; } { - const comparisonNodesById: Record<string, { CountInclusive: number; CountExclusive: number }> = - {}; + const comparisonNodesById: Record<string, ComparisonNode> = {}; if (!primaryFlamegraph || !primaryFlamegraph.Label || primaryFlamegraph.Label.length === 0) { return { @@ -97,6 +112,17 @@ export function getFlamegraphModel({ comparisonFlamegraph.ID.forEach((nodeID, index) => { comparisonNodesById[nodeID] = { + FileID: comparisonFlamegraph.FileID[index], + FrameType: comparisonFlamegraph.FrameType[index], + ExeFileName: comparisonFlamegraph.ExeFilename[index], + AddressOrLine: comparisonFlamegraph.AddressOrLine[index], + FunctionName: comparisonFlamegraph.FunctionName[index], + SourceFileName: comparisonFlamegraph.SourceFilename[index], + SourceLine: comparisonFlamegraph.SourceLine[index], + SelfAnnualCO2Kgs: comparisonFlamegraph.SelfAnnualCO2KgsItems[index], + TotalAnnualCO2Kgs: comparisonFlamegraph.TotalAnnualCO2KgsItems[index], + SelfAnnualCostUSD: comparisonFlamegraph.SelfAnnualCostsUSDItems[index], + TotalAnnualCostUSD: comparisonFlamegraph.TotalAnnualCostsUSDItems[index], CountInclusive: comparisonFlamegraph.CountInclusive[index], CountExclusive: comparisonFlamegraph.CountExclusive[index], }; diff --git a/x-pack/plugins/profiling/public/views/flamegraphs/differential_flamegraphs/index.tsx b/x-pack/plugins/profiling/public/views/flamegraphs/differential_flamegraphs/index.tsx index 82c7c0f92c071..a956a6d715fbb 100644 --- a/x-pack/plugins/profiling/public/views/flamegraphs/differential_flamegraphs/index.tsx +++ b/x-pack/plugins/profiling/public/views/flamegraphs/differential_flamegraphs/index.tsx @@ -126,9 +126,6 @@ export function DifferentialFlameGraphsView() { baseValue={ state.data?.primaryFlamegraph ? { - duration: totalSeconds, - selfCPU: state.data.primaryFlamegraph.SelfCPU, - totalCPU: state.data.primaryFlamegraph.TotalCPU, totalCount: state.data.primaryFlamegraph.TotalSamples, scaleFactor: isNormalizedByTime ? baselineTime : baseline, totalAnnualCO2Kgs: state.data.primaryFlamegraph.TotalAnnualCO2KgsItems[0], @@ -139,9 +136,6 @@ export function DifferentialFlameGraphsView() { comparisonValue={ state.data?.comparisonFlamegraph ? { - duration: totalComparisonSeconds, - selfCPU: state.data.comparisonFlamegraph.SelfCPU, - totalCPU: state.data.comparisonFlamegraph.TotalCPU, totalCount: state.data.comparisonFlamegraph.TotalSamples, scaleFactor: isNormalizedByTime ? comparisonTime : comparison, totalAnnualCO2Kgs: state.data.comparisonFlamegraph.TotalAnnualCO2KgsItems[0], diff --git a/x-pack/plugins/profiling/public/views/functions/differential_topn/index.tsx b/x-pack/plugins/profiling/public/views/functions/differential_topn/index.tsx index 9551645bb7567..007f6a3546b7b 100644 --- a/x-pack/plugins/profiling/public/views/functions/differential_topn/index.tsx +++ b/x-pack/plugins/profiling/public/views/functions/differential_topn/index.tsx @@ -54,9 +54,7 @@ export function DifferentialTopNFunctionsView() { const totalSeconds = timeRange.inSeconds.end - timeRange.inSeconds.start; const totalComparisonSeconds = - (new Date(comparisonTimeRange.end!).getTime() - - new Date(comparisonTimeRange.start!).getTime()) / - 1000; + comparisonTimeRange.inSeconds.end! - comparisonTimeRange.inSeconds.start!; const comparisonTime = totalSeconds / totalComparisonSeconds; @@ -175,10 +173,7 @@ export function DifferentialTopNFunctionsView() { baseValue={ state.data ? { - duration: totalSeconds, - selfCPU: state.data.selfCPU, totalCount: state.data.TotalCount, - totalCPU: state.data.totalCPU, scaleFactor: isNormalizedByTime ? baselineTime : baseline, totalAnnualCO2Kgs: state.data.totalAnnualCO2Kgs, totalAnnualCostUSD: state.data.totalAnnualCostUSD, @@ -188,10 +183,7 @@ export function DifferentialTopNFunctionsView() { comparisonValue={ comparisonState.data ? { - duration: totalComparisonSeconds, - selfCPU: comparisonState.data.selfCPU, totalCount: comparisonState.data.TotalCount, - totalCPU: comparisonState.data.totalCPU, scaleFactor: isNormalizedByTime ? comparisonTime : comparison, totalAnnualCO2Kgs: comparisonState.data.totalAnnualCO2Kgs, totalAnnualCostUSD: comparisonState.data.totalAnnualCostUSD, @@ -209,18 +201,19 @@ export function DifferentialTopNFunctionsView() { > <DifferentialTopNFunctionsGrid base={state.data} - comparison={comparisonState.data} baselineScaleFactor={isNormalizedByTime ? comparisonTime : comparison} + comparison={comparisonState.data} comparisonScaleFactor={isNormalizedByTime ? baselineTime : baseline} - totalSeconds={totalSeconds} - pageIndex={pageIndex} + comparisonSortDirection={comparisonSortDirection} + comparisonSortField={comparisonSortField} + comparisonTotalSeconds={totalComparisonSeconds} onChangePage={handlePageChange} onChangeSort={handleOnSort} - sortField={sortField} - sortDirection={sortDirection} onFrameClick={handleOnFrameClick} - comparisonSortDirection={comparisonSortDirection} - comparisonSortField={comparisonSortField} + pageIndex={pageIndex} + sortDirection={sortDirection} + sortField={sortField} + totalSeconds={totalSeconds} /> </AsyncComponent> </EuiFlexItem> From 99224539f863a04d68a418294774bdd553841669 Mon Sep 17 00:00:00 2001 From: Christos Nasikas <christos.nasikas@elastic.co> Date: Thu, 21 Dec 2023 12:59:19 +0200 Subject: [PATCH 59/62] [Cases] Do not check for version conflicts when adding/updating comments to a case (#173740) ## Summary When we add or update a comment (attachment) to a case we update the `updatedAt` and `updatedBy` attributes of the case. When we update the case we pass the version of the current case to the SO client for concurrency control. If the version of the current case is different from the one we updating (someone else updated the case) the SO client will throw an error. Although we always fetch the case before adding a comment it may be possible in some weird race conditions for one Kibana node to get the case and before updating another node to update the case. This is extremely difficult to produce when users interact but it may be possible (still rare) when we introduce the case action. This PR does not do any concurrency control when updating the `updatedAt` and `updatedBy` attributes of the case when adding/updating a comment. ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../common/models/case_with_comments.test.ts | 54 ++++++++++++++++++- .../common/models/case_with_comments.ts | 13 +++-- .../tests/common/comments/patch_comment.ts | 44 +++++++++++++++ .../tests/common/comments/post_comment.ts | 30 +++++++++++ .../internal/bulk_create_attachments.ts | 30 +++++++++++ 5 files changed, 163 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/cases/server/common/models/case_with_comments.test.ts b/x-pack/plugins/cases/server/common/models/case_with_comments.test.ts index 3a194645c3fca..f55c1c78b1108 100644 --- a/x-pack/plugins/cases/server/common/models/case_with_comments.test.ts +++ b/x-pack/plugins/cases/server/common/models/case_with_comments.test.ts @@ -6,11 +6,15 @@ */ import type { AlertAttachmentAttributes } from '../../../common/types/domain'; +import { AttachmentType } from '../../../common/types/domain'; import type { SavedObject } from '@kbn/core-saved-objects-api-server'; import { createCasesClientMockArgs } from '../../client/mocks'; import { alertComment, comment, mockCaseComments, mockCases, multipleAlert } from '../../mocks'; import { CaseCommentModel } from './case_with_comments'; -import { MAX_PERSISTABLE_STATE_AND_EXTERNAL_REFERENCES } from '../../../common/constants'; +import { + MAX_PERSISTABLE_STATE_AND_EXTERNAL_REFERENCES, + SECURITY_SOLUTION_OWNER, +} from '../../../common/constants'; import { commentExternalReference, commentFileExternalReference, @@ -25,6 +29,7 @@ describe('CaseCommentModel', () => { clientArgs.services.caseService.getCase.mockResolvedValue(theCase); clientArgs.services.caseService.patchCase.mockResolvedValue(theCase); clientArgs.services.attachmentService.create.mockResolvedValue(mockCaseComments[0]); + clientArgs.services.attachmentService.update.mockResolvedValue(mockCaseComments[0]); clientArgs.services.attachmentService.bulkCreate.mockResolvedValue({ saved_objects: mockCaseComments, }); @@ -274,6 +279,18 @@ describe('CaseCommentModel', () => { expect(clientArgs.services.attachmentService.create).not.toHaveBeenCalled(); }); + it('partial updates the case', async () => { + await model.createComment({ + id: 'comment-1', + commentReq: comment, + createdDate, + }); + + const args = clientArgs.services.caseService.patchCase.mock.calls[0][0]; + + expect(args.version).toBeUndefined(); + }); + describe('validation', () => { clientArgs.services.attachmentService.countPersistableStateAndExternalReferenceAttachments.mockResolvedValue( MAX_PERSISTABLE_STATE_AND_EXTERNAL_REFERENCES @@ -579,6 +596,21 @@ describe('CaseCommentModel', () => { expect(multipleAlertsCall.attributes.index).toEqual(['test-index-3', 'test-index-5']); }); + it('partial updates the case', async () => { + await model.bulkCreate({ + attachments: [ + { + id: 'comment-1', + ...comment, + }, + ], + }); + + const args = clientArgs.services.caseService.patchCase.mock.calls[0][0]; + + expect(args.version).toBeUndefined(); + }); + describe('validation', () => { clientArgs.services.attachmentService.countPersistableStateAndExternalReferenceAttachments.mockResolvedValue( MAX_PERSISTABLE_STATE_AND_EXTERNAL_REFERENCES @@ -619,4 +651,24 @@ describe('CaseCommentModel', () => { }); }); }); + + describe('updateComment', () => { + it('partial updates the case', async () => { + await model.updateComment({ + updateRequest: { + id: 'comment-id', + version: 'comment-version', + type: AttachmentType.user, + comment: 'my updated comment', + owner: SECURITY_SOLUTION_OWNER, + }, + updatedAt: createdDate, + owner: SECURITY_SOLUTION_OWNER, + }); + + const args = clientArgs.services.caseService.patchCase.mock.calls[0][0]; + + expect(args.version).toBeUndefined(); + }); + }); }); diff --git a/x-pack/plugins/cases/server/common/models/case_with_comments.ts b/x-pack/plugins/cases/server/common/models/case_with_comments.ts index e1b89d7af791e..a1eb5cbfdb8b5 100644 --- a/x-pack/plugins/cases/server/common/models/case_with_comments.ts +++ b/x-pack/plugins/cases/server/common/models/case_with_comments.ts @@ -129,7 +129,7 @@ export class CaseCommentModel { }, options, }), - this.updateCaseUserAndDateSkipRefresh(updatedAt), + this.partialUpdateCaseUserAndDateSkipRefresh(updatedAt), ]); await commentableCase.createUpdateCommentUserAction(comment, updateRequest, owner); @@ -144,11 +144,11 @@ export class CaseCommentModel { } } - private async updateCaseUserAndDateSkipRefresh(date: string) { - return this.updateCaseUserAndDate(date, false); + private async partialUpdateCaseUserAndDateSkipRefresh(date: string) { + return this.partialUpdateCaseUserAndDate(date, false); } - private async updateCaseUserAndDate( + private async partialUpdateCaseUserAndDate( date: string, refresh: RefreshSetting ): Promise<CaseCommentModel> { @@ -160,7 +160,6 @@ export class CaseCommentModel { updated_at: date, updated_by: { ...this.params.user }, }, - version: this.caseInfo.version, refresh, }); @@ -242,7 +241,7 @@ export class CaseCommentModel { id, refresh: false, }), - this.updateCaseUserAndDateSkipRefresh(createdDate), + this.partialUpdateCaseUserAndDateSkipRefresh(createdDate), ]); await Promise.all([ @@ -502,7 +501,7 @@ export class CaseCommentModel { }), refresh: false, }), - this.updateCaseUserAndDateSkipRefresh(new Date().toISOString()), + this.partialUpdateCaseUserAndDateSkipRefresh(new Date().toISOString()), ]); const savedObjectsWithoutErrors = newlyCreatedAttachments.saved_objects.filter( diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/patch_comment.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/patch_comment.ts index 8c2c356b6090e..1ea5013b16506 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/patch_comment.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/patch_comment.ts @@ -12,6 +12,7 @@ import { AlertAttachmentAttributes, UserCommentAttachmentAttributes, AttachmentType, + CaseStatuses, } from '@kbn/cases-plugin/common/types/domain'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; @@ -34,6 +35,7 @@ import { updateComment, superUserSpace1Auth, removeServerGeneratedPropertiesFromSavedObject, + updateCase, } from '../../../../common/lib/api'; import { globalRead, @@ -549,6 +551,48 @@ export default ({ getService }: FtrProviderContext): void => { } }); + describe('partial updates', () => { + it('should not result to a version conflict (409) when updating a comment to an updated case', async () => { + const postedCase = await createCase(supertest, postCaseReq); + const caseWithComments = await createComment({ + supertest, + caseId: postedCase.id, + params: postCommentUserReq, + expectedHttpCode: 200, + }); + + /** + * Updating the status of the case will + * change the version of the case + */ + await updateCase({ + supertest, + params: { + cases: [ + { + id: caseWithComments.id, + version: caseWithComments.version, + status: CaseStatuses['in-progress'], + }, + ], + }, + }); + + await updateComment({ + supertest, + caseId: postedCase.id, + req: { + id: caseWithComments.comments![0].id, + version: caseWithComments.comments![0].version, + comment: 'my new comment', + type: AttachmentType.user, + owner: 'securitySolutionFixture', + }, + expectedHttpCode: 200, + }); + }); + }); + describe('rbac', () => { const supertestWithoutAuth = getService('supertestWithoutAuth'); diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/post_comment.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/post_comment.ts index 88723df678f8a..fcb376e4df522 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/post_comment.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/post_comment.ts @@ -1123,6 +1123,36 @@ export default ({ getService }: FtrProviderContext): void => { }); }); + describe('partial updates', () => { + it('should not result to a version conflict (409) when adding a comment to an updated case', async () => { + const postedCase = await createCase(supertest, postCaseReq); + + /** + * Updating the status of the case will + * change the version of the case + */ + await updateCase({ + supertest, + params: { + cases: [ + { + id: postedCase.id, + version: postedCase.version, + status: CaseStatuses['in-progress'], + }, + ], + }, + }); + + await createComment({ + supertest, + caseId: postedCase.id, + params: postCommentUserReq, + expectedHttpCode: 200, + }); + }); + }); + describe('rbac', () => { afterEach(async () => { await deleteAllCaseItems(es); diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_create_attachments.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_create_attachments.ts index 3c3748a844ea6..6c929f67b8c90 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_create_attachments.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_create_attachments.ts @@ -1512,6 +1512,36 @@ export default ({ getService }: FtrProviderContext): void => { }); }); + describe('partial updates', () => { + it('should not result to a version conflict (409) when adding comments to an updated case', async () => { + const postedCase = await createCase(supertest, postCaseReq); + + /** + * Updating the status of the case will + * change the version of the case + */ + await updateCase({ + supertest, + params: { + cases: [ + { + id: postedCase.id, + version: postedCase.version, + status: CaseStatuses['in-progress'], + }, + ], + }, + }); + + await bulkCreateAttachments({ + supertest, + caseId: postedCase.id, + params: [postCommentUserReq], + expectedHttpCode: 200, + }); + }); + }); + describe('rbac', () => { afterEach(async () => { await deleteAllCaseItems(es); From 85df7c994930c9dccd30e8f30b81d703f5521d34 Mon Sep 17 00:00:00 2001 From: Coen Warmer <coen.warmer@gmail.com> Date: Thu, 21 Dec 2023 12:03:02 +0100 Subject: [PATCH 60/62] Adjust wording in Set up KB message (#173814) --- .../components/chat/welcome_message_knowledge_base.tsx | 6 +++--- .../public/components/feedback_buttons.tsx | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_knowledge_base.tsx b/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_knowledge_base.tsx index 849a07b7cabfc..afdbed9ed4c43 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_knowledge_base.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/chat/welcome_message_knowledge_base.tsx @@ -113,7 +113,7 @@ export function WelcomeMessageKnowledgeBase({ <EuiText color="subdued" size="s"> {i18n.translate( 'xpack.observabilityAiAssistant.welcomeMessageKnowledgeBase.yourKnowledgeBaseIsNotSetUpCorrectlyLabel', - { defaultMessage: 'Your Knowledge base is not set up correctly' } + { defaultMessage: `Your Knowledge base hasn't been set up.` } )} </EuiText> @@ -127,13 +127,13 @@ export function WelcomeMessageKnowledgeBase({ data-test-subj="observabilityAiAssistantWelcomeMessageSetUpKnowledgeBaseButton" fill isLoading={checkForInstallStatus} - iconType="refresh" + iconType="importAction" onClick={handleRetryInstall} > {i18n.translate( 'xpack.observabilityAiAssistant.welcomeMessage.retryButtonLabel', { - defaultMessage: 'Retry install', + defaultMessage: 'Install Knowledge base', } )} </EuiButton> diff --git a/x-pack/plugins/observability_ai_assistant/public/components/feedback_buttons.tsx b/x-pack/plugins/observability_ai_assistant/public/components/feedback_buttons.tsx index 2187817e7228e..6315d493078c5 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/feedback_buttons.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/feedback_buttons.tsx @@ -16,6 +16,11 @@ interface FeedbackButtonsProps { onClickFeedback: (feedback: Feedback) => void; } +const THANK_YOU_MESSAGE = i18n.translate( + 'xpack.observabilityAiAssistant.feedbackButtons.em.thanksForYourFeedbackLabel', + { defaultMessage: 'Thanks for your feedback' } +); + export function FeedbackButtons({ onClickFeedback }: FeedbackButtonsProps) { const { notifications } = useKibana().services; @@ -24,13 +29,13 @@ export function FeedbackButtons({ onClickFeedback }: FeedbackButtonsProps) { const handleClickPositive = () => { onClickFeedback('positive'); setHasBeenClicked(true); - notifications.toasts.addSuccess('Thanks for your feedback!'); + notifications.toasts.addSuccess(THANK_YOU_MESSAGE); }; const handleClickNegative = () => { onClickFeedback('negative'); setHasBeenClicked(true); - notifications.toasts.addSuccess('Thanks for your feedback!'); + notifications.toasts.addSuccess(THANK_YOU_MESSAGE); }; return ( From e51a3f9efc93912d86df9248200c7c6b91918858 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet <nicolas.chaulet@elastic.co> Date: Thu, 21 Dec 2023 12:21:17 +0100 Subject: [PATCH 61/62] [Fleet] Allow to skipDatastreamRollover from preconfiguration (#173766) --- .../common/types/models/preconfiguration.ts | 1 + .../epm/packages/bulk_install_packages.ts | 17 +++- .../server/services/preconfiguration.test.ts | 88 ++++++++++++------- .../fleet/server/services/preconfiguration.ts | 6 +- .../server/types/models/preconfiguration.ts | 1 + 5 files changed, 79 insertions(+), 34 deletions(-) diff --git a/x-pack/plugins/fleet/common/types/models/preconfiguration.ts b/x-pack/plugins/fleet/common/types/models/preconfiguration.ts index ac3f8f566ec1f..c6ad134fb31c9 100644 --- a/x-pack/plugins/fleet/common/types/models/preconfiguration.ts +++ b/x-pack/plugins/fleet/common/types/models/preconfiguration.ts @@ -35,6 +35,7 @@ export interface PreconfiguredAgentPolicy extends Omit<NewAgentPolicy, 'namespac export interface PreconfiguredPackage extends Omit<PackagePolicyPackage, 'title'> { prerelease?: boolean; + skipDataStreamRollover?: boolean; } export interface PreconfiguredOutput extends Omit<Output, 'config_yaml'> { diff --git a/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts b/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts index 70cdd766b0a66..da5ee0bcc8e5c 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts @@ -19,7 +19,10 @@ import type { BulkInstallResponse, IBulkInstallPackageError } from './install'; interface BulkInstallPackagesParams { savedObjectsClient: SavedObjectsClientContract; - packagesToInstall: Array<string | { name: string; version?: string; prerelease?: boolean }>; + packagesToInstall: Array< + | string + | { name: string; version?: string; prerelease?: boolean; skipDataStreamRollover?: boolean } + >; esClient: ElasticsearchClient; force?: boolean; spaceId: string; @@ -48,10 +51,18 @@ export async function bulkInstallPackages({ name: pkgRes.name, version: pkgRes.version, prerelease: undefined, + skipDataStreamRollover: undefined, })); } if (pkg.version !== undefined) { - return Promise.resolve(pkg as { name: string; version: string; prerelease?: boolean }); + return Promise.resolve( + pkg as { + name: string; + version: string; + prerelease?: boolean; + skipDataStreamRollover?: boolean; + } + ); } return Registry.fetchFindLatestPackageOrThrow(pkg.name, { @@ -60,6 +71,7 @@ export async function bulkInstallPackages({ name: pkgRes.name, version: pkgRes.version, prerelease: pkg.prerelease, + skipDataStreamRollover: pkg.skipDataStreamRollover, })); }) ); @@ -114,6 +126,7 @@ export async function bulkInstallPackages({ force, prerelease: prerelease || ('prerelease' in pkgKeyProps && pkgKeyProps.prerelease), authorizationHeader, + skipDataStreamRollover: pkgKeyProps.skipDataStreamRollover, }); if (installResult.error) { diff --git a/x-pack/plugins/fleet/server/services/preconfiguration.test.ts b/x-pack/plugins/fleet/server/services/preconfiguration.test.ts index 8c150aabb5b89..bf70ef7652d9a 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration.test.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration.test.ts @@ -30,7 +30,7 @@ import { } from './preconfiguration'; import { packagePolicyService } from './package_policy'; import { getBundledPackages } from './epm/packages/bundled_packages'; -import type { InstallPackageParams } from './epm/packages/install'; +import { installPackage, type InstallPackageParams } from './epm/packages/install'; jest.mock('./agent_policy_update'); jest.mock('./output'); @@ -144,44 +144,46 @@ jest.mock('./epm/registry', () => ({ })); jest.mock('./epm/packages/install', () => ({ - async installPackage(args: InstallPackageParams): Promise<InstallResult | undefined> { - if (args.installSource === 'registry') { - const [pkgName, pkgVersion] = args.pkgkey.split('-'); - const installError = mockInstallPackageErrors.get(pkgName); - if (installError) { + installPackage: jest.fn( + async (args: InstallPackageParams): Promise<InstallResult | undefined> => { + if (args.installSource === 'registry') { + const [pkgName, pkgVersion] = args.pkgkey.split('-'); + const installError = mockInstallPackageErrors.get(pkgName); + if (installError) { + return { + error: new Error(installError), + installType: 'install', + installSource: 'registry', + }; + } + + const installedPackage = mockInstalledPackages.get(pkgName); + if (installedPackage) { + if (installedPackage.version === pkgVersion) return installedPackage; + } + + const packageInstallation = { name: pkgName, version: pkgVersion, title: pkgName }; + mockInstalledPackages.set(pkgName, packageInstallation); + return { - error: new Error(installError), + status: 'installed', installType: 'install', installSource: 'registry', }; - } - - const installedPackage = mockInstalledPackages.get(pkgName); - if (installedPackage) { - if (installedPackage.version === pkgVersion) return installedPackage; - } + } else if (args.installSource === 'upload') { + const { archiveBuffer } = args; - const packageInstallation = { name: pkgName, version: pkgVersion, title: pkgName }; - mockInstalledPackages.set(pkgName, packageInstallation); + // Treat the buffer value passed in tests as the package's name for simplicity + const pkgName = archiveBuffer.toString('utf8'); - return { - status: 'installed', - installType: 'install', - installSource: 'registry', - }; - } else if (args.installSource === 'upload') { - const { archiveBuffer } = args; - - // Treat the buffer value passed in tests as the package's name for simplicity - const pkgName = archiveBuffer.toString('utf8'); - - // Just install every bundled package at version '1.0.0' - const packageInstallation = { name: pkgName, version: '1.0.0', title: pkgName }; - mockInstalledPackages.set(pkgName, packageInstallation); + // Just install every bundled package at version '1.0.0' + const packageInstallation = { name: pkgName, version: '1.0.0', title: pkgName }; + mockInstalledPackages.set(pkgName, packageInstallation); - return { status: 'installed', installType: 'install', installSource: 'upload' }; + return { status: 'installed', installType: 'install', installSource: 'upload' }; + } } - }, + ), ensurePackagesCompletedInstall() { return []; }, @@ -395,6 +397,30 @@ describe('policy preconfiguration', () => { expect(nonFatalErrors.length).toBe(0); }); + it('should pass skipDatastreamRollover flag if configured', async () => { + const soClient = getPutPreconfiguredPackagesMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + + const { policies, packages, nonFatalErrors } = await ensurePreconfiguredPackagesAndPolicies( + soClient, + esClient, + [] as PreconfiguredAgentPolicy[], + [{ name: 'test_package', version: 'latest', skipDataStreamRollover: true }], + mockDefaultOutput, + mockDefaultDownloadService, + DEFAULT_SPACE_ID + ); + + expect(policies.length).toEqual(0); + expect(packages).toEqual(expect.arrayContaining(['test_package-1.0.0'])); + expect(nonFatalErrors.length).toBe(0); + expect(jest.mocked(installPackage)).toBeCalledWith( + expect.objectContaining({ + skipDataStreamRollover: true, + }) + ); + }); + it('should not add new package policy to existing non managed policies', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; diff --git a/x-pack/plugins/fleet/server/services/preconfiguration.ts b/x-pack/plugins/fleet/server/services/preconfiguration.ts index ad1e1c0ddb8b5..8a4944ddb99ad 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration.ts @@ -81,7 +81,11 @@ export async function ensurePreconfiguredPackagesAndPolicies( const packagesToInstall = packages.map((pkg) => pkg.version === PRECONFIGURATION_LATEST_KEYWORD - ? { name: pkg.name, prerelease: pkg.prerelease } + ? { + name: pkg.name, + prerelease: pkg.prerelease, + skipDataStreamRollover: pkg.skipDataStreamRollover, + } : pkg ); diff --git a/x-pack/plugins/fleet/server/types/models/preconfiguration.ts b/x-pack/plugins/fleet/server/types/models/preconfiguration.ts index 821debf37bca0..2928db35587d1 100644 --- a/x-pack/plugins/fleet/server/types/models/preconfiguration.ts +++ b/x-pack/plugins/fleet/server/types/models/preconfiguration.ts @@ -45,6 +45,7 @@ export const PreconfiguredPackagesSchema = schema.arrayOf( }, }), prerelease: schema.maybe(schema.boolean()), + skipDataStreamRollover: schema.maybe(schema.boolean()), }), { defaultValue: [], From d7b99a587799e34c9534e4ba793aad65b4f78d55 Mon Sep 17 00:00:00 2001 From: Nikita Indik <nikita.indik@elastic.co> Date: Thu, 21 Dec 2023 12:39:16 +0100 Subject: [PATCH 62/62] [Security Solution] Enable the feature flag for JSON diffing in prebuilt rules (#173368) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Ticket:** https://github.com/elastic/kibana/issues/169160 ## Summary Sets the `jsonPrebuiltRulesDiffingEnabled` to `true` to enable the new "Updates" tab in prebuilt rules flyout. ### IMPORTANT: Merge only once acceptance and exploratory testing are passed! <img width="1178" alt="Scherm­afbeelding 2023-12-13 om 17 37 07" src="https://github.com/elastic/kibana/assets/15949146/9e07e069-595f-49a6-98c2-d2ed4aa3f977"> Co-authored-by: Georgii Gorbachev <georgii.gorbachev@elastic.co> --- .../plugins/security_solution/common/experimental_features.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index a9f3affba56d7..8c16307ab5b8c 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -162,7 +162,7 @@ export const allowedExperimentalValues = Object.freeze({ * This tab shows the JSON diff between the installed prebuilt rule * version and the latest available version. */ - jsonPrebuiltRulesDiffingEnabled: false, + jsonPrebuiltRulesDiffingEnabled: true, }); type ExperimentalConfigKeys = Array<keyof ExperimentalFeatures>;