From f694a2a26779879fb0e69d0d9092a7f314491e1d Mon Sep 17 00:00:00 2001 From: Ari Aviran Date: Wed, 2 Mar 2022 13:18:39 +0200 Subject: [PATCH 01/37] [Security Solution] Updates to Cloud Security Posture (#126590) Co-authored-by: Yarden Shalom Co-authored-by: Ido Cohen Co-authored-by: Or Ouziel --- .../common/constants.ts | 16 +- .../common/schemas/csp_rule.ts | 26 ++ .../cloud_security_posture/common/types.ts | 24 +- .../cloud_security_posture/kibana.json | 2 +- .../public/application/constants.tsx | 1 + .../public/application/index.tsx | 9 +- .../public/common/hooks/use_kibana.ts | 14 ++ .../common/hooks/use_navigate_findings.ts | 44 ++++ .../public/common/navigation/constants.ts | 3 +- .../public/common/navigation/types.ts | 2 +- .../public/components/chart_panel.tsx | 7 +- .../components/csp_evaluation_badge.tsx | 2 +- .../compliance_charts/cases_table.tsx | 24 ++ .../cloud_posture_score_chart.tsx | 37 ++- .../compliance_charts/compliance_stats.tsx | 158 ------------ .../compliance_charts/risks_table.test.ts | 24 +- .../compliance_charts/risks_table.tsx | 101 +++----- .../score_per_account_chart.tsx | 45 ---- .../dashboard_sections/benchmarks_section.tsx | 219 ++++++++--------- .../dashboard_sections/summary_section.tsx | 44 ++-- .../compliance_dashboard/translations.ts | 21 +- .../public/pages/findings/use_findings.ts | 5 +- .../public/pages/index.ts | 1 + .../public/pages/rules/index.tsx | 20 ++ .../public/pages/rules/use_csp_rules.ts | 66 +++++ .../cloud_security_posture/server/index.ts | 1 - .../server/lib/csp_app_services.ts | 36 +++ .../cloud_security_posture/server/plugin.ts | 24 +- .../routes/benchmarks/benchmarks.test.ts | 182 ++++++++++++++ .../server/routes/benchmarks/benchmarks.ts | 196 +++++++++++++++ .../compliance_dashboard.ts | 122 ++++++++++ .../compliance_dashboard/get_clusters.test.ts | 82 +++++++ .../compliance_dashboard/get_clusters.ts | 98 ++++++++ .../get_resources_types.test.ts | 51 ++++ .../get_resources_types.ts | 77 ++++++ .../compliance_dashboard/get_stats.test.ts | 86 +++++++ .../routes/compliance_dashboard/get_stats.ts | 74 ++++++ .../server/routes/findings/findings.test.ts | 65 ++++- .../server/routes/findings/findings.ts | 7 +- .../server/routes/index.ts | 13 +- .../server/routes/stats/stats.test.ts | 201 ---------------- .../server/routes/stats/stats.ts | 226 ------------------ .../server/routes/stats/stats_queries.ts | 111 --------- .../saved_objects/cis_1_4_1/csp_rule_type.ts | 58 +++++ .../cis_1_4_1/initialize_rules.ts | 24 ++ .../server/saved_objects/cis_1_4_1/rules.ts | 53 ++++ .../cloud_security_posture/server/types.ts | 5 +- .../cloud_security_posture/tsconfig.json | 3 +- 48 files changed, 1699 insertions(+), 1011 deletions(-) create mode 100644 x-pack/plugins/cloud_security_posture/common/schemas/csp_rule.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cases_table.tsx delete mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_stats.tsx delete mode 100644 x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/score_per_account_chart.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/lib/csp_app_services.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts delete mode 100644 x-pack/plugins/cloud_security_posture/server/routes/stats/stats.test.ts delete mode 100644 x-pack/plugins/cloud_security_posture/server/routes/stats/stats.ts delete mode 100644 x-pack/plugins/cloud_security_posture/server/routes/stats/stats_queries.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/csp_rule_type.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/initialize_rules.ts create mode 100644 x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/rules.ts diff --git a/x-pack/plugins/cloud_security_posture/common/constants.ts b/x-pack/plugins/cloud_security_posture/common/constants.ts index 8523c4b5757d4..84c62e62c3351 100644 --- a/x-pack/plugins/cloud_security_posture/common/constants.ts +++ b/x-pack/plugins/cloud_security_posture/common/constants.ts @@ -5,11 +5,15 @@ * 2.0. */ -export const CSP_KUBEBEAT_INDEX_PATTERN = 'logs-k8s_cis*'; -export const CSP_FINDINGS_INDEX_NAME = 'findings'; export const STATS_ROUTE_PATH = '/api/csp/stats'; export const FINDINGS_ROUTE_PATH = '/api/csp/findings'; -export const AGENT_LOGS_INDEX_PATTERN = '.logs-k8s_cis.metadata*'; +export const BENCHMARKS_ROUTE_PATH = '/api/csp/benchmarks'; + +export const CSP_KUBEBEAT_INDEX_PATTERN = 'logs-cis_kubernetes_benchmark.findings*'; +export const AGENT_LOGS_INDEX_PATTERN = '.logs-cis_kubernetes_benchmark.metadata*'; + +export const CSP_FINDINGS_INDEX_NAME = 'findings'; +export const CIS_KUBERNETES_PACKAGE_NAME = 'cis_kubernetes_benchmark'; export const RULE_PASSED = `passed`; export const RULE_FAILED = `failed`; @@ -17,5 +21,9 @@ export const RULE_FAILED = `failed`; // A mapping of in-development features to their status. These features should be hidden from users but can be easily // activated via a simple code change in a single location. export const INTERNAL_FEATURE_FLAGS = { - benchmarks: false, + showBenchmarks: false, + showTrendLineMock: false, + showClusterMetaMock: false, + showManageRulesMock: false, + showRisksMock: false, } as const; diff --git a/x-pack/plugins/cloud_security_posture/common/schemas/csp_rule.ts b/x-pack/plugins/cloud_security_posture/common/schemas/csp_rule.ts new file mode 100644 index 0000000000000..d5c8e9fab1f2e --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/common/schemas/csp_rule.ts @@ -0,0 +1,26 @@ +/* + * 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 { schema as rt, TypeOf } from '@kbn/config-schema'; + +export const cspRuleAssetSavedObjectType = 'csp_rule'; + +// TODO: needs to be shared with kubebeat +export const cspRuleSchema = rt.object({ + id: rt.string(), + name: rt.string(), + description: rt.string(), + rationale: rt.string(), + impact: rt.string(), + default_value: rt.string(), + remediation: rt.string(), + benchmark: rt.object({ name: rt.string(), version: rt.string() }), + tags: rt.arrayOf(rt.string()), + enabled: rt.boolean(), + muted: rt.boolean(), +}); + +export type CspRuleSchema = TypeOf; diff --git a/x-pack/plugins/cloud_security_posture/common/types.ts b/x-pack/plugins/cloud_security_posture/common/types.ts index aa6b1d5bc9854..435b9836c5754 100644 --- a/x-pack/plugins/cloud_security_posture/common/types.ts +++ b/x-pack/plugins/cloud_security_posture/common/types.ts @@ -9,25 +9,31 @@ export type Evaluation = 'passed' | 'failed' | 'NA'; /** number between 1-100 */ export type Score = number; -export interface FindingsResults { +export interface FindingsEvaluation { totalFindings: number; totalPassed: number; totalFailed: number; } -export interface Stats extends FindingsResults { +export interface Stats extends FindingsEvaluation { postureScore: Score; } -export interface ResourceTypeAgg extends FindingsResults { - resourceType: string; +export interface ResourceType extends FindingsEvaluation { + name: string; } -export interface BenchmarkStats extends Stats { - name: string; +export interface Cluster { + meta: { + clusterId: string; + benchmarkName: string; + }; + stats: Stats; + resourcesTypes: ResourceType[]; } -export interface CloudPostureStats extends Stats { - benchmarksStats: BenchmarkStats[]; - resourceTypesAggs: ResourceTypeAgg[]; +export interface CloudPostureStats { + stats: Stats; + resourcesTypes: ResourceType[]; + clusters: Cluster[]; } diff --git a/x-pack/plugins/cloud_security_posture/kibana.json b/x-pack/plugins/cloud_security_posture/kibana.json index 67143c15e2b7b..29f3813c211c7 100755 --- a/x-pack/plugins/cloud_security_posture/kibana.json +++ b/x-pack/plugins/cloud_security_posture/kibana.json @@ -10,6 +10,6 @@ "description": "The cloud security posture plugin", "server": true, "ui": true, - "requiredPlugins": ["navigation", "data"], + "requiredPlugins": ["navigation", "data", "fleet"], "requiredBundles": ["kibanaReact"] } diff --git a/x-pack/plugins/cloud_security_posture/public/application/constants.tsx b/x-pack/plugins/cloud_security_posture/public/application/constants.tsx index b592a30aeb2b4..128382d039f15 100644 --- a/x-pack/plugins/cloud_security_posture/public/application/constants.tsx +++ b/x-pack/plugins/cloud_security_posture/public/application/constants.tsx @@ -12,4 +12,5 @@ export const pageToComponentMapping: Record = findings: pages.Findings, dashboard: pages.ComplianceDashboard, benchmarks: pages.Benchmarks, + rules: pages.Rules, }; diff --git a/x-pack/plugins/cloud_security_posture/public/application/index.tsx b/x-pack/plugins/cloud_security_posture/public/application/index.tsx index 6530483bf2198..38fbef254ea44 100644 --- a/x-pack/plugins/cloud_security_posture/public/application/index.tsx +++ b/x-pack/plugins/cloud_security_posture/public/application/index.tsx @@ -7,8 +7,8 @@ import React from 'react'; import ReactDOM from 'react-dom'; +import { KibanaThemeProvider } from '../../../../../src/plugins/kibana_react/public'; import { CspApp } from './app'; - import type { AppMountParameters, CoreStart } from '../../../../../src/core/public'; import type { CspClientPluginStartDeps } from '../types'; @@ -17,7 +17,12 @@ export const renderApp = ( deps: CspClientPluginStartDeps, params: AppMountParameters ) => { - ReactDOM.render(, params.element); + ReactDOM.render( + + + , + params.element + ); return () => ReactDOM.unmountComponentAtNode(params.element); }; diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts new file mode 100644 index 0000000000000..b2d1d2a7b6bbe --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_kibana.ts @@ -0,0 +1,14 @@ +/* + * 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 '../../../../../../src/core/public'; +import type { CspClientPluginStartDeps } from '../../types'; +import { useKibana as useKibanaBase } from '../../../../../../src/plugins/kibana_react/public'; + +type CspKibanaContext = CoreStart & CspClientPluginStartDeps; + +export const useKibana = () => useKibanaBase(); diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts new file mode 100644 index 0000000000000..6cc1582d7ff7b --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.ts @@ -0,0 +1,44 @@ +/* + * 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 { useHistory } from 'react-router-dom'; +import { Query } from '@kbn/es-query'; +import { allNavigationItems } from '../navigation/constants'; +import { encodeQuery } from '../navigation/query_utils'; +import { CspFindingsRequest } from '../../pages/findings/use_findings'; + +const getFindingsQuery = (queryValue: Query['query']): Pick => { + const query = + typeof queryValue === 'string' + ? queryValue + : // TODO: use a tested query builder instead ASAP + Object.entries(queryValue) + .reduce((a, [key, value]) => { + a.push(`${key} : "${value}"`); + return a; + }, []) + .join(' and '); + + return { + query: { + language: 'kuery', + // NOTE: a query object is valid TS but throws on runtime + query, + }, + }!; +}; + +export const useNavigateFindings = () => { + const history = useHistory(); + + return (query?: Query['query']) => { + history.push({ + pathname: allNavigationItems.findings.path, + ...(query && { search: encodeQuery(getFindingsQuery(query)) }), + }); + }; +}; diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts index bde28fa1ce3b5..4e07a4c800f53 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts @@ -12,9 +12,10 @@ import type { CspPage, CspNavigationItem } from './types'; export const allNavigationItems: Record = { dashboard: { name: TEXT.DASHBOARD, path: '/dashboard' }, findings: { name: TEXT.FINDINGS, path: '/findings' }, + rules: { name: 'Rules', path: '/rules', disabled: true }, benchmarks: { name: TEXT.MY_BENCHMARKS, path: '/benchmarks', - disabled: !INTERNAL_FEATURE_FLAGS.benchmarks, + disabled: !INTERNAL_FEATURE_FLAGS.showBenchmarks, }, }; diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts index 64db2e59b667f..87f62b88ba171 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts @@ -10,4 +10,4 @@ export interface CspNavigationItem { readonly disabled?: boolean; } -export type CspPage = 'dashboard' | 'findings' | 'benchmarks'; +export type CspPage = 'dashboard' | 'findings' | 'benchmarks' | 'rules'; diff --git a/x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx b/x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx index 5190f71a1721a..2b0882d0916e6 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/chart_panel.tsx @@ -6,7 +6,6 @@ */ import React from 'react'; -import { css } from '@emotion/react'; import { EuiPanel, EuiText, @@ -64,7 +63,7 @@ export const ChartPanel: React.FC = ({ {title && ( - +

{title}

)} @@ -74,7 +73,3 @@ export const ChartPanel: React.FC = ({ ); }; - -const euiTitleStyle = css` - font-weight: 400; -`; diff --git a/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx b/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx index 8603bef59122e..93aa87c18a9b8 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { EuiBadge, EuiBadgeProps } from '@elastic/eui'; +import { EuiBadge, type EuiBadgeProps } from '@elastic/eui'; import { CSP_EVALUATION_BADGE_FAILED, CSP_EVALUATION_BADGE_PASSED } from './translations'; interface Props { diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cases_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cases_table.tsx new file mode 100644 index 0000000000000..30107d6689752 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cases_table.tsx @@ -0,0 +1,24 @@ +/* + * 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 { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { EuiIcon } from '@elastic/eui'; +import * as TEXT from '../translations'; + +export const CasesTable = () => { + return ( + + + + + + {TEXT.COMING_SOON} + + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cloud_posture_score_chart.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cloud_posture_score_chart.tsx index 01dfd837fca2f..a1f044241e5d3 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cloud_posture_score_chart.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/cloud_posture_score_chart.tsx @@ -7,18 +7,23 @@ import React from 'react'; import { + AreaSeries, + Axis, Chart, ElementClickListener, + niceTimeFormatByDay, Partition, PartitionElementEvent, PartitionLayout, Settings, + timeFormatter, } from '@elastic/charts'; import { EuiFlexGroup, EuiText, EuiHorizontalRule, EuiFlexItem } from '@elastic/eui'; import { statusColors } from '../../../common/constants'; import type { Stats } from '../../../../common/types'; import * as TEXT from '../translations'; import { CompactFormattedNumber } from '../../../components/compact_formatted_number'; +import { INTERNAL_FEATURE_FLAGS } from '../../../../common/constants'; interface CloudPostureScoreChartProps { data: Stats; @@ -37,7 +42,7 @@ const ScoreChart = ({ ]; return ( - +
Trend Placeholder
; +const mockData = [ + [0, 9], + [1000, 70], + [2000, 40], + [4000, 90], + [5000, 53], +]; + +const ComplianceTrendChart = () => ( + + + + + + +); export const CloudPostureScoreChart = ({ data, @@ -97,8 +124,8 @@ export const CloudPostureScoreChart = ({ }: CloudPostureScoreChartProps) => ( - - + + @@ -106,7 +133,7 @@ export const CloudPostureScoreChart = ({ - + diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_stats.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_stats.tsx deleted file mode 100644 index 1dff4aba203b9..0000000000000 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/compliance_stats.tsx +++ /dev/null @@ -1,158 +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 { - EuiStat, - EuiFlexItem, - EuiPanel, - EuiIcon, - EuiFlexGrid, - EuiText, - // EuiFlexGroup, -} from '@elastic/eui'; -// import { Chart, Settings, LineSeries } from '@elastic/charts'; -import type { IconType, EuiStatProps } from '@elastic/eui'; -import { useCloudPostureStatsApi } from '../../../common/api'; -import { statusColors } from '../../../common/constants'; -import { Score } from '../../../../common/types'; -import * as TEXT from '../translations'; -import { NO_DATA_TO_DISPLAY } from '../translations'; - -// type Trend = Array<[time: number, value: number]>; - -// TODO: this is the warning color hash listen in EUI's docs. need to find where to import it from. - -const getTitleColor = (value: Score): EuiStatProps['titleColor'] => { - if (value <= 65) return 'danger'; - if (value <= 95) return statusColors.warning; - if (value <= 100) return 'success'; - return 'default'; -}; - -const getScoreIcon = (value: Score): IconType => { - if (value <= 65) return 'alert'; - if (value <= 86) return 'alert'; - if (value <= 100) return 'check'; - return 'error'; -}; - -// TODO: make score trend check for length, cases for less than 2 or more than 5 should be handled -// const getScoreTrendPercentage = (scoreTrend: Trend) => { -// const beforeLast = scoreTrend[scoreTrend.length - 2][1]; -// const last = scoreTrend[scoreTrend.length - 1][1]; -// -// return Number((last - beforeLast).toFixed(1)); -// }; - -const placeholder = ( - - {NO_DATA_TO_DISPLAY} - -); - -export const ComplianceStats = () => { - const getStats = useCloudPostureStatsApi(); - // TODO: add error/loading state - if (!getStats.isSuccess) return null; - const { postureScore, benchmarksStats: benchmarks } = getStats.data; - - // TODO: in case we dont have a full length trend we will need to handle the sparkline chart alone. not rendering anything is just a temporary solution - if (!benchmarks || !postureScore) return null; - - // TODO: mock data, needs BE - // const scoreTrend = [ - // [0, 0], - // [1, 10], - // [2, 100], - // [3, 50], - // [4, postureScore], - // ] as Trend; - // - // const scoreChange = getScoreTrendPercentage(scoreTrend); - // const isPositiveChange = scoreChange > 0; - - const stats = [ - { - title: postureScore, - description: TEXT.POSTURE_SCORE, - titleColor: getTitleColor(postureScore), - iconType: getScoreIcon(postureScore), - }, - { - // TODO: remove placeholder for the commented out component, needs BE - title: placeholder, - description: TEXT.POSTURE_SCORE_TREND, - }, - // { - // title: ( - // - // - // {`${scoreChange}%`} - // - // ), - // description: 'Posture Score Trend', - // titleColor: isPositiveChange ? 'success' : 'danger', - // renderBody: ( - // <> - // - // - // - // - // - // ), - // }, - { - // TODO: this should count only ACTIVE benchmarks. needs BE - title: benchmarks.length, - description: TEXT.ACTIVE_FRAMEWORKS, - }, - { - // TODO: should be relatively simple to return from BE. needs BE - title: placeholder, - description: TEXT.TOTAL_RESOURCES, - }, - ]; - - return ( - - {stats.map((s) => ( - - - - { - // s.renderBody || - - } - - - - ))} - - ); -}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts index 0c750e10f060a..6b2c00c507e6f 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.test.ts @@ -5,45 +5,45 @@ * 2.0. */ -import { getTop5Risks, RisksTableProps } from './risks_table'; +import { getTopRisks, RisksTableProps } from './risks_table'; const podsAgg = { - resourceType: 'pods', + name: 'pods', totalFindings: 2, totalPassed: 1, totalFailed: 1, }; const etcdAgg = { - resourceType: 'etcd', + name: 'etcd', totalFindings: 5, totalPassed: 0, totalFailed: 5, }; const clusterAgg = { - resourceType: 'cluster', + name: 'cluster', totalFindings: 2, totalPassed: 2, totalFailed: 0, }; const systemAgg = { - resourceType: 'system', + name: 'system', totalFindings: 10, totalPassed: 6, totalFailed: 4, }; const apiAgg = { - resourceType: 'api', + name: 'api', totalFindings: 19100, totalPassed: 2100, totalFailed: 17000, }; const serverAgg = { - resourceType: 'server', + name: 'server', totalFindings: 7, totalPassed: 4, totalFailed: 3, @@ -58,16 +58,16 @@ const mockData: RisksTableProps['data'] = [ serverAgg, ]; -describe('getTop5Risks', () => { +describe('getTopRisks', () => { it('returns sorted by failed findings', () => { - expect(getTop5Risks([systemAgg, etcdAgg, apiAgg])).toEqual([apiAgg, etcdAgg, systemAgg]); + expect(getTopRisks([systemAgg, etcdAgg, apiAgg], 3)).toEqual([apiAgg, etcdAgg, systemAgg]); }); it('return array filtered with failed findings only', () => { - expect(getTop5Risks([systemAgg, clusterAgg, apiAgg])).toEqual([apiAgg, systemAgg]); + expect(getTopRisks([systemAgg, clusterAgg, apiAgg], 3)).toEqual([apiAgg, systemAgg]); }); - it('return sorted and filtered array with no more then 5 elements', () => { - expect(getTop5Risks(mockData)).toEqual([apiAgg, etcdAgg, systemAgg, serverAgg, podsAgg]); + it('return sorted and filtered array with the correct number of elements', () => { + expect(getTopRisks(mockData, 5)).toEqual([apiAgg, etcdAgg, systemAgg, serverAgg, podsAgg]); }); }); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx index fb43a8129ed77..1e355b3f3c82f 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/risks_table.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback, useMemo } from 'react'; +import React, { useMemo } from 'react'; import { EuiBasicTable, EuiButtonEmpty, @@ -14,50 +14,44 @@ import { EuiLink, EuiText, } from '@elastic/eui'; -import type { Query } from '@kbn/es-query'; -import { useHistory } from 'react-router-dom'; -import { CloudPostureStats, ResourceTypeAgg } from '../../../../common/types'; -import { allNavigationItems } from '../../../common/navigation/constants'; -import { encodeQuery } from '../../../common/navigation/query_utils'; +import { CloudPostureStats, ResourceType } from '../../../../common/types'; import { CompactFormattedNumber } from '../../../components/compact_formatted_number'; import * as TEXT from '../translations'; -import { RULE_FAILED } from '../../../../common/constants'; +import { INTERNAL_FEATURE_FLAGS } from '../../../../common/constants'; -// TODO: remove this option after we get data from the beat -const useMockData: boolean = false; -const mock = [ +const mockData = [ { - resourceType: 'pods', + name: 'pods', totalFindings: 2, totalPassed: 1, totalFailed: 1, }, { - resourceType: 'etcd', + name: 'etcd', totalFindings: 5, totalPassed: 0, totalFailed: 5, }, { - resourceType: 'cluster', + name: 'cluster', totalFindings: 2, totalPassed: 2, totalFailed: 0, }, { - resourceType: 'system', + name: 'system', totalFindings: 10, totalPassed: 6, totalFailed: 4, }, { - resourceType: 'api', + name: 'api', totalFindings: 19100, totalPassed: 2100, totalFailed: 17000, }, { - resourceType: 'server', + name: 'server', totalFindings: 7, totalPassed: 4, totalFailed: 3, @@ -65,62 +59,41 @@ const mock = [ ]; export interface RisksTableProps { - data: CloudPostureStats['resourceTypesAggs']; + data: CloudPostureStats['resourcesTypes']; + maxItems: number; + onCellClick: (resourceTypeName: string) => void; + onViewAllClick: () => void; } -const maxRisks = 5; - -export const getTop5Risks = (resourceTypesAggs: CloudPostureStats['resourceTypesAggs']) => { - const filtered = resourceTypesAggs.filter((x) => x.totalFailed > 0); +export const getTopRisks = ( + resourcesTypes: CloudPostureStats['resourcesTypes'], + maxItems: number +) => { + const filtered = resourcesTypes.filter((x) => x.totalFailed > 0); const sorted = filtered.slice().sort((first, second) => second.totalFailed - first.totalFailed); - return sorted.slice(0, maxRisks); + return sorted.slice(0, maxItems); }; -const getFailedFindingsQuery = (): Query => ({ - language: 'kuery', - query: `result.evaluation : "${RULE_FAILED}" `, -}); - -const getResourceTypeFailedFindingsQuery = (resourceType: string): Query => ({ - language: 'kuery', - query: `resource.type : "${resourceType}" and result.evaluation : "${RULE_FAILED}" `, -}); - -export const RisksTable = ({ data: resourceTypesAggs }: RisksTableProps) => { - const { push } = useHistory(); - - const handleCellClick = useCallback( - (resourceType: ResourceTypeAgg['resourceType']) => - push({ - pathname: allNavigationItems.findings.path, - search: encodeQuery(getResourceTypeFailedFindingsQuery(resourceType)), - }), - [push] - ); - - const handleViewAllClick = useCallback( - () => - push({ - pathname: allNavigationItems.findings.path, - search: encodeQuery(getFailedFindingsQuery()), - }), - [push] - ); - +export const RisksTable = ({ + data: resourcesTypes, + maxItems, + onCellClick, + onViewAllClick, +}: RisksTableProps) => { const columns = useMemo( () => [ { - field: 'resourceType', + field: 'name', name: TEXT.RESOURCE_TYPE, - render: (resourceType: ResourceTypeAgg['resourceType']) => ( - handleCellClick(resourceType)}>{resourceType} + render: (resourceTypeName: ResourceType['name']) => ( + onCellClick(resourceTypeName)}>{resourceTypeName} ), }, { field: 'totalFailed', - name: TEXT.FAILED_FINDINGS, - render: (totalFailed: ResourceTypeAgg['totalFailed'], resource: ResourceTypeAgg) => ( + name: TEXT.FINDINGS, + render: (totalFailed: ResourceType['totalFailed'], resource: ResourceType) => ( <> @@ -133,22 +106,24 @@ export const RisksTable = ({ data: resourceTypesAggs }: RisksTableProps) => { ), }, ], - [handleCellClick] + [onCellClick] ); + const items = useMemo(() => getTopRisks(resourcesTypes, maxItems), [resourcesTypes, maxItems]); + return ( - - rowHeader="resourceType" - items={useMockData ? getTop5Risks(mock) : getTop5Risks(resourceTypesAggs)} + + rowHeader="name" + items={INTERNAL_FEATURE_FLAGS.showRisksMock ? getTopRisks(mockData, maxItems) : items} columns={columns} /> - + {TEXT.VIEW_ALL_FAILED_FINDINGS} diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/score_per_account_chart.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/score_per_account_chart.tsx deleted file mode 100644 index fd47a3ecf9e43..0000000000000 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/compliance_charts/score_per_account_chart.tsx +++ /dev/null @@ -1,45 +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 { Axis, BarSeries, Chart, Settings } from '@elastic/charts'; -import { statusColors } from '../../../common/constants'; - -// soon to be deprecated -export const ScorePerAccountChart = () => { - return ( - - - - `${Number(v * 100).toFixed(0)}%`, - }} - id="bars" - data={[]} - xAccessor={'resource'} - yAccessors={['value']} - splitSeriesAccessors={['evaluation']} - stackAccessors={['evaluation']} - stackMode="percentage" - /> - - ); -}; - -const theme = { - colors: { vizColors: [statusColors.success, statusColors.danger] }, - barSeriesStyle: { - displayValue: { - fontSize: 14, - fill: { color: 'white', borderColor: 'blue', borderWidth: 0 }, - offsetX: 5, - offsetY: -5, - }, - }, -}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx index fcbfe47ea6d2c..c94f138616f55 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx @@ -7,27 +7,26 @@ import React from 'react'; import { - EuiFlexGrid, EuiFlexItem, EuiPanel, EuiIcon, - EuiTitle, EuiSpacer, - EuiDescriptionList, + EuiFlexGroup, + EuiText, + EuiButtonEmpty, + useEuiTheme, } from '@elastic/eui'; import { EuiIconType } from '@elastic/eui/src/components/icon/icon'; -import { Query } from '@kbn/es-query'; -import { useHistory } from 'react-router-dom'; import { PartitionElementEvent } from '@elastic/charts'; +import { EuiThemeComputed } from '@elastic/eui/src/services/theme/types'; import { CloudPostureScoreChart } from '../compliance_charts/cloud_posture_score_chart'; -import { ComplianceTrendChart } from '../compliance_charts/compliance_trend_chart'; import { useCloudPostureStatsApi } from '../../../common/api/use_cloud_posture_stats_api'; -import { CspHealthBadge } from '../../../components/csp_health_badge'; import { ChartPanel } from '../../../components/chart_panel'; import * as TEXT from '../translations'; -import { allNavigationItems } from '../../../common/navigation/constants'; -import { encodeQuery } from '../../../common/navigation/query_utils'; import { Evaluation } from '../../../../common/types'; +import { RisksTable } from '../compliance_charts/risks_table'; +import { INTERNAL_FEATURE_FLAGS, RULE_FAILED } from '../../../../common/constants'; +import { useNavigateFindings } from '../../../common/hooks/use_navigate_findings'; const logoMap: ReadonlyMap = new Map([['CIS Kubernetes', 'logoKubernetes']]); @@ -35,118 +34,120 @@ const getBenchmarkLogo = (benchmarkName: string): EuiIconType => { return logoMap.get(benchmarkName) ?? 'logoElastic'; }; -const getBenchmarkEvaluationQuery = (name: string, evaluation: Evaluation): Query => ({ - language: 'kuery', - query: `rule.benchmark : "${name}" and result.evaluation : "${evaluation}"`, -}); +const mockClusterId = '2468540'; + +const cardHeight = 300; export const BenchmarksSection = () => { - const history = useHistory(); + const { euiTheme } = useEuiTheme(); + const navToFindings = useNavigateFindings(); const getStats = useCloudPostureStatsApi(); - const benchmarks = getStats.isSuccess && getStats.data.benchmarksStats; - if (!benchmarks) return null; + const clusters = getStats.isSuccess && getStats.data.clusters; + if (!clusters) return null; - const handleElementClick = (name: string, elements: PartitionElementEvent[]) => { + const handleElementClick = (clusterId: string, elements: PartitionElementEvent[]) => { const [element] = elements; const [layerValue] = element; - const rollupValue = layerValue[0].groupByRollup as Evaluation; + const evaluation = layerValue[0].groupByRollup as Evaluation; - history.push({ - pathname: allNavigationItems.findings.path, - search: encodeQuery(getBenchmarkEvaluationQuery(name, rollupValue)), + navToFindings({ cluster_id: clusterId, 'result.evaluation': evaluation }); + }; + + const handleCellClick = (clusterId: string, resourceTypeName: string) => { + navToFindings({ + cluster_id: clusterId, + 'resource.type': resourceTypeName, + 'result.evaluation': RULE_FAILED, }); }; + const handleViewAllClick = (clusterId: string) => { + navToFindings({ cluster_id: clusterId, 'result.evaluation': RULE_FAILED }); + }; + return ( <> - {benchmarks.map((benchmark) => ( - - - - - - -

{benchmark.name}

-
-
- - - - handleElementClick(benchmark.name, elements) - } - /> - - ), - }, - ]} - /> - - - - {/* TODO: no api for this chart yet, using empty state for now. needs BE */} - - - ), - }, - ]} - /> - - - - ) : ( - TEXT.ERROR - ), - }, - { - title: TEXT.TOTAL_FAILURES, - description: benchmark.totalFailed || TEXT.ERROR, - }, - ]} - /> - -
-
- ))} + {clusters.map((cluster) => { + const shortId = cluster.meta.clusterId.slice(0, 6); + + return ( + <> + + + + + + +

{cluster.meta.benchmarkName}

+
+ +

{`Cluster ID ${shortId || mockClusterId}`}

+
+ {INTERNAL_FEATURE_FLAGS.showClusterMetaMock && ( + + + {' Updated 7 second ago'} + + )} +
+ + + + + {INTERNAL_FEATURE_FLAGS.showManageRulesMock && ( + {'Manage Rules'} + )} + +
+
+ + + + handleElementClick(cluster.meta.clusterId, elements) + } + /> + + + + + + handleCellClick(cluster.meta.clusterId, resourceTypeName) + } + onViewAllClick={() => handleViewAllClick(cluster.meta.clusterId)} + /> + + +
+
+ + + ); + })} ); }; + +const getIntegrationBoxStyle = (euiTheme: EuiThemeComputed) => ({ + border: `1px solid ${euiTheme.colors.lightShade}`, + borderRadius: `${euiTheme.border.radius.medium} 0 0 ${euiTheme.border.radius.medium}`, + background: euiTheme.colors.lightestShade, +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx index db768aa5c7b78..01dd072907472 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx @@ -7,23 +7,16 @@ import React from 'react'; import { EuiFlexGrid, EuiFlexItem } from '@elastic/eui'; -import { useHistory } from 'react-router-dom'; import { PartitionElementEvent } from '@elastic/charts'; -import { Query } from '@kbn/es-query'; -import { ScorePerAccountChart } from '../compliance_charts/score_per_account_chart'; import { ChartPanel } from '../../../components/chart_panel'; import { useCloudPostureStatsApi } from '../../../common/api'; import * as TEXT from '../translations'; import { CloudPostureScoreChart } from '../compliance_charts/cloud_posture_score_chart'; -import { allNavigationItems } from '../../../common/navigation/constants'; -import { encodeQuery } from '../../../common/navigation/query_utils'; import { Evaluation } from '../../../../common/types'; import { RisksTable } from '../compliance_charts/risks_table'; - -const getEvaluationQuery = (evaluation: Evaluation): Query => ({ - language: 'kuery', - query: `"result.evaluation : "${evaluation}"`, -}); +import { CasesTable } from '../compliance_charts/cases_table'; +import { useNavigateFindings } from '../../../common/hooks/use_navigate_findings'; +import { RULE_FAILED } from '../../../../common/constants'; const defaultHeight = 360; @@ -33,19 +26,24 @@ const summarySectionWrapperStyle = { }; export const SummarySection = () => { - const history = useHistory(); + const navToFindings = useNavigateFindings(); const getStats = useCloudPostureStatsApi(); if (!getStats.isSuccess) return null; const handleElementClick = (elements: PartitionElementEvent[]) => { const [element] = elements; const [layerValue] = element; - const rollupValue = layerValue[0].groupByRollup as Evaluation; + const evaluation = layerValue[0].groupByRollup as Evaluation; + + navToFindings({ 'result.evaluation': evaluation }); + }; - history.push({ - pathname: allNavigationItems.findings.path, - search: encodeQuery(getEvaluationQuery(rollupValue)), - }); + const handleCellClick = (resourceTypeName: string) => { + navToFindings({ 'resource.type': resourceTypeName, 'result.evaluation': RULE_FAILED }); + }; + + const handleViewAllClick = () => { + navToFindings({ 'result.evaluation': RULE_FAILED }); }; return ( @@ -58,24 +56,28 @@ export const SummarySection = () => { >
- + - {/* TODO: no api for this chart yet, using empty state for now. needs BE */} - + diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/translations.ts b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/translations.ts index 975c0069f1479..0d62625f98254 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/translations.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/translations.ts @@ -19,12 +19,13 @@ export const RISKS = i18n.translate('xpack.csp.risks', { defaultMessage: 'Risks', }); -export const SCORE_PER_CLUSTER_CHART_TITLE = i18n.translate( - 'xpack.csp.score_per_cluster_chart_title', - { - defaultMessage: 'Score Per Account / Cluster', - } -); +export const OPEN_CASES = i18n.translate('xpack.csp.open_cases', { + defaultMessage: 'Open Cases', +}); + +export const COMING_SOON = i18n.translate('xpack.csp.coming_soon', { + defaultMessage: 'Coming soon', +}); export const COMPLIANCE_SCORE = i18n.translate('xpack.csp.compliance_score', { defaultMessage: 'Compliance Score', @@ -78,10 +79,6 @@ export const RESOURCE_TYPE = i18n.translate('xpack.csp.resource_type', { defaultMessage: 'Resource Type', }); -export const FAILED_FINDINGS = i18n.translate('xpack.csp.failed_findings', { - defaultMessage: 'Failed Findings', -}); - -export const NO_DATA_TO_DISPLAY = i18n.translate('xpack.csp.complianceDashboard.noDataLabel', { - defaultMessage: 'No data to display', +export const FINDINGS = i18n.translate('xpack.csp.findings', { + defaultMessage: 'Findings', }); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts b/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts index c1b83bc671d16..38228e513e31b 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/use_findings.ts @@ -67,9 +67,10 @@ const mapEsQuerySortKey = (sort: readonly EsQuerySortValue[]): EsQuerySortValue[ }, []); const showResponseErrorToast = - ({ toasts: { addDanger } }: CoreStart['notifications']) => + ({ toasts }: CoreStart['notifications']) => (error: unknown): void => { - addDanger(extractErrorMessage(error, TEXT.SEARCH_FAILED)); + if (error instanceof Error) toasts.addError(error, { title: TEXT.SEARCH_FAILED }); + else toasts.addDanger(extractErrorMessage(error, TEXT.SEARCH_FAILED)); }; const extractFindings = ({ diff --git a/x-pack/plugins/cloud_security_posture/public/pages/index.ts b/x-pack/plugins/cloud_security_posture/public/pages/index.ts index 55d62913e4474..1e667a8949fc0 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/index.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/index.ts @@ -8,3 +8,4 @@ export { Findings } from './findings'; export * from './compliance_dashboard'; export { Benchmarks } from './benchmarks'; +export { Rules } from './rules'; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx new file mode 100644 index 0000000000000..130f03fd5784d --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import type { EuiPageHeaderProps } from '@elastic/eui'; +import { CspPageTemplate } from '../../components/page_template'; + +// TODO: +// - get selected integration + +const pageHeader: EuiPageHeaderProps = { + pageTitle: 'Rules', +}; + +export const Rules = () => { + return ; +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts b/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts new file mode 100644 index 0000000000000..a11256edaa40e --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts @@ -0,0 +1,66 @@ +/* + * 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, useMutation, useQueryClient } from 'react-query'; +import { cspRuleAssetSavedObjectType, type CspRuleSchema } from '../../../common/schemas/csp_rule'; +import type { + SavedObjectsBatchResponse, + SavedObjectsFindOptions, +} from '../../../../../../src/core/public'; +import { useKibana } from '../../common/hooks/use_kibana'; + +export type UseCspRulesOptions = Pick< + SavedObjectsFindOptions, + 'search' | 'searchFields' | 'page' | 'perPage' +>; + +export const useFindCspRules = ({ + search, + searchFields, + page = 1, + perPage = 10, +}: UseCspRulesOptions) => { + const { savedObjects } = useKibana().services; + return useQuery( + [cspRuleAssetSavedObjectType, { search, searchFields, page, perPage }], + () => + savedObjects.client.find({ + type: cspRuleAssetSavedObjectType, + search, + searchFields, + page, + // NOTE: 'name.raw' is a field maping we defined on 'name' so it'd also be sortable + // TODO: this needs to be shared or removed + sortField: 'name.raw', + perPage, + }), + { refetchOnWindowFocus: false } + ); +}; + +export const useBulkUpdateCspRules = () => { + const { savedObjects } = useKibana().services; + const queryClient = useQueryClient(); + + return useMutation( + (rules: CspRuleSchema[]) => + savedObjects.client.bulkUpdate( + rules.map((rule) => ({ + type: cspRuleAssetSavedObjectType, + id: rule.id, + attributes: rule, + })) + // TODO: fix bulkUpdate types in core + ) as Promise>, + { + onSettled: () => + queryClient.invalidateQueries({ + queryKey: cspRuleAssetSavedObjectType, + exact: false, + }), + } + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/server/index.ts b/x-pack/plugins/cloud_security_posture/server/index.ts index c0912e68218c8..f790ac5256ff8 100755 --- a/x-pack/plugins/cloud_security_posture/server/index.ts +++ b/x-pack/plugins/cloud_security_posture/server/index.ts @@ -4,7 +4,6 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - import type { PluginInitializerContext } from '../../../../src/core/server'; import { CspPlugin } from './plugin'; diff --git a/x-pack/plugins/cloud_security_posture/server/lib/csp_app_services.ts b/x-pack/plugins/cloud_security_posture/server/lib/csp_app_services.ts new file mode 100644 index 0000000000000..f769ea171c176 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/lib/csp_app_services.ts @@ -0,0 +1,36 @@ +/* + * 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 { + AgentService, + PackageService, + AgentPolicyServiceInterface, + PackagePolicyServiceInterface, +} from '../../../fleet/server'; + +export interface CspAppServiceDependencies { + packageService: PackageService; + agentService: AgentService; + packagePolicyService: PackagePolicyServiceInterface; + agentPolicyService: AgentPolicyServiceInterface; +} + +export class CspAppService { + public agentService: AgentService | undefined; + public packageService: PackageService | undefined; + public packagePolicyService: PackagePolicyServiceInterface | undefined; + public agentPolicyService: AgentPolicyServiceInterface | undefined; + + public start(dependencies: CspAppServiceDependencies) { + this.agentService = dependencies.agentService; + this.packageService = dependencies.packageService; + this.packagePolicyService = dependencies.packagePolicyService; + this.agentPolicyService = dependencies.agentPolicyService; + } + + public stop() {} +} diff --git a/x-pack/plugins/cloud_security_posture/server/plugin.ts b/x-pack/plugins/cloud_security_posture/server/plugin.ts index 1225d3481d334..ce6e38e4c63c5 100755 --- a/x-pack/plugins/cloud_security_posture/server/plugin.ts +++ b/x-pack/plugins/cloud_security_posture/server/plugin.ts @@ -12,6 +12,7 @@ import type { Plugin, Logger, } from '../../../../src/core/server'; +import { CspAppService } from './lib/csp_app_services'; import type { CspServerPluginSetup, CspServerPluginStart, @@ -19,6 +20,13 @@ import type { CspServerPluginStartDeps, } from './types'; import { defineRoutes } from './routes'; +import { cspRuleAssetType } from './saved_objects/cis_1_4_1/csp_rule_type'; +import { initializeCspRules } from './saved_objects/cis_1_4_1/initialize_rules'; + +export interface CspAppContext { + logger: Logger; + service: CspAppService; +} export class CspPlugin implements @@ -33,20 +41,34 @@ export class CspPlugin constructor(initializerContext: PluginInitializerContext) { this.logger = initializerContext.logger.get(); } + private readonly CspAppService = new CspAppService(); public setup( core: CoreSetup, plugins: CspServerPluginSetupDeps ): CspServerPluginSetup { + const cspAppContext: CspAppContext = { + logger: this.logger, + service: this.CspAppService, + }; + + core.savedObjects.registerType(cspRuleAssetType); + const router = core.http.createRouter(); // Register server side APIs - defineRoutes(router, this.logger); + defineRoutes(router, cspAppContext); return {}; } public start(core: CoreStart, plugins: CspServerPluginStartDeps): CspServerPluginStart { + this.CspAppService.start({ + ...plugins.fleet, + }); + + initializeCspRules(core.savedObjects.createInternalRepository()); + return {}; } public stop() {} diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts new file mode 100644 index 0000000000000..b728948cf2a05 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.test.ts @@ -0,0 +1,182 @@ +/* + * 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 { httpServiceMock, loggingSystemMock, savedObjectsClientMock } from 'src/core/server/mocks'; +import { + defineGetBenchmarksRoute, + benchmarksInputSchema, + DEFAULT_BENCHMARKS_PER_PAGE, + PACKAGE_POLICY_SAVED_OBJECT_TYPE, + getPackagePolicies, + getAgentPolicies, + createBenchmarkEntry, +} from './benchmarks'; +import { SavedObjectsClientContract } from 'src/core/server'; +import { + createMockAgentPolicyService, + createPackagePolicyServiceMock, +} from '../../../../fleet/server/mocks'; +import { createPackagePolicyMock } from '../../../../fleet/common/mocks'; +import { AgentPolicy } from '../../../../fleet/common'; + +import { CspAppService } from '../../lib/csp_app_services'; +import { CspAppContext } from '../../plugin'; + +function createMockAgentPolicy(props: Partial = {}): AgentPolicy { + return { + id: 'some-uuid1', + namespace: 'default', + monitoring_enabled: [], + name: 'Test Policy', + description: '', + is_default: false, + is_preconfigured: false, + status: 'active', + is_managed: false, + revision: 1, + updated_at: '', + updated_by: 'elastic', + package_policies: [], + ...props, + }; +} +describe('benchmarks API', () => { + let logger: ReturnType; + + beforeEach(() => { + logger = loggingSystemMock.createLogger(); + jest.clearAllMocks(); + }); + + it('validate the API route path', async () => { + const router = httpServiceMock.createRouter(); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineGetBenchmarksRoute(router, cspContext); + + const [config, _] = router.get.mock.calls[0]; + + expect(config.path).toEqual('/api/csp/benchmarks'); + }); + + describe('test input schema', () => { + it('expect to find default values', async () => { + const validatedQuery = benchmarksInputSchema.validate({}); + + expect(validatedQuery).toMatchObject({ + page: 1, + per_page: DEFAULT_BENCHMARKS_PER_PAGE, + }); + }); + + it('should throw when page field is not a positive integer', async () => { + expect(() => { + benchmarksInputSchema.validate({ page: -2 }); + }).toThrow(); + }); + + it('should throw when per_page field is not a positive integer', async () => { + expect(() => { + benchmarksInputSchema.validate({ per_page: -2 }); + }).toThrow(); + }); + }); + + describe('test benchmarks utils', () => { + let mockSoClient: jest.Mocked; + + beforeEach(() => { + mockSoClient = savedObjectsClientMock.create(); + }); + + describe('test getPackagePolicies', () => { + it('should throw when agentPolicyService is undefined', async () => { + const mockAgentPolicyService = undefined; + expect( + getPackagePolicies(mockSoClient, mockAgentPolicyService, 'myPackage', { + page: 1, + per_page: 100, + }) + ).rejects.toThrow(); + }); + + it('should format request by package name', async () => { + const mockAgentPolicyService = createPackagePolicyServiceMock(); + + await getPackagePolicies(mockSoClient, mockAgentPolicyService, 'myPackage', { + page: 1, + per_page: 100, + }); + + expect(mockAgentPolicyService.list.mock.calls[0][1]).toMatchObject( + expect.objectContaining({ + kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name:myPackage`, + page: 1, + perPage: 100, + }) + ); + }); + }); + + describe('test getAgentPolicies', () => { + it('should return one agent policy id when there is duplication', async () => { + const agentPolicyService = createMockAgentPolicyService(); + const packagePolicies = [createPackagePolicyMock(), createPackagePolicyMock()]; + + await getAgentPolicies(mockSoClient, packagePolicies, agentPolicyService); + + expect(agentPolicyService.getByIds.mock.calls[0][1]).toHaveLength(1); + }); + + it('should return full policy ids list when there is no id duplication', async () => { + const agentPolicyService = createMockAgentPolicyService(); + + const packagePolicy1 = createPackagePolicyMock(); + const packagePolicy2 = createPackagePolicyMock(); + packagePolicy2.policy_id = 'AnotherId'; + const packagePolicies = [packagePolicy1, packagePolicy2]; + + await getAgentPolicies(mockSoClient, packagePolicies, agentPolicyService); + + expect(agentPolicyService.getByIds.mock.calls[0][1]).toHaveLength(2); + }); + }); + + describe('test createBenchmarkEntry', () => { + it('should build benchmark entry agent policy and package policy', async () => { + const packagePolicy = createPackagePolicyMock(); + const agentPolicy = createMockAgentPolicy(); + // @ts-expect-error + agentPolicy.agents = 3; + + const enrichAgentPolicy = await createBenchmarkEntry(agentPolicy, packagePolicy); + + expect(enrichAgentPolicy).toMatchObject({ + package_policy: { + id: 'c6d16e42-c32d-4dce-8a88-113cfe276ad1', + name: 'endpoint-1', + policy_id: '93c46720-c217-11ea-9906-b5b8a21b268e', + namespace: 'default', + updated_at: '2020-06-25T16:03:38.159292', + updated_by: 'kibana', + created_at: '2020-06-25T16:03:38.159292', + created_by: 'kibana', + package: { + name: 'endpoint', + title: 'Elastic Endpoint', + version: '0.9.0', + }, + }, + agent_policy: { id: 'some-uuid1', name: 'Test Policy', agents: 3 }, + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts new file mode 100644 index 0000000000000..80c526c248c0f --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts @@ -0,0 +1,196 @@ +/* + * 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 { uniq, map } from 'lodash'; +import type { IRouter, SavedObjectsClientContract } from 'src/core/server'; +import { schema as rt, TypeOf } from '@kbn/config-schema'; +import { transformError } from '@kbn/securitysolution-es-utils'; +import { string } from 'io-ts'; +import { + PackagePolicyServiceInterface, + AgentPolicyServiceInterface, + AgentService, +} from '../../../../fleet/server'; +import { GetAgentPoliciesResponseItem, PackagePolicy, AgentPolicy } from '../../../../fleet/common'; +import { BENCHMARKS_ROUTE_PATH, CIS_KUBERNETES_PACKAGE_NAME } from '../../../common/constants'; +import { CspAppContext } from '../../plugin'; + +// TODO: use the same method from common/ once PR 106 is merged +export const isNonNullable = (v: T): v is NonNullable => + v !== null && v !== undefined; + +type BenchmarksQuerySchema = TypeOf; + +export interface Benchmark { + package_policy: Pick< + PackagePolicy, + | 'id' + | 'name' + | 'policy_id' + | 'namespace' + | 'package' + | 'updated_at' + | 'updated_by' + | 'created_at' + | 'created_by' + >; + agent_policy: Pick; +} + +export const DEFAULT_BENCHMARKS_PER_PAGE = 20; +export const PACKAGE_POLICY_SAVED_OBJECT_TYPE = 'ingest-package-policies'; + +const getPackageNameQuery = (packageName: string): string => { + return `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name:${packageName}`; +}; + +export const getPackagePolicies = async ( + soClient: SavedObjectsClientContract, + packagePolicyService: PackagePolicyServiceInterface | undefined, + packageName: string, + queryParams: BenchmarksQuerySchema +): Promise => { + if (!packagePolicyService) { + throw new Error('packagePolicyService is undefined'); + } + + const packageNameQuery = getPackageNameQuery(packageName); + + const { items: packagePolicies } = (await packagePolicyService?.list(soClient, { + kuery: packageNameQuery, + page: queryParams.page, + perPage: queryParams.per_page, + })) ?? { items: [] as PackagePolicy[] }; + + return packagePolicies; +}; + +export const getAgentPolicies = async ( + soClient: SavedObjectsClientContract, + packagePolicies: PackagePolicy[], + agentPolicyService: AgentPolicyServiceInterface +): Promise => { + const agentPolicyIds = uniq(map(packagePolicies, 'policy_id')); + const agentPolicies = await agentPolicyService.getByIds(soClient, agentPolicyIds); + + return agentPolicies; +}; + +const addRunningAgentToAgentPolicy = async ( + agentService: AgentService, + agentPolicies: AgentPolicy[] +): Promise => { + if (!agentPolicies?.length) return []; + return Promise.all( + agentPolicies.map((agentPolicy) => + agentService.asInternalUser + .getAgentStatusForAgentPolicy(agentPolicy.id) + .then((agentStatus) => ({ + ...agentPolicy, + agents: agentStatus.total, + })) + ) + ); +}; + +export const createBenchmarkEntry = ( + agentPolicy: GetAgentPoliciesResponseItem, + packagePolicy: PackagePolicy +): Benchmark => ({ + package_policy: { + id: packagePolicy.id, + name: packagePolicy.name, + policy_id: packagePolicy.policy_id, + namespace: packagePolicy.namespace, + updated_at: packagePolicy.updated_at, + updated_by: packagePolicy.updated_by, + created_at: packagePolicy.created_at, + created_by: packagePolicy.created_by, + package: packagePolicy.package + ? { + name: packagePolicy.package.name, + title: packagePolicy.package.title, + version: packagePolicy.package.version, + } + : undefined, + }, + agent_policy: { + id: agentPolicy.id, + name: agentPolicy.name, + agents: agentPolicy.agents, + }, +}); + +const createBenchmarks = ( + agentPolicies: GetAgentPoliciesResponseItem[], + packagePolicies: PackagePolicy[] +): Benchmark[] => + agentPolicies + .flatMap((agentPolicy) => + agentPolicy.package_policies.map((agentPackagePolicy) => { + const id = string.is(agentPackagePolicy) ? agentPackagePolicy : agentPackagePolicy.id; + const packagePolicy = packagePolicies.find((pkgPolicy) => pkgPolicy.id === id); + if (!packagePolicy) return; + return createBenchmarkEntry(agentPolicy, packagePolicy); + }) + ) + .filter(isNonNullable); + +export const defineGetBenchmarksRoute = (router: IRouter, cspContext: CspAppContext): void => + router.get( + { + path: BENCHMARKS_ROUTE_PATH, + validate: { query: benchmarksInputSchema }, + }, + async (context, request, response) => { + try { + const soClient = context.core.savedObjects.client; + const { query } = request; + + const agentService = cspContext.service.agentService; + const agentPolicyService = cspContext.service.agentPolicyService; + const packagePolicyService = cspContext.service.packagePolicyService; + + // TODO: This validate can be remove after #2819 will be merged + if (!agentPolicyService || !agentService) { + throw new Error(`Failed to get Fleet services`); + } + + const packagePolicies = await getPackagePolicies( + soClient, + packagePolicyService, + CIS_KUBERNETES_PACKAGE_NAME, + query + ); + + const agentPolicies = await getAgentPolicies(soClient, packagePolicies, agentPolicyService); + const enrichAgentPolicies = await addRunningAgentToAgentPolicy(agentService, agentPolicies); + const benchmarks = createBenchmarks(enrichAgentPolicies, packagePolicies); + + return response.ok({ + body: benchmarks, + }); + } catch (err) { + const error = transformError(err); + cspContext.logger.error(`Failed to fetch benchmarks ${err}`); + return response.customError({ + body: { message: error.message }, + statusCode: error.statusCode, + }); + } + } + ); + +export const benchmarksInputSchema = rt.object({ + /** + * The page of objects to return + */ + page: rt.number({ defaultValue: 1, min: 1 }), + /** + * The number of objects to include in each page + */ + per_page: rt.number({ defaultValue: DEFAULT_BENCHMARKS_PER_PAGE, min: 0 }), +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts new file mode 100644 index 0000000000000..f554eb91a4a49 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts @@ -0,0 +1,122 @@ +/* + * 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 { ElasticsearchClient, IRouter } from 'src/core/server'; +import { transformError } from '@kbn/securitysolution-es-utils'; +import type { + AggregationsMultiBucketAggregateBase as Aggregation, + AggregationsTopHitsAggregate, + QueryDslQueryContainer, + SearchRequest, +} from '@elastic/elasticsearch/lib/api/types'; +import type { CloudPostureStats } from '../../../common/types'; +import { CSP_KUBEBEAT_INDEX_PATTERN, STATS_ROUTE_PATH } from '../../../common/constants'; +import { CspAppContext } from '../../plugin'; +import { getResourcesTypes } from './get_resources_types'; +import { getClusters } from './get_clusters'; +import { getStats } from './get_stats'; + +export interface ClusterBucket { + ordered_top_hits: AggregationsTopHitsAggregate; +} + +interface ClustersQueryResult { + aggs_by_cluster_id: Aggregation; +} + +export interface KeyDocCount { + key: TKey; + doc_count: number; +} + +export const getLatestFindingQuery = (): SearchRequest => ({ + index: CSP_KUBEBEAT_INDEX_PATTERN, + size: 0, + query: { + match_all: {}, + }, + aggs: { + aggs_by_cluster_id: { + terms: { field: 'cluster_id.keyword' }, + aggs: { + ordered_top_hits: { + top_hits: { + size: 1, + sort: { + '@timestamp': { + order: 'desc', + }, + }, + }, + }, + }, + }, + }, +}); + +const getLatestCyclesIds = async (esClient: ElasticsearchClient): Promise => { + const queryResult = await esClient.search(getLatestFindingQuery(), { + meta: true, + }); + + const clusters = queryResult.body.aggregations?.aggs_by_cluster_id.buckets; + if (!Array.isArray(clusters)) throw new Error('missing aggs by cluster id'); + + return clusters.map((c) => { + const topHit = c.ordered_top_hits.hits.hits[0]; + if (!topHit) throw new Error('missing cluster latest hit'); + return topHit._source.cycle_id; + }); +}; + +// TODO: Utilize ES "Point in Time" feature https://www.elastic.co/guide/en/elasticsearch/reference/current/point-in-time-api.html +export const defineGetComplianceDashboardRoute = ( + router: IRouter, + cspContext: CspAppContext +): void => + router.get( + { + path: STATS_ROUTE_PATH, + validate: false, + }, + async (context, _, response) => { + try { + const esClient = context.core.elasticsearch.client.asCurrentUser; + const latestCyclesIds = await getLatestCyclesIds(esClient); + const query: QueryDslQueryContainer = { + bool: { + should: latestCyclesIds.map((id) => ({ + match: { 'cycle_id.keyword': { query: id } }, + })), + }, + }; + + const [stats, resourcesTypes, clusters] = await Promise.all([ + getStats(esClient, query), + getResourcesTypes(esClient, query), + getClusters(esClient, query), + ]); + + const body: CloudPostureStats = { + stats, + resourcesTypes, + clusters, + }; + + return response.ok({ + body, + }); + } catch (err) { + const error = transformError(err); + + return response.customError({ + body: { message: error.message }, + statusCode: error.statusCode, + }); + } + } + ); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts new file mode 100644 index 0000000000000..8ee05a6e4755f --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.test.ts @@ -0,0 +1,82 @@ +/* + * 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 { ClusterBucket, getClustersFromAggs } from './get_clusters'; + +const mockClusterBuckets: ClusterBucket[] = [ + { + key: 'cluster_id', + doc_count: 10, + benchmarks: { + buckets: [{ key: 'CIS Kubernetes', doc_count: 10 }], + }, + failed_findings: { + doc_count: 6, + }, + passed_findings: { + doc_count: 6, + }, + aggs_by_resource_type: { + buckets: [ + { + key: 'foo_type', + doc_count: 6, + failed_findings: { + doc_count: 3, + }, + passed_findings: { + doc_count: 3, + }, + }, + { + key: 'boo_type', + doc_count: 6, + failed_findings: { + doc_count: 3, + }, + passed_findings: { + doc_count: 3, + }, + }, + ], + }, + }, +]; + +describe('getClustersFromAggs', () => { + it('should return value matching CloudPostureStats["clusters"]', async () => { + const clusters = getClustersFromAggs(mockClusterBuckets); + expect(clusters).toEqual([ + { + meta: { + clusterId: 'cluster_id', + benchmarkName: 'CIS Kubernetes', + }, + stats: { + totalFindings: 12, + totalFailed: 6, + totalPassed: 6, + postureScore: 50.0, + }, + resourcesTypes: [ + { + name: 'foo_type', + totalFindings: 6, + totalFailed: 3, + totalPassed: 3, + }, + { + name: 'boo_type', + totalFindings: 6, + totalFailed: 3, + totalPassed: 3, + }, + ], + }, + ]); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts new file mode 100644 index 0000000000000..5be94f7246e53 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_clusters.ts @@ -0,0 +1,98 @@ +/* + * 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 'kibana/server'; +import type { + AggregationsMultiBucketAggregateBase as Aggregation, + QueryDslQueryContainer, + SearchRequest, +} from '@elastic/elasticsearch/lib/api/types'; +import { CloudPostureStats } from '../../../common/types'; +import { getResourceTypeFromAggs, resourceTypeAggQuery } from './get_resources_types'; +import type { ResourceTypeQueryResult } from './get_resources_types'; +import { CSP_KUBEBEAT_INDEX_PATTERN } from '../../../common/constants'; +import { findingsEvaluationAggsQuery, getStatsFromFindingsEvaluationsAggs } from './get_stats'; +import { KeyDocCount } from './compliance_dashboard'; + +export interface ClusterBucket extends ResourceTypeQueryResult, KeyDocCount { + failed_findings: { + doc_count: number; + }; + passed_findings: { + doc_count: number; + }; + benchmarks: Aggregation; +} + +interface ClustersQueryResult { + aggs_by_cluster_id: Aggregation; +} + +export const getClustersQuery = (query: QueryDslQueryContainer): SearchRequest => ({ + index: CSP_KUBEBEAT_INDEX_PATTERN, + size: 0, + query, + aggs: { + aggs_by_cluster_id: { + terms: { + field: 'cluster_id.keyword', + }, + aggs: { + benchmarks: { + terms: { + field: 'rule.benchmark.name.keyword', + }, + }, + ...resourceTypeAggQuery, + ...findingsEvaluationAggsQuery, + }, + }, + }, +}); + +export const getClustersFromAggs = (clusters: ClusterBucket[]): CloudPostureStats['clusters'] => + clusters.map((cluster) => { + // get cluster's meta data + const benchmarks = cluster.benchmarks.buckets; + if (!Array.isArray(benchmarks)) throw new Error('missing aggs by benchmarks per cluster'); + + const meta = { + clusterId: cluster.key, + benchmarkName: benchmarks[0].key, + }; + + // get cluster's stats + if (!cluster.failed_findings || !cluster.passed_findings) + throw new Error('missing findings evaluations per cluster'); + const stats = getStatsFromFindingsEvaluationsAggs(cluster); + + // get cluster's resource types aggs + const resourcesTypesAggs = cluster.aggs_by_resource_type.buckets; + if (!Array.isArray(resourcesTypesAggs)) + throw new Error('missing aggs by resource type per cluster'); + const resourcesTypes = getResourceTypeFromAggs(resourcesTypesAggs); + + return { + meta, + stats, + resourcesTypes, + }; + }); + +export const getClusters = async ( + esClient: ElasticsearchClient, + query: QueryDslQueryContainer +): Promise => { + const queryResult = await esClient.search(getClustersQuery(query), { + meta: true, + }); + + const clusters = queryResult.body.aggregations?.aggs_by_cluster_id.buckets; + if (!Array.isArray(clusters)) throw new Error('missing aggs by cluster id'); + + return getClustersFromAggs(clusters); +}; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.test.ts new file mode 100644 index 0000000000000..b01644fc3f45b --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.test.ts @@ -0,0 +1,51 @@ +/* + * 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 { getResourceTypeFromAggs, ResourceTypeBucket } from './get_resources_types'; + +const resourceTypeBuckets: ResourceTypeBucket[] = [ + { + key: 'foo_type', + doc_count: 41, + failed_findings: { + doc_count: 30, + }, + passed_findings: { + doc_count: 11, + }, + }, + { + key: 'boo_type', + doc_count: 11, + failed_findings: { + doc_count: 5, + }, + passed_findings: { + doc_count: 6, + }, + }, +]; + +describe('getResourceTypeFromAggs', () => { + it('should return value matching CloudPostureStats["resourcesTypes"]', async () => { + const resourceTypes = getResourceTypeFromAggs(resourceTypeBuckets); + expect(resourceTypes).toEqual([ + { + name: 'foo_type', + totalFindings: 41, + totalFailed: 30, + totalPassed: 11, + }, + { + name: 'boo_type', + totalFindings: 11, + totalFailed: 5, + totalPassed: 6, + }, + ]); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.ts new file mode 100644 index 0000000000000..459dce56042da --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_resources_types.ts @@ -0,0 +1,77 @@ +/* + * 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 'kibana/server'; +import { + AggregationsMultiBucketAggregateBase as Aggregation, + QueryDslQueryContainer, + SearchRequest, +} from '@elastic/elasticsearch/lib/api/types'; +import { CloudPostureStats } from '../../../common/types'; +import { KeyDocCount } from './compliance_dashboard'; +import { CSP_KUBEBEAT_INDEX_PATTERN } from '../../../common/constants'; + +export interface ResourceTypeQueryResult { + aggs_by_resource_type: Aggregation; +} + +export interface ResourceTypeBucket extends KeyDocCount { + failed_findings: { + doc_count: number; + }; + passed_findings: { + doc_count: number; + }; +} + +export const resourceTypeAggQuery = { + aggs_by_resource_type: { + terms: { + field: 'resource.type.keyword', + }, + aggs: { + failed_findings: { + filter: { term: { 'result.evaluation.keyword': 'failed' } }, + }, + passed_findings: { + filter: { term: { 'result.evaluation.keyword': 'passed' } }, + }, + }, + }, +}; + +export const getRisksEsQuery = (query: QueryDslQueryContainer): SearchRequest => ({ + index: CSP_KUBEBEAT_INDEX_PATTERN, + size: 0, + query, + aggs: resourceTypeAggQuery, +}); + +export const getResourceTypeFromAggs = ( + queryResult: ResourceTypeBucket[] +): CloudPostureStats['resourcesTypes'] => + queryResult.map((bucket) => ({ + name: bucket.key, + totalFindings: bucket.doc_count, + totalFailed: bucket.failed_findings.doc_count || 0, + totalPassed: bucket.passed_findings.doc_count || 0, + })); + +export const getResourcesTypes = async ( + esClient: ElasticsearchClient, + query: QueryDslQueryContainer +): Promise => { + const resourceTypesQueryResult = await esClient.search( + getRisksEsQuery(query), + { meta: true } + ); + + const resourceTypes = resourceTypesQueryResult.body.aggregations?.aggs_by_resource_type.buckets; + if (!Array.isArray(resourceTypes)) throw new Error('missing resources types buckets'); + + return getResourceTypeFromAggs(resourceTypes); +}; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts new file mode 100644 index 0000000000000..558fec85860ea --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.test.ts @@ -0,0 +1,86 @@ +/* + * 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 { + calculatePostureScore, + FindingsEvaluationsQueryResult, + getStatsFromFindingsEvaluationsAggs, + roundScore, +} from './get_stats'; + +const standardQueryResult: FindingsEvaluationsQueryResult = { + failed_findings: { + doc_count: 30, + }, + passed_findings: { + doc_count: 11, + }, +}; + +const oneIsZeroQueryResult: FindingsEvaluationsQueryResult = { + failed_findings: { + doc_count: 0, + }, + passed_findings: { + doc_count: 11, + }, +}; + +const bothAreZeroQueryResult: FindingsEvaluationsQueryResult = { + failed_findings: { + doc_count: 0, + }, + passed_findings: { + doc_count: 0, + }, +}; + +describe('roundScore', () => { + it('should return decimal values with one fraction digit', async () => { + const rounded = roundScore(0.85245); + expect(rounded).toEqual(85.2); + }); +}); + +describe('calculatePostureScore', () => { + it('should return calculated posture score', async () => { + const score = calculatePostureScore(4, 7); + expect(score).toEqual(36.4); + }); +}); + +describe('getStatsFromFindingsEvaluationsAggs', () => { + it('should throw error in case no findings were found', async () => { + const score = calculatePostureScore(4, 7); + expect(score).toEqual(36.4); + }); + + it('should return value matching CloudPostureStats["stats"]', async () => { + const stats = getStatsFromFindingsEvaluationsAggs(standardQueryResult); + expect(stats).toEqual({ + totalFailed: 30, + totalPassed: 11, + totalFindings: 41, + postureScore: 26.8, + }); + }); + + it('checks for stability in case one of the values is zero', async () => { + const stats = getStatsFromFindingsEvaluationsAggs(oneIsZeroQueryResult); + expect(stats).toEqual({ + totalFailed: 0, + totalPassed: 11, + totalFindings: 11, + postureScore: 100.0, + }); + }); + + it('should throw error if both evaluations are zero', async () => { + // const stats = getStatsFromFindingsEvaluationsAggs(bothAreZeroQueryResult); + expect(() => getStatsFromFindingsEvaluationsAggs(bothAreZeroQueryResult)).toThrow(); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts new file mode 100644 index 0000000000000..8d5417de24c52 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_stats.ts @@ -0,0 +1,74 @@ +/* + * 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 'kibana/server'; +import { QueryDslQueryContainer, SearchRequest } from '@elastic/elasticsearch/lib/api/types'; +import { CSP_KUBEBEAT_INDEX_PATTERN } from '../../../common/constants'; +import { CloudPostureStats, Score } from '../../../common/types'; + +/** + * @param value value is [0, 1] range + */ +export const roundScore = (value: number): Score => Number((value * 100).toFixed(1)); + +export const calculatePostureScore = (passed: number, failed: number): Score => + roundScore(passed / (passed + failed)); + +export interface FindingsEvaluationsQueryResult { + failed_findings: { + doc_count: number; + }; + passed_findings: { + doc_count: number; + }; +} + +export const findingsEvaluationAggsQuery = { + failed_findings: { + filter: { term: { 'result.evaluation.keyword': 'failed' } }, + }, + passed_findings: { + filter: { term: { 'result.evaluation.keyword': 'passed' } }, + }, +}; + +export const getEvaluationsQuery = (query: QueryDslQueryContainer): SearchRequest => ({ + index: CSP_KUBEBEAT_INDEX_PATTERN, + query, + aggs: findingsEvaluationAggsQuery, +}); + +export const getStatsFromFindingsEvaluationsAggs = ( + findingsEvaluationsAggs: FindingsEvaluationsQueryResult +): CloudPostureStats['stats'] => { + const failedFindings = findingsEvaluationsAggs.failed_findings.doc_count || 0; + const passedFindings = findingsEvaluationsAggs.passed_findings.doc_count || 0; + const totalFindings = failedFindings + passedFindings; + if (!totalFindings) throw new Error("couldn't calculate posture score"); + const postureScore = calculatePostureScore(passedFindings, failedFindings); + + return { + totalFailed: failedFindings, + totalPassed: passedFindings, + totalFindings, + postureScore, + }; +}; + +export const getStats = async ( + esClient: ElasticsearchClient, + query: QueryDslQueryContainer +): Promise => { + const evaluationsQueryResult = await esClient.search( + getEvaluationsQuery(query), + { meta: true } + ); + const findingsEvaluations = evaluationsQueryResult.body.aggregations; + if (!findingsEvaluations) throw new Error('missing findings evaluations'); + + return getStatsFromFindingsEvaluationsAggs(findingsEvaluations); +}; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.test.ts index ffc5526e2fe42..76fc97e921045 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.test.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.test.ts @@ -12,6 +12,8 @@ import { // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { KibanaRequest } from 'src/core/server/http/router/request'; import { httpServerMock, httpServiceMock, loggingSystemMock } from 'src/core/server/mocks'; +import { CspAppService } from '../../lib/csp_app_services'; +import { CspAppContext } from '../../plugin'; import { defineFindingsIndexRoute, findingsInputSchema, @@ -41,7 +43,13 @@ describe('findings API', () => { it('validate the API route path', async () => { const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); const [config, _] = router.get.mock.calls[0]; @@ -130,7 +138,13 @@ describe('findings API', () => { it('takes cycle_id and validate the filter was built right', async () => { const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); const [_, handler] = router.get.mock.calls[0]; const mockContext = getMockCspContext(mockEsClient); @@ -178,7 +192,14 @@ describe('findings API', () => { it('validate that default sort is timestamp desc', async () => { const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); + const [_, handler] = router.get.mock.calls[0]; const mockContext = getMockCspContext(mockEsClient); const mockResponse = httpServerMock.createResponseFactory(); @@ -202,7 +223,14 @@ describe('findings API', () => { it('should build sort request by `sort_field` and `sort_order` - asc', async () => { const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); + const [_, handler] = router.get.mock.calls[0]; const mockContext = getMockCspContext(mockEsClient); const mockResponse = httpServerMock.createResponseFactory(); @@ -227,7 +255,14 @@ describe('findings API', () => { it('should build sort request by `sort_field` and `sort_order` - desc', async () => { const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); + const [_, handler] = router.get.mock.calls[0]; const mockContext = getMockCspContext(mockEsClient); const mockResponse = httpServerMock.createResponseFactory(); @@ -249,10 +284,17 @@ describe('findings API', () => { }); }); - it('takes `page_number` and `per_page` validate that the requested selected page was called', async () => { + it('takes `page` number and `per_page` validate that the requested selected page was called', async () => { const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); + const [_, handler] = router.get.mock.calls[0]; const mockContext = getMockCspContext(mockEsClient); const mockResponse = httpServerMock.createResponseFactory(); @@ -278,7 +320,14 @@ describe('findings API', () => { it('should format request by fields filter', async () => { const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; const router = httpServiceMock.createRouter(); - defineFindingsIndexRoute(router, logger); + const cspAppContextService = new CspAppService(); + + const cspContext: CspAppContext = { + logger, + service: cspAppContextService, + }; + defineFindingsIndexRoute(router, cspContext); + const [_, handler] = router.get.mock.calls[0]; const mockContext = getMockCspContext(mockEsClient); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.ts b/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.ts index a5c8f67a41cac..5fea7cdbba9db 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/findings/findings.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { IRouter, Logger } from 'src/core/server'; +import type { IRouter } from 'src/core/server'; import { SearchRequest, QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { schema as rt, TypeOf } from '@kbn/config-schema'; import type { SortOrder } from '@elastic/elasticsearch/lib/api/types'; @@ -13,6 +13,7 @@ import { transformError } from '@kbn/securitysolution-es-utils'; import { getLatestCycleIds } from './get_latest_cycle_ids'; import { CSP_KUBEBEAT_INDEX_PATTERN, FINDINGS_ROUTE_PATH } from '../../../common/constants'; +import { CspAppContext } from '../../plugin'; type FindingsQuerySchema = TypeOf; @@ -70,7 +71,7 @@ const buildOptionsRequest = (queryParams: FindingsQuerySchema): FindingsOptions ...getSearchFields(queryParams.fields), }); -export const defineFindingsIndexRoute = (router: IRouter, logger: Logger): void => +export const defineFindingsIndexRoute = (router: IRouter, cspContext: CspAppContext): void => router.get( { path: FINDINGS_ROUTE_PATH, @@ -83,7 +84,7 @@ export const defineFindingsIndexRoute = (router: IRouter, logger: Logger): void const latestCycleIds = request.query.latest_cycle === true - ? await getLatestCycleIds(esClient, logger) + ? await getLatestCycleIds(esClient, cspContext.logger) : undefined; const query = buildQueryRequest(latestCycleIds); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/index.ts b/x-pack/plugins/cloud_security_posture/server/routes/index.ts index ab8d1cc3bbedf..c0b333e4058aa 100755 --- a/x-pack/plugins/cloud_security_posture/server/routes/index.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/index.ts @@ -5,11 +5,14 @@ * 2.0. */ -import type { IRouter, Logger } from '../../../../../src/core/server'; -import { defineGetStatsRoute } from './stats/stats'; +import type { IRouter } from '../../../../../src/core/server'; +import { defineGetComplianceDashboardRoute } from './compliance_dashboard/compliance_dashboard'; +import { defineGetBenchmarksRoute } from './benchmarks/benchmarks'; import { defineFindingsIndexRoute as defineGetFindingsIndexRoute } from './findings/findings'; +import { CspAppContext } from '../plugin'; -export function defineRoutes(router: IRouter, logger: Logger) { - defineGetStatsRoute(router, logger); - defineGetFindingsIndexRoute(router, logger); +export function defineRoutes(router: IRouter, cspContext: CspAppContext) { + defineGetComplianceDashboardRoute(router, cspContext); + defineGetFindingsIndexRoute(router, cspContext); + defineGetBenchmarksRoute(router, cspContext); } diff --git a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.test.ts deleted file mode 100644 index 549e8d45c989f..0000000000000 --- a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.test.ts +++ /dev/null @@ -1,201 +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 { - elasticsearchClientMock, - ElasticsearchClientMock, - // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from 'src/core/server/elasticsearch/client/mocks'; - -import { - getBenchmarks, - getAllFindingsStats, - roundScore, - getBenchmarksStats, - getResourceTypesAggs, -} from './stats'; - -export const mockCountResultOnce = async (mockEsClient: ElasticsearchClientMock, count: number) => { - mockEsClient.count.mockReturnValueOnce( - // @ts-expect-error @elast ic/elasticsearch Aggregate only allows unknown values - elasticsearchClientMock.createSuccessTransportRequestPromise({ count }) - ); -}; - -export const mockSearchResultOnce = async ( - mockEsClient: ElasticsearchClientMock, - returnedMock: object -) => { - mockEsClient.search.mockReturnValueOnce( - // @ts-expect-error @elastic/elasticsearch Aggregate only allows unknown values - elasticsearchClientMock.createSuccessTransportRequestPromise(returnedMock) - ); -}; - -const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; - -const resourceTypeAggsMockData = { - aggregations: { - resource_types: { - buckets: [ - { - key: 'pods', - doc_count: 3, - bucket_evaluation: { - buckets: [ - { - key: 'passed', - doc_count: 1, - }, - { - key: 'failed', - doc_count: 2, - }, - ], - }, - }, - { - key: 'etcd', - doc_count: 4, - bucket_evaluation: { - buckets: [ - // there is only one bucket here, in cases where aggs can't find an evaluation we count that as 0. - { - key: 'failed', - doc_count: 4, - }, - ], - }, - }, - ], - }, - }, -}; - -afterEach(() => { - jest.clearAllMocks(); -}); - -describe('testing round score', () => { - it('take decimal and expect the roundScore will return it with one digit after the dot ', async () => { - const score = roundScore(0.85245); - expect(score).toEqual(85.2); - }); -}); - -describe('general cloud posture score', () => { - it('expect to valid score from getAllFindingsStats', async () => { - mockCountResultOnce(mockEsClient, 10); // total findings - mockCountResultOnce(mockEsClient, 3); // pass findings - mockCountResultOnce(mockEsClient, 7); // fail findings - - const generalScore = await getAllFindingsStats(mockEsClient, 'randomCycleId'); - expect(generalScore).toEqual({ - name: 'general', - postureScore: 30, - totalFailed: 7, - totalFindings: 10, - totalPassed: 3, - }); - }); - - it("getAllFindingsStats throws when cycleId doesn't exists", async () => { - try { - await getAllFindingsStats(mockEsClient, 'randomCycleId'); - } catch (e) { - expect(e).toBeInstanceOf(Error); - expect(e.message).toEqual('missing stats'); - } - }); -}); - -describe('get benchmarks list', () => { - it('getBenchmarks - takes aggregated data and expect unique benchmarks array', async () => { - const returnedMock = { - aggregations: { - benchmarks: { - buckets: [ - { key: 'CIS Kubernetes', doc_count: 248514 }, - { key: 'GDPR', doc_count: 248514 }, - ], - }, - }, - }; - mockSearchResultOnce(mockEsClient, returnedMock); - const benchmarks = await getBenchmarks(mockEsClient); - expect(benchmarks).toEqual(['CIS Kubernetes', 'GDPR']); - }); -}); - -describe('score per benchmark, testing getBenchmarksStats', () => { - it('get data for only one benchmark and check', async () => { - mockCountResultOnce(mockEsClient, 10); // total findings - mockCountResultOnce(mockEsClient, 3); // pass findings - mockCountResultOnce(mockEsClient, 7); // fail findings - const benchmarkScore = await getBenchmarksStats(mockEsClient, 'randomCycleId', [ - 'CIS Benchmark', - ]); - expect(benchmarkScore).toEqual([ - { - name: 'CIS Benchmark', - postureScore: 30, - totalFailed: 7, - totalFindings: 10, - totalPassed: 3, - }, - ]); - }); - - it('get data two benchmarks and check', async () => { - mockCountResultOnce(mockEsClient, 10); // total findings - mockCountResultOnce(mockEsClient, 3); // pass findings - mockCountResultOnce(mockEsClient, 7); // fail findings - mockCountResultOnce(mockEsClient, 100); - mockCountResultOnce(mockEsClient, 50); - mockCountResultOnce(mockEsClient, 50); - const benchmarkScore = await getBenchmarksStats(mockEsClient, 'randomCycleId', [ - 'CIS Benchmark', - 'GDPR', - ]); - expect(benchmarkScore).toEqual([ - { - name: 'CIS Benchmark', - postureScore: 30, - totalFailed: 7, - totalFindings: 10, - totalPassed: 3, - }, - { - name: 'GDPR', - postureScore: 50, - totalFailed: 50, - totalFindings: 100, - totalPassed: 50, - }, - ]); - }); -}); - -describe('getResourceTypesAggs', () => { - it('get all resources types aggregations', async () => { - await mockSearchResultOnce(mockEsClient, resourceTypeAggsMockData); - const resourceTypeAggs = await getResourceTypesAggs(mockEsClient, 'RandomCycleId'); - expect(resourceTypeAggs).toEqual([ - { - resourceType: 'pods', - totalFindings: 3, - totalPassed: 1, - totalFailed: 2, - }, - { - resourceType: 'etcd', - totalFindings: 4, - totalPassed: 0, - totalFailed: 4, - }, - ]); - }); -}); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.ts b/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.ts deleted file mode 100644 index 828d7f932113e..0000000000000 --- a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats.ts +++ /dev/null @@ -1,226 +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 type { ElasticsearchClient, IRouter, Logger } from 'src/core/server'; -import type { AggregationsMultiBucketAggregateBase } from '@elastic/elasticsearch/lib/api/types'; -import { number, UnknownRecord } from 'io-ts'; -import { transformError } from '@kbn/securitysolution-es-utils'; - -import type { BenchmarkStats, CloudPostureStats, Evaluation, Score } from '../../../common/types'; -import { - getBenchmarksQuery, - getFindingsEsQuery, - getLatestFindingQuery, - getRisksEsQuery, -} from './stats_queries'; -import { RULE_FAILED, RULE_PASSED } from '../../constants'; -import { STATS_ROUTE_PATH } from '../../../common/constants'; - -// TODO: use a schema decoder -function assertBenchmarkStats(v: unknown): asserts v is BenchmarkStats { - if ( - !UnknownRecord.is(v) || - !number.is(v.totalFindings) || - !number.is(v.totalPassed) || - !number.is(v.totalFailed) || - !number.is(v.postureScore) - ) { - throw new Error('missing stats'); - } -} - -interface LastCycle { - cycle_id: string; -} - -interface GroupFilename { - // TODO find the 'key', 'doc_count' interface - key: string; - doc_count: number; -} - -interface ResourceTypeBucket { - resource_types: AggregationsMultiBucketAggregateBase<{ - key: string; - doc_count: number; - bucket_evaluation: AggregationsMultiBucketAggregateBase; - }>; -} - -interface ResourceTypeEvaluationBucket { - key: Evaluation; - doc_count: number; -} - -/** - * @param value value is [0, 1] range - */ -export const roundScore = (value: number): Score => Number((value * 100).toFixed(1)); - -const calculatePostureScore = (total: number, passed: number, failed: number): Score | undefined => - passed + failed === 0 || total === undefined ? undefined : roundScore(passed / (passed + failed)); - -const getLatestCycleId = async (esClient: ElasticsearchClient) => { - const latestFinding = await esClient.search(getLatestFindingQuery(), { meta: true }); - const lastCycle = latestFinding.body.hits.hits[0]; - - if (lastCycle?._source?.cycle_id === undefined) { - throw new Error('cycle id is missing'); - } - return lastCycle?._source?.cycle_id; -}; - -export const getBenchmarks = async (esClient: ElasticsearchClient) => { - const queryResult = await esClient.search< - {}, - { benchmarks: AggregationsMultiBucketAggregateBase> } - >(getBenchmarksQuery(), { meta: true }); - const benchmarksBuckets = queryResult.body.aggregations?.benchmarks; - - if (!benchmarksBuckets || !Array.isArray(benchmarksBuckets?.buckets)) { - throw new Error('missing buckets'); - } - - return benchmarksBuckets.buckets.map((e) => e.key); -}; - -export const getAllFindingsStats = async ( - esClient: ElasticsearchClient, - cycleId: string -): Promise => { - const [findings, passedFindings, failedFindings] = await Promise.all([ - esClient.count(getFindingsEsQuery(cycleId), { meta: true }), - esClient.count(getFindingsEsQuery(cycleId, RULE_PASSED), { meta: true }), - esClient.count(getFindingsEsQuery(cycleId, RULE_FAILED), { meta: true }), - ]); - - const totalFindings = findings.body.count; - const totalPassed = passedFindings.body.count; - const totalFailed = failedFindings.body.count; - const postureScore = calculatePostureScore(totalFindings, totalPassed, totalFailed); - const stats = { - name: 'general', - postureScore, - totalFindings, - totalPassed, - totalFailed, - }; - - assertBenchmarkStats(stats); - - return stats; -}; - -export const getBenchmarksStats = async ( - esClient: ElasticsearchClient, - cycleId: string, - benchmarks: string[] -): Promise => { - const benchmarkPromises = benchmarks.map((benchmark) => { - const benchmarkFindings = esClient.count(getFindingsEsQuery(cycleId, undefined, benchmark), { - meta: true, - }); - const benchmarkPassedFindings = esClient.count( - getFindingsEsQuery(cycleId, RULE_PASSED, benchmark), - { meta: true } - ); - const benchmarkFailedFindings = esClient.count( - getFindingsEsQuery(cycleId, RULE_FAILED, benchmark), - { meta: true } - ); - - return Promise.all([benchmarkFindings, benchmarkPassedFindings, benchmarkFailedFindings]).then( - ([benchmarkFindingsResult, benchmarkPassedFindingsResult, benchmarkFailedFindingsResult]) => { - const totalFindings = benchmarkFindingsResult.body.count; - const totalPassed = benchmarkPassedFindingsResult.body.count; - const totalFailed = benchmarkFailedFindingsResult.body.count; - const postureScore = calculatePostureScore(totalFindings, totalPassed, totalFailed); - const stats = { - name: benchmark, - postureScore, - totalFindings, - totalPassed, - totalFailed, - }; - - assertBenchmarkStats(stats); - return stats; - } - ); - }); - - return Promise.all(benchmarkPromises); -}; - -export const getResourceTypesAggs = async ( - esClient: ElasticsearchClient, - cycleId: string -): Promise => { - const resourceTypesQueryResult = await esClient.search( - getRisksEsQuery(cycleId), - { meta: true } - ); - - const resourceTypesAggs = resourceTypesQueryResult.body.aggregations?.resource_types.buckets; - if (!Array.isArray(resourceTypesAggs)) throw new Error('missing resources types buckets'); - - return resourceTypesAggs.map((bucket) => { - const evalBuckets = bucket.bucket_evaluation.buckets; - if (!Array.isArray(evalBuckets)) throw new Error('missing resources types evaluations buckets'); - - const failedBucket = evalBuckets.find((evalBucket) => evalBucket.key === RULE_FAILED); - const passedBucket = evalBuckets.find((evalBucket) => evalBucket.key === RULE_PASSED); - - return { - resourceType: bucket.key, - totalFindings: bucket.doc_count, - totalFailed: failedBucket?.doc_count || 0, - totalPassed: passedBucket?.doc_count || 0, - }; - }); -}; - -export const defineGetStatsRoute = (router: IRouter, logger: Logger): void => - router.get( - { - path: STATS_ROUTE_PATH, - validate: false, - }, - async (context, _, response) => { - try { - const esClient = context.core.elasticsearch.client.asCurrentUser; - const [benchmarks, latestCycleID] = await Promise.all([ - getBenchmarks(esClient), - getLatestCycleId(esClient), - ]); - - // TODO: Utilize ES "Point in Time" feature https://www.elastic.co/guide/en/elasticsearch/reference/current/point-in-time-api.html - const [allFindingsStats, benchmarksStats, resourceTypesAggs] = await Promise.all([ - getAllFindingsStats(esClient, latestCycleID), - getBenchmarksStats(esClient, latestCycleID, benchmarks), - getResourceTypesAggs(esClient, latestCycleID), - ]); - - const body: CloudPostureStats = { - ...allFindingsStats, - benchmarksStats, - resourceTypesAggs, - }; - - return response.ok({ - body, - }); - } catch (err) { - const error = transformError(err); - - return response.customError({ - body: { message: error.message }, - statusCode: error.statusCode, - }); - } - } - ); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats_queries.ts b/x-pack/plugins/cloud_security_posture/server/routes/stats/stats_queries.ts deleted file mode 100644 index b88182a27fee1..0000000000000 --- a/x-pack/plugins/cloud_security_posture/server/routes/stats/stats_queries.ts +++ /dev/null @@ -1,111 +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 type { - SearchRequest, - CountRequest, - QueryDslQueryContainer, -} from '@elastic/elasticsearch/lib/api/types'; - -import { CSP_KUBEBEAT_INDEX_PATTERN } from '../../../common/constants'; -import { Evaluation } from '../../../common/types'; - -export const getFindingsEsQuery = ( - cycleId: string, - evaluationResult?: string, - benchmark?: string -): CountRequest => { - const filter: QueryDslQueryContainer[] = [{ term: { 'cycle_id.keyword': cycleId } }]; - - if (benchmark) { - filter.push({ term: { 'rule.benchmark.keyword': benchmark } }); - } - - if (evaluationResult) { - filter.push({ term: { 'result.evaluation.keyword': evaluationResult } }); - } - - return { - index: CSP_KUBEBEAT_INDEX_PATTERN, - query: { - bool: { filter }, - }, - }; -}; - -export const getResourcesEvaluationEsQuery = ( - cycleId: string, - evaluation: Evaluation, - size: number, - resources?: string[] -): SearchRequest => { - const query: QueryDslQueryContainer = { - bool: { - filter: [ - { term: { 'cycle_id.keyword': cycleId } }, - { term: { 'result.evaluation.keyword': evaluation } }, - ], - }, - }; - if (resources) { - query.bool!.must = { terms: { 'resource.filename.keyword': resources } }; - } - return { - index: CSP_KUBEBEAT_INDEX_PATTERN, - size, - query, - aggs: { - group: { - terms: { field: 'resource.filename.keyword' }, - }, - }, - sort: 'resource.filename.keyword', - }; -}; - -export const getBenchmarksQuery = (): SearchRequest => ({ - index: CSP_KUBEBEAT_INDEX_PATTERN, - size: 0, - aggs: { - benchmarks: { - terms: { field: 'rule.benchmark.keyword' }, - }, - }, -}); - -export const getLatestFindingQuery = (): SearchRequest => ({ - index: CSP_KUBEBEAT_INDEX_PATTERN, - size: 1, - /* @ts-expect-error TS2322 - missing SearchSortContainer */ - sort: { '@timestamp': 'desc' }, - query: { - match_all: {}, - }, -}); - -export const getRisksEsQuery = (cycleId: string): SearchRequest => ({ - index: CSP_KUBEBEAT_INDEX_PATTERN, - size: 0, - query: { - bool: { - filter: [{ term: { 'cycle_id.keyword': cycleId } }], - }, - }, - aggs: { - resource_types: { - terms: { - field: 'resource.type.keyword', - }, - aggs: { - bucket_evaluation: { - terms: { - field: 'result.evaluation.keyword', - }, - }, - }, - }, - }, -}); diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/csp_rule_type.ts b/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/csp_rule_type.ts new file mode 100644 index 0000000000000..fcff7449fb3f5 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/csp_rule_type.ts @@ -0,0 +1,58 @@ +/* + * 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 { + SavedObjectsType, + SavedObjectsValidationMap, +} from '../../../../../../src/core/server'; +import { + type CspRuleSchema, + cspRuleSchema, + cspRuleAssetSavedObjectType, +} from '../../../common/schemas/csp_rule'; + +const validationMap: SavedObjectsValidationMap = { + '1.0.0': cspRuleSchema, +}; + +export const ruleAssetSavedObjectMappings: SavedObjectsType['mappings'] = { + dynamic: false, + properties: { + name: { + type: 'text', // search + fields: { + // TODO: how is fields mapping shared with UI ? + raw: { + type: 'keyword', // sort + }, + }, + }, + description: { + type: 'text', + }, + }, +}; + +export const cspRuleAssetType: SavedObjectsType = { + name: cspRuleAssetSavedObjectType, + hidden: false, + namespaceType: 'agnostic', + mappings: ruleAssetSavedObjectMappings, + schemas: validationMap, + // migrations: {} + management: { + importableAndExportable: true, + visibleInManagement: true, + getTitle: (savedObject) => + `${i18n.translate('xpack.csp.cspSettings.rules', { + defaultMessage: `CSP Security Rules - `, + })} ${savedObject.attributes.benchmark.name} ${savedObject.attributes.benchmark.version} ${ + savedObject.attributes.name + }`, + }, +}; diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/initialize_rules.ts b/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/initialize_rules.ts new file mode 100644 index 0000000000000..1cb08ddc1be1a --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/initialize_rules.ts @@ -0,0 +1,24 @@ +/* + * 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 { ISavedObjectsRepository } from 'src/core/server'; +import { CIS_BENCHMARK_1_4_1_RULES } from './rules'; +import { cspRuleAssetSavedObjectType } from '../../../common/schemas/csp_rule'; + +export const initializeCspRules = async (client: ISavedObjectsRepository) => { + const existingRules = await client.find({ type: cspRuleAssetSavedObjectType, perPage: 1 }); + + // TODO: version? + if (existingRules.total !== 0) return; + + try { + await client.bulkCreate(CIS_BENCHMARK_1_4_1_RULES); + } catch (e) { + // TODO: add logger + // TODO: handle error + } +}; diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/rules.ts b/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/rules.ts new file mode 100644 index 0000000000000..8f3d6df65b6b5 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/saved_objects/cis_1_4_1/rules.ts @@ -0,0 +1,53 @@ +/* + * 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 { SavedObjectsBulkCreateObject } from 'src/core/server'; +import type { CspRuleSchema } from '../../../common/schemas/csp_rule'; +import { cspRuleAssetSavedObjectType } from '../../../common/schemas/csp_rule'; + +const benchmark = { name: 'CIS', version: '1.4.1' } as const; + +const RULES: CspRuleSchema[] = [ + { + id: '1.1.1', + name: 'Ensure that the API server pod specification file permissions are set to 644 or more restrictive (Automated)', + description: 'Disable anonymous requests to the API server', + rationale: + 'When enabled, requests that are not rejected by other configured authentication methods\nare treated as anonymous requests. These requests are then served by the API server. You\nshould rely on authentication to authorize access and disallow anonymous requests.\nIf you are using RBAC authorization, it is generally considered reasonable to allow\nanonymous access to the API Server for health checks and discovery purposes, and hence\nthis recommendation is not scored. However, you should consider whether anonymous\ndiscovery is an acceptable risk for your purposes.', + impact: 'Anonymous requests will be rejected.', + default_value: 'By default, anonymous access is enabled.', + remediation: + 'Edit the API server pod specification file /etc/kubernetes/manifests/kubeapiserver.yaml on the master node and set the below parameter.\n--anonymous-auth=false', + tags: [], + enabled: true, + muted: false, + benchmark, + }, + { + id: '1.1.2', + name: 'Ensure that the --basic-auth-file argument is not set (Scored)', + description: 'Do not use basic authentication', + rationale: + 'Basic authentication uses plaintext credentials for authentication. Currently, the basic\nauthentication credentials last indefinitely, and the password cannot be changed without\nrestarting API server. The basic authentication is currently supported for convenience.\nHence, basic authentication should not be used', + impact: + 'You will have to configure and use alternate authentication mechanisms such as tokens and\ncertificates. Username and password for basic authentication could no longer be used.', + default_value: 'By default, basic authentication is not set', + remediation: + 'Follow the documentation and configure alternate mechanisms for authentication. Then,\nedit the API server pod specification file /etc/kubernetes/manifests/kubeapiserver.yaml on the master node and remove the --basic-auth-file=\nparameter.', + tags: [], + enabled: true, + muted: false, + benchmark, + }, +]; + +export const CIS_BENCHMARK_1_4_1_RULES: Array> = + RULES.map((rule) => ({ + attributes: rule, + id: rule.id, + type: cspRuleAssetSavedObjectType, + })); diff --git a/x-pack/plugins/cloud_security_posture/server/types.ts b/x-pack/plugins/cloud_security_posture/server/types.ts index 707002461d2a6..4e70027013df8 100644 --- a/x-pack/plugins/cloud_security_posture/server/types.ts +++ b/x-pack/plugins/cloud_security_posture/server/types.ts @@ -10,6 +10,8 @@ import type { PluginStart as DataPluginStart, } from '../../../../src/plugins/data/server'; +import type { FleetStartContract } from '../../fleet/server'; + // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface CspServerPluginSetup {} // eslint-disable-next-line @typescript-eslint/no-empty-interface @@ -25,6 +27,5 @@ export interface CspServerPluginSetupDeps { export interface CspServerPluginStartDeps { // required data: DataPluginStart; - - // optional + fleet: FleetStartContract; } diff --git a/x-pack/plugins/cloud_security_posture/tsconfig.json b/x-pack/plugins/cloud_security_posture/tsconfig.json index 47625c59eae6c..d7902b8b05977 100755 --- a/x-pack/plugins/cloud_security_posture/tsconfig.json +++ b/x-pack/plugins/cloud_security_posture/tsconfig.json @@ -19,6 +19,7 @@ "references": [ { "path": "../../../src/core/tsconfig.json" }, { "path": "../../../src/plugins/data/tsconfig.json" }, - { "path": "../../../src/plugins/navigation/tsconfig.json" } + { "path": "../../../src/plugins/navigation/tsconfig.json" }, + { "path": "../../../x-pack/plugins/fleet/tsconfig.json" }, ] } From 12f42e06230e15837ecc6c77541a698437e38daa Mon Sep 17 00:00:00 2001 From: Michael Dokolin Date: Wed, 2 Mar 2022 13:25:07 +0100 Subject: [PATCH 02/37] [Data] Provide `datatable` utility functions (#126572) * Extract datatable utilities into a separate service * Add getField utility function * Add getFieldFormat utility function * Add field format setter utility functions * Add data view field setter utility functions * Add getInterval utility function --- .../datatable_utilities_service.test.ts | 123 ++++++++++++++++++ .../datatable_utilities_service.ts | 93 +++++++++++++ .../data/common/datatable_utilities/index.ts | 9 ++ .../data/common/datatable_utilities/mock.ts | 22 ++++ src/plugins/data/common/index.ts | 1 + src/plugins/data/common/mocks.ts | 1 + .../common/search/aggs/aggs_service.test.ts | 3 +- .../data/common/search/aggs/aggs_service.ts | 12 +- src/plugins/data/common/search/aggs/types.ts | 7 - .../aggs/utils/datatable_column_meta.ts | 57 -------- src/plugins/data/public/mocks.ts | 2 + src/plugins/data/public/plugin.ts | 6 +- .../public/search/aggs/aggs_service.test.ts | 3 +- .../data/public/search/aggs/aggs_service.ts | 13 +- src/plugins/data/public/search/aggs/mocks.ts | 5 - src/plugins/data/public/types.ts | 7 + .../datatable_utilities_service.ts | 43 ++++++ .../data/server/datatable_utilities/index.ts | 9 ++ .../data/server/datatable_utilities/mock.ts | 16 +++ src/plugins/data/server/mocks.ts | 2 + src/plugins/data/server/plugin.ts | 17 ++- .../data/server/search/aggs/aggs_service.ts | 19 +-- src/plugins/data/server/search/aggs/mocks.ts | 5 - 23 files changed, 363 insertions(+), 112 deletions(-) create mode 100644 src/plugins/data/common/datatable_utilities/datatable_utilities_service.test.ts create mode 100644 src/plugins/data/common/datatable_utilities/datatable_utilities_service.ts create mode 100644 src/plugins/data/common/datatable_utilities/index.ts create mode 100644 src/plugins/data/common/datatable_utilities/mock.ts delete mode 100644 src/plugins/data/common/search/aggs/utils/datatable_column_meta.ts create mode 100644 src/plugins/data/server/datatable_utilities/datatable_utilities_service.ts create mode 100644 src/plugins/data/server/datatable_utilities/index.ts create mode 100644 src/plugins/data/server/datatable_utilities/mock.ts diff --git a/src/plugins/data/common/datatable_utilities/datatable_utilities_service.test.ts b/src/plugins/data/common/datatable_utilities/datatable_utilities_service.test.ts new file mode 100644 index 0000000000000..d626bc2226543 --- /dev/null +++ b/src/plugins/data/common/datatable_utilities/datatable_utilities_service.test.ts @@ -0,0 +1,123 @@ +/* + * 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 { createStubDataView } from 'src/plugins/data_views/common/mocks'; +import type { DataViewsContract } from 'src/plugins/data_views/common'; +import type { DatatableColumn } from 'src/plugins/expressions/common'; +import { FieldFormat } from 'src/plugins/field_formats/common'; +import { fieldFormatsMock } from 'src/plugins/field_formats/common/mocks'; +import type { AggsCommonStart } from '../search'; +import { DatatableUtilitiesService } from './datatable_utilities_service'; + +describe('DatatableUtilitiesService', () => { + let aggs: jest.Mocked; + let dataViews: jest.Mocked; + let datatableUtilitiesService: DatatableUtilitiesService; + + beforeEach(() => { + aggs = { + createAggConfigs: jest.fn(), + types: { get: jest.fn() }, + } as unknown as typeof aggs; + dataViews = { + get: jest.fn(), + } as unknown as typeof dataViews; + + datatableUtilitiesService = new DatatableUtilitiesService(aggs, dataViews, fieldFormatsMock); + }); + + describe('clearField', () => { + it('should delete the field reference', () => { + const column = { meta: { field: 'foo' } } as DatatableColumn; + + datatableUtilitiesService.clearField(column); + + expect(column).not.toHaveProperty('meta.field'); + }); + }); + + describe('clearFieldFormat', () => { + it('should remove field format', () => { + const column = { meta: { params: { id: 'number' } } } as DatatableColumn; + datatableUtilitiesService.clearFieldFormat(column); + + expect(column).not.toHaveProperty('meta.params'); + }); + }); + + describe('getDataView', () => { + it('should return a data view instance', async () => { + const column = { meta: { index: 'index' } } as DatatableColumn; + const dataView = {} as ReturnType; + dataViews.get.mockReturnValue(dataView); + + await expect(datatableUtilitiesService.getDataView(column)).resolves.toBe(dataView); + expect(dataViews.get).toHaveBeenCalledWith('index'); + }); + + it('should return undefined when there is no index metadata', async () => { + const column = { meta: {} } as DatatableColumn; + + await expect(datatableUtilitiesService.getDataView(column)).resolves.toBeUndefined(); + expect(dataViews.get).not.toHaveBeenCalled(); + }); + }); + + describe('getField', () => { + it('should return a data view field instance', async () => { + const column = { meta: { field: 'field', index: 'index' } } as DatatableColumn; + const dataView = createStubDataView({ spec: {} }); + const field = {}; + spyOn(datatableUtilitiesService, 'getDataView').and.returnValue(dataView); + spyOn(dataView, 'getFieldByName').and.returnValue(field); + + await expect(datatableUtilitiesService.getField(column)).resolves.toBe(field); + expect(dataView.getFieldByName).toHaveBeenCalledWith('field'); + }); + + it('should return undefined when there is no field metadata', async () => { + const column = { meta: {} } as DatatableColumn; + + await expect(datatableUtilitiesService.getField(column)).resolves.toBeUndefined(); + }); + }); + + describe('getFieldFormat', () => { + it('should deserialize field format', () => { + const column = { meta: { params: { id: 'number' } } } as DatatableColumn; + const fieldFormat = datatableUtilitiesService.getFieldFormat(column); + + expect(fieldFormat).toBeInstanceOf(FieldFormat); + }); + }); + + describe('getInterval', () => { + it('should return a histogram interval', () => { + const column = { + meta: { sourceParams: { params: { interval: '1d' } } }, + } as unknown as DatatableColumn; + + expect(datatableUtilitiesService.getInterval(column)).toBe('1d'); + }); + }); + + describe('setFieldFormat', () => { + it('should set new field format', () => { + const column = { meta: {} } as DatatableColumn; + const fieldFormat = fieldFormatsMock.deserialize({ id: 'number' }); + datatableUtilitiesService.setFieldFormat(column, fieldFormat); + + expect(column.meta.params).toEqual( + expect.objectContaining({ + id: expect.anything(), + params: undefined, + }) + ); + }); + }); +}); diff --git a/src/plugins/data/common/datatable_utilities/datatable_utilities_service.ts b/src/plugins/data/common/datatable_utilities/datatable_utilities_service.ts new file mode 100644 index 0000000000000..cf4e65f31cce3 --- /dev/null +++ b/src/plugins/data/common/datatable_utilities/datatable_utilities_service.ts @@ -0,0 +1,93 @@ +/* + * 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 { DataView, DataViewsContract, DataViewField } from 'src/plugins/data_views/common'; +import type { DatatableColumn } from 'src/plugins/expressions/common'; +import type { FieldFormatsStartCommon, FieldFormat } from 'src/plugins/field_formats/common'; +import type { AggsCommonStart, AggConfig, CreateAggConfigParams, IAggType } from '../search'; + +export class DatatableUtilitiesService { + constructor( + private aggs: AggsCommonStart, + private dataViews: DataViewsContract, + private fieldFormats: FieldFormatsStartCommon + ) { + this.getAggConfig = this.getAggConfig.bind(this); + this.getDataView = this.getDataView.bind(this); + this.getField = this.getField.bind(this); + this.isFilterable = this.isFilterable.bind(this); + } + + clearField(column: DatatableColumn): void { + delete column.meta.field; + } + + clearFieldFormat(column: DatatableColumn): void { + delete column.meta.params; + } + + async getAggConfig(column: DatatableColumn): Promise { + const dataView = await this.getDataView(column); + + if (!dataView) { + return; + } + + const { aggs } = await this.aggs.createAggConfigs( + dataView, + column.meta.sourceParams && [column.meta.sourceParams as CreateAggConfigParams] + ); + + return aggs[0]; + } + + async getDataView(column: DatatableColumn): Promise { + if (!column.meta.index) { + return; + } + + return this.dataViews.get(column.meta.index); + } + + async getField(column: DatatableColumn): Promise { + if (!column.meta.field) { + return; + } + + const dataView = await this.getDataView(column); + if (!dataView) { + return; + } + + return dataView.getFieldByName(column.meta.field); + } + + getFieldFormat(column: DatatableColumn): FieldFormat | undefined { + return this.fieldFormats.deserialize(column.meta.params); + } + + getInterval(column: DatatableColumn): string | undefined { + const params = column.meta.sourceParams?.params as { interval: string } | undefined; + + return params?.interval; + } + + isFilterable(column: DatatableColumn): boolean { + if (column.meta.source !== 'esaggs') { + return false; + } + + const aggType = this.aggs.types.get(column.meta.sourceParams?.type as string) as IAggType; + + return Boolean(aggType.createFilter); + } + + setFieldFormat(column: DatatableColumn, fieldFormat: FieldFormat): void { + column.meta.params = fieldFormat.toJSON(); + } +} diff --git a/src/plugins/data/common/datatable_utilities/index.ts b/src/plugins/data/common/datatable_utilities/index.ts new file mode 100644 index 0000000000000..34df78137510a --- /dev/null +++ b/src/plugins/data/common/datatable_utilities/index.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export * from './datatable_utilities_service'; diff --git a/src/plugins/data/common/datatable_utilities/mock.ts b/src/plugins/data/common/datatable_utilities/mock.ts new file mode 100644 index 0000000000000..4266e501f2ca2 --- /dev/null +++ b/src/plugins/data/common/datatable_utilities/mock.ts @@ -0,0 +1,22 @@ +/* + * 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 { DatatableUtilitiesService } from './datatable_utilities_service'; + +export function createDatatableUtilitiesMock(): jest.Mocked { + return { + clearField: jest.fn(), + clearFieldFormat: jest.fn(), + getAggConfig: jest.fn(), + getDataView: jest.fn(), + getField: jest.fn(), + getFieldFormat: jest.fn(), + isFilterable: jest.fn(), + setFieldFormat: jest.fn(), + } as unknown as jest.Mocked; +} diff --git a/src/plugins/data/common/index.ts b/src/plugins/data/common/index.ts index 7bb4b78850dcd..a793050eb6556 100644 --- a/src/plugins/data/common/index.ts +++ b/src/plugins/data/common/index.ts @@ -10,6 +10,7 @@ /* eslint-disable @kbn/eslint/no_export_all */ export * from './constants'; +export * from './datatable_utilities'; export * from './es_query'; export * from './kbn_field_types'; export * from './query'; diff --git a/src/plugins/data/common/mocks.ts b/src/plugins/data/common/mocks.ts index c656d9d21346e..cf7d6bef6a4e8 100644 --- a/src/plugins/data/common/mocks.ts +++ b/src/plugins/data/common/mocks.ts @@ -7,3 +7,4 @@ */ export * from '../../data_views/common/fields/fields.mocks'; +export * from './datatable_utilities/mock'; diff --git a/src/plugins/data/common/search/aggs/aggs_service.test.ts b/src/plugins/data/common/search/aggs/aggs_service.test.ts index 998b8bf286b52..b7237c7b80134 100644 --- a/src/plugins/data/common/search/aggs/aggs_service.test.ts +++ b/src/plugins/data/common/search/aggs/aggs_service.test.ts @@ -206,11 +206,10 @@ describe('Aggs service', () => { describe('start()', () => { test('exposes proper contract', () => { const start = service.start(startDeps); - expect(Object.keys(start).length).toBe(4); + expect(Object.keys(start).length).toBe(3); expect(start).toHaveProperty('calculateAutoTimeExpression'); expect(start).toHaveProperty('createAggConfigs'); expect(start).toHaveProperty('types'); - expect(start).toHaveProperty('datatableUtilities'); }); test('types registry returns uninitialized type providers', () => { diff --git a/src/plugins/data/common/search/aggs/aggs_service.ts b/src/plugins/data/common/search/aggs/aggs_service.ts index 58f65bb0cab44..6fe7eef5b87b4 100644 --- a/src/plugins/data/common/search/aggs/aggs_service.ts +++ b/src/plugins/data/common/search/aggs/aggs_service.ts @@ -17,7 +17,6 @@ import { getCalculateAutoTimeExpression, } from './'; import { AggsCommonSetup, AggsCommonStart } from './types'; -import { getDatatableColumnUtilities } from './utils/datatable_column_meta'; /** @internal */ export const aggsRequiredUiSettings = [ @@ -67,11 +66,7 @@ export class AggsCommonService { }; } - public start({ - getConfig, - getIndexPattern, - isDefaultTimezone, - }: AggsCommonStartDependencies): AggsCommonStart { + public start({ getConfig }: AggsCommonStartDependencies): AggsCommonStart { const aggTypesStart = this.aggTypesRegistry.start(); const calculateAutoTimeExpression = getCalculateAutoTimeExpression(getConfig); @@ -86,11 +81,6 @@ export class AggsCommonService { return { calculateAutoTimeExpression, - datatableUtilities: getDatatableColumnUtilities({ - getIndexPattern, - createAggConfigs, - aggTypesStart, - }), createAggConfigs, types: aggTypesStart, }; diff --git a/src/plugins/data/common/search/aggs/types.ts b/src/plugins/data/common/search/aggs/types.ts index 34d773b0ba518..cf9a6123b14c8 100644 --- a/src/plugins/data/common/search/aggs/types.ts +++ b/src/plugins/data/common/search/aggs/types.ts @@ -7,7 +7,6 @@ */ import { Assign } from '@kbn/utility-types'; -import { DatatableColumn } from 'src/plugins/expressions'; import { IndexPattern } from '../..'; import { aggAvg, @@ -88,7 +87,6 @@ import { CreateAggConfigParams, getCalculateAutoTimeExpression, METRIC_TYPES, - AggConfig, aggFilteredMetric, aggSinglePercentile, } from './'; @@ -111,11 +109,6 @@ export interface AggsCommonSetup { export interface AggsCommonStart { calculateAutoTimeExpression: ReturnType; - datatableUtilities: { - getIndexPattern: (column: DatatableColumn) => Promise; - getAggConfig: (column: DatatableColumn) => Promise; - isFilterable: (column: DatatableColumn) => boolean; - }; createAggConfigs: ( indexPattern: IndexPattern, configStates?: CreateAggConfigParams[] diff --git a/src/plugins/data/common/search/aggs/utils/datatable_column_meta.ts b/src/plugins/data/common/search/aggs/utils/datatable_column_meta.ts deleted file mode 100644 index 0e3ff69fac1d1..0000000000000 --- a/src/plugins/data/common/search/aggs/utils/datatable_column_meta.ts +++ /dev/null @@ -1,57 +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 { DatatableColumn } from 'src/plugins/expressions/common'; -import { IndexPattern } from '../../..'; -import { AggConfigs, CreateAggConfigParams } from '../agg_configs'; -import { AggTypesRegistryStart } from '../agg_types_registry'; -import { IAggType } from '../agg_type'; - -export interface MetaByColumnDeps { - getIndexPattern: (id: string) => Promise; - createAggConfigs: ( - indexPattern: IndexPattern, - configStates?: CreateAggConfigParams[] - ) => InstanceType; - aggTypesStart: AggTypesRegistryStart; -} - -export const getDatatableColumnUtilities = (deps: MetaByColumnDeps) => { - const { getIndexPattern, createAggConfigs, aggTypesStart } = deps; - - const getIndexPatternFromDatatableColumn = async (column: DatatableColumn) => { - if (!column.meta.index) return; - - return await getIndexPattern(column.meta.index); - }; - - const getAggConfigFromDatatableColumn = async (column: DatatableColumn) => { - const indexPattern = await getIndexPatternFromDatatableColumn(column); - - if (!indexPattern) return; - - const aggConfigs = await createAggConfigs(indexPattern, [column.meta.sourceParams as any]); - return aggConfigs.aggs[0]; - }; - - const isFilterableAggDatatableColumn = (column: DatatableColumn) => { - if (column.meta.source !== 'esaggs') { - return false; - } - const aggType = (aggTypesStart.get(column.meta.sourceParams?.type as string) as any)( - {} - ) as IAggType; - return Boolean(aggType.createFilter); - }; - - return { - getIndexPattern: getIndexPatternFromDatatableColumn, - getAggConfig: getAggConfigFromDatatableColumn, - isFilterable: isFilterableAggDatatableColumn, - }; -}; diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 53600a1f44469..630a29a8a7854 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { createDatatableUtilitiesMock } from '../common/mocks'; import { DataPlugin, DataViewsContract } from '.'; import { fieldFormatsServiceMock } from '../../field_formats/public/mocks'; import { searchServiceMock } from './search/mocks'; @@ -58,6 +59,7 @@ const createStartContract = (): Start => { createFiltersFromRangeSelectAction: jest.fn(), }, autocomplete: autocompleteStartMock, + datatableUtilities: createDatatableUtilitiesMock(), search: searchServiceMock.createStartContract(), fieldFormats: fieldFormatsServiceMock.createStartContract(), query: queryStartMock, diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index 7d19c1eb3ac19..50795b4416247 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -42,7 +42,7 @@ import { APPLY_FILTER_TRIGGER, applyFilterTrigger } from './triggers'; import { UsageCollectionSetup } from '../../usage_collection/public'; import { getTableViewDescription } from './utils/table_inspector_view'; import { NowProvider, NowProviderInternalContract } from './now_provider'; -import { getAggsFormats } from '../common'; +import { getAggsFormats, DatatableUtilitiesService } from '../common'; export class DataPublicPlugin implements @@ -108,7 +108,7 @@ export class DataPublicPlugin uiActions: startServices().plugins.uiActions, uiSettings: startServices().core.uiSettings, fieldFormats: startServices().self.fieldFormats, - isFilterable: startServices().self.search.aggs.datatableUtilities.isFilterable, + isFilterable: startServices().self.datatableUtilities.isFilterable, })) ); @@ -166,12 +166,14 @@ export class DataPublicPlugin uiActions.getAction(ACTION_GLOBAL_APPLY_FILTER) ); + const datatableUtilities = new DatatableUtilitiesService(search.aggs, dataViews, fieldFormats); const dataServices = { actions: { createFiltersFromValueClickAction, createFiltersFromRangeSelectAction, }, autocomplete: this.autocomplete.start(), + datatableUtilities, fieldFormats, indexPatterns: dataViews, dataViews, diff --git a/src/plugins/data/public/search/aggs/aggs_service.test.ts b/src/plugins/data/public/search/aggs/aggs_service.test.ts index b0e6e0327e654..101c2c909c7e1 100644 --- a/src/plugins/data/public/search/aggs/aggs_service.test.ts +++ b/src/plugins/data/public/search/aggs/aggs_service.test.ts @@ -79,11 +79,10 @@ describe('AggsService - public', () => { describe('start()', () => { test('exposes proper contract', () => { const start = service.start(startDeps); - expect(Object.keys(start).length).toBe(4); + expect(Object.keys(start).length).toBe(3); expect(start).toHaveProperty('calculateAutoTimeExpression'); expect(start).toHaveProperty('createAggConfigs'); expect(start).toHaveProperty('types'); - expect(start).toHaveProperty('datatableUtilities'); }); test('types registry returns initialized agg types', () => { diff --git a/src/plugins/data/public/search/aggs/aggs_service.ts b/src/plugins/data/public/search/aggs/aggs_service.ts index 4907c3bcbad26..99930a95831ea 100644 --- a/src/plugins/data/public/search/aggs/aggs_service.ts +++ b/src/plugins/data/public/search/aggs/aggs_service.ts @@ -91,13 +91,11 @@ export class AggsService { public start({ fieldFormats, uiSettings, indexPatterns }: AggsStartDependencies): AggsStart { const isDefaultTimezone = () => uiSettings.isDefault('dateFormat:tz'); - const { calculateAutoTimeExpression, datatableUtilities, types } = this.aggsCommonService.start( - { - getConfig: this.getConfig!, - getIndexPattern: indexPatterns.get, - isDefaultTimezone, - } - ); + const { calculateAutoTimeExpression, types } = this.aggsCommonService.start({ + getConfig: this.getConfig!, + getIndexPattern: indexPatterns.get, + isDefaultTimezone, + }); const aggTypesDependencies: AggTypesDependencies = { calculateBounds: this.calculateBounds, @@ -137,7 +135,6 @@ export class AggsService { return { calculateAutoTimeExpression, - datatableUtilities, createAggConfigs: (indexPattern, configStates = []) => { return new AggConfigs(indexPattern, configStates, { typesRegistry }); }, diff --git a/src/plugins/data/public/search/aggs/mocks.ts b/src/plugins/data/public/search/aggs/mocks.ts index fb50058f08348..c45d024384ba6 100644 --- a/src/plugins/data/public/search/aggs/mocks.ts +++ b/src/plugins/data/public/search/aggs/mocks.ts @@ -56,11 +56,6 @@ export const searchAggsSetupMock = (): AggsSetup => ({ export const searchAggsStartMock = (): AggsStart => ({ calculateAutoTimeExpression: getCalculateAutoTimeExpression(getConfig), - datatableUtilities: { - isFilterable: jest.fn(), - getAggConfig: jest.fn(), - getIndexPattern: jest.fn(), - }, createAggConfigs: jest.fn().mockImplementation((indexPattern, configStates = [], schemas) => { return new AggConfigs(indexPattern, configStates, { typesRegistry: mockAggTypesRegistry(), diff --git a/src/plugins/data/public/types.ts b/src/plugins/data/public/types.ts index e2e7c6b222b90..bfc35b8f39c51 100644 --- a/src/plugins/data/public/types.ts +++ b/src/plugins/data/public/types.ts @@ -14,6 +14,7 @@ import { ExpressionsSetup } from 'src/plugins/expressions/public'; import { DataViewsPublicPluginStart } from 'src/plugins/data_views/public'; import { UiActionsSetup, UiActionsStart } from 'src/plugins/ui_actions/public'; import { FieldFormatsSetup, FieldFormatsStart } from 'src/plugins/field_formats/public'; +import { DatatableUtilitiesService } from '../common'; import { AutocompleteSetup, AutocompleteStart } from './autocomplete'; import { createFiltersFromRangeSelectAction, createFiltersFromValueClickAction } from './actions'; import type { ISearchSetup, ISearchStart } from './search'; @@ -83,6 +84,12 @@ export interface DataPublicPluginStart { * {@link DataViewsContract} */ dataViews: DataViewsContract; + + /** + * Datatable type utility functions. + */ + datatableUtilities: DatatableUtilitiesService; + /** * index patterns service * {@link DataViewsContract} diff --git a/src/plugins/data/server/datatable_utilities/datatable_utilities_service.ts b/src/plugins/data/server/datatable_utilities/datatable_utilities_service.ts new file mode 100644 index 0000000000000..3909003cd4d2c --- /dev/null +++ b/src/plugins/data/server/datatable_utilities/datatable_utilities_service.ts @@ -0,0 +1,43 @@ +/* + * 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 { + ElasticsearchClient, + SavedObjectsClientContract, + UiSettingsServiceStart, +} from 'src/core/server'; +import type { FieldFormatsStart } from 'src/plugins/field_formats/server'; +import type { IndexPatternsServiceStart } from 'src/plugins/data_views/server'; +import { DatatableUtilitiesService as DatatableUtilitiesServiceCommon } from '../../common'; +import type { AggsStart } from '../search'; + +export class DatatableUtilitiesService { + constructor( + private aggs: AggsStart, + private dataViews: IndexPatternsServiceStart, + private fieldFormats: FieldFormatsStart, + private uiSettings: UiSettingsServiceStart + ) { + this.asScopedToClient = this.asScopedToClient.bind(this); + } + + async asScopedToClient( + savedObjectsClient: SavedObjectsClientContract, + elasticsearchClient: ElasticsearchClient + ): Promise { + const aggs = await this.aggs.asScopedToClient(savedObjectsClient, elasticsearchClient); + const dataViews = await this.dataViews.dataViewsServiceFactory( + savedObjectsClient, + elasticsearchClient + ); + const uiSettings = this.uiSettings.asScopedToClient(savedObjectsClient); + const fieldFormats = await this.fieldFormats.fieldFormatServiceFactory(uiSettings); + + return new DatatableUtilitiesServiceCommon(aggs, dataViews, fieldFormats); + } +} diff --git a/src/plugins/data/server/datatable_utilities/index.ts b/src/plugins/data/server/datatable_utilities/index.ts new file mode 100644 index 0000000000000..34df78137510a --- /dev/null +++ b/src/plugins/data/server/datatable_utilities/index.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export * from './datatable_utilities_service'; diff --git a/src/plugins/data/server/datatable_utilities/mock.ts b/src/plugins/data/server/datatable_utilities/mock.ts new file mode 100644 index 0000000000000..9ec069fda7ab0 --- /dev/null +++ b/src/plugins/data/server/datatable_utilities/mock.ts @@ -0,0 +1,16 @@ +/* + * 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 { createDatatableUtilitiesMock as createDatatableUtilitiesCommonMock } from '../../common/mocks'; +import type { DatatableUtilitiesService } from './datatable_utilities_service'; + +export function createDatatableUtilitiesMock(): jest.Mocked { + return { + asScopedToClient: jest.fn(createDatatableUtilitiesCommonMock), + } as unknown as jest.Mocked; +} diff --git a/src/plugins/data/server/mocks.ts b/src/plugins/data/server/mocks.ts index 6fd670d869c20..355e809888bd4 100644 --- a/src/plugins/data/server/mocks.ts +++ b/src/plugins/data/server/mocks.ts @@ -16,6 +16,7 @@ import { createFieldFormatsStartMock, } from '../../field_formats/server/mocks'; import { createIndexPatternsStartMock } from './data_views/mocks'; +import { createDatatableUtilitiesMock } from './datatable_utilities/mock'; import { DataRequestHandlerContext } from './search'; import { AutocompleteSetup } from './autocomplete'; @@ -42,6 +43,7 @@ function createStartContract() { */ fieldFormats: createFieldFormatsStartMock(), indexPatterns: createIndexPatternsStartMock(), + datatableUtilities: createDatatableUtilitiesMock(), }; } diff --git a/src/plugins/data/server/plugin.ts b/src/plugins/data/server/plugin.ts index ab8e28755cd77..9d5b3792da566 100644 --- a/src/plugins/data/server/plugin.ts +++ b/src/plugins/data/server/plugin.ts @@ -11,6 +11,7 @@ import { ExpressionsServerSetup } from 'src/plugins/expressions/server'; import { BfetchServerSetup } from 'src/plugins/bfetch/server'; import { PluginStart as DataViewsServerPluginStart } from 'src/plugins/data_views/server'; import { ConfigSchema } from '../config'; +import { DatatableUtilitiesService } from './datatable_utilities'; import type { ISearchSetup, ISearchStart, SearchEnhancements } from './search'; import { SearchService } from './search/search_service'; import { QueryService } from './query/query_service'; @@ -48,6 +49,11 @@ export interface DataPluginStart { */ fieldFormats: FieldFormatsStart; indexPatterns: DataViewsServerPluginStart; + + /** + * Datatable type utility functions. + */ + datatableUtilities: DatatableUtilitiesService; } export interface DataPluginSetupDependencies { @@ -115,10 +121,19 @@ export class DataServerPlugin } public start(core: CoreStart, { fieldFormats, dataViews }: DataPluginStartDependencies) { + const search = this.searchService.start(core, { fieldFormats, indexPatterns: dataViews }); + const datatableUtilities = new DatatableUtilitiesService( + search.aggs, + dataViews, + fieldFormats, + core.uiSettings + ); + return { + datatableUtilities, + search, fieldFormats, indexPatterns: dataViews, - search: this.searchService.start(core, { fieldFormats, indexPatterns: dataViews }), }; } diff --git a/src/plugins/data/server/search/aggs/aggs_service.ts b/src/plugins/data/server/search/aggs/aggs_service.ts index e65c6d4134970..808c0e9cc8499 100644 --- a/src/plugins/data/server/search/aggs/aggs_service.ts +++ b/src/plugins/data/server/search/aggs/aggs_service.ts @@ -72,17 +72,13 @@ export class AggsService { }; const isDefaultTimezone = () => getConfig('dateFormat:tz') === 'Browser'; - const { calculateAutoTimeExpression, datatableUtilities, types } = - this.aggsCommonService.start({ - getConfig, - getIndexPattern: ( - await indexPatterns.indexPatternsServiceFactory( - savedObjectsClient, - elasticsearchClient - ) - ).get, - isDefaultTimezone, - }); + const { calculateAutoTimeExpression, types } = this.aggsCommonService.start({ + getConfig, + getIndexPattern: ( + await indexPatterns.indexPatternsServiceFactory(savedObjectsClient, elasticsearchClient) + ).get, + isDefaultTimezone, + }); const aggTypesDependencies: AggTypesDependencies = { calculateBounds: this.calculateBounds, @@ -118,7 +114,6 @@ export class AggsService { return { calculateAutoTimeExpression, - datatableUtilities, createAggConfigs: (indexPattern, configStates = []) => { return new AggConfigs(indexPattern, configStates, { typesRegistry }); }, diff --git a/src/plugins/data/server/search/aggs/mocks.ts b/src/plugins/data/server/search/aggs/mocks.ts index 3644a3c13c48d..301bc3e5e1240 100644 --- a/src/plugins/data/server/search/aggs/mocks.ts +++ b/src/plugins/data/server/search/aggs/mocks.ts @@ -58,11 +58,6 @@ export const searchAggsSetupMock = (): AggsSetup => ({ const commonStartMock = (): AggsCommonStart => ({ calculateAutoTimeExpression: getCalculateAutoTimeExpression(getConfig), - datatableUtilities: { - getIndexPattern: jest.fn(), - getAggConfig: jest.fn(), - isFilterable: jest.fn(), - }, createAggConfigs: jest.fn().mockImplementation((indexPattern, configStates = [], schemas) => { return new AggConfigs(indexPattern, configStates, { typesRegistry: mockAggTypesRegistry(), From d53154ec5ebb9feb1a77d948e046269cc0a7f6e9 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Wed, 2 Mar 2022 13:58:38 +0100 Subject: [PATCH 03/37] [Reporting] Remove `preserve_layout` injected css (#126475) * remove unnecessary CSS * removed unused discover injected CSS * move visualize-specific css to visualize * added some comments * added missing mock Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/visualizations/kibana.json | 3 +- src/plugins/visualizations/public/mocks.ts | 2 + src/plugins/visualizations/public/plugin.ts | 7 ++ .../public/visualize_screenshot_mode.scss | 60 ++++++++++++++ .../server/layouts/preserve_layout.css | 80 +------------------ 5 files changed, 74 insertions(+), 78 deletions(-) create mode 100644 src/plugins/visualizations/public/visualize_screenshot_mode.scss diff --git a/src/plugins/visualizations/kibana.json b/src/plugins/visualizations/kibana.json index c7fd9c977bc2e..79b04f132077b 100644 --- a/src/plugins/visualizations/kibana.json +++ b/src/plugins/visualizations/kibana.json @@ -12,9 +12,10 @@ "embeddable", "inspector", "savedObjects", + "screenshotMode", "presentationUtil" ], - "optionalPlugins": [ "home", "share", "usageCollection", "spaces", "savedObjectsTaggingOss"], + "optionalPlugins": ["home", "share", "usageCollection", "spaces", "savedObjectsTaggingOss"], "requiredBundles": ["kibanaUtils", "discover", "kibanaReact", "home"], "extraPublicDirs": ["common/constants", "common/utils", "common/expression_functions"], "owner": { diff --git a/src/plugins/visualizations/public/mocks.ts b/src/plugins/visualizations/public/mocks.ts index 0fc142aeead63..69a7c61e68893 100644 --- a/src/plugins/visualizations/public/mocks.ts +++ b/src/plugins/visualizations/public/mocks.ts @@ -23,6 +23,7 @@ import { urlForwardingPluginMock } from '../../../plugins/url_forwarding/public/ import { navigationPluginMock } from '../../../plugins/navigation/public/mocks'; import { presentationUtilPluginMock } from '../../../plugins/presentation_util/public/mocks'; import { savedObjectTaggingOssPluginMock } from '../../saved_objects_tagging_oss/public/mocks'; +import { screenshotModePluginMock } from '../../screenshot_mode/public/mocks'; const createSetupContract = (): VisualizationsSetup => ({ createBaseVisualization: jest.fn(), @@ -68,6 +69,7 @@ const createInstance = async () => { navigation: navigationPluginMock.createStartContract(), presentationUtil: presentationUtilPluginMock.createStartContract(coreMock.createStart()), urlForwarding: urlForwardingPluginMock.createStartContract(), + screenshotMode: screenshotModePluginMock.createStartContract(), }); return { diff --git a/src/plugins/visualizations/public/plugin.ts b/src/plugins/visualizations/public/plugin.ts index c8c4d57543a02..92bcf1dfe6a96 100644 --- a/src/plugins/visualizations/public/plugin.ts +++ b/src/plugins/visualizations/public/plugin.ts @@ -86,6 +86,7 @@ import type { SharePluginSetup, SharePluginStart } from '../../share/public'; import type { UrlForwardingSetup, UrlForwardingStart } from '../../url_forwarding/public'; import type { PresentationUtilPluginStart } from '../../presentation_util/public'; import type { UsageCollectionStart } from '../../usage_collection/public'; +import type { ScreenshotModePluginStart } from '../../screenshot_mode/public'; import type { HomePublicPluginSetup } from '../../home/public'; import type { SpacesPluginStart } from '../../../../x-pack/plugins/spaces/public'; @@ -130,6 +131,7 @@ export interface VisualizationsStartDeps { share?: SharePluginStart; urlForwarding: UrlForwardingStart; usageCollection?: UsageCollectionStart; + screenshotMode: ScreenshotModePluginStart; } /** @@ -289,6 +291,11 @@ export class VisualizationsPlugin params.element.classList.add('visAppWrapper'); const { renderApp } = await import('./visualize_app'); + if (pluginsStart.screenshotMode.isScreenshotMode()) { + params.element.classList.add('visEditorScreenshotModeActive'); + // @ts-expect-error TS error, cannot find type declaration for scss + await import('./visualize_screenshot_mode.scss'); + } const unmount = renderApp(params, services); return () => { data.search.session.clear(); diff --git a/src/plugins/visualizations/public/visualize_screenshot_mode.scss b/src/plugins/visualizations/public/visualize_screenshot_mode.scss new file mode 100644 index 0000000000000..b0a8bb35835bd --- /dev/null +++ b/src/plugins/visualizations/public/visualize_screenshot_mode.scss @@ -0,0 +1,60 @@ +/* hide unusable controls */ +/* TODO: This is the legacy way of hiding chrome elements. Rather use chrome.setIsVisible */ +kbn-top-nav, +filter-bar, +.kbnTopNavMenu__wrapper, +::-webkit-scrollbar, +.euiNavDrawer { + display: none !important; +} + +/* hide unusable controls +* !important is required to override resizable panel inline display */ +.visEditorScreenshotModeActive .visEditor__content .visEditor--default > :not(.visEditor__visualization__wrapper) { + display: none !important; +} + +/** THIS IS FOR TSVB UNTIL REFACTOR **/ +.visEditorScreenshotModeActive .tvbEditorVisualization { + position: static !important; +} +.visEditorScreenshotModeActive .visualize .tvbVisTimeSeries__legendToggle { + /* all non-content rows in interface */ + display: none; +} + +.visEditorScreenshotModeActive .tvbEditor--hideForReporting { + /* all non-content rows in interface */ + display: none; +} +/** END TSVB BAD BAD HACKS **/ + +/* remove left padding from visualizations so that map lines up with .leaflet-container and +* setting the position to be fixed and to take up the entire screen, because some zoom levels/viewports +* are triggering the media breakpoints that cause the .visEditor__canvas to take up more room than the viewport */ + +.visEditorScreenshotModeActive .visEditor .visEditor__canvas { + padding-left: 0; + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; +} + +/** + * Visualization tweaks + */ + +/* hide unusable controls */ +.visEditorScreenshotModeActive .visualize .visLegend__toggle, +.visEditorScreenshotModeActive .visualize .kbnAggTable__controls, +.visEditorScreenshotModeActive .visualize .leaflet-container .leaflet-top.leaflet-left, +.visEditorScreenshotModeActive .visualize paginate-controls /* page numbers */ { + display: none; +} + +/* Ensure the min-height of the small breakpoint isn't used */ +.visEditorScreenshotModeActive .vis-editor visualization { + min-height: 0 !important; +} diff --git a/x-pack/plugins/screenshotting/server/layouts/preserve_layout.css b/x-pack/plugins/screenshotting/server/layouts/preserve_layout.css index 60513c417165f..7b692881d5bde 100644 --- a/x-pack/plugins/screenshotting/server/layouts/preserve_layout.css +++ b/x-pack/plugins/screenshotting/server/layouts/preserve_layout.css @@ -1,12 +1,5 @@ -/* - ****** - ****** This is a collection of CSS overrides that make Kibana look better for - ****** generating PDF reports with headless browser - ****** - */ - /** - * global + * Global utilities */ /* elements can hide themselves when shared */ @@ -14,26 +7,9 @@ display: none !important; } -/* hide unusable controls */ -kbn-top-nav, -filter-bar, -.kbnTopNavMenu__wrapper, -::-webkit-scrollbar, -.euiNavDrawer { - display: none !important; -} - /** - * Discover Tweaks - */ - -/* hide unusable controls */ -discover-app .dscTimechart, -discover-app .dscSidebar__container, -discover-app .dscCollapsibleSidebar__collapseButton, -discover-app .discover-table-footer { - display: none; -} +* Global overrides +*/ /** * The global banner (e.g. "Help us improve Elastic...") should not print. @@ -41,53 +17,3 @@ discover-app .discover-table-footer { #globalBannerList { display: none; } - -/** - * Visualize Editor Tweaks - */ - -/* hide unusable controls -* !important is required to override resizable panel inline display */ -.visEditor__content .visEditor--default > :not(.visEditor__visualization__wrapper) { - display: none !important; -} - -/** THIS IS FOR TSVB UNTIL REFACTOR **/ -.tvbEditorVisualization { - position: static !important; -} -.visualize .tvbVisTimeSeries__legendToggle, -.tvbEditor--hideForReporting { - /* all non-content rows in interface */ - display: none; -} -/** END TSVB BAD BAD HACKS **/ - -/* remove left padding from visualizations so that map lines up with .leaflet-container and -* setting the position to be fixed and to take up the entire screen, because some zoom levels/viewports -* are triggering the media breakpoints that cause the .visEditor__canvas to take up more room than the viewport */ -.visEditor .visEditor__canvas { - padding-left: 0px; - position: fixed; - width: 100%; - height: 100%; - top: 0; - left: 0; -} - -/** - * Visualization tweaks - */ - -/* hide unusable controls */ -.visualize .visLegend__toggle, -.visualize .kbnAggTable__controls/* export raw, export formatted, etc. */ , -.visualize .leaflet-container .leaflet-top.leaflet-left/* tilemap controls */ , -.visualize paginate-controls /* page numbers */ { - display: none; -} - -/* Ensure the min-height of the small breakpoint isn't used */ -.vis-editor visualization { - min-height: 0 !important; -} From 1e0a394dceb8b17e784b4873afe37b5590735f52 Mon Sep 17 00:00:00 2001 From: Giorgos Bamparopoulos Date: Wed, 2 Mar 2022 14:11:54 +0000 Subject: [PATCH 04/37] Update the command that creates APM mappings to use system_indices_superuser (#126623) --- x-pack/plugins/apm/dev_docs/local_setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/dev_docs/local_setup.md b/x-pack/plugins/apm/dev_docs/local_setup.md index 19864abd795ba..b3c9d0acbaebc 100644 --- a/x-pack/plugins/apm/dev_docs/local_setup.md +++ b/x-pack/plugins/apm/dev_docs/local_setup.md @@ -21,7 +21,7 @@ yarn es snapshot **Create APM mappings** ``` -node ./scripts/es_archiver load "x-pack/plugins/apm/ftr_e2e/cypress/fixtures/es_archiver/apm_mappings_only_8.0.0" --es-url=http://elastic:changeme@localhost:9200 --kibana-url=http://elastic:changeme@localhost:5601 --config=./test/functional/config.js +node ./scripts/es_archiver load "x-pack/plugins/apm/ftr_e2e/cypress/fixtures/es_archiver/apm_mappings_only_8.0.0" --es-url=http://system_indices_superuser:changeme@localhost:9200 --kibana-url=http://elastic:changeme@localhost:5601 --config=./test/functional/config.js ``` *Note: Elasticsearch must be available before running the above command* From d8543e8516643f986792512943e840904a11022a Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Wed, 2 Mar 2022 17:28:52 +0300 Subject: [PATCH 05/37] [TSVB] Cancel discarded searches (#125197) Closes: #46353 Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../application/components/vis_editor.tsx | 1 + .../vis_types/timeseries/public/metrics_fn.ts | 9 +- .../timeseries/public/request_handler.ts | 104 ++++++++++-------- .../abstract_search_strategy.test.ts | 6 +- .../strategies/abstract_search_strategy.ts | 14 ++- 5 files changed, 83 insertions(+), 51 deletions(-) diff --git a/src/plugins/vis_types/timeseries/public/application/components/vis_editor.tsx b/src/plugins/vis_types/timeseries/public/application/components/vis_editor.tsx index 4c71581fcb0bf..59710cbcff616 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/vis_editor.tsx +++ b/src/plugins/vis_types/timeseries/public/application/components/vis_editor.tsx @@ -239,6 +239,7 @@ export class VisEditor extends Component ({ async fn( input, args, - { getSearchSessionId, isSyncColorsEnabled, getExecutionContext, inspectorAdapters } + { + getSearchSessionId, + isSyncColorsEnabled, + getExecutionContext, + inspectorAdapters, + abortSignal: expressionAbortSignal, + } ) { const visParams: TimeseriesVisParams = JSON.parse(args.params); const uiState = JSON.parse(args.uiState); @@ -70,6 +76,7 @@ export const createMetricsFn = (): TimeseriesExpressionFunctionDefinition => ({ searchSessionId: getSearchSessionId(), executionContext: getExecutionContext(), inspectorAdapters, + expressionAbortSignal, }); return { diff --git a/src/plugins/vis_types/timeseries/public/request_handler.ts b/src/plugins/vis_types/timeseries/public/request_handler.ts index bb15f32886cdc..dcb1b0691602d 100644 --- a/src/plugins/vis_types/timeseries/public/request_handler.ts +++ b/src/plugins/vis_types/timeseries/public/request_handler.ts @@ -22,6 +22,7 @@ interface MetricsRequestHandlerParams { searchSessionId?: string; executionContext?: KibanaExecutionContext; inspectorAdapters?: Adapters; + expressionAbortSignal: AbortSignal; } export const metricsRequestHandler = async ({ @@ -31,63 +32,72 @@ export const metricsRequestHandler = async ({ searchSessionId, executionContext, inspectorAdapters, + expressionAbortSignal, }: MetricsRequestHandlerParams): Promise => { - const config = getUISettings(); - const data = getDataStart(); - const theme = getCoreStart().theme; + if (!expressionAbortSignal.aborted) { + const config = getUISettings(); + const data = getDataStart(); + const theme = getCoreStart().theme; + const abortController = new AbortController(); + const expressionAbortHandler = function () { + abortController.abort(); + }; - const timezone = getTimezone(config); - const uiStateObj = uiState[visParams.type] ?? {}; - const dataSearch = data.search; - const parsedTimeRange = data.query.timefilter.timefilter.calculateBounds(input?.timeRange!); + expressionAbortSignal.addEventListener('abort', expressionAbortHandler); - if (visParams && visParams.id && !visParams.isModelInvalid) { - const untrackSearch = - dataSearch.session.isCurrentSession(searchSessionId) && - dataSearch.session.trackSearch({ - abort: () => { - // TODO: support search cancellations - }, - }); + const timezone = getTimezone(config); + const uiStateObj = uiState[visParams.type] ?? {}; + const dataSearch = data.search; + const parsedTimeRange = data.query.timefilter.timefilter.calculateBounds(input?.timeRange!); - try { - const searchSessionOptions = dataSearch.session.getSearchOptions(searchSessionId); + if (visParams && visParams.id && !visParams.isModelInvalid && !expressionAbortSignal.aborted) { + const untrackSearch = + dataSearch.session.isCurrentSession(searchSessionId) && + dataSearch.session.trackSearch({ + abort: () => abortController.abort(), + }); - const visData: TimeseriesVisData = await getCoreStart().http.post(ROUTES.VIS_DATA, { - body: JSON.stringify({ - timerange: { - timezone, - ...parsedTimeRange, - }, - query: input?.query, - filters: input?.filters, - panels: [visParams], - state: uiStateObj, - ...(searchSessionOptions && { - searchSession: searchSessionOptions, + try { + const searchSessionOptions = dataSearch.session.getSearchOptions(searchSessionId); + + const visData: TimeseriesVisData = await getCoreStart().http.post(ROUTES.VIS_DATA, { + body: JSON.stringify({ + timerange: { + timezone, + ...parsedTimeRange, + }, + query: input?.query, + filters: input?.filters, + panels: [visParams], + state: uiStateObj, + ...(searchSessionOptions && { + searchSession: searchSessionOptions, + }), }), - }), - context: executionContext, - }); + context: executionContext, + signal: abortController.signal, + }); - inspectorAdapters?.requests?.reset(); + inspectorAdapters?.requests?.reset(); - Object.entries(visData.trackedEsSearches || {}).forEach(([key, query]) => { - inspectorAdapters?.requests - ?.start(query.label ?? key, { searchSessionId }) - .json(query.body) - .ok({ time: query.time }); + Object.entries(visData.trackedEsSearches || {}).forEach(([key, query]) => { + inspectorAdapters?.requests + ?.start(query.label ?? key, { searchSessionId }) + .json(query.body) + .ok({ time: query.time }); - if (query.response && config.get(UI_SETTINGS.ALLOW_CHECKING_FOR_FAILED_SHARDS)) { - handleResponse({ body: query.body }, { rawResponse: query.response }, theme); - } - }); + if (query.response && config.get(UI_SETTINGS.ALLOW_CHECKING_FOR_FAILED_SHARDS)) { + handleResponse({ body: query.body }, { rawResponse: query.response }, theme); + } + }); - return visData; - } finally { - if (untrackSearch && dataSearch.session.isCurrentSession(searchSessionId)) { - // untrack if this search still belongs to current session - untrackSearch(); + return visData; + } finally { + if (untrackSearch && dataSearch.session.isCurrentSession(searchSessionId)) { + // untrack if this search still belongs to current session + untrackSearch(); + } + expressionAbortSignal.removeEventListener('abort', expressionAbortHandler); } } } diff --git a/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts b/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts index 1a52132612f71..f52d1bd9b7427 100644 --- a/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts +++ b/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts @@ -7,8 +7,8 @@ */ import { IndexPatternsService } from '../../../../../../data/common'; - import { from } from 'rxjs'; + import { AbstractSearchStrategy, EsSearchRequest } from './abstract_search_strategy'; import type { FieldSpec } from '../../../../../../data/common'; import type { CachedIndexPatternFetcher } from '../lib/cached_index_pattern_fetcher'; @@ -76,6 +76,9 @@ describe('AbstractSearchStrategy', () => { isStored: true, }, }, + events: { + aborted$: from([]), + }, } as unknown as VisTypeTimeseriesVisDataRequest, searches ); @@ -90,6 +93,7 @@ describe('AbstractSearchStrategy', () => { indexType: undefined, }, { + abortSignal: new AbortController().signal, sessionId: '1', isRestore: false, isStored: true, diff --git a/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts b/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts index 1d3650ccedbd3..58c67f84a9373 100644 --- a/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts +++ b/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts @@ -5,9 +5,9 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ - import { tap } from 'rxjs/operators'; import { omit } from 'lodash'; +import type { Observable } from 'rxjs'; import { IndexPatternsService } from '../../../../../../data/server'; import { toSanitizedFieldType } from '../../../../common/fields_utils'; @@ -27,6 +27,12 @@ export interface EsSearchRequest { }; } +function getRequestAbortedSignal(aborted$: Observable): AbortSignal { + const controller = new AbortController(); + aborted$.subscribe(() => controller.abort()); + return controller.signal; +} + export abstract class AbstractSearchStrategy { async search( requestContext: VisTypeTimeseriesRequestHandlerContext, @@ -37,6 +43,10 @@ export abstract class AbstractSearchStrategy { ) { const requests: any[] = []; + // User may abort the request without waiting for the results + // we need to handle this scenario by aborting underlying server requests + const abortSignal = getRequestAbortedSignal(req.events.aborted$); + esRequests.forEach(({ body, index, trackingEsSearchMeta }) => { const startTime = Date.now(); requests.push( @@ -49,7 +59,7 @@ export abstract class AbstractSearchStrategy { index, }, }, - req.body.searchSession + { ...req.body.searchSession, abortSignal } ) .pipe( tap((data) => { From 7a19d89645c84cf1645047e69d383a7577a8d32f Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Wed, 2 Mar 2022 07:34:41 -0700 Subject: [PATCH 06/37] [Reporting/Screenshotting] Add libnss3 to the list of package dependencies (#126384) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- docs/setup/configuring-reporting.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/setup/configuring-reporting.asciidoc b/docs/setup/configuring-reporting.asciidoc index 0b2fe48670777..bd800d6032309 100644 --- a/docs/setup/configuring-reporting.asciidoc +++ b/docs/setup/configuring-reporting.asciidoc @@ -30,6 +30,7 @@ If you are using Ubuntu/Debian systems, install the following packages: * `fonts-liberation` * `libfontconfig1` +* `libnss3` If the system is missing dependencies, *Reporting* fails in a non-deterministic way. {kib} runs a self-test at server startup, and if it encounters errors, logs them in the Console. The error message does not include From 0fb3c9deaa29db076ef48cedd09ff7d964dc6598 Mon Sep 17 00:00:00 2001 From: Greg Back <1045796+gtback@users.noreply.github.com> Date: Wed, 2 Mar 2022 10:00:41 -0500 Subject: [PATCH 07/37] Use 'label' rather than 'category' in docnav (#126640) --- nav-kibana-dev.docnav.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/nav-kibana-dev.docnav.json b/nav-kibana-dev.docnav.json index a86772d3ef27f..933e257ca235e 100644 --- a/nav-kibana-dev.docnav.json +++ b/nav-kibana-dev.docnav.json @@ -6,7 +6,7 @@ "description": "Developer documentation for building custom Kibana plugins and extending Kibana functionality.", "items": [ { - "category": "Getting started", + "label": "Getting started", "items": [ { "id": "kibDevDocsWelcome" }, { "id": "kibDevTutorialSetupDevEnv" }, @@ -16,7 +16,7 @@ ] }, { - "category": "Key concepts", + "label": "Key concepts", "items": [ { "id": "kibPlatformIntro" }, { "id": "kibDevAnatomyOfAPlugin" }, @@ -32,7 +32,7 @@ ] }, { - "category": "Tutorials", + "label": "Tutorials", "items": [ { "id": "kibDevTutorialTestingPlugins" }, { "id": "kibDevTutorialSavedObject" }, @@ -53,7 +53,7 @@ ] }, { - "category": "Contributing", + "label": "Contributing", "items": [ { "id": "kibRepoStructure" }, { "id": "kibDevPrinciples" }, @@ -65,7 +65,7 @@ ] }, { - "category": "Contributors Newsletters", + "label": "Contributors Newsletters", "items": [ { "id": "kibFebruary2022ContributorNewsletter" }, { "id": "kibJanuary2022ContributorNewsletter" }, @@ -82,7 +82,7 @@ ] }, { - "category": "API documentation", + "label": "API documentation", "items": [ { "id": "kibDevDocsApiWelcome" }, { "id": "kibDevDocsPluginDirectory" }, From e89e5dbf861f94d056207020c62b2c74e9058d71 Mon Sep 17 00:00:00 2001 From: "Joey F. Poon" Date: Wed, 2 Mar 2022 09:03:58 -0600 Subject: [PATCH 08/37] [Security Solution] blocklist list fixup (#126629) --- .../exceptions_list_item_generator.ts | 2 +- .../endpoint/service/artifacts/constants.ts | 2 ++ .../pages/blocklist/services/index.ts | 2 +- .../pages/blocklist/view/blocklist.tsx | 2 +- .../fleet_integration.test.ts | 8 ++++---- .../handlers/remove_policy_from_artifacts.ts | 18 ++++-------------- 6 files changed, 13 insertions(+), 21 deletions(-) diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts index 5789db692eb45..f92408752d18e 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts @@ -256,7 +256,7 @@ export class ExceptionsListItemGenerator extends BaseDataGenerator = [ diff --git a/x-pack/plugins/security_solution/public/management/pages/blocklist/services/index.ts b/x-pack/plugins/security_solution/public/management/pages/blocklist/services/index.ts index 002093007329d..fab5be9f7ab3b 100644 --- a/x-pack/plugins/security_solution/public/management/pages/blocklist/services/index.ts +++ b/x-pack/plugins/security_solution/public/management/pages/blocklist/services/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export * from './blocklists_api_client'; +export { BlocklistsApiClient } from './blocklists_api_client'; diff --git a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.tsx b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.tsx index 8d98b401102f1..c016c10ad319f 100644 --- a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/blocklist.tsx @@ -39,7 +39,7 @@ const BLOCKLIST_PAGE_LABELS: ArtifactListPageProps['labels'] = { defaultMessage: 'Blocklist', }), pageAboutInfo: i18n.translate('xpack.securitySolution.blocklist.pageAboutInfo', { - defaultMessage: 'Add a blocklist to block applications or files from running.', + defaultMessage: 'Add a blocklist to block applications or files from running on the endpoint.', }), pageAddButtonTitle: i18n.translate('xpack.securitySolution.blocklist.pageAddButtonTitle', { defaultMessage: 'Add blocklist entry', diff --git a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts index db39d4c5108e2..b5e787bd90c98 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts @@ -41,8 +41,8 @@ import { Manifest } from '../endpoint/lib/artifacts'; import { NewPackagePolicy } from '../../../fleet/common/types/models'; import { ManifestSchema } from '../../common/endpoint/schema/manifest'; import { DeletePackagePoliciesResponse } from '../../../fleet/common'; -import { ARTIFACT_LISTS_IDS_TO_REMOVE } from './handlers/remove_policy_from_artifacts'; import { createMockPolicyData } from '../endpoint/services/feature_usage'; +import { ALL_ENDPOINT_ARTIFACT_LIST_IDS } from '../../common/endpoint/service/artifacts/constants'; describe('ingest_integration tests ', () => { let endpointAppContextMock: EndpointAppContextServiceStartContract; @@ -334,11 +334,11 @@ describe('ingest_integration tests ', () => { await invokeDeleteCallback(); expect(exceptionListClient.findExceptionListsItem).toHaveBeenCalledWith({ - listId: ARTIFACT_LISTS_IDS_TO_REMOVE, - filter: ARTIFACT_LISTS_IDS_TO_REMOVE.map( + listId: ALL_ENDPOINT_ARTIFACT_LIST_IDS, + filter: ALL_ENDPOINT_ARTIFACT_LIST_IDS.map( () => `exception-list-agnostic.attributes.tags:"policy:${policyId}"` ), - namespaceType: ARTIFACT_LISTS_IDS_TO_REMOVE.map(() => 'agnostic'), + namespaceType: ALL_ENDPOINT_ARTIFACT_LIST_IDS.map(() => 'agnostic'), page: 1, perPage: 50, sortField: undefined, diff --git a/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_policy_from_artifacts.ts b/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_policy_from_artifacts.ts index 57a23d677e014..28ee9d5ad81da 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_policy_from_artifacts.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_policy_from_artifacts.ts @@ -7,19 +7,9 @@ import pMap from 'p-map'; -import { - ENDPOINT_TRUSTED_APPS_LIST_ID, - ENDPOINT_EVENT_FILTERS_LIST_ID, - ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID, -} from '@kbn/securitysolution-list-constants'; import { ExceptionListClient } from '../../../../lists/server'; import { PostPackagePolicyDeleteCallback } from '../../../../fleet/server'; - -export const ARTIFACT_LISTS_IDS_TO_REMOVE = [ - ENDPOINT_TRUSTED_APPS_LIST_ID, - ENDPOINT_EVENT_FILTERS_LIST_ID, - ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID, -]; +import { ALL_ENDPOINT_ARTIFACT_LIST_IDS } from '../../../common/endpoint/service/artifacts/constants'; /** * Removes policy from artifacts @@ -32,11 +22,11 @@ export const removePolicyFromArtifacts = async ( const findArtifactsByPolicy = (currentPage: number) => { return exceptionsClient.findExceptionListsItem({ - listId: ARTIFACT_LISTS_IDS_TO_REMOVE, - filter: ARTIFACT_LISTS_IDS_TO_REMOVE.map( + listId: ALL_ENDPOINT_ARTIFACT_LIST_IDS as string[], + filter: ALL_ENDPOINT_ARTIFACT_LIST_IDS.map( () => `exception-list-agnostic.attributes.tags:"policy:${policy.id}"` ), - namespaceType: ARTIFACT_LISTS_IDS_TO_REMOVE.map(() => 'agnostic'), + namespaceType: ALL_ENDPOINT_ARTIFACT_LIST_IDS.map(() => 'agnostic'), page: currentPage, perPage: 50, sortField: undefined, From f72419889fc2f05397415307caedcded9644e75f Mon Sep 17 00:00:00 2001 From: Devon Thomson Date: Wed, 2 Mar 2022 10:05:46 -0500 Subject: [PATCH 09/37] replace references (#126647) --- .../public/components/editor/control_editor.tsx | 4 ++-- .../public/components/editor/controls_tab.tsx | 4 ++-- .../public/components/editor/field_select.tsx | 10 +++++----- .../components/editor/list_control_editor.tsx | 11 ++++++----- .../components/editor/range_control_editor.tsx | 7 ++++--- .../input_control_vis/public/control/control.ts | 2 +- .../public/control/create_search_source.ts | 5 +++-- .../filter_manager/filter_manager.test.ts | 9 +++------ .../control/filter_manager/filter_manager.ts | 15 ++++++--------- .../phrase_filter_manager.test.ts | 17 +++++++---------- .../filter_manager/phrase_filter_manager.ts | 7 ++----- .../filter_manager/range_filter_manager.test.ts | 17 +++++++---------- .../public/control/list_control_factory.ts | 4 ++-- .../public/control/range_control_factory.ts | 9 +++------ .../public/test_utils/get_index_pattern_mock.ts | 6 +++--- .../input_control_vis/public/vis_controller.tsx | 3 ++- src/plugins/input_control_vis/tsconfig.json | 1 + 17 files changed, 59 insertions(+), 72 deletions(-) diff --git a/src/plugins/input_control_vis/public/components/editor/control_editor.tsx b/src/plugins/input_control_vis/public/components/editor/control_editor.tsx index 76727fcaa645f..cb0ea78d613b3 100644 --- a/src/plugins/input_control_vis/public/components/editor/control_editor.tsx +++ b/src/plugins/input_control_vis/public/components/editor/control_editor.tsx @@ -22,7 +22,7 @@ import { import { RangeControlEditor } from './range_control_editor'; import { ListControlEditor } from './list_control_editor'; import { getTitle, ControlParams, CONTROL_TYPES, ControlParamsOptions } from '../../editor_utils'; -import { IndexPattern } from '../../../../data/public'; +import { DataView } from '../../../../data_views/public'; import { InputControlVisDependencies } from '../../plugin'; import './control_editor.scss'; @@ -35,7 +35,7 @@ interface ControlEditorUiProps { handleRemoveControl: (controlIndex: number) => void; handleIndexPatternChange: (controlIndex: number, indexPatternId: string) => void; handleFieldNameChange: (controlIndex: number, fieldName: string) => void; - getIndexPattern: (indexPatternId: string) => Promise; + getIndexPattern: (indexPatternId: string) => Promise; handleOptionsChange: ( controlIndex: number, optionName: T, diff --git a/src/plugins/input_control_vis/public/components/editor/controls_tab.tsx b/src/plugins/input_control_vis/public/components/editor/controls_tab.tsx index 41a6b34259a72..0b000aa61f34e 100644 --- a/src/plugins/input_control_vis/public/components/editor/controls_tab.tsx +++ b/src/plugins/input_control_vis/public/components/editor/controls_tab.tsx @@ -20,7 +20,7 @@ import { } from '@elastic/eui'; import { VisEditorOptionsProps } from 'src/plugins/visualizations/public'; -import { IndexPattern } from 'src/plugins/data/public'; +import { DataView } from '../../../../data_views/public'; import { ControlEditor } from './control_editor'; import { addControl, @@ -49,7 +49,7 @@ class ControlsTab extends PureComponent { type: CONTROL_TYPES.LIST, }; - getIndexPattern = async (indexPatternId: string): Promise => { + getIndexPattern = async (indexPatternId: string): Promise => { const [, startDeps] = await this.props.deps.core.getStartServices(); return await startDeps.data.indexPatterns.get(indexPatternId); }; diff --git a/src/plugins/input_control_vis/public/components/editor/field_select.tsx b/src/plugins/input_control_vis/public/components/editor/field_select.tsx index 1ecbf2772ebfd..7cc818b71d795 100644 --- a/src/plugins/input_control_vis/public/components/editor/field_select.tsx +++ b/src/plugins/input_control_vis/public/components/editor/field_select.tsx @@ -12,7 +12,7 @@ import React, { Component } from 'react'; import { injectI18n, FormattedMessage, InjectedIntlProps } from '@kbn/i18n-react'; import { EuiFormRow, EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { IndexPattern, IndexPatternField } from '../../../../data/public'; +import { DataView, DataViewField } from '../../../../data_views/public'; interface FieldSelectUiState { isLoading: boolean; @@ -21,11 +21,11 @@ interface FieldSelectUiState { } export type FieldSelectUiProps = InjectedIntlProps & { - getIndexPattern: (indexPatternId: string) => Promise; + getIndexPattern: (indexPatternId: string) => Promise; indexPatternId: string; onChange: (value: any) => void; fieldName?: string; - filterField?: (field: IndexPatternField) => boolean; + filterField?: (field: DataViewField) => boolean; controlIndex: number; }; @@ -74,7 +74,7 @@ class FieldSelectUi extends Component { return; } - let indexPattern: IndexPattern; + let indexPattern: DataView; try { indexPattern = await this.props.getIndexPattern(indexPatternId); } catch (err) { @@ -96,7 +96,7 @@ class FieldSelectUi extends Component { const fields: Array> = []; indexPattern.fields .filter(this.props.filterField ?? (() => true)) - .forEach((field: IndexPatternField) => { + .forEach((field: DataViewField) => { const fieldsList = fieldsByTypeMap.get(field.type) ?? []; fieldsList.push(field.name); fieldsByTypeMap.set(field.type, fieldsList); diff --git a/src/plugins/input_control_vis/public/components/editor/list_control_editor.tsx b/src/plugins/input_control_vis/public/components/editor/list_control_editor.tsx index 2bf1bacbbcd5b..720b1325142ec 100644 --- a/src/plugins/input_control_vis/public/components/editor/list_control_editor.tsx +++ b/src/plugins/input_control_vis/public/components/editor/list_control_editor.tsx @@ -14,7 +14,8 @@ import { EuiFormRow, EuiFieldNumber, EuiSwitch, EuiSelect } from '@elastic/eui'; import { IndexPatternSelectFormRow } from './index_pattern_select_form_row'; import { FieldSelect } from './field_select'; import { ControlParams, ControlParamsOptions } from '../../editor_utils'; -import { IndexPattern, IndexPatternField, IndexPatternSelectProps } from '../../../../data/public'; +import { IndexPatternSelectProps } from '../../../../data/public'; +import { DataView, DataViewField } from '../../../../data_views/public'; import { InputControlVisDependencies } from '../../plugin'; interface ListControlEditorState { @@ -25,7 +26,7 @@ interface ListControlEditorState { } interface ListControlEditorProps { - getIndexPattern: (indexPatternId: string) => Promise; + getIndexPattern: (indexPatternId: string) => Promise; controlIndex: number; controlParams: ControlParams; handleFieldNameChange: (fieldName: string) => void; @@ -40,7 +41,7 @@ interface ListControlEditorProps { deps: InputControlVisDependencies; } -function filterField(field: IndexPatternField) { +function filterField(field: DataViewField) { return ( Boolean(field.aggregatable) && ['number', 'boolean', 'date', 'ip', 'string'].includes(field.type) @@ -104,7 +105,7 @@ export class ListControlEditor extends PureComponent< return; } - let indexPattern: IndexPattern; + let indexPattern: DataView; try { indexPattern = await this.props.getIndexPattern(this.props.controlParams.indexPattern); } catch (err) { @@ -116,7 +117,7 @@ export class ListControlEditor extends PureComponent< return; } - const field = (indexPattern.fields as IndexPatternField[]).find( + const field = (indexPattern.fields as DataViewField[]).find( ({ name }) => name === this.props.controlParams.fieldName ); if (!field) { diff --git a/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx b/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx index cdf8663caea56..913eb49c96cfe 100644 --- a/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx +++ b/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx @@ -14,13 +14,14 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { IndexPatternSelectFormRow } from './index_pattern_select_form_row'; import { FieldSelect } from './field_select'; import { ControlParams, ControlParamsOptions } from '../../editor_utils'; -import { IndexPattern, IndexPatternField, IndexPatternSelectProps } from '../../../../data/public'; +import { IndexPatternSelectProps } from '../../../../data/public'; +import { DataView, DataViewField } from '../../../../data_views/public'; import { InputControlVisDependencies } from '../../plugin'; interface RangeControlEditorProps { controlIndex: number; controlParams: ControlParams; - getIndexPattern: (indexPatternId: string) => Promise; + getIndexPattern: (indexPatternId: string) => Promise; handleFieldNameChange: (fieldName: string) => void; handleIndexPatternChange: (indexPatternId: string) => void; handleOptionsChange: ( @@ -35,7 +36,7 @@ interface RangeControlEditorState { IndexPatternSelect: ComponentType | null; } -function filterField(field: IndexPatternField) { +function filterField(field: DataViewField) { return field.type === 'number'; } diff --git a/src/plugins/input_control_vis/public/control/control.ts b/src/plugins/input_control_vis/public/control/control.ts index 2df4a417da43c..26a88be6cd907 100644 --- a/src/plugins/input_control_vis/public/control/control.ts +++ b/src/plugins/input_control_vis/public/control/control.ts @@ -9,7 +9,7 @@ import _ from 'lodash'; import { i18n } from '@kbn/i18n'; -import { Filter } from 'src/plugins/data/public'; +import { Filter } from '@kbn/es-query'; import { ControlParams, ControlParamsOptions, CONTROL_TYPES } from '../editor_utils'; import { RangeFilterManager } from './filter_manager/range_filter_manager'; import { PhraseFilterManager } from './filter_manager/phrase_filter_manager'; diff --git a/src/plugins/input_control_vis/public/control/create_search_source.ts b/src/plugins/input_control_vis/public/control/create_search_source.ts index 87dec8b1d9a24..c9db1de9f7f22 100644 --- a/src/plugins/input_control_vis/public/control/create_search_source.ts +++ b/src/plugins/input_control_vis/public/control/create_search_source.ts @@ -9,15 +9,16 @@ import { Filter } from '@kbn/es-query'; import { SerializedSearchSourceFields, - IndexPattern, TimefilterContract, DataPublicPluginStart, } from 'src/plugins/data/public'; +import { DataView } from '../../../data_views/public'; + export async function createSearchSource( { create }: DataPublicPluginStart['search']['searchSource'], initialState: SerializedSearchSourceFields | null, - indexPattern: IndexPattern, + indexPattern: DataView, aggs: any, useTimeFilter: boolean, filters: Filter[] = [], diff --git a/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts b/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts index a96326a626a27..7759ba3b34607 100644 --- a/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts +++ b/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts @@ -10,11 +10,8 @@ import expect from '@kbn/expect'; import { FilterManager } from './filter_manager'; import { coreMock } from '../../../../../core/public/mocks'; -import { - Filter, - FilterManager as QueryFilterManager, - IndexPatternsContract, -} from '../../../../data/public'; +import { FilterManager as QueryFilterManager, DataViewsContract } from '../../../../data/public'; +import { Filter } from '@kbn/es-query'; const setupMock = coreMock.createSetup(); @@ -44,7 +41,7 @@ describe('FilterManager', function () { controlId, 'field1', '1', - {} as IndexPatternsContract, + {} as DataViewsContract, queryFilterMock ); }); diff --git a/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts b/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts index f35eb364ecaf6..420cb8fe844d7 100644 --- a/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts +++ b/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts @@ -6,23 +6,20 @@ * Side Public License, v 1. */ +import { Filter } from '@kbn/es-query'; import _ from 'lodash'; -import { - FilterManager as QueryFilterManager, - IndexPattern, - Filter, - IndexPatternsContract, -} from '../../../../data/public'; +import { FilterManager as QueryFilterManager, DataViewsContract } from '../../../../data/public'; +import { DataView } from '../../../../data_views/public'; export abstract class FilterManager { - protected indexPattern: IndexPattern | undefined; + protected indexPattern: DataView | undefined; constructor( public controlId: string, public fieldName: string, private indexPatternId: string, - private indexPatternsService: IndexPatternsContract, + private indexPatternsService: DataViewsContract, protected queryFilter: QueryFilterManager ) {} @@ -48,7 +45,7 @@ export abstract class FilterManager { } } - getIndexPattern(): IndexPattern | undefined { + getIndexPattern(): DataView | undefined { return this.indexPattern; } diff --git a/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts b/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts index 14a616e8a0dbe..45e67ad742a64 100644 --- a/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts +++ b/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts @@ -9,11 +9,8 @@ import { Filter } from '@kbn/es-query'; import expect from '@kbn/expect'; -import { - IndexPattern, - FilterManager as QueryFilterManager, - IndexPatternsContract, -} from '../../../../data/public'; +import { FilterManager as QueryFilterManager, DataViewsContract } from '../../../../data/public'; +import { DataView } from '../../../../data_views/public'; import { PhraseFilterManager } from './phrase_filter_manager'; describe('PhraseFilterManager', function () { @@ -27,7 +24,7 @@ describe('PhraseFilterManager', function () { convert: (value: any) => value, }, }; - const indexPatternMock: IndexPattern = { + const indexPatternMock: DataView = { id: indexPatternId, fields: { getByName: (name: string) => { @@ -35,10 +32,10 @@ describe('PhraseFilterManager', function () { return fields[name]; }, }, - } as IndexPattern; + } as DataView; const indexPatternsServiceMock = { get: jest.fn().mockReturnValue(Promise.resolve(indexPatternMock)), - } as unknown as jest.Mocked; + } as unknown as jest.Mocked; const queryFilterMock: QueryFilterManager = {} as QueryFilterManager; let filterManager: PhraseFilterManager; beforeEach(async () => { @@ -89,7 +86,7 @@ describe('PhraseFilterManager', function () { id: string, fieldName: string, indexPatternId: string, - indexPatternsService: IndexPatternsContract, + indexPatternsService: DataViewsContract, queryFilter: QueryFilterManager ) { super(id, fieldName, indexPatternId, indexPatternsService, queryFilter); @@ -105,7 +102,7 @@ describe('PhraseFilterManager', function () { } } - const indexPatternsServiceMock = {} as IndexPatternsContract; + const indexPatternsServiceMock = {} as DataViewsContract; const queryFilterMock: QueryFilterManager = {} as QueryFilterManager; let filterManager: MockFindFiltersPhraseFilterManager; beforeEach(() => { diff --git a/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.ts b/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.ts index 98ba8b4fbcda8..0653d25f16d44 100644 --- a/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.ts +++ b/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.ts @@ -18,17 +18,14 @@ import { PhraseFilter, } from '@kbn/es-query'; import { FilterManager } from './filter_manager'; -import { - IndexPatternsContract, - FilterManager as QueryFilterManager, -} from '../../../../data/public'; +import { DataViewsContract, FilterManager as QueryFilterManager } from '../../../../data/public'; export class PhraseFilterManager extends FilterManager { constructor( controlId: string, fieldName: string, indexPatternId: string, - indexPatternsService: IndexPatternsContract, + indexPatternsService: DataViewsContract, queryFilter: QueryFilterManager ) { super(controlId, fieldName, indexPatternId, indexPatternsService, queryFilter); diff --git a/src/plugins/input_control_vis/public/control/filter_manager/range_filter_manager.test.ts b/src/plugins/input_control_vis/public/control/filter_manager/range_filter_manager.test.ts index bdcd1a34573d6..a329773720bc9 100644 --- a/src/plugins/input_control_vis/public/control/filter_manager/range_filter_manager.test.ts +++ b/src/plugins/input_control_vis/public/control/filter_manager/range_filter_manager.test.ts @@ -9,11 +9,8 @@ import expect from '@kbn/expect'; import { RangeFilterManager } from './range_filter_manager'; -import { - IndexPattern, - FilterManager as QueryFilterManager, - IndexPatternsContract, -} from '../../../../data/public'; +import { FilterManager as QueryFilterManager, DataViewsContract } from '../../../../data/public'; +import { DataView } from '../../../../data_views/public'; import { RangeFilter, RangeFilterMeta } from '@kbn/es-query'; describe('RangeFilterManager', function () { @@ -24,7 +21,7 @@ describe('RangeFilterManager', function () { const fieldMock = { name: 'field1', }; - const indexPatternMock: IndexPattern = { + const indexPatternMock: DataView = { id: indexPatternId, fields: { getByName: (name: any) => { @@ -34,10 +31,10 @@ describe('RangeFilterManager', function () { return fields[name]; }, }, - } as IndexPattern; + } as DataView; const indexPatternsServiceMock = { get: jest.fn().mockReturnValue(Promise.resolve(indexPatternMock)), - } as unknown as jest.Mocked; + } as unknown as jest.Mocked; const queryFilterMock: QueryFilterManager = {} as QueryFilterManager; let filterManager: RangeFilterManager; beforeEach(async () => { @@ -70,7 +67,7 @@ describe('RangeFilterManager', function () { id: string, fieldName: string, indexPatternId: string, - indexPatternsService: IndexPatternsContract, + indexPatternsService: DataViewsContract, queryFilter: QueryFilterManager ) { super(id, fieldName, indexPatternId, indexPatternsService, queryFilter); @@ -86,7 +83,7 @@ describe('RangeFilterManager', function () { } } - const indexPatternsServiceMock = {} as IndexPatternsContract; + const indexPatternsServiceMock = {} as DataViewsContract; const queryFilterMock: QueryFilterManager = {} as QueryFilterManager; let filterManager: MockFindFiltersRangeFilterManager; beforeEach(() => { diff --git a/src/plugins/input_control_vis/public/control/list_control_factory.ts b/src/plugins/input_control_vis/public/control/list_control_factory.ts index 39c5f259c2735..f6bd0bc0cd28a 100644 --- a/src/plugins/input_control_vis/public/control/list_control_factory.ts +++ b/src/plugins/input_control_vis/public/control/list_control_factory.ts @@ -9,11 +9,11 @@ import _ from 'lodash'; import { i18n } from '@kbn/i18n'; import { - IndexPatternField, TimefilterContract, SerializedSearchSourceFields, DataPublicPluginStart, } from 'src/plugins/data/public'; +import { DataViewField } from '../../../data_views/public'; import { Control, noValuesDisableMsg, noIndexPatternMsg } from './control'; import { PhraseFilterManager } from './filter_manager/phrase_filter_manager'; import { createSearchSource } from './create_search_source'; @@ -26,7 +26,7 @@ function getEscapedQuery(query = '') { } interface TermsAggArgs { - field?: IndexPatternField; + field?: DataViewField; size: number | null; direction: string; query?: string; diff --git a/src/plugins/input_control_vis/public/control/range_control_factory.ts b/src/plugins/input_control_vis/public/control/range_control_factory.ts index 906762266a7b3..6cd477d28b4f6 100644 --- a/src/plugins/input_control_vis/public/control/range_control_factory.ts +++ b/src/plugins/input_control_vis/public/control/range_control_factory.ts @@ -9,18 +9,15 @@ import _ from 'lodash'; import { i18n } from '@kbn/i18n'; -import { - IndexPatternField, - TimefilterContract, - DataPublicPluginStart, -} from 'src/plugins/data/public'; +import { TimefilterContract, DataPublicPluginStart } from 'src/plugins/data/public'; +import { DataViewField } from '../../../data_views/public'; import { Control, noValuesDisableMsg, noIndexPatternMsg } from './control'; import { RangeFilterManager } from './filter_manager/range_filter_manager'; import { createSearchSource } from './create_search_source'; import { ControlParams } from '../editor_utils'; import { InputControlVisDependencies } from '../plugin'; -const minMaxAgg = (field?: IndexPatternField) => { +const minMaxAgg = (field?: DataViewField) => { const aggBody: any = {}; if (field) { if (field.scripted) { diff --git a/src/plugins/input_control_vis/public/test_utils/get_index_pattern_mock.ts b/src/plugins/input_control_vis/public/test_utils/get_index_pattern_mock.ts index 122800198f092..40f01b05d18b2 100644 --- a/src/plugins/input_control_vis/public/test_utils/get_index_pattern_mock.ts +++ b/src/plugins/input_control_vis/public/test_utils/get_index_pattern_mock.ts @@ -6,12 +6,12 @@ * Side Public License, v 1. */ -import { IndexPattern } from 'src/plugins/data/public'; +import { DataView } from 'src/plugins/data_views/public'; /** * Returns forced **Partial** IndexPattern for use in tests */ -export const getIndexPatternMock = (): Promise => { +export const getIndexPatternMock = (): Promise => { return Promise.resolve({ id: 'mockIndexPattern', title: 'mockIndexPattern', @@ -20,5 +20,5 @@ export const getIndexPatternMock = (): Promise => { { name: 'textField', type: 'string', aggregatable: false }, { name: 'numberField', type: 'number', aggregatable: true }, ], - } as IndexPattern); + } as DataView); }; diff --git a/src/plugins/input_control_vis/public/vis_controller.tsx b/src/plugins/input_control_vis/public/vis_controller.tsx index bb09a90bb9dd6..51c88962f3cb2 100644 --- a/src/plugins/input_control_vis/public/vis_controller.tsx +++ b/src/plugins/input_control_vis/public/vis_controller.tsx @@ -13,8 +13,9 @@ import { Subscription } from 'rxjs'; import { I18nStart } from 'kibana/public'; import { IInterpreterRenderHandlers } from 'src/plugins/expressions'; +import { Filter } from '@kbn/es-query'; import { VisualizationContainer } from '../../visualizations/public'; -import { FilterManager, Filter } from '../../data/public'; +import { FilterManager } from '../../data/public'; import { InputControlVis } from './components/vis/input_control_vis'; import { getControlFactory } from './control/control_factory'; diff --git a/src/plugins/input_control_vis/tsconfig.json b/src/plugins/input_control_vis/tsconfig.json index 5e53199bb1e6e..43b1539e87da2 100644 --- a/src/plugins/input_control_vis/tsconfig.json +++ b/src/plugins/input_control_vis/tsconfig.json @@ -13,6 +13,7 @@ "references": [ { "path": "../kibana_react/tsconfig.json" }, { "path": "../data/tsconfig.json"}, + { "path": "../data_views/tsconfig.json"}, { "path": "../expressions/tsconfig.json" }, { "path": "../visualizations/tsconfig.json" }, { "path": "../vis_default_editor/tsconfig.json" }, From 0bb021199e032f74b8a6bf3194ba66f212d94a6a Mon Sep 17 00:00:00 2001 From: Spencer Date: Wed, 2 Mar 2022 09:45:01 -0600 Subject: [PATCH 10/37] [ftr/config] require servers.elasticsearch.port config (#126650) --- .../__fixtures__/failure_hooks/config.js | 5 +++ .../__fixtures__/simple_project/config.js | 5 +++ .../integration_tests/failure_hooks.test.js | 2 +- .../lib/config/__fixtures__/config.1.js | 5 +++ .../lib/config/__fixtures__/config.2.js | 5 +++ .../lib/config/__fixtures__/config.3.js | 17 -------- .../lib/config/__fixtures__/config.4.js | 15 ------- .../lib/config/config.test.ts | 5 +++ .../lib/config/schema.ts | 42 +++++++++++++------ 9 files changed, 55 insertions(+), 46 deletions(-) delete mode 100644 packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.3.js delete mode 100644 packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.4.js diff --git a/packages/kbn-test/src/functional_test_runner/integration_tests/__fixtures__/failure_hooks/config.js b/packages/kbn-test/src/functional_test_runner/integration_tests/__fixtures__/failure_hooks/config.js index 6e25e4c073ab0..417fc8e10aeca 100644 --- a/packages/kbn-test/src/functional_test_runner/integration_tests/__fixtures__/failure_hooks/config.js +++ b/packages/kbn-test/src/functional_test_runner/integration_tests/__fixtures__/failure_hooks/config.js @@ -37,5 +37,10 @@ export default function () { captureLogOutput: false, sendToCiStats: false, }, + servers: { + elasticsearch: { + port: 1234, + }, + }, }; } diff --git a/packages/kbn-test/src/functional_test_runner/integration_tests/__fixtures__/simple_project/config.js b/packages/kbn-test/src/functional_test_runner/integration_tests/__fixtures__/simple_project/config.js index 4c87b53b5753b..067528c4ae120 100644 --- a/packages/kbn-test/src/functional_test_runner/integration_tests/__fixtures__/simple_project/config.js +++ b/packages/kbn-test/src/functional_test_runner/integration_tests/__fixtures__/simple_project/config.js @@ -13,4 +13,9 @@ export default () => ({ mochaReporter: { sendToCiStats: false, }, + servers: { + elasticsearch: { + port: 1234, + }, + }, }); diff --git a/packages/kbn-test/src/functional_test_runner/integration_tests/failure_hooks.test.js b/packages/kbn-test/src/functional_test_runner/integration_tests/failure_hooks.test.js index 0d986a1602e12..47ae51ca62f13 100644 --- a/packages/kbn-test/src/functional_test_runner/integration_tests/failure_hooks.test.js +++ b/packages/kbn-test/src/functional_test_runner/integration_tests/failure_hooks.test.js @@ -61,7 +61,7 @@ describe('failure hooks', function () { expect(tests).toHaveLength(0); } catch (error) { - console.error('full log output', linesCopy.join('\n')); + error.message += `\n\nfull log output:${linesCopy.join('\n')}`; throw error; } }); diff --git a/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.1.js b/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.1.js index 123bc8b9bc201..afcad01c4ab92 100644 --- a/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.1.js +++ b/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.1.js @@ -9,5 +9,10 @@ export default function () { return { testFiles: ['config.1'], + servers: { + elasticsearch: { + port: 1234, + }, + }, }; } diff --git a/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.2.js b/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.2.js index 2dd4c96186fcd..692a3de786723 100644 --- a/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.2.js +++ b/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.2.js @@ -11,5 +11,10 @@ export default async function ({ readConfigFile }) { return { testFiles: [...config1.get('testFiles'), 'config.2'], + servers: { + elasticsearch: { + port: 1234, + }, + }, }; } diff --git a/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.3.js b/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.3.js deleted file mode 100644 index b68a5115553f5..0000000000000 --- a/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.3.js +++ /dev/null @@ -1,17 +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. - */ - -export default async function ({ readConfigFile }) { - const config4 = await readConfigFile(require.resolve('./config.4')); - return { - testFiles: ['baz'], - screenshots: { - ...config4.get('screenshots'), - }, - }; -} diff --git a/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.4.js b/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.4.js deleted file mode 100644 index 6dc8aa803613d..0000000000000 --- a/packages/kbn-test/src/functional_test_runner/lib/config/__fixtures__/config.4.js +++ /dev/null @@ -1,15 +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. - */ - -export default function () { - return { - screenshots: { - directory: 'bar', - }, - }; -} diff --git a/packages/kbn-test/src/functional_test_runner/lib/config/config.test.ts b/packages/kbn-test/src/functional_test_runner/lib/config/config.test.ts index 88c1fd99f0014..d551e7a884b41 100644 --- a/packages/kbn-test/src/functional_test_runner/lib/config/config.test.ts +++ b/packages/kbn-test/src/functional_test_runner/lib/config/config.test.ts @@ -15,6 +15,11 @@ describe('Config', () => { services: { foo: () => 42, }, + servers: { + elasticsearch: { + port: 1234, + }, + }, }, primary: true, path: process.cwd(), diff --git a/packages/kbn-test/src/functional_test_runner/lib/config/schema.ts b/packages/kbn-test/src/functional_test_runner/lib/config/schema.ts index f65cb3c41f421..42a77b85ddc6c 100644 --- a/packages/kbn-test/src/functional_test_runner/lib/config/schema.ts +++ b/packages/kbn-test/src/functional_test_runner/lib/config/schema.ts @@ -17,19 +17,33 @@ const ID_PATTERN = /^[a-zA-Z0-9_]+$/; // it will search both --inspect and --inspect-brk const INSPECTING = !!process.execArgv.find((arg) => arg.includes('--inspect')); -const urlPartsSchema = () => +const maybeRequireKeys = (keys: string[], schemas: Record) => { + if (!keys.length) { + return schemas; + } + + const withRequires: Record = {}; + for (const [key, schema] of Object.entries(schemas)) { + withRequires[key] = keys.includes(key) ? schema.required() : schema; + } + return withRequires; +}; + +const urlPartsSchema = ({ requiredKeys }: { requiredKeys?: string[] } = {}) => Joi.object() - .keys({ - protocol: Joi.string().valid('http', 'https').default('http'), - hostname: Joi.string().hostname().default('localhost'), - port: Joi.number(), - auth: Joi.string().regex(/^[^:]+:.+$/, 'username and password separated by a colon'), - username: Joi.string(), - password: Joi.string(), - pathname: Joi.string().regex(/^\//, 'start with a /'), - hash: Joi.string().regex(/^\//, 'start with a /'), - certificateAuthorities: Joi.array().items(Joi.binary()).optional(), - }) + .keys( + maybeRequireKeys(requiredKeys ?? [], { + protocol: Joi.string().valid('http', 'https').default('http'), + hostname: Joi.string().hostname().default('localhost'), + port: Joi.number(), + auth: Joi.string().regex(/^[^:]+:.+$/, 'username and password separated by a colon'), + username: Joi.string(), + password: Joi.string(), + pathname: Joi.string().regex(/^\//, 'start with a /'), + hash: Joi.string().regex(/^\//, 'start with a /'), + certificateAuthorities: Joi.array().items(Joi.binary()).optional(), + }) + ) .default(); const appUrlPartsSchema = () => @@ -170,7 +184,9 @@ export const schema = Joi.object() servers: Joi.object() .keys({ kibana: urlPartsSchema(), - elasticsearch: urlPartsSchema(), + elasticsearch: urlPartsSchema({ + requiredKeys: ['port'], + }), }) .default(), From 5023a033133243d0110a0d43da5af3a15a9147b8 Mon Sep 17 00:00:00 2001 From: Sander Philipse <94373878+sphilipse@users.noreply.github.com> Date: Wed, 2 Mar 2022 16:53:44 +0100 Subject: [PATCH 11/37] [Workplace Search] Enables external SharePoint Online and custom SharePoint Server connectors (#126172) This adds the ability to add and manage an External SharePoint Online connector and a Custom SharePoint Server connector via Kibana. Co-authored-by: Byron Hulcher --- .../__mocks__/content_sources.mock.ts | 7 +- .../shared/assets/source_icons/index.ts | 4 + .../assets/source_icons/sharepoint_server.svg | 1 + .../workplace_search/constants.ts | 5 + .../applications/workplace_search/routes.ts | 46 +--- .../applications/workplace_search/types.ts | 10 +- .../utils/has_multiple_connector_options.ts | 17 ++ .../workplace_search/utils/index.ts | 2 + .../workplace_search/utils/is_not_nullish.ts | 10 + .../add_source/add_custom_source.test.tsx | 69 +++++ .../add_source/add_custom_source.tsx | 44 ++++ .../add_custom_source_logic.test.ts | 182 ++++++++++++++ .../add_source/add_custom_source_logic.ts | 110 ++++++++ .../components/add_source/add_source.test.tsx | 43 +--- .../components/add_source/add_source.tsx | 57 +---- .../components/add_source/add_source_list.tsx | 14 +- .../add_source/add_source_logic.test.ts | 106 ++++---- .../components/add_source/add_source_logic.ts | 57 +---- .../available_sources_list.test.tsx | 4 +- .../add_source/available_sources_list.tsx | 16 +- .../add_source/configuration_choice.test.tsx | 141 +++++++++++ .../add_source/configuration_choice.tsx | 236 ++++++++++++++++++ .../add_source/configure_custom.test.tsx | 32 +-- .../add_source/configure_custom.tsx | 79 +++--- .../configured_sources_list.test.tsx | 6 +- .../add_source/configured_sources_list.tsx | 105 ++++---- .../add_source/connect_instance.test.tsx | 2 +- .../external_connector_config.test.tsx | 90 +++++++ .../add_source/external_connector_config.tsx | 168 +++++++++++++ .../external_connector_logic.test.ts | 144 +++++++++++ .../add_source/external_connector_logic.ts | 138 ++++++++++ .../components/add_source/github_via_app.tsx | 3 +- .../add_source/save_custom.test.tsx | 35 +-- .../components/add_source/save_custom.tsx | 90 ++++--- .../components/source_settings.tsx | 6 +- .../views/content_sources/source_data.tsx | 221 +++++++++------- .../content_sources/sources_logic.test.ts | 7 +- .../views/content_sources/sources_logic.ts | 19 +- .../content_sources/sources_router.test.tsx | 6 +- .../views/content_sources/sources_router.tsx | 141 +++++++++-- .../views/settings/components/connectors.tsx | 10 +- .../components/source_config.test.tsx | 12 +- .../settings/components/source_config.tsx | 7 +- .../views/settings/settings_router.tsx | 7 +- .../server/routes/workplace_search/sources.ts | 10 +- 45 files changed, 1980 insertions(+), 539 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/assets/source_icons/sharepoint_server.svg create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/has_multiple_connector_options.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/is_not_nullish.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source_logic.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source_logic.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configuration_choice.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configuration_choice.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_config.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_config.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_logic.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_logic.ts diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/__mocks__/content_sources.mock.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/__mocks__/content_sources.mock.ts index b5309d8fedc1b..f262579f56c56 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/__mocks__/content_sources.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/__mocks__/content_sources.mock.ts @@ -8,6 +8,7 @@ import { groups } from './groups.mock'; import { IndexingRule } from '../types'; +import { SourceConfigData } from '../views/content_sources/components/add_source/add_source_logic'; import { staticSourceData } from '../views/content_sources/source_data'; import { mergeServerAndStaticData } from '../views/content_sources/sources_logic'; @@ -339,23 +340,23 @@ export const mergedConfiguredSources = mergeServerAndStaticData( contentSources ); -export const sourceConfigData = { +export const sourceConfigData: SourceConfigData = { serviceType: 'confluence_cloud', name: 'Confluence', configured: true, needsPermissions: true, accountContextOnly: false, - supportedByLicense: true, privateSourcesEnabled: false, categories: ['wiki', 'atlassian', 'intranet'], configuredFields: { - isOauth1: false, clientId: 'CyztADsSECRETCSAUCEh1a', clientSecret: 'GSjJxqSECRETCSAUCEksHk', baseUrl: 'https://mine.atlassian.net', privateKey: '-----BEGIN PRIVATE KEY-----\nkeykeykeykey==\n-----END PRIVATE KEY-----\n', publicKey: '-----BEGIN PUBLIC KEY-----\nkeykeykeykey\n-----END PUBLIC KEY-----\n', consumerKey: 'elastic_enterprise_search_123', + apiKey: 'asdf1234', + url: 'https://www.elastic.co', }, }; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/assets/source_icons/index.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/assets/source_icons/index.ts index fdccd536c3c6d..5b893250235f7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/assets/source_icons/index.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/assets/source_icons/index.ts @@ -19,6 +19,7 @@ import oneDrive from './onedrive.svg'; import salesforce from './salesforce.svg'; import serviceNow from './servicenow.svg'; import sharePoint from './sharepoint.svg'; +import sharePointServer from './sharepoint_server.svg'; import slack from './slack.svg'; import zendesk from './zendesk.svg'; @@ -29,6 +30,8 @@ export const images = { confluenceServer: confluence, custom, dropbox, + // TODO: For now external sources are all SharePoint. When this is no longer the case, this needs to be dynamic. + external: sharePoint, github, githubEnterpriseServer: github, githubViaApp: github, @@ -44,6 +47,7 @@ export const images = { salesforceSandbox: salesforce, serviceNow, sharePoint, + sharePointServer, slack, zendesk, } as { [key: string]: string }; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/assets/source_icons/sharepoint_server.svg b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/assets/source_icons/sharepoint_server.svg new file mode 100644 index 0000000000000..aebfd7a8e49c0 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/assets/source_icons/sharepoint_server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/constants.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/constants.ts index 4510498465793..e83430504b389 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/constants.ts @@ -192,6 +192,10 @@ export const SOURCE_NAMES = { 'xpack.enterpriseSearch.workplaceSearch.sources.sourceNames.sharePoint', { defaultMessage: 'SharePoint Online' } ), + SHAREPOINT_SERVER: i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.sources.sourceNames.sharePointServer', + { defaultMessage: 'SharePoint Server' } + ), SLACK: i18n.translate('xpack.enterpriseSearch.workplaceSearch.sources.sourceNames.slack', { defaultMessage: 'Slack', }), @@ -357,6 +361,7 @@ export const GITHUB_VIA_APP_SERVICE_TYPE = 'github_via_app'; export const GITHUB_ENTERPRISE_SERVER_VIA_APP_SERVICE_TYPE = 'github_enterprise_server_via_app'; export const CUSTOM_SERVICE_TYPE = 'custom'; +export const EXTERNAL_SERVICE_TYPE = 'external'; export const WORKPLACE_SEARCH_URL_PREFIX = '/app/enterprise_search/workplace_search'; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts index 4857fa2a158a0..cbcd1d885b120 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts @@ -7,11 +7,6 @@ import { generatePath } from 'react-router-dom'; -import { - GITHUB_VIA_APP_SERVICE_TYPE, - GITHUB_ENTERPRISE_SERVER_VIA_APP_SERVICE_TYPE, -} from './constants'; - export const SETUP_GUIDE_PATH = '/setup_guide'; export const NOT_FOUND_PATH = '/404'; @@ -40,25 +35,7 @@ export const PRIVATE_SOURCES_PATH = `${PERSONAL_PATH}${SOURCES_PATH}`; export const SOURCE_ADDED_PATH = `${SOURCES_PATH}/added`; export const ADD_SOURCE_PATH = `${SOURCES_PATH}/add`; -export const ADD_BOX_PATH = `${SOURCES_PATH}/add/box`; -export const ADD_CONFLUENCE_PATH = `${SOURCES_PATH}/add/confluence_cloud`; -export const ADD_CONFLUENCE_SERVER_PATH = `${SOURCES_PATH}/add/confluence_server`; -export const ADD_DROPBOX_PATH = `${SOURCES_PATH}/add/dropbox`; -export const ADD_GITHUB_ENTERPRISE_PATH = `${SOURCES_PATH}/add/github_enterprise_server`; -export const ADD_GITHUB_PATH = `${SOURCES_PATH}/add/github`; -export const ADD_GITHUB_VIA_APP_PATH = `${SOURCES_PATH}/add/${GITHUB_VIA_APP_SERVICE_TYPE}`; -export const ADD_GITHUB_ENTERPRISE_SERVER_VIA_APP_PATH = `${SOURCES_PATH}/add/${GITHUB_ENTERPRISE_SERVER_VIA_APP_SERVICE_TYPE}`; -export const ADD_GMAIL_PATH = `${SOURCES_PATH}/add/gmail`; -export const ADD_GOOGLE_DRIVE_PATH = `${SOURCES_PATH}/add/google_drive`; -export const ADD_JIRA_PATH = `${SOURCES_PATH}/add/jira_cloud`; -export const ADD_JIRA_SERVER_PATH = `${SOURCES_PATH}/add/jira_server`; -export const ADD_ONEDRIVE_PATH = `${SOURCES_PATH}/add/one_drive`; -export const ADD_SALESFORCE_PATH = `${SOURCES_PATH}/add/salesforce`; -export const ADD_SALESFORCE_SANDBOX_PATH = `${SOURCES_PATH}/add/salesforce_sandbox`; -export const ADD_SERVICENOW_PATH = `${SOURCES_PATH}/add/servicenow`; -export const ADD_SHAREPOINT_PATH = `${SOURCES_PATH}/add/share_point`; -export const ADD_SLACK_PATH = `${SOURCES_PATH}/add/slack`; -export const ADD_ZENDESK_PATH = `${SOURCES_PATH}/add/zendesk`; +export const ADD_EXTERNAL_PATH = `${SOURCES_PATH}/add/external`; export const ADD_CUSTOM_PATH = `${SOURCES_PATH}/add/custom`; export const PERSONAL_SETTINGS_PATH = `${PERSONAL_PATH}/settings`; @@ -83,24 +60,6 @@ export const ORG_SETTINGS_PATH = '/settings'; export const ORG_SETTINGS_CUSTOMIZE_PATH = `${ORG_SETTINGS_PATH}/customize`; export const ORG_SETTINGS_CONNECTORS_PATH = `${ORG_SETTINGS_PATH}/connectors`; export const ORG_SETTINGS_OAUTH_APPLICATION_PATH = `${ORG_SETTINGS_PATH}/oauth`; -export const EDIT_BOX_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/box/edit`; -export const EDIT_CONFLUENCE_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/confluence_cloud/edit`; -export const EDIT_CONFLUENCE_SERVER_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/confluence_server/edit`; -export const EDIT_DROPBOX_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/dropbox/edit`; -export const EDIT_GITHUB_ENTERPRISE_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/github_enterprise_server/edit`; -export const EDIT_GITHUB_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/github/edit`; -export const EDIT_GMAIL_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/gmail/edit`; -export const EDIT_GOOGLE_DRIVE_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/google_drive/edit`; -export const EDIT_JIRA_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/jira_cloud/edit`; -export const EDIT_JIRA_SERVER_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/jira_server/edit`; -export const EDIT_ONEDRIVE_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/one_drive/edit`; -export const EDIT_SALESFORCE_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/salesforce/edit`; -export const EDIT_SALESFORCE_SANDBOX_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/salesforce_sandbox/edit`; -export const EDIT_SERVICENOW_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/servicenow/edit`; -export const EDIT_SHAREPOINT_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/share_point/edit`; -export const EDIT_SLACK_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/slack/edit`; -export const EDIT_ZENDESK_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/zendesk/edit`; -export const EDIT_CUSTOM_PATH = `${ORG_SETTINGS_CONNECTORS_PATH}/custom/edit`; export const getContentSourcePath = ( path: string, @@ -118,3 +77,6 @@ export const getReindexJobRoute = ( isOrganization: boolean ) => getSourcesPath(generatePath(REINDEX_JOB_PATH, { sourceId, activeReindexJobId }), isOrganization); +export const getAddPath = (serviceType: string): string => `${SOURCES_PATH}/add/${serviceType}`; +export const getEditPath = (serviceType: string): string => + `${ORG_SETTINGS_CONNECTORS_PATH}/${serviceType}/edit`; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts index b01700b8bce34..b3bfebcd6b295 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts @@ -66,23 +66,27 @@ export interface Configuration { needsConfiguration?: boolean; hasOauthRedirect: boolean; baseUrlTitle?: string; - helpText: string; + helpText?: string; documentationUrl: string; applicationPortalUrl?: string; applicationLinkTitle?: string; + githubRepository?: string; } export interface SourceDataItem { name: string; + iconName: string; + categories?: string[]; serviceType: string; configuration: Configuration; configured?: boolean; connected?: boolean; features?: Features; objTypes?: string[]; - addPath: string; - editPath?: string; // undefined for GitHub apps, as they are configured on a source level, and don't use a connector where you can edit the configuration accountContextOnly: boolean; + internalConnectorAvailable?: boolean; + externalConnectorAvailable?: boolean; + customConnectorAvailable?: boolean; } export interface ContentSource { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/has_multiple_connector_options.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/has_multiple_connector_options.ts new file mode 100644 index 0000000000000..fbfda1ddf8d5e --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/has_multiple_connector_options.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SourceDataItem } from '../types'; + +export const hasMultipleConnectorOptions = ({ + internalConnectorAvailable, + externalConnectorAvailable, + customConnectorAvailable, +}: SourceDataItem) => + [externalConnectorAvailable, internalConnectorAvailable, customConnectorAvailable].filter( + (available) => !!available + ).length > 1; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/index.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/index.ts index 92f27500d7262..86d3e4f844bbd 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/index.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/index.ts @@ -11,3 +11,5 @@ export { mimeType } from './mime_types'; export { readUploadedFileAsBase64 } from './read_uploaded_file_as_base64'; export { readUploadedFileAsText } from './read_uploaded_file_as_text'; export { handlePrivateKeyUpload } from './handle_private_key_upload'; +export { hasMultipleConnectorOptions } from './has_multiple_connector_options'; +export { isNotNullish } from './is_not_nullish'; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/is_not_nullish.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/is_not_nullish.ts new file mode 100644 index 0000000000000..d492dad5d52c2 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/is_not_nullish.ts @@ -0,0 +1,10 @@ +/* + * 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 function isNotNullish(value: T | null | undefined): value is T { + return value !== null && value !== undefined; +} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source.test.tsx new file mode 100644 index 0000000000000..b13cc6583cf2f --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source.test.tsx @@ -0,0 +1,69 @@ +/* + * 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 '../../../../../__mocks__/shallow_useeffect.mock'; +import { setMockValues } from '../../../../../__mocks__/kea_logic'; +import { sourceConfigData } from '../../../../__mocks__/content_sources.mock'; + +import React from 'react'; + +import { shallow } from 'enzyme'; + +import { + WorkplaceSearchPageTemplate, + PersonalDashboardLayout, +} from '../../../../components/layout'; +import { staticSourceData } from '../../source_data'; + +import { AddCustomSource } from './add_custom_source'; +import { AddCustomSourceSteps } from './add_custom_source_logic'; +import { ConfigureCustom } from './configure_custom'; +import { SaveCustom } from './save_custom'; + +describe('AddCustomSource', () => { + const props = { + sourceData: staticSourceData[0], + initialValues: undefined, + }; + + const values = { + sourceConfigData, + isOrganization: true, + }; + + beforeEach(() => { + setMockValues({ ...values }); + }); + + it('renders', () => { + const wrapper = shallow(); + + expect(wrapper.find(WorkplaceSearchPageTemplate)).toHaveLength(1); + }); + + it('should show correct layout for personal dashboard', () => { + setMockValues({ isOrganization: false }); + const wrapper = shallow(); + + expect(wrapper.find(WorkplaceSearchPageTemplate)).toHaveLength(0); + expect(wrapper.find(PersonalDashboardLayout)).toHaveLength(1); + }); + + it('should show Configure Custom for custom configuration step', () => { + setMockValues({ currentStep: AddCustomSourceSteps.ConfigureCustomStep }); + const wrapper = shallow(); + + expect(wrapper.find(ConfigureCustom)).toHaveLength(1); + }); + + it('should show Save Custom for save custom step', () => { + setMockValues({ currentStep: AddCustomSourceSteps.SaveCustomStep }); + const wrapper = shallow(); + + expect(wrapper.find(SaveCustom)).toHaveLength(1); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source.tsx new file mode 100644 index 0000000000000..6f7dc2bcdb342 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source.tsx @@ -0,0 +1,44 @@ +/* + * 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 { useValues } from 'kea'; + +import { AppLogic } from '../../../../app_logic'; +import { + WorkplaceSearchPageTemplate, + PersonalDashboardLayout, +} from '../../../../components/layout'; +import { NAV } from '../../../../constants'; + +import { SourceDataItem } from '../../../../types'; + +import { AddCustomSourceLogic, AddCustomSourceSteps } from './add_custom_source_logic'; +import { ConfigureCustom } from './configure_custom'; +import { SaveCustom } from './save_custom'; + +import './add_source.scss'; + +interface Props { + sourceData: SourceDataItem; + initialValue?: string; +} +export const AddCustomSource: React.FC = ({ sourceData, initialValue = '' }) => { + const addCustomSourceLogic = AddCustomSourceLogic({ sourceData, initialValue }); + const { currentStep } = useValues(addCustomSourceLogic); + const { isOrganization } = useValues(AppLogic); + + const Layout = isOrganization ? WorkplaceSearchPageTemplate : PersonalDashboardLayout; + + return ( + + {currentStep === AddCustomSourceSteps.ConfigureCustomStep && } + {currentStep === AddCustomSourceSteps.SaveCustomStep && } + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source_logic.test.ts new file mode 100644 index 0000000000000..9360967985876 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source_logic.test.ts @@ -0,0 +1,182 @@ +/* + * 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 { + LogicMounter, + mockFlashMessageHelpers, + mockHttpValues, +} from '../../../../../__mocks__/kea_logic'; +import { sourceConfigData } from '../../../../__mocks__/content_sources.mock'; + +import { i18n } from '@kbn/i18n'; +import { nextTick } from '@kbn/test-jest-helpers'; + +import { docLinks } from '../../../../../shared/doc_links'; +import { itShowsServerErrorAsFlashMessage } from '../../../../../test_helpers'; + +jest.mock('../../../../app_logic', () => ({ + AppLogic: { values: { isOrganization: true } }, +})); +import { AppLogic } from '../../../../app_logic'; + +import { SOURCE_NAMES } from '../../../../constants'; +import { CustomSource, SourceDataItem } from '../../../../types'; + +import { AddCustomSourceLogic, AddCustomSourceSteps } from './add_custom_source_logic'; + +const CUSTOM_SOURCE_DATA_ITEM: SourceDataItem = { + name: SOURCE_NAMES.CUSTOM, + iconName: SOURCE_NAMES.CUSTOM, + serviceType: 'custom', + configuration: { + isPublicKey: false, + hasOauthRedirect: false, + needsBaseUrl: false, + helpText: i18n.translate('xpack.enterpriseSearch.workplaceSearch.sources.helpText.custom', { + defaultMessage: + 'To create a Custom API Source, provide a human-readable and descriptive name. The name will appear as-is in the various search experiences and management interfaces.', + }), + documentationUrl: docLinks.workplaceSearchCustomSources, + applicationPortalUrl: '', + }, + accountContextOnly: false, +}; + +const DEFAULT_VALUES = { + currentStep: AddCustomSourceSteps.ConfigureCustomStep, + buttonLoading: false, + customSourceNameValue: '', + newCustomSource: {} as CustomSource, + sourceData: CUSTOM_SOURCE_DATA_ITEM, +}; + +const MOCK_PROPS = { initialValue: '', sourceData: CUSTOM_SOURCE_DATA_ITEM }; + +const MOCK_NAME = 'name'; + +describe('AddCustomSourceLogic', () => { + const { mount } = new LogicMounter(AddCustomSourceLogic); + const { http } = mockHttpValues; + const { clearFlashMessages } = mockFlashMessageHelpers; + + beforeEach(() => { + jest.clearAllMocks(); + mount({}, MOCK_PROPS); + }); + + it('has expected default values', () => { + expect(AddCustomSourceLogic.values).toEqual(DEFAULT_VALUES); + }); + + describe('actions', () => { + describe('setButtonNotLoading', () => { + it('turns off the button loading flag', () => { + AddCustomSourceLogic.actions.setButtonNotLoading(); + + expect(AddCustomSourceLogic.values).toEqual({ + ...DEFAULT_VALUES, + buttonLoading: false, + }); + }); + }); + + describe('setCustomSourceNameValue', () => { + it('saves the name', () => { + AddCustomSourceLogic.actions.setCustomSourceNameValue('name'); + + expect(AddCustomSourceLogic.values).toEqual({ + ...DEFAULT_VALUES, + customSourceNameValue: 'name', + }); + }); + }); + + describe('setNewCustomSource', () => { + it('saves the custom source', () => { + const newCustomSource = { + accessToken: 'foo', + key: 'bar', + name: 'source', + id: '123key', + }; + + AddCustomSourceLogic.actions.setNewCustomSource(newCustomSource); + + expect(AddCustomSourceLogic.values).toEqual({ + ...DEFAULT_VALUES, + newCustomSource, + currentStep: AddCustomSourceSteps.SaveCustomStep, + }); + }); + }); + }); + + describe('listeners', () => { + beforeEach(() => { + mount( + { + customSourceNameValue: MOCK_NAME, + }, + MOCK_PROPS + ); + }); + + describe('organization context', () => { + describe('createContentSource', () => { + it('calls API and sets values', async () => { + const setButtonNotLoadingSpy = jest.spyOn( + AddCustomSourceLogic.actions, + 'setButtonNotLoading' + ); + const setNewCustomSourceSpy = jest.spyOn( + AddCustomSourceLogic.actions, + 'setNewCustomSource' + ); + http.post.mockReturnValue(Promise.resolve({ sourceConfigData })); + + AddCustomSourceLogic.actions.createContentSource(); + + expect(clearFlashMessages).toHaveBeenCalled(); + expect(AddCustomSourceLogic.values.buttonLoading).toEqual(true); + expect(http.post).toHaveBeenCalledWith('/internal/workplace_search/org/create_source', { + body: JSON.stringify({ service_type: 'custom', name: MOCK_NAME }), + }); + await nextTick(); + expect(setNewCustomSourceSpy).toHaveBeenCalledWith({ sourceConfigData }); + expect(setButtonNotLoadingSpy).toHaveBeenCalled(); + }); + + itShowsServerErrorAsFlashMessage(http.post, () => { + AddCustomSourceLogic.actions.createContentSource(); + }); + }); + }); + + describe('account context routes', () => { + beforeEach(() => { + AppLogic.values.isOrganization = false; + }); + + describe('createContentSource', () => { + it('sends relevant fields to the API', () => { + AddCustomSourceLogic.actions.createContentSource(); + + expect(http.post).toHaveBeenCalledWith( + '/internal/workplace_search/account/create_source', + { + body: JSON.stringify({ service_type: 'custom', name: MOCK_NAME }), + } + ); + }); + + itShowsServerErrorAsFlashMessage(http.post, () => { + AddCustomSourceLogic.actions.createContentSource(); + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source_logic.ts new file mode 100644 index 0000000000000..5bf86f6df41c7 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_custom_source_logic.ts @@ -0,0 +1,110 @@ +/* + * 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 { kea, MakeLogicType } from 'kea'; + +import { flashAPIErrors, clearFlashMessages } from '../../../../../shared/flash_messages'; +import { HttpLogic } from '../../../../../shared/http'; +import { AppLogic } from '../../../../app_logic'; +import { CustomSource, SourceDataItem } from '../../../../types'; + +export interface AddCustomSourceProps { + sourceData: SourceDataItem; + initialValue: string; +} + +export enum AddCustomSourceSteps { + ConfigureCustomStep = 'Configure Custom', + SaveCustomStep = 'Save Custom', +} + +export interface AddCustomSourceActions { + createContentSource(): void; + setButtonNotLoading(): void; + setCustomSourceNameValue(customSourceNameValue: string): string; + setNewCustomSource(data: CustomSource): CustomSource; +} + +interface AddCustomSourceValues { + buttonLoading: boolean; + currentStep: AddCustomSourceSteps; + customSourceNameValue: string; + newCustomSource: CustomSource; + sourceData: SourceDataItem; +} + +/** + * Workplace Search needs to know the host for the redirect. As of yet, we do not + * have access to this in Kibana. We parse it from the browser and pass it as a param. + */ + +export const AddCustomSourceLogic = kea< + MakeLogicType +>({ + path: ['enterprise_search', 'workplace_search', 'add_custom_source_logic'], + actions: { + createContentSource: true, + setButtonNotLoading: true, + setCustomSourceNameValue: (customSourceNameValue) => customSourceNameValue, + setNewCustomSource: (data) => data, + }, + reducers: ({ props }) => ({ + buttonLoading: [ + false, + { + setButtonNotLoading: () => false, + createContentSource: () => true, + }, + ], + currentStep: [ + AddCustomSourceSteps.ConfigureCustomStep, + { + setNewCustomSource: () => AddCustomSourceSteps.SaveCustomStep, + }, + ], + customSourceNameValue: [ + props.initialValue, + { + setCustomSourceNameValue: (_, customSourceNameValue) => customSourceNameValue, + }, + ], + newCustomSource: [ + {} as CustomSource, + { + setNewCustomSource: (_, newCustomSource) => newCustomSource, + }, + ], + sourceData: [props.sourceData], + }), + listeners: ({ actions, values }) => ({ + createContentSource: async () => { + clearFlashMessages(); + const { isOrganization } = AppLogic.values; + const route = isOrganization + ? '/internal/workplace_search/org/create_source' + : '/internal/workplace_search/account/create_source'; + + const { customSourceNameValue } = values; + + const params = { + service_type: 'custom', + name: customSourceNameValue, + }; + + try { + const response = await HttpLogic.values.http.post(route, { + body: JSON.stringify({ ...params }), + }); + actions.setNewCustomSource(response); + } catch (e) { + flashAPIErrors(e); + } finally { + actions.setButtonNotLoading(); + } + }, + }), +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source.test.tsx index 0501509b3a8ef..4598ca337f4e2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source.test.tsx @@ -22,16 +22,16 @@ import { PersonalDashboardLayout, } from '../../../../components/layout'; +import { staticSourceData } from '../../source_data'; + import { AddSource } from './add_source'; import { AddSourceSteps } from './add_source_logic'; import { ConfigCompleted } from './config_completed'; import { ConfigurationIntro } from './configuration_intro'; -import { ConfigureCustom } from './configure_custom'; import { ConfigureOauth } from './configure_oauth'; import { ConnectInstance } from './connect_instance'; import { Reauthenticate } from './reauthenticate'; import { SaveConfig } from './save_config'; -import { SaveCustom } from './save_custom'; describe('AddSourceList', () => { const { navigateToUrl } = mockKibanaValues; @@ -65,7 +65,7 @@ describe('AddSourceList', () => { }); it('renders default state', () => { - const wrapper = shallow(); + const wrapper = shallow(); wrapper.find(ConfigurationIntro).prop('advanceStep')(); expect(setAddSourceStep).toHaveBeenCalledWith(AddSourceSteps.SaveConfigStep); @@ -74,14 +74,14 @@ describe('AddSourceList', () => { describe('layout', () => { it('renders the default workplace search layout when on an organization view', () => { setMockValues({ ...mockValues, isOrganization: true }); - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.type()).toEqual(WorkplaceSearchPageTemplate); }); it('renders the personal dashboard layout when not in an organization', () => { setMockValues({ ...mockValues, isOrganization: false }); - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.type()).toEqual(PersonalDashboardLayout); }); @@ -89,7 +89,7 @@ describe('AddSourceList', () => { it('renders a breadcrumb fallback while data is loading', () => { setMockValues({ ...mockValues, dataLoading: true, sourceConfigData: {} }); - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.prop('pageChrome')).toEqual(['Sources', 'Add Source', '...']); }); @@ -99,7 +99,7 @@ describe('AddSourceList', () => { ...mockValues, addSourceCurrentStep: AddSourceSteps.ConfigCompletedStep, }); - const wrapper = shallow(); + const wrapper = shallow(); wrapper.find(ConfigCompleted).prop('advanceStep')(); expect(navigateToUrl).toHaveBeenCalledWith('/sources/add/confluence_cloud/connect'); @@ -111,7 +111,7 @@ describe('AddSourceList', () => { ...mockValues, addSourceCurrentStep: AddSourceSteps.SaveConfigStep, }); - const wrapper = shallow(); + const wrapper = shallow(); const saveConfig = wrapper.find(SaveConfig); saveConfig.prop('advanceStep')(); saveConfig.prop('goBackStep')!(); @@ -126,51 +126,30 @@ describe('AddSourceList', () => { sourceConfigData, addSourceCurrentStep: AddSourceSteps.ConnectInstanceStep, }); - const wrapper = shallow(); + const wrapper = shallow(); wrapper.find(ConnectInstance).prop('onFormCreated')('foo'); expect(navigateToUrl).toHaveBeenCalledWith('/sources/add/confluence_cloud/connect'); }); - it('renders Configure Custom step', () => { - setMockValues({ - ...mockValues, - addSourceCurrentStep: AddSourceSteps.ConfigureCustomStep, - }); - const wrapper = shallow(); - wrapper.find(ConfigureCustom).prop('advanceStep')(); - - expect(createContentSource).toHaveBeenCalled(); - }); - it('renders Configure Oauth step', () => { setMockValues({ ...mockValues, addSourceCurrentStep: AddSourceSteps.ConfigureOauthStep, }); - const wrapper = shallow(); + const wrapper = shallow(); wrapper.find(ConfigureOauth).prop('onFormCreated')('foo'); expect(navigateToUrl).toHaveBeenCalledWith('/sources/add/confluence_cloud/connect'); }); - it('renders Save Custom step', () => { - setMockValues({ - ...mockValues, - addSourceCurrentStep: AddSourceSteps.SaveCustomStep, - }); - const wrapper = shallow(); - - expect(wrapper.find(SaveCustom)).toHaveLength(1); - }); - it('renders Reauthenticate step', () => { setMockValues({ ...mockValues, addSourceCurrentStep: AddSourceSteps.ReauthenticateStep, }); - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find(Reauthenticate)).toHaveLength(1); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source.tsx index f575ddb19ebdc..1e9be74224c5e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source.tsx @@ -18,49 +18,28 @@ import { WorkplaceSearchPageTemplate, PersonalDashboardLayout, } from '../../../../components/layout'; -import { NAV, CUSTOM_SERVICE_TYPE } from '../../../../constants'; -import { SOURCES_PATH, getSourcesPath } from '../../../../routes'; -import { SourceDataItem } from '../../../../types'; -import { staticSourceData } from '../../source_data'; +import { NAV } from '../../../../constants'; +import { SOURCES_PATH, getSourcesPath, getAddPath } from '../../../../routes'; import { AddSourceHeader } from './add_source_header'; import { AddSourceLogic, AddSourceProps, AddSourceSteps } from './add_source_logic'; import { ConfigCompleted } from './config_completed'; import { ConfigurationIntro } from './configuration_intro'; -import { ConfigureCustom } from './configure_custom'; import { ConfigureOauth } from './configure_oauth'; import { ConnectInstance } from './connect_instance'; import { Reauthenticate } from './reauthenticate'; import { SaveConfig } from './save_config'; -import { SaveCustom } from './save_custom'; import './add_source.scss'; export const AddSource: React.FC = (props) => { - const { - initializeAddSource, - setAddSourceStep, - saveSourceConfig, - createContentSource, - resetSourceState, - } = useActions(AddSourceLogic); - const { - addSourceCurrentStep, - sourceConfigData: { - name, - categories, - needsPermissions, - accountContextOnly, - privateSourcesEnabled, - }, - dataLoading, - newCustomSource, - } = useValues(AddSourceLogic); - - const { serviceType, configuration, features, objTypes, addPath } = staticSourceData[ - props.sourceIndex - ] as SourceDataItem; - + const { initializeAddSource, setAddSourceStep, saveSourceConfig, resetSourceState } = + useActions(AddSourceLogic); + const { addSourceCurrentStep, sourceConfigData, dataLoading } = useValues(AddSourceLogic); + const { name, categories, needsPermissions, accountContextOnly, privateSourcesEnabled } = + sourceConfigData; + const { serviceType, configuration, features, objTypes } = props.sourceData; + const addPath = getAddPath(serviceType); const { isOrganization } = useValues(AppLogic); useEffect(() => { @@ -85,9 +64,6 @@ export const AddSource: React.FC = (props) => { KibanaLogic.values.navigateToUrl(`${getSourcesPath(addPath, isOrganization)}/connect`); }; - const saveCustomSuccess = () => setAddSourceStep(AddSourceSteps.SaveCustomStep); - const goToSaveCustom = () => createContentSource(CUSTOM_SERVICE_TYPE, saveCustomSuccess); - const goToFormSourceCreated = () => { KibanaLogic.values.navigateToUrl(`${getSourcesPath(SOURCES_PATH, isOrganization)}`); flashSuccessToast(FORM_SOURCE_ADDED_SUCCESS_MESSAGE); @@ -131,24 +107,9 @@ export const AddSource: React.FC = (props) => { header={header} /> )} - {addSourceCurrentStep === AddSourceSteps.ConfigureCustomStep && ( - - )} {addSourceCurrentStep === AddSourceSteps.ConfigureOauthStep && ( )} - {addSourceCurrentStep === AddSourceSteps.SaveCustomStep && ( - - )} {addSourceCurrentStep === AddSourceSteps.ReauthenticateStep && ( )} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_list.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_list.tsx index 08e002ee432a9..15160abb42809 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_list.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_list.tsx @@ -27,7 +27,7 @@ import { } from '../../../../components/layout'; import { ContentSection } from '../../../../components/shared/content_section'; import { ViewContentHeader } from '../../../../components/shared/view_content_header'; -import { NAV, CUSTOM_SERVICE_TYPE } from '../../../../constants'; +import { NAV, CUSTOM_SERVICE_TYPE, EXTERNAL_SERVICE_TYPE } from '../../../../constants'; import { SourceDataItem } from '../../../../types'; import { SourcesLogic } from '../../sources_logic'; @@ -90,12 +90,12 @@ export const AddSourceList: React.FC = () => { const filterConfiguredSources = (source: SourceDataItem) => filterSources(source, configuredSources); - const visibleAvailableSources = availableSources.filter( - filterAvailableSources - ) as SourceDataItem[]; - const visibleConfiguredSources = configuredSources.filter( - filterConfiguredSources - ) as SourceDataItem[]; + const visibleAvailableSources = availableSources + .filter(filterAvailableSources) + .filter((source) => source.serviceType !== EXTERNAL_SERVICE_TYPE); + // The API returns available external sources as a separate entry, but we don't want to present them as options to add + + const visibleConfiguredSources = configuredSources.filter(filterConfiguredSources); const Layout = isOrganization ? WorkplaceSearchPageTemplate : PersonalDashboardLayout; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.test.ts index 65ccd8d95256e..80f8a2fc18218 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.test.ts @@ -15,6 +15,7 @@ import { sourceConfigData } from '../../../../__mocks__/content_sources.mock'; import { nextTick } from '@kbn/test-jest-helpers'; +import { docLinks } from '../../../../../shared/doc_links'; import { itShowsServerErrorAsFlashMessage } from '../../../../../test_helpers'; jest.mock('../../../../app_logic', () => ({ @@ -22,13 +23,9 @@ jest.mock('../../../../app_logic', () => ({ })); import { AppLogic } from '../../../../app_logic'; -import { - ADD_GITHUB_PATH, - SOURCES_PATH, - PRIVATE_SOURCES_PATH, - getSourcesPath, -} from '../../../../routes'; -import { CustomSource } from '../../../../types'; +import { SOURCE_NAMES, SOURCE_OBJ_TYPES } from '../../../../constants'; +import { SOURCES_PATH, PRIVATE_SOURCES_PATH, getSourcesPath } from '../../../../routes'; +import { FeatureIds } from '../../../../types'; import { PERSONAL_DASHBOARD_SOURCE_ERROR } from '../../constants'; import { SourcesLogic } from '../../sources_logic'; @@ -38,6 +35,8 @@ import { SourceConfigData, SourceConnectData, OrganizationsMap, + AddSourceValues, + AddSourceProps, } from './add_source_logic'; describe('AddSourceLogic', () => { @@ -46,13 +45,12 @@ describe('AddSourceLogic', () => { const { navigateToUrl } = mockKibanaValues; const { clearFlashMessages, flashAPIErrors, setErrorMessage } = mockFlashMessageHelpers; - const DEFAULT_VALUES = { + const DEFAULT_VALUES: AddSourceValues = { addSourceCurrentStep: AddSourceSteps.ConfigIntroStep, - addSourceProps: {}, + addSourceProps: {} as AddSourceProps, dataLoading: true, sectionLoading: true, buttonLoading: false, - customSourceNameValue: '', clientIdValue: '', clientSecretValue: '', baseUrlValue: '', @@ -62,7 +60,6 @@ describe('AddSourceLogic', () => { indexPermissionsValue: false, sourceConfigData: {} as SourceConfigData, sourceConnectData: {} as SourceConnectData, - newCustomSource: {} as CustomSource, oauthConfigCompleted: false, currentServiceType: '', githubOrganizations: [], @@ -81,8 +78,34 @@ describe('AddSourceLogic', () => { serviceType: 'github', githubOrganizations: ['foo', 'bar'], }; - - const CUSTOM_SERVICE_TYPE_INDEX = 17; + const DEFAULT_SERVICE_TYPE = { + name: SOURCE_NAMES.BOX, + iconName: SOURCE_NAMES.BOX, + serviceType: 'box', + configuration: { + isPublicKey: false, + hasOauthRedirect: true, + needsBaseUrl: false, + documentationUrl: docLinks.workplaceSearchBox, + applicationPortalUrl: 'https://app.box.com/developers/console', + }, + objTypes: [SOURCE_OBJ_TYPES.FOLDERS, SOURCE_OBJ_TYPES.ALL_FILES], + features: { + basicOrgContext: [ + FeatureIds.SyncFrequency, + FeatureIds.SyncedItems, + FeatureIds.GlobalAccessPermissions, + ], + basicOrgContextExcludedFeatures: [FeatureIds.DocumentLevelPermissions], + platinumOrgContext: [FeatureIds.SyncFrequency, FeatureIds.SyncedItems], + platinumPrivateContext: [ + FeatureIds.Private, + FeatureIds.SyncFrequency, + FeatureIds.SyncedItems, + ], + }, + accountContextOnly: false, + }; beforeEach(() => { jest.clearAllMocks(); @@ -145,15 +168,6 @@ describe('AddSourceLogic', () => { }); }); - it('setCustomSourceNameValue', () => { - AddSourceLogic.actions.setCustomSourceNameValue('name'); - - expect(AddSourceLogic.values).toEqual({ - ...DEFAULT_VALUES, - customSourceNameValue: 'name', - }); - }); - it('setSourceLoginValue', () => { AddSourceLogic.actions.setSourceLoginValue('login'); @@ -190,22 +204,6 @@ describe('AddSourceLogic', () => { }); }); - it('setCustomSourceData', () => { - const newCustomSource = { - accessToken: 'foo', - key: 'bar', - name: 'source', - id: '123key', - }; - - AddSourceLogic.actions.setCustomSourceData(newCustomSource); - - expect(AddSourceLogic.values).toEqual({ - ...DEFAULT_VALUES, - newCustomSource, - }); - }); - it('setPreContentSourceConfigData', () => { AddSourceLogic.actions.setPreContentSourceConfigData(config); @@ -260,13 +258,14 @@ describe('AddSourceLogic', () => { }); it('handles fallback states', () => { - const { publicKey, privateKey, consumerKey } = sourceConfigData.configuredFields; - const sourceConfigDataMock = { + const { publicKey, privateKey, consumerKey, apiKey } = sourceConfigData.configuredFields; + const sourceConfigDataMock: SourceConfigData = { ...sourceConfigData, configuredFields: { publicKey, privateKey, consumerKey, + apiKey, }, }; AddSourceLogic.actions.setSourceConfigData(sourceConfigDataMock); @@ -284,7 +283,7 @@ describe('AddSourceLogic', () => { describe('listeners', () => { it('initializeAddSource', () => { - const addSourceProps = { sourceIndex: 1 }; + const addSourceProps = { sourceData: DEFAULT_SERVICE_TYPE }; const getSourceConfigDataSpy = jest.spyOn(AddSourceLogic.actions, 'getSourceConfigData'); const setAddSourcePropsSpy = jest.spyOn(AddSourceLogic.actions, 'setAddSourceProps'); const setAddSourceStepSpy = jest.spyOn(AddSourceLogic.actions, 'setAddSourceStep'); @@ -293,21 +292,13 @@ describe('AddSourceLogic', () => { expect(setAddSourcePropsSpy).toHaveBeenCalledWith({ addSourceProps }); expect(setAddSourceStepSpy).toHaveBeenCalledWith(AddSourceSteps.ConfigIntroStep); - expect(getSourceConfigDataSpy).toHaveBeenCalledWith('confluence_cloud'); + expect(getSourceConfigDataSpy).toHaveBeenCalledWith('box'); }); describe('getFirstStep', () => { - it('sets custom as first step', () => { - const setAddSourceStepSpy = jest.spyOn(AddSourceLogic.actions, 'setAddSourceStep'); - const addSourceProps = { sourceIndex: CUSTOM_SERVICE_TYPE_INDEX }; - AddSourceLogic.actions.initializeAddSource(addSourceProps); - - expect(setAddSourceStepSpy).toHaveBeenCalledWith(AddSourceSteps.ConfigureCustomStep); - }); - it('sets connect as first step', () => { const setAddSourceStepSpy = jest.spyOn(AddSourceLogic.actions, 'setAddSourceStep'); - const addSourceProps = { sourceIndex: 1, connect: true }; + const addSourceProps = { sourceData: DEFAULT_SERVICE_TYPE, connect: true }; AddSourceLogic.actions.initializeAddSource(addSourceProps); expect(setAddSourceStepSpy).toHaveBeenCalledWith(AddSourceSteps.ConnectInstanceStep); @@ -315,7 +306,7 @@ describe('AddSourceLogic', () => { it('sets configure as first step', () => { const setAddSourceStepSpy = jest.spyOn(AddSourceLogic.actions, 'setAddSourceStep'); - const addSourceProps = { sourceIndex: 1, configure: true }; + const addSourceProps = { sourceData: DEFAULT_SERVICE_TYPE, configure: true }; AddSourceLogic.actions.initializeAddSource(addSourceProps); expect(setAddSourceStepSpy).toHaveBeenCalledWith(AddSourceSteps.ConfigureOauthStep); @@ -323,7 +314,7 @@ describe('AddSourceLogic', () => { it('sets reAuthenticate as first step', () => { const setAddSourceStepSpy = jest.spyOn(AddSourceLogic.actions, 'setAddSourceStep'); - const addSourceProps = { sourceIndex: 1, reAuthenticate: true }; + const addSourceProps = { sourceData: DEFAULT_SERVICE_TYPE, reAuthenticate: true }; AddSourceLogic.actions.initializeAddSource(addSourceProps); expect(setAddSourceStepSpy).toHaveBeenCalledWith(AddSourceSteps.ReauthenticateStep); @@ -401,7 +392,7 @@ describe('AddSourceLogic', () => { await nextTick(); expect(setPreContentSourceIdSpy).toHaveBeenCalledWith(preContentSourceId); - expect(navigateToUrl).toHaveBeenCalledWith(`${ADD_GITHUB_PATH}/configure${queryString}`); + expect(navigateToUrl).toHaveBeenCalledWith(`/sources/add/github/configure${queryString}`); }); describe('Github error edge case', () => { @@ -635,7 +626,6 @@ describe('AddSourceLogic', () => { const errorCallback = jest.fn(); const serviceType = 'zendesk'; - const name = 'name'; const login = 'login'; const password = 'password'; const indexPermissions = false; @@ -643,7 +633,6 @@ describe('AddSourceLogic', () => { let params: any; beforeEach(() => { - AddSourceLogic.actions.setCustomSourceNameValue(name); AddSourceLogic.actions.setSourceLoginValue(login); AddSourceLogic.actions.setSourcePasswordValue(password); AddSourceLogic.actions.setPreContentSourceConfigData(config); @@ -652,7 +641,6 @@ describe('AddSourceLogic', () => { params = { service_type: serviceType, - name, login, password, organizations: ['foo'], @@ -661,8 +649,7 @@ describe('AddSourceLogic', () => { it('calls API and sets values', async () => { const setButtonNotLoadingSpy = jest.spyOn(AddSourceLogic.actions, 'setButtonNotLoading'); - const setCustomSourceDataSpy = jest.spyOn(AddSourceLogic.actions, 'setCustomSourceData'); - http.post.mockReturnValue(Promise.resolve({ sourceConfigData })); + http.post.mockReturnValue(Promise.resolve()); AddSourceLogic.actions.createContentSource(serviceType, successCallback, errorCallback); @@ -672,7 +659,6 @@ describe('AddSourceLogic', () => { body: JSON.stringify({ ...params }), }); await nextTick(); - expect(setCustomSourceDataSpy).toHaveBeenCalledWith({ sourceConfigData }); expect(successCallback).toHaveBeenCalled(); expect(setButtonNotLoadingSpy).toHaveBeenCalled(); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.ts index 6dbac2dcd1452..db0c5b9737263 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.ts @@ -21,20 +21,14 @@ import { import { HttpLogic } from '../../../../../shared/http'; import { KibanaLogic } from '../../../../../shared/kibana'; import { AppLogic } from '../../../../app_logic'; -import { CUSTOM_SERVICE_TYPE, WORKPLACE_SEARCH_URL_PREFIX } from '../../../../constants'; -import { - SOURCES_PATH, - ADD_GITHUB_PATH, - PRIVATE_SOURCES_PATH, - getSourcesPath, -} from '../../../../routes'; -import { CustomSource } from '../../../../types'; +import { WORKPLACE_SEARCH_URL_PREFIX } from '../../../../constants'; +import { SOURCES_PATH, PRIVATE_SOURCES_PATH, getSourcesPath, getAddPath } from '../../../../routes'; +import { SourceDataItem } from '../../../../types'; import { PERSONAL_DASHBOARD_SOURCE_ERROR } from '../../constants'; -import { staticSourceData } from '../../source_data'; import { SourcesLogic } from '../../sources_logic'; export interface AddSourceProps { - sourceIndex: number; + sourceData: SourceDataItem; connect?: boolean; configure?: boolean; reAuthenticate?: boolean; @@ -45,9 +39,7 @@ export enum AddSourceSteps { SaveConfigStep = 'Save Config', ConfigCompletedStep = 'Config Completed', ConnectInstanceStep = 'Connect Instance', - ConfigureCustomStep = 'Configure Custom', ConfigureOauthStep = 'Configure Oauth', - SaveCustomStep = 'Save Custom', ReauthenticateStep = 'Reauthenticate', } @@ -71,12 +63,10 @@ export interface AddSourceActions { setClientIdValue(clientIdValue: string): string; setClientSecretValue(clientSecretValue: string): string; setBaseUrlValue(baseUrlValue: string): string; - setCustomSourceNameValue(customSourceNameValue: string): string; setSourceLoginValue(loginValue: string): string; setSourcePasswordValue(passwordValue: string): string; setSourceSubdomainValue(subdomainValue: string): string; setSourceIndexPermissionsValue(indexPermissionsValue: boolean): boolean; - setCustomSourceData(data: CustomSource): CustomSource; setPreContentSourceConfigData(data: PreContentSourceResponse): PreContentSourceResponse; setPreContentSourceId(preContentSourceId: string): string; setSelectedGithubOrganizations(option: string): string; @@ -119,6 +109,8 @@ export interface SourceConfigData { baseUrl?: string; clientId?: string; clientSecret?: string; + url?: string; + apiKey?: string; }; accountContextOnly?: boolean; } @@ -132,13 +124,12 @@ export interface OrganizationsMap { [key: string]: string | boolean; } -interface AddSourceValues { +export interface AddSourceValues { addSourceProps: AddSourceProps; addSourceCurrentStep: AddSourceSteps; dataLoading: boolean; sectionLoading: boolean; buttonLoading: boolean; - customSourceNameValue: string; clientIdValue: string; clientSecretValue: string; baseUrlValue: string; @@ -148,7 +139,6 @@ interface AddSourceValues { indexPermissionsValue: boolean; sourceConfigData: SourceConfigData; sourceConnectData: SourceConnectData; - newCustomSource: CustomSource; currentServiceType: string; githubOrganizations: string[]; selectedGithubOrganizationsMap: OrganizationsMap; @@ -185,12 +175,10 @@ export const AddSourceLogic = kea clientIdValue, setClientSecretValue: (clientSecretValue: string) => clientSecretValue, setBaseUrlValue: (baseUrlValue: string) => baseUrlValue, - setCustomSourceNameValue: (customSourceNameValue: string) => customSourceNameValue, setSourceLoginValue: (loginValue: string) => loginValue, setSourcePasswordValue: (passwordValue: string) => passwordValue, setSourceSubdomainValue: (subdomainValue: string) => subdomainValue, setSourceIndexPermissionsValue: (indexPermissionsValue: boolean) => indexPermissionsValue, - setCustomSourceData: (data: CustomSource) => data, setPreContentSourceConfigData: (data: PreContentSourceResponse) => data, setPreContentSourceId: (preContentSourceId: string) => preContentSourceId, setSelectedGithubOrganizations: (option: string) => option, @@ -322,20 +310,6 @@ export const AddSourceLogic = kea false, }, ], - customSourceNameValue: [ - '', - { - setCustomSourceNameValue: (_, customSourceNameValue) => customSourceNameValue, - resetSourceState: () => '', - }, - ], - newCustomSource: [ - {} as CustomSource, - { - setCustomSourceData: (_, newCustomSource) => newCustomSource, - resetSourceState: () => ({} as CustomSource), - }, - ], currentServiceType: [ '', { @@ -383,7 +357,7 @@ export const AddSourceLogic = kea ({ initializeAddSource: ({ addSourceProps }) => { - const { serviceType } = staticSourceData[addSourceProps.sourceIndex]; + const { serviceType } = addSourceProps.sourceData; actions.setAddSourceProps({ addSourceProps }); actions.setAddSourceStep(getFirstStep(addSourceProps)); actions.getSourceConfigData(serviceType); @@ -540,7 +514,9 @@ export const AddSourceLogic = kea 0 ? githubOrganizations : undefined, @@ -580,10 +554,9 @@ export const AddSourceLogic = kea params[key] === undefined && delete params[key]); try { - const response = await HttpLogic.values.http.post(route, { + await HttpLogic.values.http.post(route, { body: JSON.stringify({ ...params }), }); - actions.setCustomSourceData(response); successCallback(); } catch (e) { flashAPIErrors(e); @@ -596,11 +569,7 @@ export const AddSourceLogic = kea { - const { sourceIndex, connect, configure, reAuthenticate } = props; - const { serviceType } = staticSourceData[sourceIndex]; - const isCustom = serviceType === CUSTOM_SERVICE_TYPE; - - if (isCustom) return AddSourceSteps.ConfigureCustomStep; + const { connect, configure, reAuthenticate } = props; if (connect) return AddSourceSteps.ConnectInstanceStep; if (configure) return AddSourceSteps.ConfigureOauthStep; if (reAuthenticate) return AddSourceSteps.ReauthenticateStep; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/available_sources_list.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/available_sources_list.test.tsx index f168dfbea91ce..fbcb8685f7ff9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/available_sources_list.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/available_sources_list.test.tsx @@ -26,7 +26,7 @@ describe('AvailableSourcesList', () => { const wrapper = shallow(); expect(wrapper.find(EuiTitle)).toHaveLength(1); - expect(wrapper.find('[data-test-subj="AvailableSourceListItem"]')).toHaveLength(11); + expect(wrapper.find('[data-test-subj="AvailableSourceListItem"]')).toHaveLength(20); expect(wrapper.find('[data-test-subj="CustomAPISourceLink"]')).toHaveLength(1); }); @@ -34,7 +34,7 @@ describe('AvailableSourcesList', () => { setMockValues({ hasPlatinumLicense: false }); const wrapper = shallow(); - expect(wrapper.find(EuiToolTip)).toHaveLength(1); + expect(wrapper.find(EuiToolTip)).toHaveLength(2); }); it('handles empty state', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/available_sources_list.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/available_sources_list.tsx index 13f0f41643e16..7dc9ad9ca0f60 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/available_sources_list.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/available_sources_list.tsx @@ -24,9 +24,11 @@ import { i18n } from '@kbn/i18n'; import { LicensingLogic } from '../../../../../shared/licensing'; import { EuiButtonEmptyTo, EuiLinkTo } from '../../../../../shared/react_router_helpers'; import { SourceIcon } from '../../../../components/shared/source_icon'; -import { ADD_CUSTOM_PATH, getSourcesPath } from '../../../../routes'; +import { ADD_CUSTOM_PATH, getAddPath, getSourcesPath } from '../../../../routes'; import { SourceDataItem } from '../../../../types'; +import { staticCustomSourceData } from '../../source_data'; + import { AVAILABLE_SOURCE_EMPTY_STATE, AVAILABLE_SOURCE_TITLE, @@ -41,7 +43,8 @@ interface AvailableSourcesListProps { export const AvailableSourcesList: React.FC = ({ sources }) => { const { hasPlatinumLicense } = useValues(LicensingLogic); - const getSourceCard = ({ name, serviceType, addPath, accountContextOnly }: SourceDataItem) => { + const getSourceCard = ({ name, serviceType, accountContextOnly }: SourceDataItem) => { + const addPath = getAddPath(serviceType); const disabled = !hasPlatinumLicense && accountContextOnly; const connectButton = () => { @@ -105,6 +108,15 @@ export const AvailableSourcesList: React.FC = ({ sour
))} + + + {getSourceCard(staticCustomSourceData)} + + ); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configuration_choice.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configuration_choice.test.tsx new file mode 100644 index 0000000000000..bfb916847d865 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configuration_choice.test.tsx @@ -0,0 +1,141 @@ +/* + * 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 { mockKibanaValues, setMockValues } from '../../../../../__mocks__/kea_logic'; + +import React from 'react'; + +import { shallow } from 'enzyme'; + +import { EuiText, EuiButton } from '@elastic/eui'; + +import { + PersonalDashboardLayout, + WorkplaceSearchPageTemplate, +} from '../../../../components/layout'; +import { staticSourceData } from '../../source_data'; + +import { ConfigurationChoice } from './configuration_choice'; + +describe('ConfigurationChoice', () => { + const { navigateToUrl } = mockKibanaValues; + const props = { + sourceData: staticSourceData[0], + }; + const mockValues = { + isOrganization: true, + }; + + beforeEach(() => { + setMockValues(mockValues); + jest.clearAllMocks(); + }); + + describe('layout', () => { + it('renders the default workplace search layout when on an organization view', () => { + setMockValues({ ...mockValues, isOrganization: true }); + const wrapper = shallow(); + + expect(wrapper.type()).toEqual(WorkplaceSearchPageTemplate); + }); + + it('renders the personal dashboard layout when not in an organization', () => { + setMockValues({ ...mockValues, isOrganization: false }); + const wrapper = shallow(); + + expect(wrapper.type()).toEqual(PersonalDashboardLayout); + }); + }); + + it('renders internal connector if available', () => { + const wrapper = shallow(); + + expect(wrapper.find('EuiPanel')).toHaveLength(1); + expect(wrapper.find(EuiText)).toHaveLength(3); + expect(wrapper.find(EuiButton)).toHaveLength(1); + }); + it('should navigate to internal connector on internal connector click', () => { + const wrapper = shallow(); + const button = wrapper.find(EuiButton); + button.simulate('click'); + expect(navigateToUrl).toHaveBeenCalledWith('/sources/add/box/internal/'); + }); + + it('renders external connector if available', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('EuiPanel')).toHaveLength(1); + expect(wrapper.find(EuiText)).toHaveLength(3); + expect(wrapper.find(EuiButton)).toHaveLength(1); + }); + it('should navigate to external connector on external connector click', () => { + const wrapper = shallow( + + ); + const button = wrapper.find(EuiButton); + button.simulate('click'); + expect(navigateToUrl).toHaveBeenCalledWith('/sources/add/box/external/'); + }); + + it('renders custom connector if available', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('EuiPanel')).toHaveLength(1); + expect(wrapper.find(EuiText)).toHaveLength(3); + expect(wrapper.find(EuiButton)).toHaveLength(1); + }); + it('should navigate to custom connector on internal connector click', () => { + const wrapper = shallow( + + ); + const button = wrapper.find(EuiButton); + button.simulate('click'); + expect(navigateToUrl).toHaveBeenCalledWith('/sources/add/box/custom/'); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configuration_choice.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configuration_choice.tsx new file mode 100644 index 0000000000000..46a8998c9dd10 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configuration_choice.tsx @@ -0,0 +1,236 @@ +/* + * 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 { useValues } from 'kea'; + +import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiPanel, EuiSpacer, EuiText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import { KibanaLogic } from '../../../../../shared/kibana'; +import { AppLogic } from '../../../../app_logic'; +import { + WorkplaceSearchPageTemplate, + PersonalDashboardLayout, +} from '../../../../components/layout'; +import { NAV } from '../../../../constants'; +import { getAddPath, getSourcesPath } from '../../../../routes'; +import { SourceDataItem } from '../../../../types'; + +import { AddSourceHeader } from './add_source_header'; + +interface ConfigurationIntroProps { + sourceData: SourceDataItem; +} + +export const ConfigurationChoice: React.FC = ({ + sourceData: { + name, + serviceType, + externalConnectorAvailable, + internalConnectorAvailable, + customConnectorAvailable, + }, +}) => { + const { isOrganization } = useValues(AppLogic); + const goToInternal = () => + KibanaLogic.values.navigateToUrl( + `${getSourcesPath( + `${getSourcesPath(getAddPath(serviceType), isOrganization)}/internal`, + isOrganization + )}/` + ); + const goToExternal = () => + KibanaLogic.values.navigateToUrl( + `${getSourcesPath( + `${getSourcesPath(getAddPath(serviceType), isOrganization)}/external`, + isOrganization + )}/` + ); + const goToCustom = () => + KibanaLogic.values.navigateToUrl( + `${getSourcesPath( + `${getSourcesPath(getAddPath(serviceType), isOrganization)}/custom`, + isOrganization + )}/` + ); + const Layout = isOrganization ? WorkplaceSearchPageTemplate : PersonalDashboardLayout; + + return ( + + + + + {internalConnectorAvailable && ( + + + + + +

{name}

+
+
+ + +

+ {i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.contentSource.configExternalChoice.internal.title', + { + defaultMessage: 'Default connector', + } + )} +

+
+
+ + + {i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.contentSource.configExternalChoice.internal.description', + { + defaultMessage: 'Use our out-of-the-box connector to get started quickly.', + } + )} + + + + + {i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.contentSource.configExternalChoice.internal.button', + { + defaultMessage: 'Connect', + } + )} + + +
+
+
+ )} + {externalConnectorAvailable && ( + + + + + +

{name}

+
+
+ + +

+ {i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.contentSource.configExternalChoice.external.title', + { + defaultMessage: 'Custom connector', + } + )} +

+
+
+ + + {i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.contentSource.configExternalChoice.external.description', + { + defaultMessage: + 'Set up a custom connector for more configurability and control.', + } + )} + + + + + + {i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.contentSource.configExternalChoice.external.button', + { + defaultMessage: 'Instructions', + } + )} + + + +
+
+
+ )} + {customConnectorAvailable && ( + + + + + +

{name}

+
+
+ + +

+ {i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.contentSource.configExternalChoice.custom.title', + { + defaultMessage: 'Custom connector', + } + )} +

+
+
+ + + {i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.contentSource.configExternalChoice.custom.description', + { + defaultMessage: + 'Set up a custom connector for more configurability and control.', + } + )} + + +
+ + + + {i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.contentSource.configExternalChoice.custom.button', + { + defaultMessage: 'Instructions', + } + )} + + + +
+
+ )} +
+
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configure_custom.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configure_custom.test.tsx index 6c0d87b7696ec..645226c546f10 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configure_custom.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configure_custom.test.tsx @@ -14,45 +14,45 @@ import { shallow } from 'enzyme'; import { EuiForm, EuiFieldText } from '@elastic/eui'; +import { staticSourceData } from '../../source_data'; + import { ConfigureCustom } from './configure_custom'; describe('ConfigureCustom', () => { - const advanceStep = jest.fn(); const setCustomSourceNameValue = jest.fn(); - - const props = { - header:

Header

, - helpText: 'I bet you could use a hand.', - advanceStep, - }; + const createContentSource = jest.fn(); beforeEach(() => { - setMockActions({ setCustomSourceNameValue }); - setMockValues({ customSourceNameValue: 'name', buttonLoading: false }); + setMockActions({ setCustomSourceNameValue, createContentSource }); + setMockValues({ + customSourceNameValue: 'name', + buttonLoading: false, + sourceData: staticSourceData[1], + }); }); it('renders', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find(EuiForm)).toHaveLength(1); }); it('handles input change', () => { - const wrapper = shallow(); - const TEXT = 'changed for the better'; + const wrapper = shallow(); + const text = 'changed for the better'; const input = wrapper.find(EuiFieldText); - input.simulate('change', { target: { value: TEXT } }); + input.simulate('change', { target: { value: text } }); - expect(setCustomSourceNameValue).toHaveBeenCalledWith(TEXT); + expect(setCustomSourceNameValue).toHaveBeenCalledWith(text); }); it('handles form submission', () => { - const wrapper = shallow(); + const wrapper = shallow(); const preventDefault = jest.fn(); wrapper.find('form').simulate('submit', { preventDefault }); expect(preventDefault).toHaveBeenCalled(); - expect(advanceStep).toHaveBeenCalled(); + expect(createContentSource).toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configure_custom.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configure_custom.tsx index e794323dc169e..bf5a7fea21333 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configure_custom.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configure_custom.tsx @@ -24,51 +24,64 @@ import { docLinks } from '../../../../../shared/doc_links'; import { SOURCE_NAME_LABEL } from '../../constants'; -import { AddSourceLogic } from './add_source_logic'; +import { AddCustomSourceLogic } from './add_custom_source_logic'; +import { AddSourceHeader } from './add_source_header'; import { CONFIG_CUSTOM_BUTTON, CONFIG_CUSTOM_LINK_TEXT } from './constants'; -interface ConfigureCustomProps { - header: React.ReactNode; - helpText: string; - advanceStep(): void; -} - -export const ConfigureCustom: React.FC = ({ - helpText, - advanceStep, - header, -}) => { - const { setCustomSourceNameValue } = useActions(AddSourceLogic); - const { customSourceNameValue, buttonLoading } = useValues(AddSourceLogic); +export const ConfigureCustom: React.FC = () => { + const { setCustomSourceNameValue, createContentSource } = useActions(AddCustomSourceLogic); + const { customSourceNameValue, buttonLoading, sourceData } = useValues(AddCustomSourceLogic); const handleFormSubmit = (e: FormEvent) => { e.preventDefault(); - advanceStep(); + createContentSource(); }; const handleNameChange = (e: ChangeEvent) => setCustomSourceNameValue(e.target.value); + const { + serviceType, + configuration: { documentationUrl, helpText }, + name, + categories = [], + } = sourceData; + return ( <> - {header} +

{helpText}

- - {CONFIG_CUSTOM_LINK_TEXT} - - ), - }} - /> + {serviceType === 'custom' ? ( + + {CONFIG_CUSTOM_LINK_TEXT} + + ), + }} + /> + ) : ( + + {CONFIG_CUSTOM_LINK_TEXT} + + ), + name, + }} + /> + )}

@@ -90,7 +103,17 @@ export const ConfigureCustom: React.FC = ({ isLoading={buttonLoading} data-test-subj="CreateCustomButton" > - {CONFIG_CUSTOM_BUTTON} + {serviceType === 'custom' ? ( + CONFIG_CUSTOM_BUTTON + ) : ( + + )}
diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configured_sources_list.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configured_sources_list.test.tsx index a1169cd582cba..a13558469cc08 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configured_sources_list.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configured_sources_list.test.tsx @@ -22,9 +22,9 @@ describe('ConfiguredSourcesList', () => { it('renders', () => { const wrapper = shallow(); - expect(wrapper.find('[data-test-subj="UnConnectedTooltip"]')).toHaveLength(5); - expect(wrapper.find('[data-test-subj="AccountOnlyTooltip"]')).toHaveLength(1); - expect(wrapper.find('[data-test-subj="ConfiguredSourcesListItem"]')).toHaveLength(6); + expect(wrapper.find('[data-test-subj="UnConnectedTooltip"]')).toHaveLength(16); + expect(wrapper.find('[data-test-subj="AccountOnlyTooltip"]')).toHaveLength(2); + expect(wrapper.find('[data-test-subj="ConfiguredSourcesListItem"]')).toHaveLength(19); }); it('handles empty state', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configured_sources_list.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configured_sources_list.tsx index ac465c43643a4..d4bb62901cdb6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configured_sources_list.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/configured_sources_list.tsx @@ -22,8 +22,9 @@ import { import { EuiButtonEmptyTo } from '../../../../../shared/react_router_helpers'; import { SourceIcon } from '../../../../components/shared/source_icon'; -import { getSourcesPath } from '../../../../routes'; +import { getAddPath, getSourcesPath } from '../../../../routes'; import { SourceDataItem } from '../../../../types'; +import { hasMultipleConnectorOptions } from '../../../../utils'; import { CONFIGURED_SOURCES_LIST_UNCONNECTED_TOOLTIP, @@ -68,54 +69,62 @@ export const ConfiguredSourcesList: React.FC = ({ const visibleSources = ( - {sources.map(({ name, serviceType, addPath, connected, accountContextOnly }, i) => ( - - - - - - - - - - -

- {name} - {!connected && !accountContextOnly && isOrganization && unConnectedTooltip} - {accountContextOnly && isOrganization && accountOnlyTooltip} -

-
-
-
-
- - {((!isOrganization || (isOrganization && !accountContextOnly)) && ( - { + const { connected, accountContextOnly, name, serviceType } = sourceData; + return ( + + + + + - {CONFIGURED_SOURCES_CONNECT_BUTTON} - - )) || ( - - {ADD_SOURCE_ORG_SOURCES_TITLE} - - )} - -
-
-
- ))} + + + + + +

+ {name} + {!connected && + !accountContextOnly && + isOrganization && + unConnectedTooltip} + {accountContextOnly && isOrganization && accountOnlyTooltip} +

+
+
+ + + + {((!isOrganization || (isOrganization && !accountContextOnly)) && ( + + {CONFIGURED_SOURCES_CONNECT_BUTTON} + + )) || ( + + {ADD_SOURCE_ORG_SOURCES_TITLE} + + )} + + + + + ); + })}
); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.test.tsx index c967b20e0450d..0ee80019ea720 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.test.tsx @@ -43,7 +43,7 @@ describe('ConnectInstance', () => { const credentialsSourceData = staticSourceData[13]; const oauthSourceData = staticSourceData[0]; - const subdomainSourceData = staticSourceData[16]; + const subdomainSourceData = staticSourceData[18]; const props = { ...credentialsSourceData, diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_config.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_config.test.tsx new file mode 100644 index 0000000000000..6288a5fc79129 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_config.test.tsx @@ -0,0 +1,90 @@ +/* + * 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 '../../../../../__mocks__/shallow_useeffect.mock'; +import { setMockActions, setMockValues } from '../../../../../__mocks__/kea_logic'; +import { sourceConfigData } from '../../../../__mocks__/content_sources.mock'; + +import React from 'react'; + +import { shallow } from 'enzyme'; + +import { EuiSteps } from '@elastic/eui'; + +import { staticSourceData } from '../../source_data'; + +import { ExternalConnectorConfig } from './external_connector_config'; + +describe('ExternalConnectorConfig', () => { + const goBack = jest.fn(); + const onDeleteConfig = jest.fn(); + const setExternalConnectorApiKey = jest.fn(); + const setExternalConnectorUrl = jest.fn(); + const saveExternalConnectorConfig = jest.fn(); + const fetchExternalSource = jest.fn(); + + const props = { + sourceData: staticSourceData[0], + goBack, + onDeleteConfig, + }; + + const values = { + sourceConfigData, + buttonLoading: false, + clientIdValue: 'foo', + clientSecretValue: 'bar', + baseUrlValue: 'http://foo.baz', + hasPlatinumLicense: true, + }; + + beforeEach(() => { + setMockActions({ + setExternalConnectorApiKey, + setExternalConnectorUrl, + saveExternalConnectorConfig, + fetchExternalSource, + }); + setMockValues({ ...values }); + }); + + it('renders', () => { + const wrapper = shallow(); + + expect(wrapper.find(EuiSteps)).toHaveLength(1); + }); + + it('handles form submission', () => { + const wrapper = shallow(); + + const preventDefault = jest.fn(); + wrapper.find('form').simulate('submit', { preventDefault }); + + expect(preventDefault).toHaveBeenCalled(); + expect(saveExternalConnectorConfig).toHaveBeenCalled(); + }); + + describe('external connector configuration', () => { + it('handles url change', () => { + const wrapper = shallow(); + const steps = wrapper.find(EuiSteps); + const input = steps.dive().find('[name="external-connector-url"]'); + input.simulate('change', { target: { value: 'url' } }); + + expect(setExternalConnectorUrl).toHaveBeenCalledWith('url'); + }); + + it('handles Client secret change', () => { + const wrapper = shallow(); + const steps = wrapper.find(EuiSteps); + const input = steps.dive().find('[name="external-connector-api-key"]'); + input.simulate('change', { target: { value: 'api-key' } }); + + expect(setExternalConnectorApiKey).toHaveBeenCalledWith('api-key'); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_config.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_config.tsx new file mode 100644 index 0000000000000..1f0528f492b9d --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_config.tsx @@ -0,0 +1,168 @@ +/* + * 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, { FormEvent, useEffect } from 'react'; + +import { useActions, useValues } from 'kea'; + +import { + EuiButton, + EuiButtonEmpty, + EuiFieldText, + EuiFlexGroup, + EuiFlexItem, + EuiForm, + EuiFormRow, + EuiSpacer, + EuiSteps, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import { AppLogic } from '../../../../app_logic'; +import { + PersonalDashboardLayout, + WorkplaceSearchPageTemplate, +} from '../../../../components/layout'; +import { NAV, REMOVE_BUTTON } from '../../../../constants'; +import { SourceDataItem } from '../../../../types'; + +import { AddSourceHeader } from './add_source_header'; +import { OAUTH_SAVE_CONFIG_BUTTON, OAUTH_BACK_BUTTON } from './constants'; +import { ExternalConnectorLogic } from './external_connector_logic'; + +interface SaveConfigProps { + sourceData: SourceDataItem; + goBack?: () => void; + onDeleteConfig?: () => void; +} + +export const ExternalConnectorConfig: React.FC = ({ goBack, onDeleteConfig }) => { + const serviceType = 'external'; + const { + fetchExternalSource, + setExternalConnectorApiKey, + setExternalConnectorUrl, + saveExternalConnectorConfig, + } = useActions(ExternalConnectorLogic); + + const { buttonLoading, externalConnectorUrl, externalConnectorApiKey, sourceConfigData } = + useValues(ExternalConnectorLogic); + + useEffect(() => { + fetchExternalSource(); + }, []); + + const handleFormSubmission = (e: FormEvent) => { + e.preventDefault(); + saveExternalConnectorConfig({ url: externalConnectorUrl, apiKey: externalConnectorApiKey }); + }; + + const { name, categories } = sourceConfigData; + const { isOrganization } = useValues(AppLogic); + + const saveButton = ( + + {OAUTH_SAVE_CONFIG_BUTTON} + + ); + + const deleteButton = ( + + {REMOVE_BUTTON} + + ); + + const backButton = {OAUTH_BACK_BUTTON}; + + const formActions = ( + + + {saveButton} + + {goBack && backButton} + {onDeleteConfig && deleteButton} + + + + ); + + const connectorForm = ( + + {/* TODO: get a docs link in here for the external connector + */} + + + + setExternalConnectorUrl(e.target.value)} + name="external-connector-url" + /> + + + setExternalConnectorApiKey(e.target.value)} + name="external-connector-api-key" + /> + + + {formActions} + + + ); + + const configSteps = [ + { + title: i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.contentSource.addSource.externalConnectorConfig.stepTitle', + { + defaultMessage: 'Provide the appropriate configuration information', + } + ), + children: connectorForm, + }, + ]; + + const header = ; + const Layout = isOrganization ? WorkplaceSearchPageTemplate : PersonalDashboardLayout; + + return ( + + {header} + + + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_logic.test.ts new file mode 100644 index 0000000000000..22a36deeeccd5 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_logic.test.ts @@ -0,0 +1,144 @@ +/* + * 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 { LogicMounter, mockHttpValues, mockKibanaValues } from '../../../../../__mocks__/kea_logic'; +import { sourceConfigData } from '../../../../__mocks__/content_sources.mock'; + +import { itShowsServerErrorAsFlashMessage } from '../../../../../test_helpers'; + +jest.mock('../../../../app_logic', () => ({ + AppLogic: { values: { isOrganization: true } }, +})); + +import { ExternalConnectorLogic, ExternalConnectorValues } from './external_connector_logic'; + +describe('ExternalConnectorLogic', () => { + const { mount } = new LogicMounter(ExternalConnectorLogic); + const { http } = mockHttpValues; + const { navigateToUrl } = mockKibanaValues; + + const DEFAULT_VALUES: ExternalConnectorValues = { + dataLoading: true, + buttonLoading: false, + externalConnectorUrl: '', + externalConnectorApiKey: '', + sourceConfigData: { + name: '', + categories: [], + }, + }; + + beforeEach(() => { + jest.clearAllMocks(); + mount(); + }); + + it('has expected default values', () => { + expect(ExternalConnectorLogic.values).toEqual(DEFAULT_VALUES); + }); + + describe('actions', () => { + describe('fetchExternalSourceSuccess', () => { + beforeEach(() => { + ExternalConnectorLogic.actions.fetchExternalSourceSuccess(sourceConfigData); + }); + + it('turns off the data loading flag', () => { + expect(ExternalConnectorLogic.values.dataLoading).toEqual(false); + }); + + it('saves the external url', () => { + expect(ExternalConnectorLogic.values.externalConnectorUrl).toEqual( + sourceConfigData.configuredFields.url + ); + }); + + it('saves the source config', () => { + expect(ExternalConnectorLogic.values.sourceConfigData).toEqual(sourceConfigData); + }); + + it('sets undefined url to empty string', () => { + ExternalConnectorLogic.actions.fetchExternalSourceSuccess({ + ...sourceConfigData, + configuredFields: { ...sourceConfigData.configuredFields, url: undefined }, + }); + expect(ExternalConnectorLogic.values.externalConnectorUrl).toEqual(''); + }); + it('sets undefined api key to empty string', () => { + ExternalConnectorLogic.actions.fetchExternalSourceSuccess({ + ...sourceConfigData, + configuredFields: { ...sourceConfigData.configuredFields, apiKey: undefined }, + }); + expect(ExternalConnectorLogic.values.externalConnectorApiKey).toEqual(''); + }); + }); + + describe('saveExternalConnectorConfigSuccess', () => { + it('turns off the button loading flag', () => { + mount({ + buttonLoading: true, + }); + + ExternalConnectorLogic.actions.saveExternalConnectorConfigSuccess('external'); + + expect(ExternalConnectorLogic.values.buttonLoading).toEqual(false); + }); + }); + + describe('setExternalConnectorApiKey', () => { + it('updates the api key', () => { + ExternalConnectorLogic.actions.setExternalConnectorApiKey('abcd1234'); + + expect(ExternalConnectorLogic.values.externalConnectorApiKey).toEqual('abcd1234'); + }); + }); + + describe('setExternalConnectorUrl', () => { + it('updates the url', () => { + ExternalConnectorLogic.actions.setExternalConnectorUrl('https://www.elastic.co'); + + expect(ExternalConnectorLogic.values.externalConnectorUrl).toEqual( + 'https://www.elastic.co' + ); + }); + }); + }); + + describe('listeners', () => { + describe('fetchExternalSource', () => { + it('retrieves config info on the "external" connector', () => { + const promise = Promise.resolve(); + http.get.mockReturnValue(promise); + ExternalConnectorLogic.actions.fetchExternalSource(); + + expect(http.get).toHaveBeenCalledWith( + '/internal/workplace_search/org/settings/connectors/external' + ); + }); + + itShowsServerErrorAsFlashMessage(http.get, () => { + mount(); + ExternalConnectorLogic.actions.fetchExternalSource(); + }); + }); + + describe('saveExternalConnectorConfig', () => { + it('saves the external connector config', () => { + const saveExternalConnectorConfigSuccess = jest.spyOn( + ExternalConnectorLogic.actions, + 'saveExternalConnectorConfigSuccess' + ); + ExternalConnectorLogic.actions.saveExternalConnectorConfig({ + url: 'url', + apiKey: 'apiKey', + }); + expect(saveExternalConnectorConfigSuccess).toHaveBeenCalled(); + expect(navigateToUrl).toHaveBeenCalledWith('/sources/add/external'); + }); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_logic.ts new file mode 100644 index 0000000000000..13c0b9167310b --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/external_connector_logic.ts @@ -0,0 +1,138 @@ +/* + * 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 { kea, MakeLogicType } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { + flashAPIErrors, + flashSuccessToast, + clearFlashMessages, +} from '../../../../../shared/flash_messages'; +import { HttpLogic } from '../../../../../shared/http'; +import { KibanaLogic } from '../../../../../shared/kibana'; +import { AppLogic } from '../../../../app_logic'; + +import { getAddPath, getSourcesPath } from '../../../../routes'; + +import { SourceConfigData } from './add_source_logic'; + +export interface ExternalConnectorActions { + fetchExternalSource: () => true; + fetchExternalSourceSuccess(sourceConfigData: SourceConfigData): SourceConfigData; + saveExternalConnectorConfigSuccess(externalConnectorId: string): string; + setExternalConnectorApiKey(externalConnectorApiKey: string): string; + saveExternalConnectorConfig(config: ExternalConnectorConfig): ExternalConnectorConfig; + setExternalConnectorUrl(externalConnectorUrl: string): string; + resetSourceState: () => true; +} + +export interface ExternalConnectorConfig { + url: string; + apiKey: string; +} + +export interface ExternalConnectorValues { + buttonLoading: boolean; + dataLoading: boolean; + externalConnectorApiKey: string; + externalConnectorUrl: string; + sourceConfigData: SourceConfigData | Pick; +} + +export const ExternalConnectorLogic = kea< + MakeLogicType +>({ + path: ['enterprise_search', 'workplace_search', 'external_connector_logic'], + actions: { + fetchExternalSource: true, + fetchExternalSourceSuccess: (sourceConfigData) => sourceConfigData, + saveExternalConnectorConfigSuccess: (externalConnectorId) => externalConnectorId, + saveExternalConnectorConfig: (config) => config, + setExternalConnectorApiKey: (externalConnectorApiKey: string) => externalConnectorApiKey, + setExternalConnectorUrl: (externalConnectorUrl: string) => externalConnectorUrl, + }, + reducers: { + dataLoading: [ + true, + { + fetchExternalSourceSuccess: () => false, + }, + ], + buttonLoading: [ + false, + { + saveExternalConnectorConfigSuccess: () => false, + saveExternalConnectorConfig: () => true, + }, + ], + externalConnectorUrl: [ + '', + { + fetchExternalSourceSuccess: (_, { configuredFields: { url } }) => url || '', + setExternalConnectorUrl: (_, url) => url, + }, + ], + externalConnectorApiKey: [ + '', + { + fetchExternalSourceSuccess: (_, { configuredFields: { apiKey } }) => apiKey || '', + setExternalConnectorApiKey: (_, apiKey) => apiKey, + }, + ], + sourceConfigData: [ + { name: '', categories: [] }, + { + fetchExternalSourceSuccess: (_, sourceConfigData) => sourceConfigData, + }, + ], + }, + listeners: ({ actions }) => ({ + fetchExternalSource: async () => { + const route = '/internal/workplace_search/org/settings/connectors/external'; + + try { + const response = await HttpLogic.values.http.get(route); + actions.fetchExternalSourceSuccess(response); + } catch (e) { + flashAPIErrors(e); + } + }, + saveExternalConnectorConfig: async () => { + clearFlashMessages(); + // const route = '/internal/workplace_search/org/settings/connectors'; + // const http = HttpLogic.values.http.post; + // const params = { + // url, + // api_key: apiKey, + // service_type: 'external', + // }; + try { + // const response = await http(route, { + // body: JSON.stringify(params), + // }); + + flashSuccessToast( + i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.sources.flashMessages.externalConnectorCreated', + { + defaultMessage: 'Successfully updated configuration.', + } + ) + ); + // TODO: use response data instead + actions.saveExternalConnectorConfigSuccess('external'); + KibanaLogic.values.navigateToUrl( + getSourcesPath(`${getAddPath('external')}`, AppLogic.values.isOrganization) + ); + } catch (e) { + // flashAPIErrors(e); + } + }, + }), +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/github_via_app.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/github_via_app.tsx index b62648348ed80..c0e72d3b7a5a0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/github_via_app.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/github_via_app.tsx @@ -61,7 +61,8 @@ export const GitHubViaApp: React.FC = ({ isGithubEnterpriseSe const { hasPlatinumLicense } = useValues(LicensingLogic); const name = isGithubEnterpriseServer ? SOURCE_NAMES.GITHUB_ENTERPRISE : SOURCE_NAMES.GITHUB; - const data = staticSourceData.find((source) => source.name === name); + const serviceType = isGithubEnterpriseServer ? 'github_enterprise_server' : 'github'; + const data = staticSourceData.find((source) => source.serviceType === serviceType); const Layout = isOrganization ? WorkplaceSearchPageTemplate : PersonalDashboardLayout; const handleSubmit = (e: FormEvent) => { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/save_custom.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/save_custom.test.tsx index 4715c50e4233c..c05110bd4e6ac 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/save_custom.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/save_custom.test.tsx @@ -11,40 +11,45 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { EuiLink, EuiPanel, EuiTitle } from '@elastic/eui'; +import { EuiPanel, EuiTitle } from '@elastic/eui'; import { EuiLinkTo } from '../../../../../shared/react_router_helpers'; import { LicenseBadge } from '../../../../components/shared/license_badge'; +import { staticCustomSourceData } from '../../source_data'; import { SaveCustom } from './save_custom'; describe('SaveCustom', () => { - const props = { - documentationUrl: 'http://string.boolean', + const mockValues = { newCustomSource: { - accessToken: 'dsgfsd', - key: 'sdfs', - name: 'source', - id: '12e1', + id: 'id', + accessToken: 'token', + name: 'name', }, + sourceData: staticCustomSourceData, isOrganization: true, - header:

Header

, + hasPlatinumLicense: true, }; + + beforeEach(() => { + setMockValues(mockValues); + }); + it('renders', () => { - setMockValues({ hasPlatinumLicense: true }); - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find(EuiPanel)).toHaveLength(1); expect(wrapper.find(EuiTitle)).toHaveLength(4); expect(wrapper.find(EuiLinkTo)).toHaveLength(1); + expect(wrapper.find(LicenseBadge)).toHaveLength(0); }); - - it('renders platinum LicenseBadge and link', () => { - setMockValues({ hasPlatinumLicense: false }); - const wrapper = shallow(); + it('renders platinum license badge if license is not present', () => { + setMockValues({ ...mockValues, hasPlatinumLicense: false }); + const wrapper = shallow(); expect(wrapper.find(LicenseBadge)).toHaveLength(1); - expect(wrapper.find(EuiLink)).toHaveLength(1); + expect(wrapper.find(EuiTitle)).toHaveLength(4); + expect(wrapper.find(EuiLinkTo)).toHaveLength(1); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/save_custom.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/save_custom.tsx index c136f22d91d3d..14d088f377f5e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/save_custom.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/save_custom.tsx @@ -20,6 +20,7 @@ import { EuiTitle, EuiLink, EuiPanel, + EuiCode, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -27,6 +28,7 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { docLinks } from '../../../../../shared/doc_links'; import { LicensingLogic } from '../../../../../shared/licensing'; import { EuiLinkTo } from '../../../../../shared/react_router_helpers'; +import { AppLogic } from '../../../../app_logic'; import { LicenseBadge } from '../../../../components/shared/license_badge'; import { SOURCES_PATH, @@ -34,11 +36,12 @@ import { getContentSourcePath, getSourcesPath, } from '../../../../routes'; -import { CustomSource } from '../../../../types'; import { LEARN_CUSTOM_FEATURES_BUTTON } from '../../constants'; import { SourceIdentifier } from '../source_identifier'; +import { AddCustomSourceLogic } from './add_custom_source_logic'; +import { AddSourceHeader } from './add_source_header'; import { SAVE_CUSTOM_BODY1, SAVE_CUSTOM_BODY2, @@ -51,23 +54,20 @@ import { SAVE_CUSTOM_DOC_PERMISSIONS_LINK, } from './constants'; -interface SaveCustomProps { - documentationUrl: string; - newCustomSource: CustomSource; - isOrganization: boolean; - header: React.ReactNode; -} - -export const SaveCustom: React.FC = ({ - documentationUrl, - newCustomSource: { id, name }, - isOrganization, - header, -}) => { +export const SaveCustom: React.FC = () => { + const { newCustomSource, sourceData } = useValues(AddCustomSourceLogic); + const { isOrganization } = useValues(AppLogic); const { hasPlatinumLicense } = useValues(LicensingLogic); + const { + serviceType, + configuration: { githubRepository, documentationUrl }, + name, + categories = [], + } = sourceData; + return ( <> - {header} + @@ -84,7 +84,7 @@ export const SaveCustom: React.FC = ({ 'xpack.enterpriseSearch.workplaceSearch.contentSource.saveCustom.heading', { defaultMessage: '{name} Created', - values: { name }, + values: { name: newCustomSource.name }, } )} @@ -93,7 +93,22 @@ export const SaveCustom: React.FC = ({ {SAVE_CUSTOM_BODY1} -
+ + {serviceType !== 'custom' && githubRepository && ( + <> + +
+ + + {githubRepository} + + + + + )} {SAVE_CUSTOM_BODY2}
@@ -105,7 +120,7 @@ export const SaveCustom: React.FC = ({
- +
@@ -119,17 +134,32 @@ export const SaveCustom: React.FC = ({

- - {SAVE_CUSTOM_VISUAL_WALKTHROUGH_LINK} - - ), - }} - /> + {serviceType === 'custom' ? ( + + {SAVE_CUSTOM_VISUAL_WALKTHROUGH_LINK} + + ), + }} + /> + ) : ( + + {SAVE_CUSTOM_VISUAL_WALKTHROUGH_LINK} + + ), + name, + }} + /> + )}

@@ -149,7 +179,7 @@ export const SaveCustom: React.FC = ({ diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_settings.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_settings.tsx index 484a9ca14b4e1..d57dc49683275 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_settings.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_settings.tsx @@ -41,7 +41,7 @@ import { SAVE_CHANGES_BUTTON, REMOVE_BUTTON, } from '../../../constants'; -import { SourceDataItem } from '../../../types'; +import { getEditPath } from '../../../routes'; import { handlePrivateKeyUpload } from '../../../utils'; import { AddSourceLogic } from '../components/add_source/add_source_logic'; import { @@ -57,7 +57,6 @@ import { SYNC_DIAGNOSTICS_DESCRIPTION, SYNC_DIAGNOSTICS_BUTTON, } from '../constants'; -import { staticSourceData } from '../source_data'; import { SourceLogic } from '../source_logic'; import { DownloadDiagnosticsButton } from './download_diagnostics_button'; @@ -96,8 +95,7 @@ export const SourceSettings: React.FC = () => { const editPath = isGithubApp ? undefined // undefined for GitHub apps, as they are configured source-wide, and don't use a connector where you can edit the configuration - : (staticSourceData.find((source) => source.serviceType === serviceType) as SourceDataItem) - .editPath; + : getEditPath(serviceType); const [inputValue, setValue] = useState(name); const [confirmModalVisible, setModalVisibility] = useState(false); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/source_data.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/source_data.tsx index 20a0673709b5a..f99af41836419 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/source_data.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/source_data.tsx @@ -10,52 +10,13 @@ import { i18n } from '@kbn/i18n'; import { docLinks } from '../../../shared/doc_links'; import { SOURCE_NAMES, SOURCE_OBJ_TYPES, GITHUB_LINK_TITLE } from '../../constants'; -import { - ADD_BOX_PATH, - ADD_CONFLUENCE_PATH, - ADD_CONFLUENCE_SERVER_PATH, - ADD_DROPBOX_PATH, - ADD_GITHUB_ENTERPRISE_PATH, - ADD_GITHUB_PATH, - ADD_GMAIL_PATH, - ADD_GOOGLE_DRIVE_PATH, - ADD_JIRA_PATH, - ADD_JIRA_SERVER_PATH, - ADD_ONEDRIVE_PATH, - ADD_SALESFORCE_PATH, - ADD_SALESFORCE_SANDBOX_PATH, - ADD_SERVICENOW_PATH, - ADD_SHAREPOINT_PATH, - ADD_SLACK_PATH, - ADD_ZENDESK_PATH, - ADD_CUSTOM_PATH, - EDIT_BOX_PATH, - EDIT_CONFLUENCE_PATH, - EDIT_CONFLUENCE_SERVER_PATH, - EDIT_DROPBOX_PATH, - EDIT_GITHUB_ENTERPRISE_PATH, - EDIT_GITHUB_PATH, - EDIT_GMAIL_PATH, - EDIT_GOOGLE_DRIVE_PATH, - EDIT_JIRA_PATH, - EDIT_JIRA_SERVER_PATH, - EDIT_ONEDRIVE_PATH, - EDIT_SALESFORCE_PATH, - EDIT_SALESFORCE_SANDBOX_PATH, - EDIT_SERVICENOW_PATH, - EDIT_SHAREPOINT_PATH, - EDIT_SLACK_PATH, - EDIT_ZENDESK_PATH, - EDIT_CUSTOM_PATH, -} from '../../routes'; import { FeatureIds, SourceDataItem } from '../../types'; -export const staticSourceData = [ +export const staticSourceData: SourceDataItem[] = [ { name: SOURCE_NAMES.BOX, + iconName: SOURCE_NAMES.BOX, serviceType: 'box', - addPath: ADD_BOX_PATH, - editPath: EDIT_BOX_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -79,12 +40,12 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, { name: SOURCE_NAMES.CONFLUENCE, + iconName: SOURCE_NAMES.CONFLUENCE, serviceType: 'confluence_cloud', - addPath: ADD_CONFLUENCE_PATH, - editPath: EDIT_CONFLUENCE_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -113,12 +74,12 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, { name: SOURCE_NAMES.CONFLUENCE_SERVER, + iconName: SOURCE_NAMES.CONFLUENCE_SERVER, serviceType: 'confluence_server', - addPath: ADD_CONFLUENCE_SERVER_PATH, - editPath: EDIT_CONFLUENCE_SERVER_PATH, configuration: { isPublicKey: true, hasOauthRedirect: true, @@ -145,12 +106,12 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, { name: SOURCE_NAMES.DROPBOX, + iconName: SOURCE_NAMES.DROPBOX, serviceType: 'dropbox', - addPath: ADD_DROPBOX_PATH, - editPath: EDIT_DROPBOX_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -174,12 +135,12 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, { name: SOURCE_NAMES.GITHUB, + iconName: SOURCE_NAMES.GITHUB, serviceType: 'github', - addPath: ADD_GITHUB_PATH, - editPath: EDIT_GITHUB_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -210,12 +171,12 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, { name: SOURCE_NAMES.GITHUB_ENTERPRISE, + iconName: SOURCE_NAMES.GITHUB_ENTERPRISE, serviceType: 'github_enterprise_server', - addPath: ADD_GITHUB_ENTERPRISE_PATH, - editPath: EDIT_GITHUB_ENTERPRISE_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -252,12 +213,12 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, { name: SOURCE_NAMES.GMAIL, + iconName: SOURCE_NAMES.GMAIL, serviceType: 'gmail', - addPath: ADD_GMAIL_PATH, - editPath: EDIT_GMAIL_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -273,9 +234,8 @@ export const staticSourceData = [ }, { name: SOURCE_NAMES.GOOGLE_DRIVE, + iconName: SOURCE_NAMES.GOOGLE_DRIVE, serviceType: 'google_drive', - addPath: ADD_GOOGLE_DRIVE_PATH, - editPath: EDIT_GOOGLE_DRIVE_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -303,12 +263,12 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, { name: SOURCE_NAMES.JIRA, + iconName: SOURCE_NAMES.JIRA, serviceType: 'jira_cloud', - addPath: ADD_JIRA_PATH, - editPath: EDIT_JIRA_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -339,12 +299,12 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, { name: SOURCE_NAMES.JIRA_SERVER, + iconName: SOURCE_NAMES.JIRA_SERVER, serviceType: 'jira_server', - addPath: ADD_JIRA_SERVER_PATH, - editPath: EDIT_JIRA_SERVER_PATH, configuration: { isPublicKey: true, hasOauthRedirect: true, @@ -374,12 +334,12 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, { name: SOURCE_NAMES.ONEDRIVE, + iconName: SOURCE_NAMES.ONEDRIVE, serviceType: 'one_drive', - addPath: ADD_ONEDRIVE_PATH, - editPath: EDIT_ONEDRIVE_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -403,12 +363,12 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, { name: SOURCE_NAMES.SALESFORCE, + iconName: SOURCE_NAMES.SALESFORCE, serviceType: 'salesforce', - addPath: ADD_SALESFORCE_PATH, - editPath: EDIT_SALESFORCE_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -439,12 +399,13 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, + { name: SOURCE_NAMES.SALESFORCE_SANDBOX, + iconName: SOURCE_NAMES.SALESFORCE_SANDBOX, serviceType: 'salesforce_sandbox', - addPath: ADD_SALESFORCE_SANDBOX_PATH, - editPath: EDIT_SALESFORCE_SANDBOX_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -475,12 +436,12 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, { name: SOURCE_NAMES.SERVICENOW, + iconName: SOURCE_NAMES.SERVICENOW, serviceType: 'service_now', - addPath: ADD_SERVICENOW_PATH, - editPath: EDIT_SERVICENOW_PATH, configuration: { isPublicKey: false, hasOauthRedirect: false, @@ -508,12 +469,44 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, { name: SOURCE_NAMES.SHAREPOINT, + iconName: SOURCE_NAMES.SHAREPOINT, serviceType: 'share_point', - addPath: ADD_SHAREPOINT_PATH, - editPath: EDIT_SHAREPOINT_PATH, + configuration: { + isPublicKey: false, + hasOauthRedirect: true, + needsBaseUrl: false, + documentationUrl: docLinks.workplaceSearchSharePoint, + applicationPortalUrl: 'https://portal.azure.com/', + }, + objTypes: [SOURCE_OBJ_TYPES.FOLDERS, SOURCE_OBJ_TYPES.SITES, SOURCE_OBJ_TYPES.ALL_FILES], + features: { + basicOrgContext: [ + FeatureIds.SyncFrequency, + FeatureIds.SyncedItems, + FeatureIds.GlobalAccessPermissions, + ], + basicOrgContextExcludedFeatures: [FeatureIds.DocumentLevelPermissions], + platinumOrgContext: [FeatureIds.SyncFrequency, FeatureIds.SyncedItems], + platinumPrivateContext: [ + FeatureIds.Private, + FeatureIds.SyncFrequency, + FeatureIds.SyncedItems, + ], + }, + + accountContextOnly: false, + internalConnectorAvailable: true, + externalConnectorAvailable: true, + }, + // TODO: temporary hack until backend sends us stuff + { + name: SOURCE_NAMES.SHAREPOINT, + iconName: SOURCE_NAMES.SHAREPOINT, + serviceType: 'external', configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -537,12 +530,54 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, + externalConnectorAvailable: false, + customConnectorAvailable: false, + }, + { + name: SOURCE_NAMES.SHAREPOINT_SERVER, + iconName: SOURCE_NAMES.SHAREPOINT_SERVER, + categories: [ + i18n.translate('xpack.enterpriseSearch.workplaceSearch.sources.categories.fileSharing', { + defaultMessage: 'File Sharing', + }), + i18n.translate('xpack.enterpriseSearch.workplaceSearch.sources.categories.storage', { + defaultMessage: 'Storage', + }), + i18n.translate('xpack.enterpriseSearch.workplaceSearch.sources.categories.cloud', { + defaultMessage: 'Cloud', + }), + i18n.translate('xpack.enterpriseSearch.workplaceSearch.sources.categories.microsoft', { + defaultMessage: 'Microsoft', + }), + i18n.translate('xpack.enterpriseSearch.workplaceSearch.sources.categories.office', { + defaultMessage: 'Office 365', + }), + ], + serviceType: 'share_point_server', // this doesn't exist on the BE + configuration: { + isPublicKey: false, + hasOauthRedirect: false, + needsBaseUrl: false, + // helpText: i18n.translate( // TODO updatae this + // 'xpack.enterpriseSearch.workplaceSearch.sources.helpText.sharepointServer', + // { + // defaultMessage: + // "Here is some help text. It should probably give the user a heads up that they're going to have to deploy some code.", + // } + // ), + documentationUrl: docLinks.workplaceSearchCustomSources, // TODO update this + applicationPortalUrl: '', + githubRepository: 'elastic/enterprise-search-sharepoint-server-connector', + }, + accountContextOnly: false, + internalConnectorAvailable: false, + customConnectorAvailable: true, }, { name: SOURCE_NAMES.SLACK, + iconName: SOURCE_NAMES.SLACK, serviceType: 'slack', - addPath: ADD_SLACK_PATH, - editPath: EDIT_SLACK_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -559,12 +594,13 @@ export const staticSourceData = [ platinumPrivateContext: [FeatureIds.Remote, FeatureIds.Private, FeatureIds.SearchableContent], }, accountContextOnly: true, + internalConnectorAvailable: true, }, + { name: SOURCE_NAMES.ZENDESK, + iconName: SOURCE_NAMES.ZENDESK, serviceType: 'zendesk', - addPath: ADD_ZENDESK_PATH, - editPath: EDIT_ZENDESK_PATH, configuration: { isPublicKey: false, hasOauthRedirect: true, @@ -588,23 +624,26 @@ export const staticSourceData = [ ], }, accountContextOnly: false, + internalConnectorAvailable: true, }, - { - name: SOURCE_NAMES.CUSTOM, - serviceType: 'custom', - addPath: ADD_CUSTOM_PATH, - editPath: EDIT_CUSTOM_PATH, - configuration: { - isPublicKey: false, - hasOauthRedirect: false, - needsBaseUrl: false, - helpText: i18n.translate('xpack.enterpriseSearch.workplaceSearch.sources.helpText.custom', { - defaultMessage: - 'To create a Custom API Source, provide a human-readable and descriptive name. The name will appear as-is in the various search experiences and management interfaces.', - }), - documentationUrl: docLinks.workplaceSearchCustomSources, - applicationPortalUrl: '', - }, - accountContextOnly: false, +]; + +export const staticCustomSourceData: SourceDataItem = { + name: SOURCE_NAMES.CUSTOM, + iconName: SOURCE_NAMES.CUSTOM, + categories: ['API', 'Custom'], + serviceType: 'custom', + configuration: { + isPublicKey: false, + hasOauthRedirect: false, + needsBaseUrl: false, + helpText: i18n.translate('xpack.enterpriseSearch.workplaceSearch.sources.helpText.custom', { + defaultMessage: + 'To create a Custom API Source, provide a human-readable and descriptive name. The name will appear as-is in the various search experiences and management interfaces.', + }), + documentationUrl: docLinks.workplaceSearchCustomSources, + applicationPortalUrl: '', }, -] as SourceDataItem[]; + accountContextOnly: false, + customConnectorAvailable: true, +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.test.ts index f7e41f6512017..a007d31ff67cb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.test.ts @@ -18,6 +18,7 @@ jest.mock('../../app_logic', () => ({ import { itShowsServerErrorAsFlashMessage } from '../../../test_helpers'; import { AppLogic } from '../../app_logic'; +import { staticSourceData } from './source_data'; import { SourcesLogic, fetchSourceStatuses, POLLING_INTERVAL } from './sources_logic'; describe('SourcesLogic', () => { @@ -32,8 +33,8 @@ describe('SourcesLogic', () => { const defaultValues = { contentSources: [], privateContentSources: [], - sourceData: [], - availableSources: [], + sourceData: staticSourceData.map((data) => ({ ...data, connected: false })), + availableSources: staticSourceData.map((data) => ({ ...data, connected: false })), configuredSources: [], serviceTypes: [], permissionsModal: null, @@ -316,7 +317,7 @@ describe('SourcesLogic', () => { it('availableSources & configuredSources have correct length', () => { SourcesLogic.actions.onInitializeSources(serverResponse); - expect(SourcesLogic.values.availableSources).toHaveLength(1); + expect(SourcesLogic.values.availableSources).toHaveLength(14); expect(SourcesLogic.values.configuredSources).toHaveLength(5); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.ts index 90b1f83281e94..b7bdef52fceb0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.ts @@ -178,7 +178,7 @@ export const SourcesLogic = kea>( if (isOrganization && !values.serverStatuses) { // We want to get the initial statuses from the server to compare our polling results to. const sourceStatuses = await fetchSourceStatuses(isOrganization, breakpoint); - actions.setServerSourceStatuses(sourceStatuses); + actions.setServerSourceStatuses(sourceStatuses ?? []); } }, // We poll the server and if the status update, we trigger a new fetch of the sources. @@ -190,7 +190,7 @@ export const SourcesLogic = kea>( pollingInterval = window.setInterval(async () => { const sourceStatuses = await fetchSourceStatuses(isOrganization, breakpoint); - sourceStatuses.some((source: ContentSourceStatus) => { + (sourceStatuses ?? []).some((source: ContentSourceStatus) => { if (serverStatuses && serverStatuses[source.id] !== source.status.status) { return actions.initializeSources(); } @@ -249,7 +249,7 @@ export const SourcesLogic = kea>( export const fetchSourceStatuses = async ( isOrganization: boolean, breakpoint: BreakPointFunction -) => { +): Promise => { const route = isOrganization ? '/internal/workplace_search/org/sources/status' : '/internal/workplace_search/account/sources/status'; @@ -267,8 +267,7 @@ export const fetchSourceStatuses = async ( } } - // TODO: remove casting. return type should be ContentSourceStatus[] | undefined - return response as ContentSourceStatus[]; + return response; }; const updateSourcesOnToggle = ( @@ -293,7 +292,7 @@ const updateSourcesOnToggle = ( * The second is the base list of available sources that the server sends back in the collection, * `availableTypes` that is the source of truth for the name and whether the source has been configured. * - * Fnally, also in the collection response is the current set of connected sources. We check for the + * Finally, also in the collection response is the current set of connected sources. We check for the * existence of a `connectedSource` of the type in the loop and set `connected` to true so that the UI * can diplay "Add New" instead of "Connect", the latter of which is displated only when a connector * has been configured but there are no connected sources yet. @@ -304,13 +303,13 @@ export const mergeServerAndStaticData = ( contentSources: ContentSourceDetails[] ) => { const combined = [] as CombinedDataItem[]; - serverData.forEach((serverItem) => { - const type = serverItem.serviceType; - const staticItem = staticData.find(({ serviceType }) => serviceType === type); + staticData.forEach((staticItem) => { + const type = staticItem.serviceType; + const serverItem = serverData.find(({ serviceType }) => serviceType === type); const connectedSource = contentSources.find(({ serviceType }) => serviceType === type); combined.push({ - ...serverItem, ...staticItem, + ...serverItem, connected: !!connectedSource, } as CombinedDataItem); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.test.tsx index cf5dc48682ae8..49c8ebbbebc08 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.test.tsx @@ -34,7 +34,7 @@ describe('SourcesRouter', () => { }); it('renders sources routes', () => { - const TOTAL_ROUTES = 63; + const TOTAL_ROUTES = 86; const wrapper = shallow(); expect(wrapper.find(Switch)).toHaveLength(1); @@ -45,8 +45,8 @@ describe('SourcesRouter', () => { setMockValues({ ...mockValues, hasPlatinumLicense: false }); const wrapper = shallow(); - expect(wrapper.find(Redirect).first().prop('from')).toEqual(ADD_SOURCE_PATH); - expect(wrapper.find(Redirect).first().prop('to')).toEqual(SOURCES_PATH); + expect(wrapper.find(Redirect).last().prop('from')).toEqual(ADD_SOURCE_PATH); + expect(wrapper.find(Redirect).last().prop('to')).toEqual(SOURCES_PATH); }); it('redirects when cannot create sources', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.tsx index 23109506b364e..c2cd58a90f209 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.tsx @@ -14,19 +14,27 @@ import { useActions, useValues } from 'kea'; import { LicensingLogic } from '../../../shared/licensing'; import { AppLogic } from '../../app_logic'; import { - ADD_GITHUB_VIA_APP_PATH, - ADD_GITHUB_ENTERPRISE_SERVER_VIA_APP_PATH, + GITHUB_ENTERPRISE_SERVER_VIA_APP_SERVICE_TYPE, + GITHUB_VIA_APP_SERVICE_TYPE, +} from '../../constants'; +import { ADD_SOURCE_PATH, SOURCE_DETAILS_PATH, PRIVATE_SOURCES_PATH, SOURCES_PATH, getSourcesPath, + getAddPath, + ADD_CUSTOM_PATH, } from '../../routes'; +import { hasMultipleConnectorOptions } from '../../utils'; import { AddSource, AddSourceList, GitHubViaApp } from './components/add_source'; +import { AddCustomSource } from './components/add_source/add_custom_source'; +import { ConfigurationChoice } from './components/add_source/configuration_choice'; +import { ExternalConnectorConfig } from './components/add_source/external_connector_config'; import { OrganizationSources } from './organization_sources'; import { PrivateSources } from './private_sources'; -import { staticSourceData } from './source_data'; +import { staticCustomSourceData, staticSourceData as sources } from './source_data'; import { SourceRouter } from './source_router'; import { SourcesLogic } from './sources_logic'; @@ -68,36 +76,121 @@ export const SourcesRouter: React.FC = () => { - + - + - {staticSourceData.map(({ addPath, accountContextOnly }, i) => ( - - {!hasPlatinumLicense && accountContextOnly ? ( - - ) : ( - - )} - - ))} - {staticSourceData.map(({ addPath }, i) => ( - - + {sources.map((sourceData, i) => { + const { serviceType, externalConnectorAvailable, internalConnectorAvailable } = sourceData; + const path = `${getSourcesPath(getAddPath(serviceType), isOrganization)}`; + const defaultOption = internalConnectorAvailable + ? 'internal' + : externalConnectorAvailable + ? 'external' + : 'custom'; + return ( + + {hasMultipleConnectorOptions(sourceData) ? ( + + ) : ( + + )} + + ); + })} + + + + {sources + .filter((sourceData) => sourceData.internalConnectorAvailable) + .map((sourceData, i) => { + const { serviceType, accountContextOnly } = sourceData; + return ( + + {!hasPlatinumLicense && accountContextOnly ? ( + + ) : ( + + )} + + ); + })} + {sources + .filter((sourceData) => sourceData.externalConnectorAvailable) + .map((sourceData, i) => { + const { serviceType, accountContextOnly } = sourceData; + + return ( + + {!hasPlatinumLicense && accountContextOnly ? ( + + ) : ( + + )} + + ); + })} + {sources + .filter((sourceData) => sourceData.customConnectorAvailable) + .map((sourceData, i) => { + const { serviceType, accountContextOnly } = sourceData; + return ( + + {!hasPlatinumLicense && accountContextOnly ? ( + + ) : ( + + )} + + ); + })} + {sources.map((sourceData, i) => ( + + ))} - {staticSourceData.map(({ addPath }, i) => ( - - + {sources.map((sourceData, i) => ( + + ))} - {staticSourceData.map(({ addPath, configuration: { needsConfiguration } }, i) => { - if (needsConfiguration) + {sources.map((sourceData, i) => { + if (sourceData.configuration.needsConfiguration) return ( - - + + ); })} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/connectors.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/connectors.tsx index 85f91f769cc77..be139fd6b38ea 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/connectors.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/connectors.tsx @@ -33,9 +33,7 @@ import { PRIVATE_SOURCE, UPDATE_BUTTON, } from '../../../constants'; -import { getSourcesPath } from '../../../routes'; -import { SourceDataItem } from '../../../types'; -import { staticSourceData } from '../../content_sources/source_data'; +import { getAddPath, getEditPath, getSourcesPath } from '../../../routes'; import { SettingsLogic } from '../settings_logic'; export const Connectors: React.FC = () => { @@ -52,9 +50,9 @@ export const Connectors: React.FC = () => { ); const getRowActions = (configured: boolean, serviceType: string, supportedByLicense: boolean) => { - const { addPath, editPath } = staticSourceData.find( - (s) => s.serviceType === serviceType - ) as SourceDataItem; + const addPath = getAddPath(serviceType); + const editPath = getEditPath(serviceType); + const configurePath = getSourcesPath(addPath, true); const updateButtons = ( diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/source_config.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/source_config.test.tsx index 35619d2b2d560..af8b8fe461f16 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/source_config.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/source_config.test.tsx @@ -18,6 +18,8 @@ import { EuiConfirmModal } from '@elastic/eui'; import { SaveConfig } from '../../content_sources/components/add_source/save_config'; +import { staticSourceData } from '../../content_sources/source_data'; + import { SourceConfig } from './source_config'; describe('SourceConfig', () => { @@ -31,7 +33,7 @@ describe('SourceConfig', () => { }); it('renders', () => { - const wrapper = shallow(); + const wrapper = shallow(); const saveConfig = wrapper.find(SaveConfig); // Trigger modal visibility @@ -42,13 +44,13 @@ describe('SourceConfig', () => { it('renders a breadcrumb fallback while data is loading', () => { setMockValues({ dataLoading: true, sourceConfigData: {} }); - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.prop('pageChrome')).toEqual(['Settings', 'Content source connectors', '...']); }); it('handles delete click', () => { - const wrapper = shallow(); + const wrapper = shallow(); const saveConfig = wrapper.find(SaveConfig); // Trigger modal visibility @@ -60,7 +62,7 @@ describe('SourceConfig', () => { }); it('saves source config', () => { - const wrapper = shallow(); + const wrapper = shallow(); const saveConfig = wrapper.find(SaveConfig); // Trigger modal visibility @@ -72,7 +74,7 @@ describe('SourceConfig', () => { }); it('cancels and closes modal', () => { - const wrapper = shallow(); + const wrapper = shallow(); const saveConfig = wrapper.find(SaveConfig); // Trigger modal visibility diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/source_config.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/source_config.tsx index c2a0b60e1eca3..ea63f3bab77d9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/source_config.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/components/source_config.tsx @@ -18,16 +18,15 @@ import { SourceDataItem } from '../../../types'; import { AddSourceHeader } from '../../content_sources/components/add_source/add_source_header'; import { AddSourceLogic } from '../../content_sources/components/add_source/add_source_logic'; import { SaveConfig } from '../../content_sources/components/add_source/save_config'; -import { staticSourceData } from '../../content_sources/source_data'; import { SettingsLogic } from '../settings_logic'; interface SourceConfigProps { - sourceIndex: number; + sourceData: SourceDataItem; } -export const SourceConfig: React.FC = ({ sourceIndex }) => { +export const SourceConfig: React.FC = ({ sourceData }) => { const [confirmModalVisible, setConfirmModalVisibility] = useState(false); - const { configuration, serviceType } = staticSourceData[sourceIndex] as SourceDataItem; + const { configuration, serviceType } = sourceData; const { deleteSourceConfig } = useActions(SettingsLogic); const { saveSourceConfig, getSourceConfigData } = useActions(AddSourceLogic); const { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/settings_router.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/settings_router.tsx index d9aeba361d240..7c5e501d6a2a1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/settings_router.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/settings/settings_router.tsx @@ -14,6 +14,7 @@ import { ORG_SETTINGS_CUSTOMIZE_PATH, ORG_SETTINGS_CONNECTORS_PATH, ORG_SETTINGS_OAUTH_APPLICATION_PATH, + getEditPath, } from '../../routes'; import { staticSourceData } from '../content_sources/source_data'; @@ -41,9 +42,9 @@ export const SettingsRouter: React.FC = () => { - {staticSourceData.map(({ editPath }, i) => ( - - + {staticSourceData.map((sourceData, i) => ( + + ))} diff --git a/x-pack/plugins/enterprise_search/server/routes/workplace_search/sources.ts b/x-pack/plugins/enterprise_search/server/routes/workplace_search/sources.ts index 222288d369fdb..d106302128204 100644 --- a/x-pack/plugins/enterprise_search/server/routes/workplace_search/sources.ts +++ b/x-pack/plugins/enterprise_search/server/routes/workplace_search/sources.ts @@ -38,6 +38,14 @@ const oauthConfigSchema = schema.object({ consumer_key: schema.maybe(schema.string()), }); +const externalConnectorSchema = schema.object({ + url: schema.string(), + api_key: schema.string(), + service_type: schema.string(), +}); + +const postConnectorSchema = schema.oneOf([externalConnectorSchema, oauthConfigSchema]); + const displayFieldSchema = schema.object({ fieldName: schema.string(), label: schema.string(), @@ -872,7 +880,7 @@ export function registerOrgSourceOauthConfigurationsRoute({ { path: '/internal/workplace_search/org/settings/connectors', validate: { - body: oauthConfigSchema, + body: postConnectorSchema, }, }, enterpriseSearchRequestHandler.createRequest({ From c365e608192bb747b2378d9864358d7c36eec2b2 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Wed, 2 Mar 2022 10:56:03 -0500 Subject: [PATCH 12/37] [ci] Ensure every kibana pipeline has a non-default queue defined (#126641) --- .buildkite/pipelines/bazel_cache.yml | 2 ++ .buildkite/pipelines/es_snapshots/promote.yml | 2 ++ .buildkite/pipelines/es_snapshots/verify.yml | 6 +++++ .buildkite/pipelines/flaky_tests/pipeline.js | 3 +++ .buildkite/pipelines/hourly.yml | 4 ++++ .buildkite/pipelines/on_merge.yml | 4 ++++ .buildkite/pipelines/performance/daily.yml | 23 +++++++++++-------- .buildkite/pipelines/pull_request.yml | 17 -------------- .buildkite/pipelines/pull_request/base.yml | 2 ++ .../pipelines/pull_request/post_build.yml | 2 ++ .../pipelines/purge_cloud_deployments.yml | 2 ++ .buildkite/pipelines/update_demo_env.yml | 2 ++ 12 files changed, 42 insertions(+), 27 deletions(-) delete mode 100644 .buildkite/pipelines/pull_request.yml diff --git a/.buildkite/pipelines/bazel_cache.yml b/.buildkite/pipelines/bazel_cache.yml index daf56eb712a8d..9aa961bcddbd2 100644 --- a/.buildkite/pipelines/bazel_cache.yml +++ b/.buildkite/pipelines/bazel_cache.yml @@ -1,5 +1,7 @@ steps: - label: ':pipeline: Create pipeline with priority' + agents: + queue: kibana-default concurrency_group: bazel_macos concurrency: 1 concurrency_method: eager diff --git a/.buildkite/pipelines/es_snapshots/promote.yml b/.buildkite/pipelines/es_snapshots/promote.yml index 5a003321246a1..f2f7b423c94c2 100644 --- a/.buildkite/pipelines/es_snapshots/promote.yml +++ b/.buildkite/pipelines/es_snapshots/promote.yml @@ -10,3 +10,5 @@ steps: required: true - label: Promote Snapshot command: .buildkite/scripts/steps/es_snapshots/promote.sh + agents: + queue: kibana-default diff --git a/.buildkite/pipelines/es_snapshots/verify.yml b/.buildkite/pipelines/es_snapshots/verify.yml index f98626ef25c01..58908d1578bb5 100755 --- a/.buildkite/pipelines/es_snapshots/verify.yml +++ b/.buildkite/pipelines/es_snapshots/verify.yml @@ -14,6 +14,8 @@ steps: - command: .buildkite/scripts/lifecycle/pre_build.sh label: Pre-Build timeout_in_minutes: 10 + agents: + queue: kibana-default - wait @@ -85,6 +87,8 @@ steps: - command: .buildkite/scripts/steps/es_snapshots/trigger_promote.sh label: Trigger promotion timeout_in_minutes: 10 + agents: + queue: kibana-default depends_on: - default-cigroup - default-cigroup-docker @@ -98,3 +102,5 @@ steps: - command: .buildkite/scripts/lifecycle/post_build.sh label: Post-Build timeout_in_minutes: 10 + agents: + queue: kibana-default diff --git a/.buildkite/pipelines/flaky_tests/pipeline.js b/.buildkite/pipelines/flaky_tests/pipeline.js index cb5c37bf58348..b7f93412edb37 100644 --- a/.buildkite/pipelines/flaky_tests/pipeline.js +++ b/.buildkite/pipelines/flaky_tests/pipeline.js @@ -51,6 +51,9 @@ const pipeline = { { command: '.buildkite/pipelines/flaky_tests/runner.sh', label: 'Create pipeline', + agents: { + queue: 'kibana-default', + }, }, ], }; diff --git a/.buildkite/pipelines/hourly.yml b/.buildkite/pipelines/hourly.yml index 6953c146050eb..78c57ff3bd128 100644 --- a/.buildkite/pipelines/hourly.yml +++ b/.buildkite/pipelines/hourly.yml @@ -2,6 +2,8 @@ steps: - command: .buildkite/scripts/lifecycle/pre_build.sh label: Pre-Build timeout_in_minutes: 10 + agents: + queue: kibana-default - wait @@ -174,3 +176,5 @@ steps: - command: .buildkite/scripts/lifecycle/post_build.sh label: Post-Build timeout_in_minutes: 10 + agents: + queue: kibana-default diff --git a/.buildkite/pipelines/on_merge.yml b/.buildkite/pipelines/on_merge.yml index e5f6dcc2d1d5f..c6acb48b3e212 100644 --- a/.buildkite/pipelines/on_merge.yml +++ b/.buildkite/pipelines/on_merge.yml @@ -5,6 +5,8 @@ steps: - command: .buildkite/scripts/lifecycle/pre_build.sh label: Pre-Build timeout_in_minutes: 10 + agents: + queue: kibana-default - wait @@ -34,3 +36,5 @@ steps: - command: .buildkite/scripts/lifecycle/post_build.sh label: Post-Build timeout_in_minutes: 10 + agents: + queue: kibana-default diff --git a/.buildkite/pipelines/performance/daily.yml b/.buildkite/pipelines/performance/daily.yml index 208456f9c67a5..564bfb5e501b3 100644 --- a/.buildkite/pipelines/performance/daily.yml +++ b/.buildkite/pipelines/performance/daily.yml @@ -1,25 +1,27 @@ steps: - - block: ":gear: Performance Tests Configuration" - prompt: "Fill out the details for performance test" + - block: ':gear: Performance Tests Configuration' + prompt: 'Fill out the details for performance test' fields: - - text: ":arrows_counterclockwise: Iterations" - key: "performance-test-iteration-count" - hint: "How many times you want to run tests? " + - text: ':arrows_counterclockwise: Iterations' + key: 'performance-test-iteration-count' + hint: 'How many times you want to run tests? ' required: true if: build.env('PERF_TEST_COUNT') == null - - label: ":male-mechanic::skin-tone-2: Pre-Build" + - label: ':male-mechanic::skin-tone-2: Pre-Build' command: .buildkite/scripts/lifecycle/pre_build.sh + agents: + queue: kibana-default - wait - - label: ":factory_worker: Build Kibana Distribution and Plugins" + - label: ':factory_worker: Build Kibana Distribution and Plugins' command: .buildkite/scripts/steps/build_kibana.sh agents: queue: c2-16 key: build - - label: ":muscle: Performance Tests with Playwright config" + - label: ':muscle: Performance Tests with Playwright config' command: .buildkite/scripts/steps/functional/performance_playwright.sh agents: queue: c2-16 @@ -28,6 +30,7 @@ steps: - wait: ~ continue_on_failure: true - - label: ":male_superhero::skin-tone-2: Post-Build" + - label: ':male_superhero::skin-tone-2: Post-Build' command: .buildkite/scripts/lifecycle/post_build.sh - + agents: + queue: kibana-default diff --git a/.buildkite/pipelines/pull_request.yml b/.buildkite/pipelines/pull_request.yml deleted file mode 100644 index 41c13bb403e1a..0000000000000 --- a/.buildkite/pipelines/pull_request.yml +++ /dev/null @@ -1,17 +0,0 @@ -env: - GITHUB_COMMIT_STATUS_ENABLED: 'true' - GITHUB_COMMIT_STATUS_CONTEXT: 'buildkite/kibana-pull-request' -steps: - - command: .buildkite/scripts/lifecycle/pre_build.sh - label: Pre-Build - - - wait - - - command: echo 'Hello World' - label: Test - - - wait: ~ - continue_on_failure: true - - - command: .buildkite/scripts/lifecycle/post_build.sh - label: Post-Build diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index d832717906bb1..3117ba98078d9 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -2,6 +2,8 @@ steps: - command: .buildkite/scripts/lifecycle/pre_build.sh label: Pre-Build timeout_in_minutes: 10 + agents: + queue: kibana-default - wait diff --git a/.buildkite/pipelines/pull_request/post_build.yml b/.buildkite/pipelines/pull_request/post_build.yml index 4f252bf8abc11..63f7169334584 100644 --- a/.buildkite/pipelines/pull_request/post_build.yml +++ b/.buildkite/pipelines/pull_request/post_build.yml @@ -4,3 +4,5 @@ steps: - command: .buildkite/scripts/lifecycle/post_build.sh label: Post-Build + agents: + queue: kibana-default diff --git a/.buildkite/pipelines/purge_cloud_deployments.yml b/.buildkite/pipelines/purge_cloud_deployments.yml index 8287abf2ca5a2..9567f67a047f8 100644 --- a/.buildkite/pipelines/purge_cloud_deployments.yml +++ b/.buildkite/pipelines/purge_cloud_deployments.yml @@ -2,3 +2,5 @@ steps: - command: .buildkite/scripts/steps/cloud/purge.sh label: Purge old cloud deployments timeout_in_minutes: 10 + agents: + queue: kibana-default diff --git a/.buildkite/pipelines/update_demo_env.yml b/.buildkite/pipelines/update_demo_env.yml index e2dfdd782fd41..12c4f296f5dfd 100644 --- a/.buildkite/pipelines/update_demo_env.yml +++ b/.buildkite/pipelines/update_demo_env.yml @@ -2,6 +2,8 @@ steps: - command: .buildkite/scripts/steps/demo_env/es_and_init.sh label: Initialize Environment and Deploy ES timeout_in_minutes: 10 + agents: + queue: kibana-default - command: .buildkite/scripts/steps/demo_env/kibana.sh label: Build and Deploy Kibana From 08b8bb87a5e5f5453b44cceaa17cabd50149b184 Mon Sep 17 00:00:00 2001 From: Davis Plumlee <56367316+dplumlee@users.noreply.github.com> Date: Wed, 2 Mar 2022 12:05:19 -0500 Subject: [PATCH 13/37] [ResponseOps] Adds `uiSettingsClient` to alerting framework services (#126648) --- x-pack/plugins/alerting/server/mocks.ts | 2 ++ x-pack/plugins/alerting/server/plugin.ts | 1 + .../alerting/server/task_runner/task_runner.test.ts | 3 +++ .../plugins/alerting/server/task_runner/task_runner.ts | 9 ++++++--- .../server/task_runner/task_runner_cancel.test.ts | 3 +++ .../server/task_runner/task_runner_factory.test.ts | 3 +++ .../alerting/server/task_runner/task_runner_factory.ts | 2 ++ x-pack/plugins/alerting/server/types.ts | 2 ++ .../server/utils/create_lifecycle_rule_type.test.ts | 1 + .../server/utils/rule_executor_test_utils.ts | 2 ++ .../detection_engine/routes/rules/preview_rules_route.ts | 1 + 11 files changed, 26 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/alerting/server/mocks.ts b/x-pack/plugins/alerting/server/mocks.ts index d58630e18cd4d..a94b30b59104c 100644 --- a/x-pack/plugins/alerting/server/mocks.ts +++ b/x-pack/plugins/alerting/server/mocks.ts @@ -11,6 +11,7 @@ import { Alert, AlertFactoryDoneUtils } from './alert'; import { elasticsearchServiceMock, savedObjectsClientMock, + uiSettingsServiceMock, } from '../../../../src/core/server/mocks'; import { AlertInstanceContext, AlertInstanceState } from './types'; @@ -105,6 +106,7 @@ const createAlertServicesMock = < done: jest.fn().mockReturnValue(alertFactoryMockDone), }, savedObjectsClient: savedObjectsClientMock.create(), + uiSettingsClient: uiSettingsServiceMock.createClient(), scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), shouldWriteAlerts: () => true, shouldStopExecution: () => true, diff --git a/x-pack/plugins/alerting/server/plugin.ts b/x-pack/plugins/alerting/server/plugin.ts index 760aa6e0050a9..939068e23e2b4 100644 --- a/x-pack/plugins/alerting/server/plugin.ts +++ b/x-pack/plugins/alerting/server/plugin.ts @@ -384,6 +384,7 @@ export class AlertingPlugin { taskRunnerFactory.initialize({ logger, savedObjects: core.savedObjects, + uiSettings: core.uiSettings, elasticsearch: core.elasticsearch, getRulesClientWithRequest, spaceIdToNamespace, diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts index 99feefb472df1..bdebc66911e94 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts @@ -30,6 +30,7 @@ import { executionContextServiceMock, savedObjectsServiceMock, elasticsearchServiceMock, + uiSettingsServiceMock, } from '../../../../../src/core/server/mocks'; import { PluginStartContract as ActionsPluginStart } from '../../../actions/server'; import { actionsMock, actionsClientMock } from '../../../actions/server/mocks'; @@ -95,6 +96,7 @@ describe('Task Runner', () => { const ruleTypeRegistry = ruleTypeRegistryMock.create(); const savedObjectsService = savedObjectsServiceMock.createInternalStartContract(); const elasticsearchService = elasticsearchServiceMock.createInternalStart(); + const uiSettingsService = uiSettingsServiceMock.createStartContract(); type TaskRunnerFactoryInitializerParamsType = jest.Mocked & { actionsPlugin: jest.Mocked; @@ -106,6 +108,7 @@ describe('Task Runner', () => { const taskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType = { savedObjects: savedObjectsService, + uiSettings: uiSettingsService, elasticsearch: elasticsearchService, actionsPlugin: actionsMock.createStart(), getRulesClientWithRequest: jest.fn().mockReturnValue(rulesClient), diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.ts index dbc7749a0fbdf..c05bdc3cf7bd9 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.ts @@ -352,14 +352,17 @@ export class TaskRunner< }] namespace`, }; + const savedObjectsClient = this.context.savedObjects.getScopedClient(fakeRequest, { + includedHiddenTypes: ['alert', 'action'], + }); + updatedRuleTypeState = await this.context.executionContext.withContext(ctx, () => this.ruleType.executor({ alertId: ruleId, executionId: this.executionId, services: { - savedObjectsClient: this.context.savedObjects.getScopedClient(fakeRequest, { - includedHiddenTypes: ['alert', 'action'], - }), + savedObjectsClient, + uiSettingsClient: this.context.uiSettings.asScopedToClient(savedObjectsClient), scopedClusterClient: wrappedScopedClusterClient.client(), alertFactory: createAlertFactory< InstanceState, diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner_cancel.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner_cancel.test.ts index d70b36ff48a8f..add8d7a24912d 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner_cancel.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner_cancel.test.ts @@ -25,6 +25,7 @@ import { executionContextServiceMock, savedObjectsServiceMock, elasticsearchServiceMock, + uiSettingsServiceMock, } from '../../../../../src/core/server/mocks'; import { PluginStartContract as ActionsPluginStart } from '../../../actions/server'; import { actionsMock, actionsClientMock } from '../../../actions/server/mocks'; @@ -94,6 +95,7 @@ describe('Task Runner Cancel', () => { const ruleTypeRegistry = ruleTypeRegistryMock.create(); const savedObjectsService = savedObjectsServiceMock.createInternalStartContract(); const elasticsearchService = elasticsearchServiceMock.createInternalStart(); + const uiSettingsService = uiSettingsServiceMock.createStartContract(); type TaskRunnerFactoryInitializerParamsType = jest.Mocked & { actionsPlugin: jest.Mocked; @@ -103,6 +105,7 @@ describe('Task Runner Cancel', () => { const taskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType = { savedObjects: savedObjectsService, + uiSettings: uiSettingsService, elasticsearch: elasticsearchService, actionsPlugin: actionsMock.createStart(), getRulesClientWithRequest: jest.fn().mockReturnValue(rulesClient), diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner_factory.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner_factory.test.ts index 6dea8df475503..d4e92015d4112 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner_factory.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner_factory.test.ts @@ -16,6 +16,7 @@ import { httpServiceMock, savedObjectsServiceMock, elasticsearchServiceMock, + uiSettingsServiceMock, } from '../../../../../src/core/server/mocks'; import { actionsMock } from '../../../actions/server/mocks'; import { rulesClientMock } from '../mocks'; @@ -28,6 +29,7 @@ const executionContext = executionContextServiceMock.createSetupContract(); const mockUsageCountersSetup = usageCountersServiceMock.createSetupContract(); const mockUsageCounter = mockUsageCountersSetup.createUsageCounter('test'); const savedObjectsService = savedObjectsServiceMock.createInternalStartContract(); +const uiSettingsService = uiSettingsServiceMock.createStartContract(); const elasticsearchService = elasticsearchServiceMock.createInternalStart(); const ruleType: UntypedNormalizedRuleType = { id: 'test', @@ -77,6 +79,7 @@ describe('Task Runner Factory', () => { const taskRunnerFactoryInitializerParams: jest.Mocked = { savedObjects: savedObjectsService, + uiSettings: uiSettingsService, elasticsearch: elasticsearchService, getRulesClientWithRequest: jest.fn().mockReturnValue(rulesClient), actionsPlugin: actionsMock.createStart(), diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner_factory.ts b/x-pack/plugins/alerting/server/task_runner/task_runner_factory.ts index f60370dd7daf7..0b8ffe2f93d7b 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner_factory.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner_factory.ts @@ -15,6 +15,7 @@ import type { ExecutionContextStart, SavedObjectsServiceStart, ElasticsearchServiceStart, + UiSettingsServiceStart, } from '../../../../../src/core/server'; import { RunContext } from '../../../task_manager/server'; import { EncryptedSavedObjectsClient } from '../../../encrypted_saved_objects/server'; @@ -35,6 +36,7 @@ import { NormalizedRuleType } from '../rule_type_registry'; export interface TaskRunnerContext { logger: Logger; savedObjects: SavedObjectsServiceStart; + uiSettings: UiSettingsServiceStart; elasticsearch: ElasticsearchServiceStart; getRulesClientWithRequest(request: KibanaRequest): PublicMethodsOf; actionsPlugin: ActionsPluginStartContract; diff --git a/x-pack/plugins/alerting/server/types.ts b/x-pack/plugins/alerting/server/types.ts index 95c1a07e241b2..1642cc13d4dec 100644 --- a/x-pack/plugins/alerting/server/types.ts +++ b/x-pack/plugins/alerting/server/types.ts @@ -11,6 +11,7 @@ import type { RequestHandlerContext, SavedObjectReference, ElasticsearchClient, + IUiSettingsClient, } from 'src/core/server'; import type { PublicMethodsOf } from '@kbn/utility-types'; import { AlertFactoryDoneUtils, PublicAlert } from './alert'; @@ -78,6 +79,7 @@ export interface AlertServices< ActionGroupIds extends string = never > { savedObjectsClient: SavedObjectsClientContract; + uiSettingsClient: IUiSettingsClient; scopedClusterClient: IScopedClusterClient; alertFactory: { create: (id: string) => PublicAlert; diff --git a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts index 3593030913ba7..dbd9116498700 100644 --- a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts +++ b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts @@ -112,6 +112,7 @@ function createRule(shouldWriteAlerts: boolean = true) { services: { alertFactory, savedObjectsClient: {} as any, + uiSettingsClient: {} as any, scopedClusterClient: {} as any, shouldWriteAlerts: () => shouldWriteAlerts, shouldStopExecution: () => false, diff --git a/x-pack/plugins/rule_registry/server/utils/rule_executor_test_utils.ts b/x-pack/plugins/rule_registry/server/utils/rule_executor_test_utils.ts index 3d880988182b1..38843d95d6b73 100644 --- a/x-pack/plugins/rule_registry/server/utils/rule_executor_test_utils.ts +++ b/x-pack/plugins/rule_registry/server/utils/rule_executor_test_utils.ts @@ -7,6 +7,7 @@ import { elasticsearchServiceMock, savedObjectsClientMock, + uiSettingsServiceMock, } from '../../../../../src/core/server/mocks'; import { AlertExecutorOptions, @@ -69,6 +70,7 @@ export const createDefaultAlertExecutorOptions = < services: { alertFactory: alertsMock.createAlertServices().alertFactory, savedObjectsClient: savedObjectsClientMock.create(), + uiSettingsClient: uiSettingsServiceMock.createClient(), scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), shouldWriteAlerts: () => shouldWriteAlerts, shouldStopExecution: () => false, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/preview_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/preview_rules_route.ts index 11396864d802d..95dcb918cd165 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/preview_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/preview_rules_route.ts @@ -195,6 +195,7 @@ export const previewRulesRoute = async ( }), savedObjectsClient: context.core.savedObjects.client, scopedClusterClient: context.core.elasticsearch.client, + uiSettingsClient: context.core.uiSettings.client, }, spaceId, startedAt: startedAt.toDate(), From 31261df6ad78146ddbb8e94f881e0479be5c1235 Mon Sep 17 00:00:00 2001 From: Kyle Pollich Date: Wed, 2 Mar 2022 12:23:25 -0500 Subject: [PATCH 14/37] [Fleet] Add functional tests for bundled packages (#126595) * Add first pass functional tests for bundled packages * Address PR feedback + fix TS errors * Move docker wait hook * Move setupFleetAndAgents call in test * Try disabling bundled tests to debug CI * Fix failing jest tests * Fix type errors * Fix type errors Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .gitignore | 1 - src/dev/build/tasks/bundle_fleet_packages.ts | 2 +- src/dev/precommit_hook/casing_check_config.js | 3 - .../plugins/fleet/common/openapi/bundled.json | 13 ++ .../plugins/fleet/common/openapi/bundled.yaml | 9 ++ ...epm@packages@{pkg_name}@{pkg_version}.yaml | 9 ++ .../plugins/fleet/common/types/models/epm.ts | 2 +- .../fleet/common/types/rest_spec/epm.ts | 5 + .../fleet/server/routes/epm/handlers.ts | 7 + .../plugins/fleet/server/routes/epm/index.ts | 2 +- .../services/epm/packages/bundled_packages.ts | 2 +- .../services/epm/packages/install.test.ts | 1 + .../server/services/epm/packages/install.ts | 22 +-- .../server/services/preconfiguration.test.ts | 4 +- .../fleet_api_integration/apis/epm/index.js | 1 + .../apis/epm/install_bundled.ts | 126 ++++++++++++++++++ .../bundled_packages/elastic_agent-1.0.0.zip | Bin 0 -> 539833 bytes .../bundled_packages/elastic_agent-1.2.0.zip | Bin 0 -> 867428 bytes 18 files changed, 190 insertions(+), 19 deletions(-) create mode 100644 x-pack/test/fleet_api_integration/apis/epm/install_bundled.ts create mode 100644 x-pack/test/fleet_api_integration/apis/fixtures/bundled_packages/elastic_agent-1.0.0.zip create mode 100644 x-pack/test/fleet_api_integration/apis/fixtures/bundled_packages/elastic_agent-1.2.0.zip diff --git a/.gitignore b/.gitignore index 818d3a472d52c..7e45158458238 100644 --- a/.gitignore +++ b/.gitignore @@ -95,4 +95,3 @@ fleet-server-* elastic-agent.yml fleet-server.yml -/x-pack/plugins/fleet/server/bundled_packages diff --git a/src/dev/build/tasks/bundle_fleet_packages.ts b/src/dev/build/tasks/bundle_fleet_packages.ts index 7d0dc6a25a47e..b2faed818b55b 100644 --- a/src/dev/build/tasks/bundle_fleet_packages.ts +++ b/src/dev/build/tasks/bundle_fleet_packages.ts @@ -11,7 +11,7 @@ import JSON5 from 'json5'; import { readCliArgs } from '../args'; import { Task, read, downloadToDisk } from '../lib'; -const BUNDLED_PACKAGES_DIR = 'x-pack/plugins/fleet/server/bundled_packages'; +const BUNDLED_PACKAGES_DIR = 'x-pack/plugins/fleet/target/bundled_packages'; interface FleetPackage { name: string; diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index 860886811da54..932fdaf6c2e28 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -61,9 +61,6 @@ export const IGNORE_FILE_GLOBS = [ 'x-pack/plugins/maps/server/fonts/**/*', - // Bundled package names typically use a format like ${pkgName}-${pkgVersion}, so don't lint them - 'x-pack/plugins/fleet/server/bundled_packages/**/*', - // Bazel default files '**/WORKSPACE.bazel', '**/BUILD.bazel', diff --git a/x-pack/plugins/fleet/common/openapi/bundled.json b/x-pack/plugins/fleet/common/openapi/bundled.json index 46cd3e998ea7f..9c79397e25e10 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.json +++ b/x-pack/plugins/fleet/common/openapi/bundled.json @@ -621,6 +621,19 @@ "type" ] } + }, + "_meta": { + "type": "object", + "properties": { + "install_source": { + "type": "string", + "enum": [ + "registry", + "upload", + "bundled" + ] + } + } } }, "required": [ diff --git a/x-pack/plugins/fleet/common/openapi/bundled.yaml b/x-pack/plugins/fleet/common/openapi/bundled.yaml index ae8fdb3b87d4d..1ec0df0e51641 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.yaml +++ b/x-pack/plugins/fleet/common/openapi/bundled.yaml @@ -382,6 +382,15 @@ paths: required: - id - type + _meta: + type: object + properties: + install_source: + type: string + enum: + - registry + - upload + - bundled required: - items operationId: install-package diff --git a/x-pack/plugins/fleet/common/openapi/paths/epm@packages@{pkg_name}@{pkg_version}.yaml b/x-pack/plugins/fleet/common/openapi/paths/epm@packages@{pkg_name}@{pkg_version}.yaml index ef0964b66e045..6ef61788acd62 100644 --- a/x-pack/plugins/fleet/common/openapi/paths/epm@packages@{pkg_name}@{pkg_version}.yaml +++ b/x-pack/plugins/fleet/common/openapi/paths/epm@packages@{pkg_name}@{pkg_version}.yaml @@ -64,6 +64,15 @@ post: required: - id - type + _meta: + type: object + properties: + install_source: + type: string + enum: + - registry + - upload + - bundled required: - items operationId: install-package diff --git a/x-pack/plugins/fleet/common/types/models/epm.ts b/x-pack/plugins/fleet/common/types/models/epm.ts index 64ea5665241e1..1c7e09a51c5da 100644 --- a/x-pack/plugins/fleet/common/types/models/epm.ts +++ b/x-pack/plugins/fleet/common/types/models/epm.ts @@ -43,7 +43,7 @@ export interface DefaultPackagesInstallationError { } export type InstallType = 'reinstall' | 'reupdate' | 'rollback' | 'update' | 'install' | 'unknown'; -export type InstallSource = 'registry' | 'upload'; +export type InstallSource = 'registry' | 'upload' | 'bundled'; export type EpmPackageInstallStatus = | 'installed' diff --git a/x-pack/plugins/fleet/common/types/rest_spec/epm.ts b/x-pack/plugins/fleet/common/types/rest_spec/epm.ts index 6a72792e780ef..f1ccaae05487b 100644 --- a/x-pack/plugins/fleet/common/types/rest_spec/epm.ts +++ b/x-pack/plugins/fleet/common/types/rest_spec/epm.ts @@ -12,6 +12,7 @@ import type { PackageInfo, PackageUsageStats, InstallType, + InstallSource, } from '../models/epm'; export interface GetCategoriesRequest { @@ -108,6 +109,9 @@ export interface InstallPackageRequest { export interface InstallPackageResponse { items: AssetReference[]; + _meta: { + install_source: InstallSource; + }; // deprecated in 8.0 response?: AssetReference[]; } @@ -123,6 +127,7 @@ export interface InstallResult { status?: 'installed' | 'already_installed'; error?: Error; installType: InstallType; + installSource: InstallSource; } export interface BulkInstallPackageInfo { diff --git a/x-pack/plugins/fleet/server/routes/epm/handlers.ts b/x-pack/plugins/fleet/server/routes/epm/handlers.ts index 9bfcffa04bf35..7ba2d3f194eeb 100644 --- a/x-pack/plugins/fleet/server/routes/epm/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/epm/handlers.ts @@ -267,9 +267,13 @@ export const installPackageFromRegistryHandler: FleetRequestHandler< force: request.body?.force, ignoreConstraints: request.body?.ignore_constraints, }); + if (!res.error) { const body: InstallPackageResponse = { items: res.assets || [], + _meta: { + install_source: res.installSource, + }, }; return response.ok({ body }); } else { @@ -342,6 +346,9 @@ export const installPackageByUploadHandler: FleetRequestHandler< const body: InstallPackageResponse = { items: res.assets || [], response: res.assets || [], + _meta: { + install_source: res.installSource, + }, }; return response.ok({ body }); } else { diff --git a/x-pack/plugins/fleet/server/routes/epm/index.ts b/x-pack/plugins/fleet/server/routes/epm/index.ts index 95aadf1b8555a..544ab8b288cb4 100644 --- a/x-pack/plugins/fleet/server/routes/epm/index.ts +++ b/x-pack/plugins/fleet/server/routes/epm/index.ts @@ -242,7 +242,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { response ); if (resp.payload?.items) { - return response.ok({ body: { response: resp.payload.items } }); + return response.ok({ body: { ...resp.payload, response: resp.payload.items } }); } return resp; } diff --git a/x-pack/plugins/fleet/server/services/epm/packages/bundled_packages.ts b/x-pack/plugins/fleet/server/services/epm/packages/bundled_packages.ts index 8ccd2006ad846..77ece9e1d7787 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/bundled_packages.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/bundled_packages.ts @@ -12,7 +12,7 @@ import type { BundledPackage } from '../../../types'; import { appContextService } from '../../app_context'; import { splitPkgKey } from '../registry'; -const BUNDLED_PACKAGE_DIRECTORY = path.join(__dirname, '../../../bundled_packages'); +const BUNDLED_PACKAGE_DIRECTORY = path.join(__dirname, '../../../../target/bundled_packages'); export async function getBundledPackages(): Promise { try { diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/install.test.ts index 1a1f1aa617f54..c803b0ff18a44 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.test.ts @@ -83,6 +83,7 @@ describe('install', () => { .mockImplementation(() => Promise.resolve({ packageInfo: { license: 'basic' } } as any)); mockGetBundledPackages.mockReset(); + (install._installPackage as jest.Mock).mockClear(); }); describe('registry', () => { diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install.ts b/x-pack/plugins/fleet/server/services/epm/packages/install.ts index 107b906a969c8..23883f90d4248 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.ts @@ -276,6 +276,7 @@ async function installPackageFromRegistry({ ], status: 'already_installed', installType, + installSource: 'registry', }; } } @@ -307,7 +308,7 @@ async function installPackageFromRegistry({ ...telemetryEvent, errorMessage: err.message, }); - return { error: err, installType }; + return { error: err, installType, installSource: 'registry' }; } const savedObjectsImporter = appContextService @@ -338,7 +339,7 @@ async function installPackageFromRegistry({ ...telemetryEvent, status: 'success', }); - return { assets, status: 'installed', installType }; + return { assets, status: 'installed', installType, installSource: 'registry' }; }) .catch(async (err: Error) => { logger.warn(`Failure to install package [${pkgName}]: [${err.toString()}]`); @@ -355,7 +356,7 @@ async function installPackageFromRegistry({ ...telemetryEvent, errorMessage: err.message, }); - return { error: err, installType }; + return { error: err, installType, installSource: 'registry' }; }); } catch (e) { sendEvent({ @@ -365,6 +366,7 @@ async function installPackageFromRegistry({ return { error: e, installType, + installSource: 'registry', }; } } @@ -454,7 +456,7 @@ async function installPackageByUpload({ ...telemetryEvent, errorMessage: e.message, }); - return { error: e, installType }; + return { error: e, installType, installSource: 'upload' }; } } @@ -463,9 +465,10 @@ export type InstallPackageParams = { } & ( | ({ installSource: Extract } & InstallRegistryPackageParams) | ({ installSource: Extract } & InstallUploadedArchiveParams) + | ({ installSource: Extract } & InstallUploadedArchiveParams) ); -export async function installPackage(args: InstallPackageParams) { +export async function installPackage(args: InstallPackageParams): Promise { if (!('installSource' in args)) { throw new Error('installSource is required'); } @@ -487,7 +490,7 @@ export async function installPackage(args: InstallPackageParams) { `found bundled package for requested install of ${pkgkey} - installing from bundled package archive` ); - const response = installPackageByUpload({ + const response = await installPackageByUpload({ savedObjectsClient, esClient, archiveBuffer: matchingBundledPackage.buffer, @@ -495,11 +498,11 @@ export async function installPackage(args: InstallPackageParams) { spaceId, }); - return response; + return { ...response, installSource: 'bundled' }; } logger.debug(`kicking off install of ${pkgkey} from registry`); - const response = installPackageFromRegistry({ + const response = await installPackageFromRegistry({ savedObjectsClient, pkgkey, esClient, @@ -510,7 +513,7 @@ export async function installPackage(args: InstallPackageParams) { return response; } else if (args.installSource === 'upload') { const { archiveBuffer, contentType, spaceId } = args; - const response = installPackageByUpload({ + const response = await installPackageByUpload({ savedObjectsClient, esClient, archiveBuffer, @@ -519,7 +522,6 @@ export async function installPackage(args: InstallPackageParams) { }); return response; } - // @ts-expect-error s/b impossibe b/c `never` by this point, but just in case throw new Error(`Unknown installSource: ${args.installSource}`); } diff --git a/x-pack/plugins/fleet/server/services/preconfiguration.test.ts b/x-pack/plugins/fleet/server/services/preconfiguration.test.ts index 518b79b9e8547..2a6e235580811 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration.test.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration.test.ts @@ -143,6 +143,7 @@ jest.mock('./epm/packages/install', () => ({ return { error: new Error(installError), installType: 'install', + installSource: 'registry', }; } @@ -157,6 +158,7 @@ jest.mock('./epm/packages/install', () => ({ return { status: 'installed', installType: 'install', + installSource: 'registry', }; } else if (args.installSource === 'upload') { const { archiveBuffer } = args; @@ -168,7 +170,7 @@ jest.mock('./epm/packages/install', () => ({ const packageInstallation = { name: pkgName, version: '1.0.0', title: pkgName }; mockInstalledPackages.set(pkgName, packageInstallation); - return { status: 'installed', installType: 'install' }; + return { status: 'installed', installType: 'install', installSource: 'upload' }; } }, ensurePackagesCompletedInstall() { diff --git a/x-pack/test/fleet_api_integration/apis/epm/index.js b/x-pack/test/fleet_api_integration/apis/epm/index.js index 70c8748932f6e..4247be10e0792 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/index.js +++ b/x-pack/test/fleet_api_integration/apis/epm/index.js @@ -14,6 +14,7 @@ export default function loadTests({ loadTestFile }) { loadTestFile(require.resolve('./file')); loadTestFile(require.resolve('./template')); loadTestFile(require.resolve('./ilm')); + // loadTestFile(require.resolve('./install_bundled')); loadTestFile(require.resolve('./install_by_upload')); loadTestFile(require.resolve('./install_endpoint')); loadTestFile(require.resolve('./install_overrides')); diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_bundled.ts b/x-pack/test/fleet_api_integration/apis/epm/install_bundled.ts new file mode 100644 index 0000000000000..c70495ea7809d --- /dev/null +++ b/x-pack/test/fleet_api_integration/apis/epm/install_bundled.ts @@ -0,0 +1,126 @@ +/* + * 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 expect from '@kbn/expect'; +import fs from 'fs/promises'; +import path from 'path'; + +import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; +import { skipIfNoDockerRegistry } from '../../helpers'; +import { setupFleetAndAgents } from '../agents/services'; + +export default function (providerContext: FtrProviderContext) { + const { getService } = providerContext; + const supertest = getService('supertest'); + const log = getService('log'); + + const BUNDLED_PACKAGE_FIXTURES_DIR = path.join( + path.dirname(__filename), + '../fixtures/bundled_packages' + ); + const BUNDLED_PACKAGES_DIR = path.join( + path.dirname(__filename), + '../../../../plugins/fleet/target/bundled_packages' + ); + + const bundlePackage = async (name: string) => { + try { + await fs.access(BUNDLED_PACKAGES_DIR); + } catch (error) { + await fs.mkdir(BUNDLED_PACKAGES_DIR); + } + + await fs.copyFile( + path.join(BUNDLED_PACKAGE_FIXTURES_DIR, `${name}.zip`), + path.join(BUNDLED_PACKAGES_DIR, `${name}.zip`) + ); + }; + + const removeBundledPackages = async () => { + try { + const files = await fs.readdir(BUNDLED_PACKAGES_DIR); + + for (const file of files) { + await fs.unlink(path.join(BUNDLED_PACKAGES_DIR, file)); + } + } catch (error) { + log.error('Error removing bundled packages'); + log.error(error); + } + }; + + describe('installing bundled packages', async () => { + skipIfNoDockerRegistry(providerContext); + setupFleetAndAgents(providerContext); + + afterEach(async () => { + await removeBundledPackages(); + }); + + describe('without registry', () => { + it('installs from bundled source via api', async () => { + await bundlePackage('elastic_agent-1.2.0'); + + const response = await supertest + .post(`/api/fleet/epm/packages/elastic_agent/1.2.0`) + .set('kbn-xsrf', 'xxxx') + .type('application/json') + .send({ force: true }) + .expect(200); + + expect(response.body._meta.install_source).to.be('bundled'); + }); + + it('allows for upgrading from newer bundled source when outdated package was installed from bundled source', async () => { + await bundlePackage('elastic_agent-1.0.0'); + await bundlePackage('elastic_agent-1.2.0'); + + const installResponse = await supertest + .post(`/api/fleet/epm/packages/elastic_agent/1.0.0`) + .set('kbn-xsrf', 'xxxx') + .type('application/json') + .send({ force: true }) + .expect(200); + + expect(installResponse.body._meta.install_source).to.be('bundled'); + + const updateResponse = await supertest + .post(`/api/fleet/epm/packages/elastic_agent/1.2.0`) + .set('kbn-xsrf', 'xxxx') + .type('application/json') + .send({ force: true }) + .expect(200); + + expect(updateResponse.body._meta.install_source).to.be('bundled'); + }); + }); + + describe('with registry', () => { + it('allows for updating from registry when outdated package is installed from bundled source', async () => { + await bundlePackage('elastic_agent-1.2.0'); + + const bundledInstallResponse = await supertest + .post(`/api/fleet/epm/packages/elastic_agent/1.2.0`) + .set('kbn-xsrf', 'xxxx') + .type('application/json') + .send({ force: true }) + .expect(200); + + expect(bundledInstallResponse.body._meta.install_source).to.be('bundled'); + + const registryUpdateResponse = await supertest + .post(`/api/fleet/epm/packages/elastic_agent/1.3.0`) + .set('kbn-xsrf', 'xxxx') + .type('application/json') + .send({ force: true }) + .expect(200); + + expect(registryUpdateResponse.body._meta.install_source).to.be('registry'); + }); + }); + }); +} diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/bundled_packages/elastic_agent-1.0.0.zip b/x-pack/test/fleet_api_integration/apis/fixtures/bundled_packages/elastic_agent-1.0.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..77961d6b14c53d074a3f5dbfe91ddeebafed920f GIT binary patch literal 539833 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

@j^ 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�jB^&~z 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

HZThDyN+!wC|i!BQ6D*A^= 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

  • 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 V;DZkOG+h;-S19c_eWYMilQf;7UWeG|sl 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

    G+|VPMfPDcNj)^!|gG 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

    }&R>Cn)@*YsO6ZPWQ?pUqYA@7fgxi(92E%8zm) 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 z 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

    sZch=Urbglt&j|AFS8no{Cj>ydf?82F||6Hi- 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

    Irh%EIApZQqUhvpd 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 literal 0 HcmV?d00001 From 6b636603888099622dc2600a9c62efeef29ac151 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Wed, 2 Mar 2022 13:42:33 -0500 Subject: [PATCH 15/37] Test out unused deprecations list (#121911) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/data/common/es_query/index.ts | 31 ----------------------- src/plugins/data/public/deprecated.ts | 9 +------ 2 files changed, 1 insertion(+), 39 deletions(-) diff --git a/src/plugins/data/common/es_query/index.ts b/src/plugins/data/common/es_query/index.ts index fa9b7ac86a7fa..d717af0107e8c 100644 --- a/src/plugins/data/common/es_query/index.ts +++ b/src/plugins/data/common/es_query/index.ts @@ -43,13 +43,10 @@ import { buildExistsFilter as oldBuildExistsFilter, toggleFilterNegated as oldtoggleFilterNegated, Filter as oldFilter, - RangeFilterMeta as oldRangeFilterMeta, RangeFilterParams as oldRangeFilterParams, ExistsFilter as oldExistsFilter, - PhrasesFilter as oldPhrasesFilter, PhraseFilter as oldPhraseFilter, MatchAllFilter as oldMatchAllFilter, - CustomFilter as oldCustomFilter, RangeFilter as oldRangeFilter, KueryNode as oldKueryNode, FilterMeta as oldFilterMeta, @@ -58,17 +55,11 @@ import { compareFilters as oldCompareFilters, COMPARE_ALL_OPTIONS as OLD_COMPARE_ALL_OPTIONS, dedupFilters as oldDedupFilters, - isFilter as oldIsFilter, onlyDisabledFiltersChanged as oldOnlyDisabledFiltersChanged, uniqFilters as oldUniqFilters, FilterStateStore, } from '@kbn/es-query'; -/** - * @deprecated Import from the "@kbn/es-query" package directly instead. - * @removeBy 8.1 - */ -const isFilter = oldIsFilter; /** * @deprecated Import from the "@kbn/es-query" package directly instead. * @removeBy 8.1 @@ -295,12 +286,6 @@ const FILTERS = oldFILTERS; */ type Filter = oldFilter; -/** - * @deprecated Import from the "@kbn/es-query" package directly instead. - * @removeBy 8.1 - */ -type RangeFilterMeta = oldRangeFilterMeta; - /** * @deprecated Import from the "@kbn/es-query" package directly instead. * @removeBy 8.1 @@ -313,12 +298,6 @@ type RangeFilterParams = oldRangeFilterParams; */ type ExistsFilter = oldExistsFilter; -/** - * @deprecated Import from the "@kbn/es-query" package directly instead. - * @removeBy 8.1 - */ -type PhrasesFilter = oldPhrasesFilter; - /** * @deprecated Import from the "@kbn/es-query" package directly instead. * @removeBy 8.1 @@ -331,12 +310,6 @@ type PhraseFilter = oldPhraseFilter; */ type MatchAllFilter = oldMatchAllFilter; -/** - * @deprecated Import from the "@kbn/es-query" package directly instead. - * @removeBy 8.1 - */ -type CustomFilter = oldCustomFilter; - /** * @deprecated Import from the "@kbn/es-query" package directly instead. * @removeBy 8.1 @@ -368,13 +341,10 @@ type EsQueryConfig = oldEsQueryConfig; export type { Filter, - RangeFilterMeta, RangeFilterParams, ExistsFilter, - PhrasesFilter, PhraseFilter, MatchAllFilter, - CustomFilter, RangeFilter, KueryNode, FilterMeta, @@ -415,7 +385,6 @@ export { buildExistsFilter, toggleFilterNegated, FILTERS, - isFilter, isFilterDisabled, dedupFilters, onlyDisabledFiltersChanged, diff --git a/src/plugins/data/public/deprecated.ts b/src/plugins/data/public/deprecated.ts index 0458a940482de..6a6c7bbb2cd2c 100644 --- a/src/plugins/data/public/deprecated.ts +++ b/src/plugins/data/public/deprecated.ts @@ -36,16 +36,12 @@ import { luceneStringToDsl, decorateQuery, FILTERS, - isFilter, isFilters, KueryNode, RangeFilter, - RangeFilterMeta, RangeFilterParams, ExistsFilter, - PhrasesFilter, PhraseFilter, - CustomFilter, MatchAllFilter, EsQueryConfig, FilterStateStore, @@ -139,16 +135,13 @@ export const esFilters = { export type { KueryNode, RangeFilter, - RangeFilterMeta, RangeFilterParams, ExistsFilter, - PhrasesFilter, PhraseFilter, - CustomFilter, MatchAllFilter, EsQueryConfig, }; -export { isFilter, isFilters }; +export { isFilters }; /** * @deprecated Import helpers from the "@kbn/es-query" package directly instead. From 9d53810791165e9a16fa7dc6aac8ca4179b26b52 Mon Sep 17 00:00:00 2001 From: Ashokaditya <1849116+ashokaditya@users.noreply.github.com> Date: Wed, 2 Mar 2022 19:55:58 +0100 Subject: [PATCH 16/37] [Security Solution][Endpoint] Adds `matches` wildcard operator for `file.path.text` field for Event Filters (#125202) * labels for wildcard path entries fixes elastic/security-team/issues/2525 * consistent naming and add missing tests refs elastic/kibana/pull/120679 * add autocompletion for wildcard fixes elastic/security-team/issues/2525 * ensure event filter artifacts have correct wildcard type for process.name entry fixes elastic/security-team/issues/2525 fixes elastic/security-team/issues/2723 * set warning for input values fixes elastic/security-team/issues/2525 * lift path validations to packages fixes elastic/security-team/issues/2525 * Add more tests fixes elastic/security-team/issues/2525 * Add wildcards to event filter generator * fix merge i18n check * Remove not match/excluded operator for now review changes * add mixed entries for wildcard review changes * comparison typo refs 06c868b6d1233676cc3bd5343ad36539a9433936 * fix vulnerable regex review changes * ignore empty space on input review changes * update component review changes * use const enum review changes * update type imports to use ConditionEntryField, OperatingSystem, TrustedAppEntryTypes --- .i18nrc.json | 1 + .../README.md | 22 +- .../src/field_value_wildcard/index.test.tsx | 279 ++++++++++++++++++ .../src/field_value_wildcard/index.tsx | 255 ++++++++++++++++ .../src/fields/index.mock.ts | 8 + .../src/get_operators/index.test.ts | 10 + .../src/get_operators/index.ts | 3 + .../src/index.ts | 1 + .../src/operator/index.test.tsx | 27 ++ .../src/common/endpoint/entries/index.mock.ts | 4 +- .../src/common/endpoint/entries/index.test.ts | 4 +- .../entry_match_wildcard/index.mock.ts | 2 +- .../entry_match_wildcard/index.test.ts | 99 +++++++ .../src/autocomplete_operators/index.ts | 11 + .../src/helpers/index.ts | 60 ++++ .../kbn-securitysolution-utils/BUILD.bazel | 4 +- .../kbn-securitysolution-utils/src/index.ts | 1 + .../src/path_validations/index.test.ts | 80 ++++- .../src/path_validations/index.ts | 178 +++++++++++ .../components/builder/builder.stories.tsx | 4 + .../builder/entry_renderer.test.tsx | 119 ++++++++ .../components/builder/entry_renderer.tsx | 60 +++- .../builder/exception_item_renderer.test.tsx | 9 + .../builder/exception_item_renderer.tsx | 17 +- .../builder/exception_items_renderer.tsx | 17 +- .../exceptions/components/builder/reducer.ts | 14 + .../data_generators/base_data_generator.ts | 4 +- .../data_generators/event_filter_generator.ts | 8 +- .../exceptions_list_item_generator.ts | 2 +- .../data_generators/trusted_app_generator.ts | 3 +- .../endpoint/schema/trusted_apps.test.ts | 9 +- .../common/endpoint/schema/trusted_apps.ts | 3 +- .../service/trusted_apps/validations.ts | 123 +------- .../common/endpoint/types/os.ts | 6 - .../common/endpoint/types/trusted_apps.ts | 14 +- .../common/utils/path_placeholder.test.ts | 6 +- .../common/utils/path_placeholder.ts | 7 +- .../public/management/common/translations.ts | 3 +- .../components/criteria_conditions.tsx | 4 +- .../components/translations.ts | 4 +- .../view/components/form/index.tsx | 4 +- .../antivirus_registration_form/index.tsx | 2 +- .../components/config_form/index.stories.tsx | 2 +- .../view/components/config_form/index.tsx | 2 +- .../view/components/events_form/index.tsx | 7 +- .../policy/view/policy_forms/events/linux.tsx | 2 +- .../policy/view/policy_forms/events/mac.tsx | 2 +- .../view/policy_forms/events/windows.tsx | 2 +- .../policy_forms/protections/behavior.tsx | 7 +- .../view/policy_forms/protections/malware.tsx | 7 +- .../view/policy_forms/protections/memory.tsx | 7 +- .../policy_forms/protections/ransomware.tsx | 7 +- .../pages/trusted_apps/service/mappers.ts | 8 +- .../pages/trusted_apps/state/type_guards.ts | 2 +- .../pages/trusted_apps/store/builders.ts | 8 +- .../pages/trusted_apps/test_utils/index.ts | 3 +- .../condition_entry_input/index.test.tsx | 8 +- .../condition_entry_input/index.tsx | 9 +- .../view/components/condition_group/index.tsx | 3 +- .../create_trusted_app_form.test.tsx | 7 +- .../components/create_trusted_app_form.tsx | 11 +- .../pages/trusted_apps/view/translations.ts | 2 +- .../view/trusted_apps_page.test.tsx | 7 +- .../scripts/endpoint/event_filters/index.ts | 30 +- .../server/endpoint/lib/artifacts/lists.ts | 5 +- .../manifest_manager/manifest_manager.test.ts | 1 + .../endpoint/validators/base_validator.ts | 2 +- .../host_isolation_exceptions_validator.ts | 2 +- .../validators/trusted_app_validator.ts | 7 +- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 71 files changed, 1385 insertions(+), 268 deletions(-) create mode 100644 packages/kbn-securitysolution-autocomplete/src/field_value_wildcard/index.test.tsx create mode 100644 packages/kbn-securitysolution-autocomplete/src/field_value_wildcard/index.tsx create mode 100644 packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entry_match_wildcard/index.test.ts rename x-pack/plugins/security_solution/common/endpoint/service/trusted_apps/validations.test.ts => packages/kbn-securitysolution-utils/src/path_validations/index.test.ts (84%) create mode 100644 packages/kbn-securitysolution-utils/src/path_validations/index.ts diff --git a/.i18nrc.json b/.i18nrc.json index 5c362908a1876..7ec704aab3a7a 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -66,6 +66,7 @@ "uiActions": "src/plugins/ui_actions", "uiActionsExamples": "examples/ui_action_examples", "usageCollection": "src/plugins/usage_collection", + "utils": "packages/kbn-securitysolution-utils/src", "visDefaultEditor": "src/plugins/vis_default_editor", "visTypeHeatmap": "src/plugins/vis_types/heatmap", "visTypeMarkdown": "src/plugins/vis_type_markdown", diff --git a/packages/kbn-securitysolution-autocomplete/README.md b/packages/kbn-securitysolution-autocomplete/README.md index 41bfd9baf628d..83b2d6a1882ce 100644 --- a/packages/kbn-securitysolution-autocomplete/README.md +++ b/packages/kbn-securitysolution-autocomplete/README.md @@ -1,6 +1,6 @@ # Autocomplete Fields -Need an input that shows available index fields? Or an input that autocompletes based on a selected indexPattern field? Bingo! That's what these components are for. They are generalized enough so that they can be reused throughout and repurposed based on your needs. +Need an input that shows available index fields? Or an input that auto-completes based on a selected indexPattern field? Bingo! That's what these components are for. They are generalized enough so that they can be reused throughout and repurposed based on your needs. All three of the available components rely on Eui's combo box. @@ -119,4 +119,24 @@ The `onChange` handler is passed selected `string[]`. indexPattern={indexPattern} onChange={handleFieldMatchAnyValueChange} /> +``` + +## AutocompleteFieldWildcardComponent + +This component can be used to allow users to select a single value. It uses the autocomplete hook to display any autocomplete options based on the passed in `indexPattern`, but also allows a user to add their own value. + +The `onChange` handler is passed selected `string[]`. + +```js + ``` \ No newline at end of file diff --git a/packages/kbn-securitysolution-autocomplete/src/field_value_wildcard/index.test.tsx b/packages/kbn-securitysolution-autocomplete/src/field_value_wildcard/index.test.tsx new file mode 100644 index 0000000000000..34769a76563c1 --- /dev/null +++ b/packages/kbn-securitysolution-autocomplete/src/field_value_wildcard/index.test.tsx @@ -0,0 +1,279 @@ +/* + * 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 { ReactWrapper, mount } from 'enzyme'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; +import { act } from '@testing-library/react'; +import { AutocompleteFieldWildcardComponent } from '.'; +import { useFieldValueAutocomplete } from '../hooks/use_field_value_autocomplete'; +import { fields, getField } from '../fields/index.mock'; +import { autocompleteStartMock } from '../autocomplete/index.mock'; + +jest.mock('../hooks/use_field_value_autocomplete'); + +describe('AutocompleteFieldWildcardComponent', () => { + let wrapper: ReactWrapper; + + const getValueSuggestionsMock = jest + .fn() + .mockResolvedValue([false, true, ['value 3', 'value 4'], jest.fn()]); + + beforeEach(() => { + (useFieldValueAutocomplete as jest.Mock).mockReturnValue([ + false, + true, + ['value 1', 'value 2'], + getValueSuggestionsMock, + ]); + }); + + afterEach(() => { + jest.clearAllMocks(); + wrapper.unmount(); + }); + + test('it renders row label if one passed in', () => { + wrapper = mount( + + ); + + expect( + wrapper.find('[data-test-subj="valuesAutocompleteWildcardLabel"] label').at(0).text() + ).toEqual('Row Label'); + }); + + test('it renders disabled if "isDisabled" is true', () => { + wrapper = mount( + + ); + + expect( + wrapper.find('[data-test-subj="valuesAutocompleteWildcard"] input').prop('disabled') + ).toBeTruthy(); + }); + + test('it renders loading if "isLoading" is true', () => { + wrapper = mount( + + ); + wrapper.find('[data-test-subj="valuesAutocompleteWildcard"] button').at(0).simulate('click'); + expect( + wrapper + .find('EuiComboBoxOptionsList[data-test-subj="valuesAutocompleteWildcard-optionsList"]') + .prop('isLoading') + ).toBeTruthy(); + }); + + test('it allows user to clear values if "isClearable" is true', () => { + wrapper = mount( + + ); + + expect( + wrapper + .find('[data-test-subj="comboBoxInput"]') + .hasClass('euiComboBox__inputWrap-isClearable') + ).toBeTruthy(); + }); + + test('it correctly displays selected value', () => { + wrapper = mount( + + ); + + expect( + wrapper.find('[data-test-subj="valuesAutocompleteWildcard"] EuiComboBoxPill').at(0).text() + ).toEqual('/opt/*/app.dmg'); + }); + + test('it invokes "onChange" when new value created', async () => { + const mockOnChange = jest.fn(); + wrapper = mount( + + ); + + ( + wrapper.find(EuiComboBox).props() as unknown as { + onCreateOption: (a: string) => void; + } + ).onCreateOption('/opt/*/app.dmg'); + + expect(mockOnChange).toHaveBeenCalledWith('/opt/*/app.dmg'); + }); + + test('it invokes "onChange" when new value selected', async () => { + const mockOnChange = jest.fn(); + wrapper = mount( + + ); + + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange([{ label: 'value 1' }]); + + expect(mockOnChange).toHaveBeenCalledWith('value 1'); + }); + + test('it refreshes autocomplete with search query when new value searched', () => { + wrapper = mount( + + ); + act(() => { + ( + wrapper.find(EuiComboBox).props() as unknown as { + onSearchChange: (a: string) => void; + } + ).onSearchChange('A:\\Some Folder\\inc*.exe'); + }); + + expect(useFieldValueAutocomplete).toHaveBeenCalledWith({ + autocompleteService: autocompleteStartMock, + fieldValue: '', + indexPattern: { + fields, + id: '1234', + title: 'logs-endpoint.events.*', + }, + operatorType: 'wildcard', + query: 'A:\\Some Folder\\inc*.exe', + selectedField: getField('file.path.text'), + }); + }); +}); diff --git a/packages/kbn-securitysolution-autocomplete/src/field_value_wildcard/index.tsx b/packages/kbn-securitysolution-autocomplete/src/field_value_wildcard/index.tsx new file mode 100644 index 0000000000000..159267c3386de --- /dev/null +++ b/packages/kbn-securitysolution-autocomplete/src/field_value_wildcard/index.tsx @@ -0,0 +1,255 @@ +/* + * 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, { useCallback, useMemo, useState, useEffect, memo } from 'react'; +import { EuiFormRow, EuiComboBoxOptionOption, EuiComboBox } from '@elastic/eui'; +import { DataViewBase, DataViewFieldBase } from '@kbn/es-query'; + +import { uniq } from 'lodash'; + +import { ListOperatorTypeEnum as OperatorTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; + +// TODO: I have to use any here for now, but once this is available below, we should use the correct types, https://github.com/elastic/kibana/issues/100715 +// import { AutocompleteStart } from '../../../../../../../src/plugins/data/public'; +type AutocompleteStart = any; + +import * as i18n from '../translations'; +import { useFieldValueAutocomplete } from '../hooks/use_field_value_autocomplete'; +import { + getGenericComboBoxProps, + GetGenericComboBoxPropsReturn, +} from '../get_generic_combo_box_props'; +import { paramIsValid } from '../param_is_valid'; + +const SINGLE_SELECTION = { asPlainText: true }; + +interface AutocompleteFieldWildcardProps { + placeholder: string; + selectedField: DataViewFieldBase | undefined; + selectedValue: string | undefined; + indexPattern: DataViewBase | undefined; + isLoading: boolean; + isDisabled?: boolean; + isClearable?: boolean; + isRequired?: boolean; + fieldInputWidth?: number; + rowLabel?: string; + autocompleteService: AutocompleteStart; + onChange: (arg: string) => void; + onError: (arg: boolean) => void; + onWarning: (arg: boolean) => void; + warning?: string; +} + +export const AutocompleteFieldWildcardComponent: React.FC = memo( + ({ + autocompleteService, + placeholder, + rowLabel, + selectedField, + selectedValue, + indexPattern, + isLoading, + isDisabled = false, + isClearable = false, + isRequired = false, + fieldInputWidth, + onChange, + onError, + onWarning, + warning, + }): JSX.Element => { + const [searchQuery, setSearchQuery] = useState(''); + const [touched, setIsTouched] = useState(false); + const [error, setError] = useState(undefined); + const [isLoadingSuggestions, , suggestions] = useFieldValueAutocomplete({ + autocompleteService, + fieldValue: selectedValue, + indexPattern, + operatorType: OperatorTypeEnum.WILDCARD, + query: searchQuery, + selectedField, + }); + const getLabel = useCallback((option: string): string => option, []); + const optionsMemo = useMemo((): string[] => { + const valueAsStr = String(selectedValue); + return selectedValue != null && selectedValue.trim() !== '' + ? uniq([valueAsStr, ...suggestions]) + : suggestions; + }, [suggestions, selectedValue]); + const selectedOptionsMemo = useMemo((): string[] => { + const valueAsStr = String(selectedValue); + return selectedValue ? [valueAsStr] : []; + }, [selectedValue]); + + const handleError = useCallback( + (err: string | undefined): void => { + setError((existingErr): string | undefined => { + const oldErr = existingErr != null; + const newErr = err != null; + if (oldErr !== newErr && onError != null) { + onError(newErr); + } + + return err; + }); + }, + [setError, onError] + ); + + const handleWarning = useCallback( + (warn: string | undefined): void => { + onWarning(warn !== undefined); + }, + [onWarning] + ); + + const { comboOptions, labels, selectedComboOptions } = useMemo( + (): GetGenericComboBoxPropsReturn => + getGenericComboBoxProps({ + getLabel, + options: optionsMemo, + selectedOptions: selectedOptionsMemo, + }), + [optionsMemo, selectedOptionsMemo, getLabel] + ); + + const handleValuesChange = useCallback( + (newOptions: EuiComboBoxOptionOption[]): void => { + const [newValue] = newOptions.map(({ label }) => optionsMemo[labels.indexOf(label)]); + handleError(undefined); + handleWarning(undefined); + onChange(newValue ?? ''); + }, + [handleError, handleWarning, labels, onChange, optionsMemo] + ); + + const handleSearchChange = useCallback( + (searchVal: string): void => { + if (searchVal.trim() !== '' && selectedField != null) { + const err = paramIsValid(searchVal, selectedField, isRequired, touched); + handleError(err); + handleWarning(warning); + setSearchQuery(searchVal); + } + }, + [handleError, isRequired, selectedField, touched, warning, handleWarning] + ); + + const handleCreateOption = useCallback( + (option: string): boolean | undefined => { + const err = paramIsValid(option, selectedField, isRequired, touched); + handleError(err); + handleWarning(warning); + + if (err != null) { + // Explicitly reject the user's input + return false; + } else { + onChange(option); + return undefined; + } + }, + [isRequired, onChange, selectedField, touched, handleError, handleWarning, warning] + ); + + const setIsTouchedValue = useCallback((): void => { + setIsTouched(true); + + const err = paramIsValid(selectedValue, selectedField, isRequired, true); + handleError(err); + handleWarning(warning); + }, [ + setIsTouched, + handleError, + selectedValue, + selectedField, + isRequired, + handleWarning, + warning, + ]); + + const inputPlaceholder = useMemo((): string => { + if (isLoading || isLoadingSuggestions) { + return i18n.LOADING; + } else if (selectedField == null) { + return i18n.SELECT_FIELD_FIRST; + } else { + return placeholder; + } + }, [isLoading, selectedField, isLoadingSuggestions, placeholder]); + + const isLoadingState = useMemo( + (): boolean => isLoading || isLoadingSuggestions, + [isLoading, isLoadingSuggestions] + ); + + useEffect((): void => { + setError(undefined); + if (onError != null) { + onError(false); + } + if (onWarning != null) { + onWarning(false); + } + }, [selectedField, onError, onWarning]); + + const defaultInput = useMemo((): JSX.Element => { + return ( + + + + ); + }, [ + comboOptions, + error, + fieldInputWidth, + handleCreateOption, + handleSearchChange, + handleValuesChange, + inputPlaceholder, + isClearable, + isDisabled, + isLoadingState, + rowLabel, + selectedComboOptions, + selectedField, + setIsTouchedValue, + warning, + ]); + + return defaultInput; + } +); + +AutocompleteFieldWildcardComponent.displayName = 'AutocompleteFieldWildcard'; diff --git a/packages/kbn-securitysolution-autocomplete/src/fields/index.mock.ts b/packages/kbn-securitysolution-autocomplete/src/fields/index.mock.ts index d25dc5d45c9ec..b3def81c43360 100644 --- a/packages/kbn-securitysolution-autocomplete/src/fields/index.mock.ts +++ b/packages/kbn-securitysolution-autocomplete/src/fields/index.mock.ts @@ -309,6 +309,14 @@ export const fields: DataViewFieldBase[] = [ readFromDocValues: false, subType: { nested: { path: 'nestedField.nestedChild' } }, }, + { + name: 'file.path.text', + type: 'string', + esTypes: ['text'], + searchable: true, + aggregatable: false, + subType: { multi: { parent: 'file.path' } }, + }, ] as unknown as DataViewFieldBase[]; export const getField = (name: string) => fields.find((field) => field.name === name); diff --git a/packages/kbn-securitysolution-autocomplete/src/get_operators/index.test.ts b/packages/kbn-securitysolution-autocomplete/src/get_operators/index.test.ts index 9ed9c6358c397..24e4d759989eb 100644 --- a/packages/kbn-securitysolution-autocomplete/src/get_operators/index.test.ts +++ b/packages/kbn-securitysolution-autocomplete/src/get_operators/index.test.ts @@ -8,6 +8,7 @@ import { doesNotExistOperator, + EVENT_FILTERS_OPERATORS, EXCEPTION_OPERATORS, existsOperator, isNotOperator, @@ -40,6 +41,15 @@ describe('#getOperators', () => { expect(operator).toEqual([isOperator]); }); + test('it includes a "matches" operator when field is "file.path.text"', () => { + const operator = getOperators({ + name: 'file.path.text', + type: 'simple', + }); + + expect(operator).toEqual(EVENT_FILTERS_OPERATORS); + }); + test('it returns all operator types when field type is not null, boolean, or nested', () => { const operator = getOperators(getField('machine.os.raw')); diff --git a/packages/kbn-securitysolution-autocomplete/src/get_operators/index.ts b/packages/kbn-securitysolution-autocomplete/src/get_operators/index.ts index e84dc33e676e6..643c330b15241 100644 --- a/packages/kbn-securitysolution-autocomplete/src/get_operators/index.ts +++ b/packages/kbn-securitysolution-autocomplete/src/get_operators/index.ts @@ -10,6 +10,7 @@ import { DataViewFieldBase } from '@kbn/es-query'; import { EXCEPTION_OPERATORS, + EVENT_FILTERS_OPERATORS, OperatorOption, doesNotExistOperator, existsOperator, @@ -30,6 +31,8 @@ export const getOperators = (field: DataViewFieldBase | undefined): OperatorOpti return [isOperator, isNotOperator, existsOperator, doesNotExistOperator]; } else if (field.type === 'nested') { return [isOperator]; + } else if (field.name === 'file.path.text') { + return EVENT_FILTERS_OPERATORS; } else { return EXCEPTION_OPERATORS; } diff --git a/packages/kbn-securitysolution-autocomplete/src/index.ts b/packages/kbn-securitysolution-autocomplete/src/index.ts index 5fcb3f954189a..fcb1ea6b2cde6 100644 --- a/packages/kbn-securitysolution-autocomplete/src/index.ts +++ b/packages/kbn-securitysolution-autocomplete/src/index.ts @@ -11,6 +11,7 @@ export * from './field_value_exists'; export * from './field_value_lists'; export * from './field_value_match'; export * from './field_value_match_any'; +export * from './field_value_wildcard'; export * from './filter_field_to_list'; export * from './get_generic_combo_box_props'; export * from './get_operators'; diff --git a/packages/kbn-securitysolution-autocomplete/src/operator/index.test.tsx b/packages/kbn-securitysolution-autocomplete/src/operator/index.test.tsx index 6d1622f0fa95f..48f5cbf25b91c 100644 --- a/packages/kbn-securitysolution-autocomplete/src/operator/index.test.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/operator/index.test.tsx @@ -129,6 +129,9 @@ describe('operator', () => { { label: 'is not in list', }, + { + label: 'matches', + }, ]); }); @@ -196,6 +199,30 @@ describe('operator', () => { ]); }); + test('it only displays subset of operators if field name is "file.path.text"', () => { + const wrapper = mount( + + ); + + expect( + wrapper.find(`[data-test-subj="operatorAutocompleteComboBox"]`).at(0).prop('options') + ).toEqual([ + { label: 'is' }, + { label: 'is not' }, + { label: 'is one of' }, + { label: 'is not one of' }, + { label: 'matches' }, + ]); + }); + test('it invokes "onChange" when option selected', () => { const mockOnChange = jest.fn(); const wrapper = mount( diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entries/index.mock.ts b/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entries/index.mock.ts index 176a6357b30e7..64f7e1aceeb2a 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entries/index.mock.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entries/index.mock.ts @@ -10,11 +10,11 @@ import { EndpointEntriesArray } from '.'; import { getEndpointEntryMatchMock } from '../entry_match/index.mock'; import { getEndpointEntryMatchAnyMock } from '../entry_match_any/index.mock'; import { getEndpointEntryNestedMock } from '../entry_nested/index.mock'; -import { getEndpointEntryMatchWildcard } from '../entry_match_wildcard/index.mock'; +import { getEndpointEntryMatchWildcardMock } from '../entry_match_wildcard/index.mock'; export const getEndpointEntriesArrayMock = (): EndpointEntriesArray => [ getEndpointEntryMatchMock(), getEndpointEntryMatchAnyMock(), getEndpointEntryNestedMock(), - getEndpointEntryMatchWildcard(), + getEndpointEntryMatchWildcardMock(), ]; diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entries/index.test.ts b/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entries/index.test.ts index ca852e15c5c2a..08235d35e921f 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entries/index.test.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entries/index.test.ts @@ -20,7 +20,7 @@ import { getEndpointEntryNestedMock } from '../entry_nested/index.mock'; import { getEndpointEntriesArrayMock } from './index.mock'; import { getEntryListMock } from '../../entries_list/index.mock'; import { getEntryExistsMock } from '../../entries_exist/index.mock'; -import { getEndpointEntryMatchWildcard } from '../entry_match_wildcard/index.mock'; +import { getEndpointEntryMatchWildcardMock } from '../entry_match_wildcard/index.mock'; describe('Endpoint', () => { describe('entriesArray', () => { @@ -101,7 +101,7 @@ describe('Endpoint', () => { }); test('it should validate an array with wildcard entry', () => { - const payload = [getEndpointEntryMatchWildcard()]; + const payload = [getEndpointEntryMatchWildcardMock()]; const decoded = endpointEntriesArray.decode(payload); const message = pipe(decoded, foldLeftRight); diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entry_match_wildcard/index.mock.ts b/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entry_match_wildcard/index.mock.ts index e001552277e0c..842e046ea67ee 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entry_match_wildcard/index.mock.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entry_match_wildcard/index.mock.ts @@ -9,7 +9,7 @@ import { ENTRY_VALUE, FIELD, OPERATOR, WILDCARD } from '../../../constants/index.mock'; import { EndpointEntryMatchWildcard } from './index'; -export const getEndpointEntryMatchWildcard = (): EndpointEntryMatchWildcard => ({ +export const getEndpointEntryMatchWildcardMock = (): EndpointEntryMatchWildcard => ({ field: FIELD, operator: OPERATOR, type: WILDCARD, diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entry_match_wildcard/index.test.ts b/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entry_match_wildcard/index.test.ts new file mode 100644 index 0000000000000..9671e721f20c6 --- /dev/null +++ b/packages/kbn-securitysolution-io-ts-list-types/src/common/endpoint/entry_match_wildcard/index.test.ts @@ -0,0 +1,99 @@ +/* + * 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 { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { getEndpointEntryMatchWildcardMock } from './index.mock'; +import { EndpointEntryMatchWildcard, endpointEntryMatchWildcard } from '.'; +import { foldLeftRight, getPaths } from '@kbn/securitysolution-io-ts-utils'; +import { getEntryMatchWildcardMock } from '../../entry_match_wildcard/index.mock'; + +describe('endpointEntryMatchWildcard', () => { + test('it should validate an entry', () => { + const payload = getEndpointEntryMatchWildcardMock(); + const decoded = endpointEntryMatchWildcard.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should NOT validate when "operator" is "excluded"', () => { + const payload = getEntryMatchWildcardMock(); + payload.operator = 'excluded'; + const decoded = endpointEntryMatchWildcard.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "excluded" supplied to "operator"', + ]); + expect(message.schema).toEqual({}); + }); + + test('it should FAIL validation when "field" is empty string', () => { + const payload: Omit & { field: string } = { + ...getEndpointEntryMatchWildcardMock(), + field: '', + }; + const decoded = endpointEntryMatchWildcard.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "" supplied to "field"']); + expect(message.schema).toEqual({}); + }); + + test('it should FAIL validation when "value" is not string', () => { + const payload: Omit & { value: string[] } = { + ...getEndpointEntryMatchWildcardMock(), + value: ['some value'], + }; + const decoded = endpointEntryMatchWildcard.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "["some value"]" supplied to "value"', + ]); + expect(message.schema).toEqual({}); + }); + + test('it should FAIL validation when "value" is empty string', () => { + const payload: Omit & { value: string } = { + ...getEndpointEntryMatchWildcardMock(), + value: '', + }; + const decoded = endpointEntryMatchWildcard.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "" supplied to "value"']); + expect(message.schema).toEqual({}); + }); + + test('it should FAIL validation when "type" is not "wildcard"', () => { + const payload: Omit & { type: string } = { + ...getEndpointEntryMatchWildcardMock(), + type: 'match', + }; + const decoded = endpointEntryMatchWildcard.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "match" supplied to "type"']); + expect(message.schema).toEqual({}); + }); + + test('it should strip out extra keys', () => { + const payload: EndpointEntryMatchWildcard & { + extraKey?: string; + } = getEndpointEntryMatchWildcardMock(); + payload.extraKey = 'some value'; + const decoded = endpointEntryMatchWildcard.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(getEntryMatchWildcardMock()); + }); +}); diff --git a/packages/kbn-securitysolution-list-utils/src/autocomplete_operators/index.ts b/packages/kbn-securitysolution-list-utils/src/autocomplete_operators/index.ts index 101076bdfcfff..ac3236528b671 100644 --- a/packages/kbn-securitysolution-list-utils/src/autocomplete_operators/index.ts +++ b/packages/kbn-securitysolution-list-utils/src/autocomplete_operators/index.ts @@ -85,11 +85,21 @@ export const isNotInListOperator: OperatorOption = { value: 'is_not_in_list', }; +export const matchesOperator: OperatorOption = { + message: i18n.translate('lists.exceptions.matchesOperatorLabel', { + defaultMessage: 'matches', + }), + operator: OperatorEnum.INCLUDED, + type: OperatorTypeEnum.WILDCARD, + value: 'matches', +}; + export const EVENT_FILTERS_OPERATORS: OperatorOption[] = [ isOperator, isNotOperator, isOneOfOperator, isNotOneOfOperator, + matchesOperator, ]; export const EXCEPTION_OPERATORS: OperatorOption[] = [ @@ -101,6 +111,7 @@ export const EXCEPTION_OPERATORS: OperatorOption[] = [ doesNotExistOperator, isInListOperator, isNotInListOperator, + matchesOperator, ]; export const EXCEPTION_OPERATORS_SANS_LISTS: OperatorOption[] = [ diff --git a/packages/kbn-securitysolution-list-utils/src/helpers/index.ts b/packages/kbn-securitysolution-list-utils/src/helpers/index.ts index 394d4f02b8772..eabf8dfa33f98 100644 --- a/packages/kbn-securitysolution-list-utils/src/helpers/index.ts +++ b/packages/kbn-securitysolution-list-utils/src/helpers/index.ts @@ -172,6 +172,8 @@ export const getOperatorType = (item: BuilderEntry): OperatorTypeEnum => { return OperatorTypeEnum.MATCH; case 'match_any': return OperatorTypeEnum.MATCH_ANY; + case 'wildcard': + return OperatorTypeEnum.WILDCARD; case 'list': return OperatorTypeEnum.LIST; default: @@ -207,6 +209,7 @@ export const getEntryValue = (item: BuilderEntry): string | string[] | undefined switch (item.type) { case OperatorTypeEnum.MATCH: case OperatorTypeEnum.MATCH_ANY: + case OperatorTypeEnum.WILDCARD: return item.value; case OperatorTypeEnum.EXISTS: return undefined; @@ -523,6 +526,54 @@ export const getEntryOnMatchChange = ( } }; +/** + * Determines proper entry update when user updates value + * when operator is of type "wildcard" + * + * @param item - current exception item entry values + * @param newField - newly entered value + * + */ +export const getEntryOnWildcardChange = ( + item: FormattedBuilderEntry, + newField: string +): { index: number; updatedEntry: BuilderEntry } => { + const { nested, parent, entryIndex, field, operator } = item; + + if (nested != null && parent != null) { + const fieldName = field != null ? field.name.split('.').slice(-1)[0] : ''; + + return { + index: parent.parentIndex, + updatedEntry: { + ...parent.parent, + entries: [ + ...parent.parent.entries.slice(0, entryIndex), + { + field: fieldName, + id: item.id, + operator: operator.operator, + type: OperatorTypeEnum.WILDCARD, + value: newField, + }, + ...parent.parent.entries.slice(entryIndex + 1), + ], + }, + }; + } else { + return { + index: entryIndex, + updatedEntry: { + field: field != null ? field.name : '', + id: item.id, + operator: operator.operator, + type: OperatorTypeEnum.WILDCARD, + value: newField, + }, + }; + } +}; + /** * On operator change, determines whether value needs to be cleared or not * @@ -563,6 +614,15 @@ export const getEntryFromOperator = ( operator: selectedOperator.operator, type: OperatorTypeEnum.LIST, }; + case 'wildcard': + return { + field: fieldValue, + id: currentEntry.id, + operator: selectedOperator.operator, + type: OperatorTypeEnum.WILDCARD, + value: + isSameOperatorType && typeof currentEntry.value === 'string' ? currentEntry.value : '', + }; default: return { field: fieldValue, diff --git a/packages/kbn-securitysolution-utils/BUILD.bazel b/packages/kbn-securitysolution-utils/BUILD.bazel index cfb6b722ea2e6..70ecc2712d4af 100644 --- a/packages/kbn-securitysolution-utils/BUILD.bazel +++ b/packages/kbn-securitysolution-utils/BUILD.bazel @@ -28,11 +28,13 @@ NPM_MODULE_EXTRA_FILES = [ ] RUNTIME_DEPS = [ + "//packages/kbn-i18n", "@npm//tslib", - "@npm//uuid", + "@npm//uuid" ] TYPES_DEPS = [ + "//packages/kbn-i18n:npm_module_types", "@npm//tslib", "@npm//@types/jest", "@npm//@types/node", diff --git a/packages/kbn-securitysolution-utils/src/index.ts b/packages/kbn-securitysolution-utils/src/index.ts index 755bbd2203dff..e3442a3ec7dc8 100644 --- a/packages/kbn-securitysolution-utils/src/index.ts +++ b/packages/kbn-securitysolution-utils/src/index.ts @@ -8,3 +8,4 @@ export * from './add_remove_id_to_item'; export * from './transform_data_to_ndjson'; +export * from './path_validations'; diff --git a/x-pack/plugins/security_solution/common/endpoint/service/trusted_apps/validations.test.ts b/packages/kbn-securitysolution-utils/src/path_validations/index.test.ts similarity index 84% rename from x-pack/plugins/security_solution/common/endpoint/service/trusted_apps/validations.test.ts rename to packages/kbn-securitysolution-utils/src/path_validations/index.test.ts index 952a2fa234ace..ee2d8764a30af 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/trusted_apps/validations.test.ts +++ b/packages/kbn-securitysolution-utils/src/path_validations/index.test.ts @@ -1,12 +1,84 @@ /* * 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. + * 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 { isPathValid, hasSimpleExecutableName } from './validations'; -import { OperatingSystem, ConditionEntryField } from '../../types'; +import { + isPathValid, + hasSimpleExecutableName, + OperatingSystem, + ConditionEntryField, + validateFilePathInput, + FILENAME_WILDCARD_WARNING, + FILEPATH_WARNING, +} from '.'; + +describe('validateFilePathInput', () => { + describe('windows', () => { + const os = OperatingSystem.WINDOWS; + + it('warns on wildcard in file name at the end of the path', () => { + expect(validateFilePathInput({ os, value: 'c:\\path*.exe' })).toEqual( + FILENAME_WILDCARD_WARNING + ); + }); + + it('warns on unix paths or non-windows paths', () => { + expect(validateFilePathInput({ os, value: '/opt/bin' })).toEqual(FILEPATH_WARNING); + }); + + it('warns on malformed paths', () => { + expect(validateFilePathInput({ os, value: 'c:\\path/opt' })).toEqual(FILEPATH_WARNING); + expect(validateFilePathInput({ os, value: '1242' })).toEqual(FILEPATH_WARNING); + expect(validateFilePathInput({ os, value: 'w12efdfa' })).toEqual(FILEPATH_WARNING); + }); + }); + describe('unix paths', () => { + const os = + parseInt((Math.random() * 2).toString(), 10) === 1 + ? OperatingSystem.MAC + : OperatingSystem.LINUX; + + it('warns on wildcard in file name at the end of the path', () => { + expect(validateFilePathInput({ os, value: '/opt/bin*' })).toEqual(FILENAME_WILDCARD_WARNING); + }); + + it('warns on windows paths', () => { + expect(validateFilePathInput({ os, value: 'd:\\path\\file.exe' })).toEqual(FILEPATH_WARNING); + }); + + it('warns on malformed paths', () => { + expect(validateFilePathInput({ os, value: 'opt/bin\\file.exe' })).toEqual(FILEPATH_WARNING); + expect(validateFilePathInput({ os, value: '1242' })).toEqual(FILEPATH_WARNING); + expect(validateFilePathInput({ os, value: 'w12efdfa' })).toEqual(FILEPATH_WARNING); + }); + }); +}); + +describe('No Warnings', () => { + it('should not show warnings on non path entries ', () => { + expect( + isPathValid({ + os: OperatingSystem.WINDOWS, + field: ConditionEntryField.HASH, + type: 'match', + value: '5d5b09f6dcb2d53a5fffc60c4ac0d55fabdf556069d6631545f42aa6e3500f2e', + }) + ).toEqual(true); + + expect( + isPathValid({ + os: OperatingSystem.WINDOWS, + field: ConditionEntryField.SIGNER, + type: 'match', + value: '', + }) + ).toEqual(true); + }); +}); describe('Unacceptable Windows wildcard paths', () => { it('should not accept paths that do not have a folder name with a wildcard ', () => { diff --git a/packages/kbn-securitysolution-utils/src/path_validations/index.ts b/packages/kbn-securitysolution-utils/src/path_validations/index.ts new file mode 100644 index 0000000000000..82d2cc3151b90 --- /dev/null +++ b/packages/kbn-securitysolution-utils/src/path_validations/index.ts @@ -0,0 +1,178 @@ +/* + * 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'; + +export const FILENAME_WILDCARD_WARNING = i18n.translate('utils.filename.wildcardWarning', { + defaultMessage: `A wildcard in the filename will affect the endpoint's performance`, +}); + +export const FILEPATH_WARNING = i18n.translate('utils.filename.pathWarning', { + defaultMessage: `Path may be formed incorrectly; verify value`, +}); + +export const enum ConditionEntryField { + HASH = 'process.hash.*', + PATH = 'process.executable.caseless', + SIGNER = 'process.Ext.code_signature', +} + +export const enum OperatingSystem { + LINUX = 'linux', + MAC = 'macos', + WINDOWS = 'windows', +} + +export type TrustedAppEntryTypes = 'match' | 'wildcard'; +/* + * regex to match executable names + * starts matching from the eol of the path + * file names with a single or multiple spaces (for spaced names) + * and hyphens and combinations of these that produce complex names + * such as: + * c:\home\lib\dmp.dmp + * c:\home\lib\my-binary-app-+/ some/ x/ dmp.dmp + * /home/lib/dmp.dmp + * /home/lib/my-binary-app+-\ some\ x\ dmp.dmp + */ +export const WIN_EXEC_PATH = /(\\[-\w]+|\\[-\w]+[\.]+[\w]+)$/i; +export const UNIX_EXEC_PATH = /(\/[-\w]+|\/[-\w]+[\.]+[\w]+)$/i; + +export const validateFilePathInput = ({ + os, + value = '', +}: { + os: OperatingSystem; + value?: string; +}): string | undefined => { + const textInput = value.trim(); + const isValidFilePath = isPathValid({ + os, + field: 'file.path.text', + type: 'wildcard', + value: textInput, + }); + const hasSimpleFileName = hasSimpleExecutableName({ + os, + type: 'wildcard', + value: textInput, + }); + + if (!textInput.length) { + return FILEPATH_WARNING; + } + + if (isValidFilePath) { + if (!hasSimpleFileName) { + return FILENAME_WILDCARD_WARNING; + } + } else { + return FILEPATH_WARNING; + } +}; + +export const hasSimpleExecutableName = ({ + os, + type, + value, +}: { + os: OperatingSystem; + type: TrustedAppEntryTypes; + value: string; +}): boolean => { + if (type === 'wildcard') { + return os === OperatingSystem.WINDOWS ? WIN_EXEC_PATH.test(value) : UNIX_EXEC_PATH.test(value); + } + return true; +}; + +export const isPathValid = ({ + os, + field, + type, + value, +}: { + os: OperatingSystem; + field: ConditionEntryField | 'file.path.text'; + type: TrustedAppEntryTypes; + value: string; +}): boolean => { + if (field === ConditionEntryField.PATH || field === 'file.path.text') { + if (type === 'wildcard') { + return os === OperatingSystem.WINDOWS + ? isWindowsWildcardPathValid(value) + : isLinuxMacWildcardPathValid(value); + } + return doesPathMatchRegex({ value, os }); + } + return true; +}; + +const doesPathMatchRegex = ({ os, value }: { os: OperatingSystem; value: string }): boolean => { + if (os === OperatingSystem.WINDOWS) { + const filePathRegex = + /^[a-z]:(?:|\\\\[^<>:"'/\\|?*]+\\[^<>:"'/\\|?*]+|%\w+%|)[\\](?:[^<>:"'/\\|?*]+[\\/])*([^<>:"'/\\|?*])+$/i; + return filePathRegex.test(value); + } + return /^(\/|(\/[\w\-]+)+|\/[\w\-]+\.[\w]+|(\/[\w-]+)+\/[\w\-]+\.[\w]+)$/i.test(value); +}; + +const isWindowsWildcardPathValid = (path: string): boolean => { + const firstCharacter = path[0]; + const lastCharacter = path.slice(-1); + const trimmedValue = path.trim(); + const hasSlash = /\//.test(trimmedValue); + if (path.length === 0) { + return false; + } else if ( + hasSlash || + trimmedValue.length !== path.length || + firstCharacter === '^' || + lastCharacter === '\\' || + !hasWildcard({ path, isWindowsPath: true }) + ) { + return false; + } else { + return true; + } +}; + +const isLinuxMacWildcardPathValid = (path: string): boolean => { + const firstCharacter = path[0]; + const lastCharacter = path.slice(-1); + const trimmedValue = path.trim(); + if (path.length === 0) { + return false; + } else if ( + trimmedValue.length !== path.length || + firstCharacter !== '/' || + lastCharacter === '/' || + path.length > 1024 === true || + path.includes('//') === true || + !hasWildcard({ path, isWindowsPath: false }) + ) { + return false; + } else { + return true; + } +}; + +const hasWildcard = ({ + path, + isWindowsPath, +}: { + path: string; + isWindowsPath: boolean; +}): boolean => { + for (const pathComponent of path.split(isWindowsPath ? '\\' : '/')) { + if (/[\*|\?]+/.test(pathComponent) === true) { + return true; + } + } + return false; +}; diff --git a/x-pack/plugins/lists/public/exceptions/components/builder/builder.stories.tsx b/x-pack/plugins/lists/public/exceptions/components/builder/builder.stories.tsx index f0c59cc613c76..0f842bb53b99e 100644 --- a/x-pack/plugins/lists/public/exceptions/components/builder/builder.stories.tsx +++ b/x-pack/plugins/lists/public/exceptions/components/builder/builder.stories.tsx @@ -236,6 +236,7 @@ Default.args = { errorExists: false, exceptionItems: [], exceptionsToDelete: [], + warningExists: false, }), ruleName: 'My awesome rule', }; @@ -288,6 +289,7 @@ SingleExceptionItem.args = { errorExists: false, exceptionItems: [sampleExceptionItem], exceptionsToDelete: [], + warningExists: false, }), ruleName: 'My awesome rule', }; @@ -313,6 +315,7 @@ MultiExceptionItems.args = { errorExists: false, exceptionItems: [sampleExceptionItem, sampleExceptionItem], exceptionsToDelete: [], + warningExists: false, }), ruleName: 'My awesome rule', }; @@ -338,6 +341,7 @@ WithNestedExceptionItem.args = { errorExists: false, exceptionItems: [sampleNestedExceptionItem, sampleExceptionItem], exceptionsToDelete: [], + warningExists: false, }), ruleName: 'My awesome rule', }; diff --git a/x-pack/plugins/lists/public/exceptions/components/builder/entry_renderer.test.tsx b/x-pack/plugins/lists/public/exceptions/components/builder/entry_renderer.test.tsx index 1ac35608f884a..aa7071a9074a9 100644 --- a/x-pack/plugins/lists/public/exceptions/components/builder/entry_renderer.test.tsx +++ b/x-pack/plugins/lists/public/exceptions/components/builder/entry_renderer.test.tsx @@ -18,7 +18,9 @@ import { isNotOperator, isOneOfOperator, isOperator, + matchesOperator, } from '@kbn/securitysolution-list-utils'; +import { validateFilePathInput } from '@kbn/securitysolution-utils'; import { useFindLists } from '@kbn/securitysolution-list-hooks'; import type { FieldSpec } from 'src/plugins/data/common'; @@ -30,6 +32,7 @@ import { getFoundListSchemaMock } from '../../../../common/schemas/response/foun import { BuilderEntryItem } from './entry_renderer'; jest.mock('@kbn/securitysolution-list-hooks'); +jest.mock('@kbn/securitysolution-utils'); const mockKibanaHttpService = coreMock.createStart().http; const { autocomplete: autocompleteStartMock } = dataPluginMock.createStartContract(); @@ -74,6 +77,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={true} /> ); @@ -104,6 +108,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -138,6 +143,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -174,6 +180,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -210,6 +217,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -247,6 +255,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={true} /> ); @@ -284,6 +293,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={true} /> ); @@ -320,6 +330,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -357,6 +368,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -414,6 +426,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -456,6 +469,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={mockOnChange} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -496,6 +510,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={mockOnChange} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -536,6 +551,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={mockOnChange} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -576,6 +592,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={mockOnChange} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -616,6 +633,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={mockOnChange} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -662,6 +680,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={jest.fn()} setErrorsExist={mockSetErrorExists} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -701,6 +720,7 @@ describe('BuilderEntryItem', () => { listType="detection" onChange={jest.fn()} setErrorsExist={mockSetErrorExists} + setWarningsExist={jest.fn()} showLabel={false} /> ); @@ -723,6 +743,104 @@ describe('BuilderEntryItem', () => { expect(mockSetErrorExists).toHaveBeenCalledWith(true); }); + test('it invokes "setWarningsExist" when invalid value in field value input', async () => { + const mockSetWarningsExists = jest.fn(); + + (validateFilePathInput as jest.Mock).mockReturnValue('some warning message'); + wrapper = mount( + + ); + + await waitFor(() => { + ( + wrapper.find(EuiComboBox).at(2).props() as unknown as { + onBlur: () => void; + } + ).onBlur(); + + // Invalid input because field is just a string and not a path + ( + wrapper.find(EuiComboBox).at(2).props() as unknown as { + onSearchChange: (arg: string) => void; + } + ).onSearchChange('i243kjhfew'); + }); + + expect(mockSetWarningsExists).toHaveBeenCalledWith(true); + }); + + test('it does not invoke "setWarningsExist" when valid value in field value input', async () => { + const mockSetWarningsExists = jest.fn(); + + (validateFilePathInput as jest.Mock).mockReturnValue(undefined); + wrapper = mount( + + ); + + await waitFor(() => { + ( + wrapper.find(EuiComboBox).at(2).props() as unknown as { + onBlur: () => void; + } + ).onBlur(); + + // valid input as it is a path + ( + wrapper.find(EuiComboBox).at(2).props() as unknown as { + onSearchChange: (arg: string) => void; + } + ).onSearchChange('c:\\path.exe'); + }); + + expect(mockSetWarningsExists).toHaveBeenCalledWith(false); + }); + test('it disabled field inputs correctly when passed "isDisabled=true"', () => { wrapper = mount( { listType="detection" onChange={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} osTypes={['windows']} showLabel={false} isDisabled={true} diff --git a/x-pack/plugins/lists/public/exceptions/components/builder/entry_renderer.tsx b/x-pack/plugins/lists/public/exceptions/components/builder/entry_renderer.tsx index 206b1a5dd6f85..aa24ec6611b97 100644 --- a/x-pack/plugins/lists/public/exceptions/components/builder/entry_renderer.tsx +++ b/x-pack/plugins/lists/public/exceptions/components/builder/entry_renderer.tsx @@ -24,6 +24,7 @@ import { getEntryOnMatchAnyChange, getEntryOnMatchChange, getEntryOnOperatorChange, + getEntryOnWildcardChange, getFilteredIndexPatterns, getOperatorOptions, } from '@kbn/securitysolution-list-utils'; @@ -32,9 +33,11 @@ import { AutocompleteFieldListsComponent, AutocompleteFieldMatchAnyComponent, AutocompleteFieldMatchComponent, + AutocompleteFieldWildcardComponent, FieldComponent, OperatorComponent, } from '@kbn/securitysolution-autocomplete'; +import { OperatingSystem, validateFilePathInput } from '@kbn/securitysolution-utils'; import { DataViewBase, DataViewFieldBase } from '@kbn/es-query'; import type { AutocompleteStart } from '../../../../../../../src/plugins/data/public'; @@ -64,6 +67,7 @@ export interface EntryItemProps { onChange: (arg: BuilderEntry, i: number) => void; onlyShowListOperators?: boolean; setErrorsExist: (arg: boolean) => void; + setWarningsExist: (arg: boolean) => void; isDisabled?: boolean; operatorsList?: OperatorOption[]; } @@ -80,6 +84,7 @@ export const BuilderEntryItem: React.FC = ({ onChange, onlyShowListOperators = false, setErrorsExist, + setWarningsExist, showLabel, isDisabled = false, operatorsList, @@ -90,6 +95,12 @@ export const BuilderEntryItem: React.FC = ({ }, [setErrorsExist] ); + const handleWarning = useCallback( + (warn: boolean): void => { + setWarningsExist(warn); + }, + [setWarningsExist] + ); const handleFieldChange = useCallback( ([newField]: DataViewFieldBase[]): void => { @@ -126,6 +137,15 @@ export const BuilderEntryItem: React.FC = ({ [onChange, entry] ); + const handleFieldWildcardValueChange = useCallback( + (newField: string): void => { + const { updatedEntry, index } = getEntryOnWildcardChange(entry, newField); + + onChange(updatedEntry, index); + }, + [onChange, entry] + ); + const handleFieldListValueChange = useCallback( (newField: ListSchema): void => { const { updatedEntry, index } = getEntryOnListChange(entry, newField); @@ -199,8 +219,17 @@ export const BuilderEntryItem: React.FC = ({ ); const renderOperatorInput = (isFirst: boolean): JSX.Element => { - const operatorOptions = operatorsList - ? operatorsList + // for event filters forms + // show extra operators for wildcards when field is `file.path.text` + const isFilePathTextField = entry.field !== undefined && entry.field.name === 'file.path.text'; + const isEventFilterList = listType === 'endpoint_events'; + const augmentedOperatorsList = + operatorsList && isFilePathTextField && isEventFilterList + ? operatorsList + : operatorsList?.filter((operator) => operator.type !== OperatorTypeEnum.WILDCARD); + + const operatorOptions = augmentedOperatorsList + ? augmentedOperatorsList : onlyShowListOperators ? EXCEPTION_OPERATORS_ONLY_LISTS : getOperatorOptions( @@ -209,6 +238,7 @@ export const BuilderEntryItem: React.FC = ({ entry.field != null && entry.field.type === 'boolean', isFirst && allowLargeValueLists ); + const comboBox = ( = ({ data-test-subj="exceptionBuilderEntryFieldMatchAny" /> ); + case OperatorTypeEnum.WILDCARD: + const wildcardValue = typeof entry.value === 'string' ? entry.value : undefined; + let os: OperatingSystem = OperatingSystem.WINDOWS; + if (osTypes) { + [os] = osTypes as OperatingSystem[]; + } + const warning = validateFilePathInput({ os, value: wildcardValue }); + return ( + + ); case OperatorTypeEnum.LIST: const id = typeof entry.value === 'string' ? entry.value : undefined; return ( diff --git a/x-pack/plugins/lists/public/exceptions/components/builder/exception_item_renderer.test.tsx b/x-pack/plugins/lists/public/exceptions/components/builder/exception_item_renderer.test.tsx index ccda52e280586..fed24ba428e6c 100644 --- a/x-pack/plugins/lists/public/exceptions/components/builder/exception_item_renderer.test.tsx +++ b/x-pack/plugins/lists/public/exceptions/components/builder/exception_item_renderer.test.tsx @@ -53,6 +53,7 @@ describe('BuilderExceptionListItemComponent', () => { onChangeExceptionItem={jest.fn()} onDeleteExceptionItem={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} /> ); @@ -84,6 +85,7 @@ describe('BuilderExceptionListItemComponent', () => { onChangeExceptionItem={jest.fn()} onDeleteExceptionItem={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} /> ); @@ -113,6 +115,7 @@ describe('BuilderExceptionListItemComponent', () => { onChangeExceptionItem={jest.fn()} onDeleteExceptionItem={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} /> ); @@ -144,6 +147,7 @@ describe('BuilderExceptionListItemComponent', () => { onChangeExceptionItem={jest.fn()} onDeleteExceptionItem={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} /> ); @@ -182,6 +186,7 @@ describe('BuilderExceptionListItemComponent', () => { onChangeExceptionItem={jest.fn()} onDeleteExceptionItem={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} /> ); @@ -212,6 +217,7 @@ describe('BuilderExceptionListItemComponent', () => { onChangeExceptionItem={jest.fn()} onDeleteExceptionItem={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} /> ); @@ -243,6 +249,7 @@ describe('BuilderExceptionListItemComponent', () => { onChangeExceptionItem={jest.fn()} onDeleteExceptionItem={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} /> ); @@ -272,6 +279,7 @@ describe('BuilderExceptionListItemComponent', () => { onChangeExceptionItem={jest.fn()} onDeleteExceptionItem={jest.fn()} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} /> ); @@ -303,6 +311,7 @@ describe('BuilderExceptionListItemComponent', () => { onChangeExceptionItem={jest.fn()} onDeleteExceptionItem={mockOnDeleteExceptionItem} setErrorsExist={jest.fn()} + setWarningsExist={jest.fn()} /> ); diff --git a/x-pack/plugins/lists/public/exceptions/components/builder/exception_item_renderer.tsx b/x-pack/plugins/lists/public/exceptions/components/builder/exception_item_renderer.tsx index 931a8356e93be..febfa54a482b2 100644 --- a/x-pack/plugins/lists/public/exceptions/components/builder/exception_item_renderer.tsx +++ b/x-pack/plugins/lists/public/exceptions/components/builder/exception_item_renderer.tsx @@ -59,6 +59,7 @@ interface BuilderExceptionListItemProps { onDeleteExceptionItem: (item: ExceptionsBuilderExceptionItem, index: number) => void; onChangeExceptionItem: (item: ExceptionsBuilderExceptionItem, index: number) => void; setErrorsExist: (arg: boolean) => void; + setWarningsExist: (arg: boolean) => void; onlyShowListOperators?: boolean; isDisabled?: boolean; operatorsList?: OperatorOption[]; @@ -80,6 +81,7 @@ export const BuilderExceptionListItemComponent = React.memo - indexPattern != null && exceptionItem.entries.length > 0 - ? getFormattedBuilderEntries(indexPattern, exceptionItem.entries) - : [], - [exceptionItem.entries, indexPattern] - ); + const entries = useMemo((): FormattedBuilderEntry[] => { + const hasIndexPatternAndEntries = indexPattern != null && exceptionItem.entries.length > 0; + return hasIndexPatternAndEntries + ? getFormattedBuilderEntries(indexPattern, exceptionItem.entries) + : []; + }, [exceptionItem.entries, indexPattern]); return ( @@ -150,6 +150,7 @@ export const BuilderExceptionListItemComponent = React.memo; exceptionsToDelete: ExceptionListItemSchema[]; + warningExists: boolean; } export interface ExceptionBuilderProps { @@ -123,6 +125,7 @@ export const ExceptionBuilderComponent = ({ disableNested, disableOr, errorExists, + warningExists, exceptions, exceptionsToDelete, }, @@ -144,6 +147,16 @@ export const ExceptionBuilderComponent = ({ [dispatch] ); + const setWarningsExist = useCallback( + (hasWarnings: boolean): void => { + dispatch({ + type: 'setWarningsExist', + warningExists: hasWarnings, + }); + }, + [dispatch] + ); + const setUpdateExceptions = useCallback( (items: ExceptionsBuilderExceptionItem[]): void => { dispatch({ @@ -350,8 +363,9 @@ export const ExceptionBuilderComponent = ({ errorExists: errorExists > 0, exceptionItems: filterExceptionItems(exceptions), exceptionsToDelete, + warningExists: warningExists > 0, }); - }, [onChange, exceptionsToDelete, exceptions, errorExists]); + }, [onChange, exceptionsToDelete, exceptions, errorExists, warningExists]); useEffect(() => { setUpdateExceptions([]); @@ -416,6 +430,7 @@ export const ExceptionBuilderComponent = ({ onDeleteExceptionItem={handleDeleteExceptionItem} onlyShowListOperators={containsValueListEntry(exceptions)} setErrorsExist={setErrorsExist} + setWarningsExist={setWarningsExist} osTypes={osTypes} isDisabled={isDisabled} operatorsList={operatorsList} diff --git a/x-pack/plugins/lists/public/exceptions/components/builder/reducer.ts b/x-pack/plugins/lists/public/exceptions/components/builder/reducer.ts index 4ace0c7d31ef8..ba3b77fb24ed1 100644 --- a/x-pack/plugins/lists/public/exceptions/components/builder/reducer.ts +++ b/x-pack/plugins/lists/public/exceptions/components/builder/reducer.ts @@ -25,6 +25,7 @@ export interface State { exceptions: ExceptionsBuilderExceptionItem[]; exceptionsToDelete: ExceptionListItemSchema[]; errorExists: number; + warningExists: number; } export type Action = @@ -56,6 +57,10 @@ export type Action = | { type: 'setErrorsExist'; errorExists: boolean; + } + | { + type: 'setWarningsExist'; + warningExists: boolean; }; export const exceptionsBuilderReducer = @@ -128,6 +133,15 @@ export const exceptionsBuilderReducer = errorExists: errTotal < 0 ? 0 : errTotal, }; } + case 'setWarningsExist': { + const { warningExists } = state; + const warnTotal = action.warningExists ? warningExists + 1 : warningExists - 1; + + return { + ...state, + warningExists: warnTotal < 0 ? 0 : warnTotal, + }; + } default: return state; } diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/base_data_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/base_data_generator.ts index 6fbe54578f469..6ddb2fc19ef07 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/base_data_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/base_data_generator.ts @@ -118,7 +118,7 @@ export class BaseDataGenerator { } /** generate random OS family value */ - protected randomOSFamily(): string { + public randomOSFamily(): string { return this.randomChoice(OS_FAMILY); } @@ -133,7 +133,7 @@ export class BaseDataGenerator { } /** Generate a random number up to the max provided */ - protected randomN(max: number): number { + public randomN(max: number): number { return Math.floor(this.random() * max); } diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/event_filter_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/event_filter_generator.ts index daf96a3149649..99683bcd11868 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/event_filter_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/event_filter_generator.ts @@ -5,7 +5,10 @@ * 2.0. */ -import type { CreateExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import type { + CreateExceptionListItemSchema, + ExceptionListItemSchema, +} from '@kbn/securitysolution-io-ts-list-types'; import { ENDPOINT_EVENT_FILTERS_LIST_ID } from '@kbn/securitysolution-list-constants'; import { BaseDataGenerator } from './base_data_generator'; import { ExceptionsListItemGenerator } from './exceptions_list_item_generator'; @@ -13,7 +16,7 @@ import { BY_POLICY_ARTIFACT_TAG_PREFIX, GLOBAL_ARTIFACT_TAG } from '../service/a const EFFECT_SCOPE_TYPES = [BY_POLICY_ARTIFACT_TAG_PREFIX, GLOBAL_ARTIFACT_TAG]; export class EventFilterGenerator extends BaseDataGenerator { - generate(): CreateExceptionListItemSchema { + generate(overrides: Partial = {}): CreateExceptionListItemSchema { const eventFilterGenerator = new ExceptionsListItemGenerator(); const eventFilterData: CreateExceptionListItemSchema = eventFilterGenerator.generateEventFilter( { @@ -29,6 +32,7 @@ export class EventFilterGenerator extends BaseDataGenerator { describe('for GET List', () => { diff --git a/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.ts b/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.ts index 4b04f15682777..88ac65768e163 100644 --- a/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.ts +++ b/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.ts @@ -6,7 +6,8 @@ */ import { schema } from '@kbn/config-schema'; -import { ConditionEntry, ConditionEntryField, OperatingSystem } from '../types'; +import { ConditionEntryField, OperatingSystem } from '@kbn/securitysolution-utils'; +import { ConditionEntry } from '../types'; import { getDuplicateFields, isValidHash } from '../service/trusted_apps/validations'; export const DeleteTrustedAppsRequestSchema = { diff --git a/x-pack/plugins/security_solution/common/endpoint/service/trusted_apps/validations.ts b/x-pack/plugins/security_solution/common/endpoint/service/trusted_apps/validations.ts index 0e6f2a5a7df41..2d2c50572a8bc 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/trusted_apps/validations.ts +++ b/x-pack/plugins/security_solution/common/endpoint/service/trusted_apps/validations.ts @@ -5,12 +5,8 @@ * 2.0. */ -import { - ConditionEntry, - ConditionEntryField, - OperatingSystem, - TrustedAppEntryTypes, -} from '../../types'; +import { ConditionEntryField } from '@kbn/securitysolution-utils'; +import { ConditionEntry } from '../../types'; const HASH_LENGTHS: readonly number[] = [ 32, // MD5 @@ -37,118 +33,3 @@ export const getDuplicateFields = (entries: ConditionEntry[]) => { .filter((entry) => entry[1].length > 1) .map((entry) => entry[0]); }; - -/* - * regex to match executable names - * starts matching from the eol of the path - * file names with a single or multiple spaces (for spaced names) - * and hyphens and combinations of these that produce complex names - * such as: - * c:\home\lib\dmp.dmp - * c:\home\lib\my-binary-app-+/ some/ x/ dmp.dmp - * /home/lib/dmp.dmp - * /home/lib/my-binary-app+-\ some\ x\ dmp.dmp - */ -const WIN_EXEC_PATH = /\\(\w+|\w*[\w+|-]+\/ +)+\w+[\w+|-]+\.*\w+$/i; -const UNIX_EXEC_PATH = /(\/|\w*[\w+|-]+\\ +)+\w+[\w+|-]+\.*\w*$/i; - -export const hasSimpleExecutableName = ({ - os, - type, - value, -}: { - os: OperatingSystem; - type: TrustedAppEntryTypes; - value: string; -}): boolean => { - if (type === 'wildcard') { - return os === OperatingSystem.WINDOWS ? WIN_EXEC_PATH.test(value) : UNIX_EXEC_PATH.test(value); - } - return true; -}; - -export const isPathValid = ({ - os, - field, - type, - value, -}: { - os: OperatingSystem; - field: ConditionEntryField; - type: TrustedAppEntryTypes; - value: string; -}): boolean => { - if (field === ConditionEntryField.PATH) { - if (type === 'wildcard') { - return os === OperatingSystem.WINDOWS - ? isWindowsWildcardPathValid(value) - : isLinuxMacWildcardPathValid(value); - } - return doesPathMatchRegex({ value, os }); - } - return true; -}; - -const doesPathMatchRegex = ({ os, value }: { os: OperatingSystem; value: string }): boolean => { - if (os === OperatingSystem.WINDOWS) { - const filePathRegex = - /^[a-z]:(?:|\\\\[^<>:"'/\\|?*]+\\[^<>:"'/\\|?*]+|%\w+%|)[\\](?:[^<>:"'/\\|?*]+[\\/])*([^<>:"'/\\|?*])+$/i; - return filePathRegex.test(value); - } - return /^(\/|(\/[\w\-]+)+|\/[\w\-]+\.[\w]+|(\/[\w-]+)+\/[\w\-]+\.[\w]+)$/i.test(value); -}; - -const isWindowsWildcardPathValid = (path: string): boolean => { - const firstCharacter = path[0]; - const lastCharacter = path.slice(-1); - const trimmedValue = path.trim(); - const hasSlash = /\//.test(trimmedValue); - if (path.length === 0) { - return false; - } else if ( - hasSlash || - trimmedValue.length !== path.length || - firstCharacter === '^' || - lastCharacter === '\\' || - !hasWildcard({ path, isWindowsPath: true }) - ) { - return false; - } else { - return true; - } -}; - -const isLinuxMacWildcardPathValid = (path: string): boolean => { - const firstCharacter = path[0]; - const lastCharacter = path.slice(-1); - const trimmedValue = path.trim(); - if (path.length === 0) { - return false; - } else if ( - trimmedValue.length !== path.length || - firstCharacter !== '/' || - lastCharacter === '/' || - path.length > 1024 === true || - path.includes('//') === true || - !hasWildcard({ path, isWindowsPath: false }) - ) { - return false; - } else { - return true; - } -}; - -const hasWildcard = ({ - path, - isWindowsPath, -}: { - path: string; - isWindowsPath: boolean; -}): boolean => { - for (const pathComponent of path.split(isWindowsPath ? '\\' : '/')) { - if (/[\*|\?]+/.test(pathComponent) === true) { - return true; - } - } - return false; -}; diff --git a/x-pack/plugins/security_solution/common/endpoint/types/os.ts b/x-pack/plugins/security_solution/common/endpoint/types/os.ts index f892d077a9ed8..af73dcd91ae8d 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/os.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/os.ts @@ -5,12 +5,6 @@ * 2.0. */ -export enum OperatingSystem { - LINUX = 'linux', - MAC = 'macos', - WINDOWS = 'windows', -} - // PolicyConfig uses mac instead of macos export enum PolicyOperatingSystem { windows = 'windows', diff --git a/x-pack/plugins/security_solution/common/endpoint/types/trusted_apps.ts b/x-pack/plugins/security_solution/common/endpoint/types/trusted_apps.ts index 9815bc3535de4..3872df8d10247 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/trusted_apps.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/trusted_apps.ts @@ -6,7 +6,11 @@ */ import { TypeOf } from '@kbn/config-schema'; - +import { + ConditionEntryField, + OperatingSystem, + TrustedAppEntryTypes, +} from '@kbn/securitysolution-utils'; import { DeleteTrustedAppsRequestSchema, GetOneTrustedAppRequestSchema, @@ -15,7 +19,6 @@ import { PutTrustedAppUpdateRequestSchema, GetTrustedAppsSummaryRequestSchema, } from '../schema/trusted_apps'; -import { OperatingSystem } from './os'; /** API request params for deleting Trusted App entry */ export type DeleteTrustedAppsRequestParams = TypeOf; @@ -67,18 +70,11 @@ export interface GetTrustedAppsSummaryResponse { linux: number; } -export enum ConditionEntryField { - HASH = 'process.hash.*', - PATH = 'process.executable.caseless', - SIGNER = 'process.Ext.code_signature', -} - export enum OperatorFieldIds { is = 'is', matches = 'matches', } -export type TrustedAppEntryTypes = 'match' | 'wildcard'; export interface ConditionEntry { field: T; type: TrustedAppEntryTypes; diff --git a/x-pack/plugins/security_solution/common/utils/path_placeholder.test.ts b/x-pack/plugins/security_solution/common/utils/path_placeholder.test.ts index 9618440c105dc..58f9fa70f7395 100644 --- a/x-pack/plugins/security_solution/common/utils/path_placeholder.test.ts +++ b/x-pack/plugins/security_solution/common/utils/path_placeholder.test.ts @@ -6,7 +6,11 @@ */ import { getPlaceholderTextByOSType, getPlaceholderText } from './path_placeholder'; -import { ConditionEntryField, OperatingSystem, TrustedAppEntryTypes } from '../endpoint/types'; +import { + ConditionEntryField, + OperatingSystem, + TrustedAppEntryTypes, +} from '@kbn/securitysolution-utils'; const trustedAppEntry = { os: OperatingSystem.LINUX, diff --git a/x-pack/plugins/security_solution/common/utils/path_placeholder.ts b/x-pack/plugins/security_solution/common/utils/path_placeholder.ts index baa9b71cd4483..328df398dd576 100644 --- a/x-pack/plugins/security_solution/common/utils/path_placeholder.ts +++ b/x-pack/plugins/security_solution/common/utils/path_placeholder.ts @@ -4,8 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - -import { ConditionEntryField, OperatingSystem, TrustedAppEntryTypes } from '../endpoint/types'; +import { + ConditionEntryField, + OperatingSystem, + TrustedAppEntryTypes, +} from '@kbn/securitysolution-utils'; export const getPlaceholderText = () => ({ windows: { diff --git a/x-pack/plugins/security_solution/public/management/common/translations.ts b/x-pack/plugins/security_solution/public/management/common/translations.ts index 8e6fcd4cc951e..e79c1c0b34496 100644 --- a/x-pack/plugins/security_solution/public/management/common/translations.ts +++ b/x-pack/plugins/security_solution/public/management/common/translations.ts @@ -6,10 +6,9 @@ */ import { i18n } from '@kbn/i18n'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; import { ServerApiError } from '../../common/types'; -import { OperatingSystem } from '../../../common/endpoint/types'; - export const ENDPOINTS_TAB = i18n.translate('xpack.securitySolution.endpointsTab', { defaultMessage: 'Endpoints', }); diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/criteria_conditions.tsx b/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/criteria_conditions.tsx index 238fe87c05890..9b656a97a94a0 100644 --- a/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/criteria_conditions.tsx +++ b/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/criteria_conditions.tsx @@ -22,7 +22,7 @@ import { OS_MAC, OS_WINDOWS, CONDITION_AND, - CONDITION_OPERATOR_TYPE_WILDCARD, + CONDITION_OPERATOR_TYPE_WILDCARD_MATCHES, CONDITION_OPERATOR_TYPE_NESTED, CONDITION_OPERATOR_TYPE_MATCH, CONDITION_OPERATOR_TYPE_MATCH_ANY, @@ -45,7 +45,7 @@ const OPERATOR_TYPE_LABELS_INCLUDED = Object.freeze({ [ListOperatorTypeEnum.NESTED]: CONDITION_OPERATOR_TYPE_NESTED, [ListOperatorTypeEnum.MATCH_ANY]: CONDITION_OPERATOR_TYPE_MATCH_ANY, [ListOperatorTypeEnum.MATCH]: CONDITION_OPERATOR_TYPE_MATCH, - [ListOperatorTypeEnum.WILDCARD]: CONDITION_OPERATOR_TYPE_WILDCARD, + [ListOperatorTypeEnum.WILDCARD]: CONDITION_OPERATOR_TYPE_WILDCARD_MATCHES, [ListOperatorTypeEnum.EXISTS]: CONDITION_OPERATOR_TYPE_EXISTS, [ListOperatorTypeEnum.LIST]: CONDITION_OPERATOR_TYPE_LIST, }); diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/translations.ts b/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/translations.ts index 3290a52c1c37d..273cda46aa721 100644 --- a/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/translations.ts +++ b/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/translations.ts @@ -61,8 +61,8 @@ export const CONDITION_OPERATOR_TYPE_NOT_MATCH = i18n.translate( } ); -export const CONDITION_OPERATOR_TYPE_WILDCARD = i18n.translate( - 'xpack.securitySolution.artifactCard.conditions.wildcardOperator', +export const CONDITION_OPERATOR_TYPE_WILDCARD_MATCHES = i18n.translate( + 'xpack.securitySolution.artifactCard.conditions.wildcardMatchesOperator', { defaultMessage: 'MATCHES', } diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form/index.tsx b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form/index.tsx index fa68215cc768b..6d24b9558ea53 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form/index.tsx @@ -25,8 +25,9 @@ import { FormattedMessage } from '@kbn/i18n-react'; import type { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; import { EVENT_FILTERS_OPERATORS } from '@kbn/securitysolution-list-utils'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; -import { OperatingSystem, PolicyData } from '../../../../../../../common/endpoint/types'; +import { PolicyData } from '../../../../../../../common/endpoint/types'; import { AddExceptionComments } from '../../../../../../common/components/exceptions/add_exception_comments'; import { filterIndexPatterns } from '../../../../../../common/components/exceptions/helpers'; import { Loader } from '../../../../../../common/components/loader'; @@ -225,6 +226,7 @@ export const EventFiltersForm: React.FC = memo( onChange: handleOnBuilderChange, listTypeSpecificIndexPatternFilter: filterIndexPatterns, operatorsList: EVENT_FILTERS_OPERATORS, + osTypes: exception?.os_types, }), [data, handleOnBuilderChange, http, indexPatterns, exception] ); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/components/antivirus_registration_form/index.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/components/antivirus_registration_form/index.tsx index 45aad6c3d1432..c02969993e62d 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/components/antivirus_registration_form/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/components/antivirus_registration_form/index.tsx @@ -10,7 +10,7 @@ import { useDispatch } from 'react-redux'; import { i18n } from '@kbn/i18n'; import { EuiSpacer, EuiSwitch, EuiText } from '@elastic/eui'; -import { OperatingSystem } from '../../../../../../../common/endpoint/types'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; import { isAntivirusRegistrationEnabled } from '../../../store/policy_details/selectors'; import { usePolicyDetailsSelector } from '../../policy_hooks'; import { ConfigForm } from '../config_form'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/components/config_form/index.stories.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/components/config_form/index.stories.tsx index 89fe46445b20e..79e32cf2e3672 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/components/config_form/index.stories.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/components/config_form/index.stories.tsx @@ -11,7 +11,7 @@ import { addDecorator, storiesOf } from '@storybook/react'; import { euiLightVars } from '@kbn/ui-theme'; import { EuiCheckbox, EuiSpacer, EuiSwitch, EuiText } from '@elastic/eui'; -import { OperatingSystem } from '../../../../../../../common/endpoint/types'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; import { ConfigForm } from '.'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/components/config_form/index.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/components/config_form/index.tsx index 9d753749dabed..6a5f7d187478d 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/components/config_form/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/components/config_form/index.tsx @@ -21,7 +21,7 @@ import { } from '@elastic/eui'; import { ThemeContext } from 'styled-components'; -import { OperatingSystem } from '../../../../../../../common/endpoint/types'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; import { OS_TITLES } from '../../../../../common/translations'; const TITLES = { diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/components/events_form/index.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/components/events_form/index.tsx index 4364d92141240..a3f4b2fdc7fb1 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/components/events_form/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/components/events_form/index.tsx @@ -8,11 +8,8 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiCheckbox, EuiSpacer, EuiText, htmlIdGenerator } from '@elastic/eui'; -import { - OperatingSystem, - PolicyOperatingSystem, - UIPolicyConfig, -} from '../../../../../../../common/endpoint/types'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; +import { PolicyOperatingSystem, UIPolicyConfig } from '../../../../../../../common/endpoint/types'; import { ConfigForm, ConfigFormHeading } from '../../components/config_form'; const OPERATING_SYSTEM_TO_TEST_SUBJ: { [K in OperatingSystem]: string } = { diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx index 7f7163b68e7c3..1980877eea95d 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx @@ -8,7 +8,7 @@ import React, { memo } from 'react'; import { i18n } from '@kbn/i18n'; import { useDispatch } from 'react-redux'; -import { OperatingSystem } from '../../../../../../../common/endpoint/types'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; import { policyConfig } from '../../../store/policy_details/selectors'; import { setIn } from '../../../models/policy_details_config'; import { usePolicyDetailsSelector } from '../../policy_hooks'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx index 65b4ce9964d86..8bc1f0fcaf17c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx @@ -8,7 +8,7 @@ import React, { memo } from 'react'; import { i18n } from '@kbn/i18n'; import { useDispatch } from 'react-redux'; -import { OperatingSystem } from '../../../../../../../common/endpoint/types'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; import { policyConfig } from '../../../store/policy_details/selectors'; import { setIn } from '../../../models/policy_details_config'; import { usePolicyDetailsSelector } from '../../policy_hooks'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx index eb48fc3ffa28b..4ca72da6abfdf 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx @@ -8,7 +8,7 @@ import React, { memo } from 'react'; import { i18n } from '@kbn/i18n'; import { useDispatch } from 'react-redux'; -import { OperatingSystem } from '../../../../../../../common/endpoint/types'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; import { policyConfig } from '../../../store/policy_details/selectors'; import { setIn } from '../../../models/policy_details_config'; import { usePolicyDetailsSelector } from '../../policy_hooks'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/behavior.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/behavior.tsx index 4c358bc3e3a46..4d177c5cf6d30 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/behavior.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/behavior.tsx @@ -9,11 +9,8 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiCallOut, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { - Immutable, - OperatingSystem, - PolicyOperatingSystem, -} from '../../../../../../../common/endpoint/types'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; +import { Immutable, PolicyOperatingSystem } from '../../../../../../../common/endpoint/types'; import { BehaviorProtectionOSes } from '../../../types'; import { ConfigForm } from '../../components/config_form'; import { RadioButtons } from '../components/radio_buttons'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx index e348b1b802229..9f9ac475d4186 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx @@ -9,13 +9,10 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; import { APP_UI_ID } from '../../../../../../../common/constants'; import { SecurityPageName } from '../../../../../../app/types'; -import { - Immutable, - OperatingSystem, - PolicyOperatingSystem, -} from '../../../../../../../common/endpoint/types'; +import { Immutable, PolicyOperatingSystem } from '../../../../../../../common/endpoint/types'; import { MalwareProtectionOSes } from '../../../types'; import { ConfigForm } from '../../components/config_form'; import { LinkToApp } from '../../../../../../common/components/endpoint/link_to_app'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/memory.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/memory.tsx index 82a14e4fa9808..ae3b2f7a1abc6 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/memory.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/memory.tsx @@ -9,13 +9,10 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; import { APP_UI_ID } from '../../../../../../../common/constants'; import { SecurityPageName } from '../../../../../../app/types'; -import { - Immutable, - OperatingSystem, - PolicyOperatingSystem, -} from '../../../../../../../common/endpoint/types'; +import { Immutable, PolicyOperatingSystem } from '../../../../../../../common/endpoint/types'; import { MemoryProtectionOSes } from '../../../types'; import { ConfigForm } from '../../components/config_form'; import { LinkToApp } from '../../../../../../common/components/endpoint/link_to_app'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/ransomware.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/ransomware.tsx index 22266ef7351a0..da1b2e06b3a09 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/ransomware.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/ransomware.tsx @@ -9,13 +9,10 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; import { APP_UI_ID } from '../../../../../../../common/constants'; import { SecurityPageName } from '../../../../../../app/types'; -import { - Immutable, - OperatingSystem, - PolicyOperatingSystem, -} from '../../../../../../../common/endpoint/types'; +import { Immutable, PolicyOperatingSystem } from '../../../../../../../common/endpoint/types'; import { RansomwareProtectionOSes } from '../../../types'; import { ConfigForm } from '../../components/config_form'; import { LinkToApp } from '../../../../../../common/components/endpoint/link_to_app'; diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/service/mappers.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/service/mappers.ts index 8069d18169dd1..f440a0a394631 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/service/mappers.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/service/mappers.ts @@ -18,13 +18,15 @@ import { } from '@kbn/securitysolution-io-ts-list-types'; import { ENDPOINT_TRUSTED_APPS_LIST_ID } from '@kbn/securitysolution-list-constants'; import { - ConditionEntry, ConditionEntryField, + OperatingSystem, + TrustedAppEntryTypes, +} from '@kbn/securitysolution-utils'; +import { + ConditionEntry, EffectScope, NewTrustedApp, - OperatingSystem, TrustedApp, - TrustedAppEntryTypes, UpdateTrustedApp, } from '../../../../../common/endpoint/types'; import { tagsToEffectScope } from '../../../../../common/endpoint/service/trusted_apps/mapping'; diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/state/type_guards.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/state/type_guards.ts index 3f9e9d53f69e4..22aeedca7312c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/state/type_guards.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/state/type_guards.ts @@ -5,9 +5,9 @@ * 2.0. */ +import { ConditionEntryField } from '@kbn/securitysolution-utils'; import { ConditionEntry, - ConditionEntryField, EffectScope, GlobalEffectScope, MacosLinuxConditionEntry, diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/builders.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/builders.ts index 363da5cd27390..431894274ee00 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/builders.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/builders.ts @@ -5,12 +5,8 @@ * 2.0. */ -import { - ConditionEntry, - ConditionEntryField, - NewTrustedApp, - OperatingSystem, -} from '../../../../../common/endpoint/types'; +import { ConditionEntryField, OperatingSystem } from '@kbn/securitysolution-utils'; +import { ConditionEntry, NewTrustedApp } from '../../../../../common/endpoint/types'; import { MANAGEMENT_DEFAULT_PAGE, MANAGEMENT_DEFAULT_PAGE_SIZE } from '../../../common/constants'; diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/test_utils/index.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/test_utils/index.ts index 3c2f177520271..32e1867db567c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/test_utils/index.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/test_utils/index.ts @@ -6,7 +6,8 @@ */ import { combineReducers, createStore } from 'redux'; -import { TrustedApp, OperatingSystem } from '../../../../../common/endpoint/types'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; +import { TrustedApp } from '../../../../../common/endpoint/types'; import { RoutingAction } from '../../../../common/store/routing'; import { diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_entry_input/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_entry_input/index.test.tsx index 9d6c35d64b2d5..4ea42c896847c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_entry_input/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_entry_input/index.test.tsx @@ -8,11 +8,8 @@ import { shallow, mount } from 'enzyme'; import React from 'react'; import { keys } from 'lodash'; -import { - ConditionEntry, - ConditionEntryField, - OperatingSystem, -} from '../../../../../../../common/endpoint/types'; +import { ConditionEntryField, OperatingSystem } from '@kbn/securitysolution-utils'; +import { ConditionEntry } from '../../../../../../../common/endpoint/types'; import { ConditionEntryInput } from '.'; import { EuiSuperSelectProps } from '@elastic/eui'; @@ -53,6 +50,7 @@ describe('Condition entry input', () => { /> ); + // @ts-ignore it.each(keys(ConditionEntryField).map((k) => [k]))( 'should call on change for field input with value %s', (field) => { diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_entry_input/index.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_entry_input/index.tsx index f487a38401ef0..4f4f89b80f28d 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_entry_input/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_entry_input/index.tsx @@ -16,13 +16,8 @@ import { EuiSuperSelectOption, EuiText, } from '@elastic/eui'; - -import { - ConditionEntry, - ConditionEntryField, - OperatorFieldIds, - OperatingSystem, -} from '../../../../../../../common/endpoint/types'; +import { ConditionEntryField, OperatingSystem } from '@kbn/securitysolution-utils'; +import { ConditionEntry, OperatorFieldIds } from '../../../../../../../common/endpoint/types'; import { CONDITION_FIELD_DESCRIPTION, diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_group/index.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_group/index.tsx index fb7135b1173e0..aed69128847f6 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_group/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_group/index.tsx @@ -9,7 +9,8 @@ import React, { memo } from 'react'; import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiHideFor, EuiSpacer } from '@elastic/eui'; import styled from 'styled-components'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ConditionEntry, OperatingSystem } from '../../../../../../../common/endpoint/types'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; +import { ConditionEntry } from '../../../../../../../common/endpoint/types'; import { AndOrBadge } from '../../../../../../common/components/and_or_badge'; import { ConditionEntryInput, ConditionEntryInputProps } from '../condition_entry_input'; import { useTestIdGenerator } from '../../../../../components/hooks/use_test_id_generator'; diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.test.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.test.tsx index cc2c51c5f4c40..68dd43fa41152 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.test.tsx @@ -9,11 +9,8 @@ import React from 'react'; import * as reactTestingLibrary from '@testing-library/react'; import { fireEvent, getByTestId } from '@testing-library/dom'; -import { - ConditionEntryField, - NewTrustedApp, - OperatingSystem, -} from '../../../../../../common/endpoint/types'; +import { ConditionEntryField, OperatingSystem } from '@kbn/securitysolution-utils'; +import { NewTrustedApp } from '../../../../../../common/endpoint/types'; import { AppContextTestRender, createAppRootMockRenderer, diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx index 7cff989f008a0..2812bdc9c3c0b 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx @@ -18,20 +18,23 @@ import { EuiSpacer, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { + hasSimpleExecutableName, + isPathValid, + ConditionEntryField, + OperatingSystem, +} from '@kbn/securitysolution-utils'; import { EuiFormProps } from '@elastic/eui/src/components/form/form'; + import { ConditionEntry, - ConditionEntryField, EffectScope, MacosLinuxConditionEntry, MaybeImmutable, NewTrustedApp, - OperatingSystem, } from '../../../../../../common/endpoint/types'; import { isValidHash, - isPathValid, - hasSimpleExecutableName, getDuplicateFields, } from '../../../../../../common/endpoint/service/trusted_apps/validations'; diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/translations.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/translations.ts index dd9b8fe4324c1..3d8a56ad74315 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/translations.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/translations.ts @@ -6,10 +6,10 @@ */ import { i18n } from '@kbn/i18n'; +import { ConditionEntryField } from '@kbn/securitysolution-utils'; import { MacosLinuxConditionEntry, WindowsConditionEntry, - ConditionEntryField, OperatorFieldIds, } from '../../../../../common/endpoint/types'; diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx index 82169fcd19c10..3666164676ee3 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx @@ -11,11 +11,8 @@ import { TrustedAppsPage } from './trusted_apps_page'; import { AppContextTestRender, createAppRootMockRenderer } from '../../../../common/mock/endpoint'; import { fireEvent } from '@testing-library/dom'; import { MiddlewareActionSpyHelper } from '../../../../common/store/test_utils'; -import { - ConditionEntryField, - OperatingSystem, - TrustedApp, -} from '../../../../../common/endpoint/types'; +import { ConditionEntryField, OperatingSystem } from '@kbn/securitysolution-utils'; +import { TrustedApp } from '../../../../../common/endpoint/types'; import { HttpFetchOptions, HttpFetchOptionsWithPath } from 'kibana/public'; import { isFailedResourceState, isLoadedResourceState } from '../state'; import { forceHTMLElementOffsetWidth } from '../../../components/effected_policy_select/test_utils'; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/event_filters/index.ts b/x-pack/plugins/security_solution/scripts/endpoint/event_filters/index.ts index 7f18c0b40fed7..05baa6d4ade04 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/event_filters/index.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/event_filters/index.ts @@ -9,7 +9,11 @@ import { run, RunFn, createFailError } from '@kbn/dev-utils'; import { KbnClient } from '@kbn/test'; import { AxiosError } from 'axios'; import pMap from 'p-map'; -import type { CreateExceptionListSchema } from '@kbn/securitysolution-io-ts-list-types'; +import type { + CreateExceptionListItemSchema, + CreateExceptionListSchema, + ExceptionListItemSchema, +} from '@kbn/securitysolution-io-ts-list-types'; import { ENDPOINT_EVENT_FILTERS_LIST_DESCRIPTION, ENDPOINT_EVENT_FILTERS_LIST_ID, @@ -41,8 +45,8 @@ export const cli = () => { kibana: 'http://elastic:changeme@localhost:5601', }, help: ` - --count Number of event filters to create. Default: 10 - --kibana The URL to kibana including credentials. Default: http://elastic:changeme@localhost:5601 + --count Number of event filters to create. Default: 10 + --kibana The URL to kibana including credentials. Default: http://elastic:changeme@localhost:5601 `, }, } @@ -77,7 +81,25 @@ const createEventFilters: RunFn = async ({ flags, log }) => { await pMap( Array.from({ length: flags.count as unknown as number }), () => { - const body = eventGenerator.generateEventFilterForCreate(); + let options: Partial = {}; + const listSize = (flags.count ?? 10) as number; + const randomN = eventGenerator.randomN(listSize); + if (randomN > Math.floor(listSize / 2)) { + const os = eventGenerator.randomOSFamily() as ExceptionListItemSchema['os_types'][number]; + options = { + os_types: [os], + entries: [ + { + field: 'file.path.text', + operator: 'included', + type: 'wildcard', + value: os === 'windows' ? 'C:\\Fol*\\file.*' : '/usr/*/*.dmg', + }, + ], + }; + } + + const body = eventGenerator.generateEventFilterForCreate(options); if (isArtifactByPolicy(body)) { const nmExceptions = Math.floor(Math.random() * 3) || 1; diff --git a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts index d4a486539855b..b23c2fe08bf10 100644 --- a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts +++ b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts @@ -13,6 +13,7 @@ import type { ExceptionListItemSchema, } from '@kbn/securitysolution-io-ts-list-types'; import { validate } from '@kbn/securitysolution-io-ts-utils'; +import { hasSimpleExecutableName, OperatingSystem } from '@kbn/securitysolution-utils'; import { ENDPOINT_EVENT_FILTERS_LIST_ID, @@ -20,7 +21,6 @@ import { ENDPOINT_LIST_ID, ENDPOINT_TRUSTED_APPS_LIST_ID, } from '@kbn/securitysolution-list-constants'; -import { OperatingSystem } from '../../../../common/endpoint/types'; import { ExceptionListClient } from '../../../../../lists/server'; import { InternalArtifactCompleteSchema, @@ -40,7 +40,6 @@ import { WrappedTranslatedExceptionList, wrappedTranslatedExceptionList, } from '../../schemas'; -import { hasSimpleExecutableName } from '../../../../common/endpoint/service/trusted_apps/validations'; export async function buildArtifact( exceptions: WrappedTranslatedExceptionList, @@ -227,7 +226,7 @@ function getMatcherWildcardFunction({ field: string; os: ExceptionListItemSchema['os_types'][number]; }): TranslatedEntryMatchWildcardMatcher { - return field.endsWith('.caseless') + return field.endsWith('.caseless') || field.endsWith('.text') ? os === 'linux' ? 'wildcard_cased' : 'wildcard_caseless' diff --git a/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.test.ts index 95d0c8b607cb6..c878c02df2a08 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.test.ts @@ -449,6 +449,7 @@ describe('ManifestManager', () => { } }); + // test('Builds manifest with policy specific exception list items for trusted apps', async () => { const exceptionListItem = getExceptionListItemSchemaMock({ os_types: ['macos'] }); const trustedAppListItem = getExceptionListItemSchemaMock({ os_types: ['linux'] }); diff --git a/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/base_validator.ts b/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/base_validator.ts index 3f53e59c348ab..293066a3a1824 100644 --- a/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/base_validator.ts +++ b/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/base_validator.ts @@ -9,6 +9,7 @@ import { KibanaRequest } from 'kibana/server'; import { schema } from '@kbn/config-schema'; import { isEqual } from 'lodash/fp'; import { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; import { EndpointAppContextService } from '../../../endpoint/endpoint_app_context_services'; import { ExceptionItemLikeOptions } from '../types'; import { getEndpointAuthzInitialState } from '../../../../common/endpoint/service/authz'; @@ -16,7 +17,6 @@ import { getPolicyIdsFromArtifact, isArtifactByPolicy, } from '../../../../common/endpoint/service/artifacts'; -import { OperatingSystem } from '../../../../common/endpoint/types'; import { EndpointArtifactExceptionValidationError } from './errors'; import type { FeatureKeys } from '../../../endpoint/services/feature_usage/service'; diff --git a/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts b/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts index 28bc408165d4b..6454584783863 100644 --- a/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts +++ b/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts @@ -7,6 +7,7 @@ import { schema } from '@kbn/config-schema'; import { ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID } from '@kbn/securitysolution-list-constants'; +import { OperatingSystem } from '@kbn/securitysolution-utils'; import { BaseValidator, BasicEndpointExceptionDataSchema } from './base_validator'; import { EndpointArtifactExceptionValidationError } from './errors'; import { ExceptionItemLikeOptions } from '../types'; @@ -16,7 +17,6 @@ import { UpdateExceptionListItemOptions, } from '../../../../../lists/server'; import { isValidIPv4OrCIDR } from '../../../../common/endpoint/utils/is_valid_ip'; -import { OperatingSystem } from '../../../../common/endpoint/types'; function validateIp(value: string) { if (!isValidIPv4OrCIDR(value)) { diff --git a/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/trusted_app_validator.ts b/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/trusted_app_validator.ts index d7ca2c0f05672..fc69153f0b21b 100644 --- a/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/trusted_app_validator.ts +++ b/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/trusted_app_validator.ts @@ -8,17 +8,14 @@ import { ENDPOINT_TRUSTED_APPS_LIST_ID } from '@kbn/securitysolution-list-constants'; import { schema, TypeOf } from '@kbn/config-schema'; import { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { OperatingSystem, TrustedAppEntryTypes } from '@kbn/securitysolution-utils'; import { BaseValidator } from './base_validator'; import { ExceptionItemLikeOptions } from '../types'; import { CreateExceptionListItemOptions, UpdateExceptionListItemOptions, } from '../../../../../lists/server'; -import { - ConditionEntry, - OperatingSystem, - TrustedAppEntryTypes, -} from '../../../../common/endpoint/types'; +import { ConditionEntry } from '../../../../common/endpoint/types'; import { getDuplicateFields, isValidHash, diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 3a5bc5edfbb79..487fe67b85a00 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -22715,7 +22715,6 @@ "xpack.securitySolution.artifactCard.conditions.matchOperator.not": "IS NOT", "xpack.securitySolution.artifactCard.conditions.nestedOperator": "がある", "xpack.securitySolution.artifactCard.conditions.os": "OS", - "xpack.securitySolution.artifactCard.conditions.wildcardOperator": "一致", "xpack.securitySolution.artifactCard.conditions.windows": "Windows", "xpack.securitySolution.artifactCard.created": "作成済み", "xpack.securitySolution.artifactCard.createdBy": "作成者", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index cd88c2b4b6a52..b515f1416eb99 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -22744,7 +22744,6 @@ "xpack.securitySolution.artifactCard.conditions.matchOperator.not": "不是", "xpack.securitySolution.artifactCard.conditions.nestedOperator": "具有", "xpack.securitySolution.artifactCard.conditions.os": "OS", - "xpack.securitySolution.artifactCard.conditions.wildcardOperator": "匹配", "xpack.securitySolution.artifactCard.conditions.windows": "Windows", "xpack.securitySolution.artifactCard.created": "创建时间", "xpack.securitySolution.artifactCard.createdBy": "创建者", From 0bd772432a313599656d8fe8adfdc7e6ef5d328a Mon Sep 17 00:00:00 2001 From: Jason Rhodes Date: Wed, 2 Mar 2022 15:26:08 -0500 Subject: [PATCH 17/37] [Stack Monitoring] More typescript conversion (#126654) * Converts monitoring_bulk to TS * Converts routes/alerts to TS, closes #117755 * Converts check_access route to TS * Converts clusters routes to TS Also changes some overly restrictive types that weren't accurate * Fixes lowercase method for legacy server route --- .../server/es_client/instantiate_client.ts | 1 - .../{monitoring_bulk.js => monitoring_bulk.ts} | 4 +++- .../lib/cluster/get_clusters_from_request.ts | 17 +++++++++-------- .../server/lib/cluster/get_clusters_stats.ts | 4 ++-- .../monitoring/server/lib/create_query.ts | 2 +- .../lib/elasticsearch/verify_monitoring_auth.ts | 4 ++++ .../server/lib/logstash/get_pipeline_ids.ts | 2 +- .../routes/api/v1/alerts/{index.js => index.ts} | 0 .../{check_access.js => check_access.ts} | 9 ++++++--- .../api/v1/check_access/{index.js => index.ts} | 0 .../api/v1/cluster/{clusters.js => clusters.ts} | 9 ++++++--- .../api/v1/cluster/{index.js => index.ts} | 0 12 files changed, 32 insertions(+), 20 deletions(-) rename x-pack/plugins/monitoring/server/kibana_monitoring/lib/{monitoring_bulk.js => monitoring_bulk.ts} (91%) rename x-pack/plugins/monitoring/server/routes/api/v1/alerts/{index.js => index.ts} (100%) rename x-pack/plugins/monitoring/server/routes/api/v1/check_access/{check_access.js => check_access.ts} (72%) rename x-pack/plugins/monitoring/server/routes/api/v1/check_access/{index.js => index.ts} (100%) rename x-pack/plugins/monitoring/server/routes/api/v1/cluster/{clusters.js => clusters.ts} (81%) rename x-pack/plugins/monitoring/server/routes/api/v1/cluster/{index.js => index.ts} (100%) diff --git a/x-pack/plugins/monitoring/server/es_client/instantiate_client.ts b/x-pack/plugins/monitoring/server/es_client/instantiate_client.ts index 096c82a9c456c..605cf463bc7ef 100644 --- a/x-pack/plugins/monitoring/server/es_client/instantiate_client.ts +++ b/x-pack/plugins/monitoring/server/es_client/instantiate_client.ts @@ -5,7 +5,6 @@ * 2.0. */ import { Logger, ICustomClusterClient, ElasticsearchClientConfig } from 'kibana/server'; -// @ts-ignore import { monitoringBulk } from '../kibana_monitoring/lib/monitoring_bulk'; import { monitoringEndpointDisableWatches } from './monitoring_endpoint_disable_watches'; import { MonitoringElasticsearchConfig } from '../config'; diff --git a/x-pack/plugins/monitoring/server/kibana_monitoring/lib/monitoring_bulk.js b/x-pack/plugins/monitoring/server/kibana_monitoring/lib/monitoring_bulk.ts similarity index 91% rename from x-pack/plugins/monitoring/server/kibana_monitoring/lib/monitoring_bulk.js rename to x-pack/plugins/monitoring/server/kibana_monitoring/lib/monitoring_bulk.ts index 6c57da9051b3e..9e219658439e0 100644 --- a/x-pack/plugins/monitoring/server/kibana_monitoring/lib/monitoring_bulk.js +++ b/x-pack/plugins/monitoring/server/kibana_monitoring/lib/monitoring_bulk.ts @@ -5,7 +5,9 @@ * 2.0. */ -export function monitoringBulk(Client, _config, components) { +// TODO: Track down where this function is called by the elasticsearch client setup so we can properly type these + +export function monitoringBulk(Client: any, _config: any, components: any) { const ca = components.clientAction.factory; Client.prototype.monitoring = components.clientAction.namespaceFactory(); const monitoring = Client.prototype.monitoring.prototype; diff --git a/x-pack/plugins/monitoring/server/lib/cluster/get_clusters_from_request.ts b/x-pack/plugins/monitoring/server/lib/cluster/get_clusters_from_request.ts index c4c31f31df688..ced05dd5ea020 100644 --- a/x-pack/plugins/monitoring/server/lib/cluster/get_clusters_from_request.ts +++ b/x-pack/plugins/monitoring/server/lib/cluster/get_clusters_from_request.ts @@ -50,7 +50,7 @@ export async function getClustersFromRequest( start, end, codePaths, - }: { clusterUuid: string; start: number; end: number; codePaths: string[] } + }: { clusterUuid?: string; start?: number; end?: number; codePaths: string[] } ) { const { filebeatIndexPattern } = indexPatterns; @@ -96,13 +96,14 @@ export async function getClustersFromRequest( cluster.ml = { jobs: mlJobs }; } - cluster.logs = isInCodePath(codePaths, [CODE_PATH_LOGS]) - ? await getLogTypes(req, filebeatIndexPattern, { - clusterUuid: get(cluster, 'elasticsearch.cluster.id', cluster.cluster_uuid), - start, - end, - }) - : []; + cluster.logs = + start && end && isInCodePath(codePaths, [CODE_PATH_LOGS]) + ? await getLogTypes(req, filebeatIndexPattern, { + clusterUuid: get(cluster, 'elasticsearch.cluster.id', cluster.cluster_uuid), + start, + end, + }) + : []; } else if (!isStandaloneCluster) { // get all clusters if (!clusters || clusters.length === 0) { diff --git a/x-pack/plugins/monitoring/server/lib/cluster/get_clusters_stats.ts b/x-pack/plugins/monitoring/server/lib/cluster/get_clusters_stats.ts index e9b734d98b70d..07cb8751d0bd8 100644 --- a/x-pack/plugins/monitoring/server/lib/cluster/get_clusters_stats.ts +++ b/x-pack/plugins/monitoring/server/lib/cluster/get_clusters_stats.ts @@ -26,7 +26,7 @@ import { Globals } from '../../static_globals'; * @param {String} clusterUuid (optional) If not undefined, getClusters will filter for a single cluster * @return {Promise} A promise containing an array of clusters. */ -export function getClustersStats(req: LegacyRequest, clusterUuid: string, ccs?: string) { +export function getClustersStats(req: LegacyRequest, clusterUuid?: string, ccs?: string) { return ( fetchClusterStats(req, clusterUuid, ccs) .then((response) => handleClusterStats(response)) @@ -42,7 +42,7 @@ export function getClustersStats(req: LegacyRequest, clusterUuid: string, ccs?: * @param {String} clusterUuid (optional) - if not undefined, getClusters filters for a single clusterUuid * @return {Promise} Object representing each cluster. */ -function fetchClusterStats(req: LegacyRequest, clusterUuid: string, ccs?: string) { +function fetchClusterStats(req: LegacyRequest, clusterUuid?: string, ccs?: string) { const dataset = 'cluster_stats'; const moduleType = 'elasticsearch'; const indexPattern = getNewIndexPatterns({ diff --git a/x-pack/plugins/monitoring/server/lib/create_query.ts b/x-pack/plugins/monitoring/server/lib/create_query.ts index 051b0ed6b4f9c..55b96a7d36906 100644 --- a/x-pack/plugins/monitoring/server/lib/create_query.ts +++ b/x-pack/plugins/monitoring/server/lib/create_query.ts @@ -72,7 +72,7 @@ interface CreateQueryOptions { dsDataset?: string; metricset?: string; filters?: any[]; - clusterUuid: string; + clusterUuid?: string; uuid?: string; start?: number; end?: number; diff --git a/x-pack/plugins/monitoring/server/lib/elasticsearch/verify_monitoring_auth.ts b/x-pack/plugins/monitoring/server/lib/elasticsearch/verify_monitoring_auth.ts index 7673f1b7ff052..3bd9f6d2265dc 100644 --- a/x-pack/plugins/monitoring/server/lib/elasticsearch/verify_monitoring_auth.ts +++ b/x-pack/plugins/monitoring/server/lib/elasticsearch/verify_monitoring_auth.ts @@ -17,6 +17,8 @@ import { LegacyRequest } from '../../types'; * * @param req {Object} the server route handler request object */ + +// TODO: replace LegacyRequest with current request object + plugin retrieval export async function verifyMonitoringAuth(req: LegacyRequest) { const xpackInfo = get(req.server.plugins.monitoring, 'info'); @@ -38,6 +40,8 @@ export async function verifyMonitoringAuth(req: LegacyRequest) { * @param req {Object} the server route handler request object * @return {Promise} That either resolves with no response (void) or an exception. */ + +// TODO: replace LegacyRequest with current request object + plugin retrieval async function verifyHasPrivileges(req: LegacyRequest) { const { callWithRequest } = req.server.plugins.elasticsearch.getCluster('monitoring'); diff --git a/x-pack/plugins/monitoring/server/lib/logstash/get_pipeline_ids.ts b/x-pack/plugins/monitoring/server/lib/logstash/get_pipeline_ids.ts index 7654ed551b63b..91983186218c9 100644 --- a/x-pack/plugins/monitoring/server/lib/logstash/get_pipeline_ids.ts +++ b/x-pack/plugins/monitoring/server/lib/logstash/get_pipeline_ids.ts @@ -15,7 +15,7 @@ import { Globals } from '../../static_globals'; interface GetLogstashPipelineIdsParams { req: LegacyRequest; - clusterUuid: string; + clusterUuid?: string; size: number; logstashUuid?: string; ccs?: string; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/alerts/index.js b/x-pack/plugins/monitoring/server/routes/api/v1/alerts/index.ts similarity index 100% rename from x-pack/plugins/monitoring/server/routes/api/v1/alerts/index.js rename to x-pack/plugins/monitoring/server/routes/api/v1/alerts/index.ts diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/check_access/check_access.js b/x-pack/plugins/monitoring/server/routes/api/v1/check_access/check_access.ts similarity index 72% rename from x-pack/plugins/monitoring/server/routes/api/v1/check_access/check_access.js rename to x-pack/plugins/monitoring/server/routes/api/v1/check_access/check_access.ts index 84bea7ba2e8c4..450872049a3de 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/check_access/check_access.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/check_access/check_access.ts @@ -7,17 +7,20 @@ import { verifyMonitoringAuth } from '../../../../lib/elasticsearch/verify_monitoring_auth'; import { handleError } from '../../../../lib/errors'; +import { LegacyRequest, LegacyServer } from '../../../../types'; /* * API for checking read privilege on Monitoring Data * Used for the "Access Denied" page as something to auto-retry with. */ -export function checkAccessRoute(server) { + +// TODO: Replace this LegacyServer call with the "new platform" core Kibana route method +export function checkAccessRoute(server: LegacyServer) { server.route({ method: 'GET', path: '/api/monitoring/v1/check_access', - handler: async (req) => { - const response = {}; + handler: async (req: LegacyRequest) => { + const response: { has_access?: boolean } = {}; try { await verifyMonitoringAuth(req); response.has_access = true; // response data is ignored diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/check_access/index.js b/x-pack/plugins/monitoring/server/routes/api/v1/check_access/index.ts similarity index 100% rename from x-pack/plugins/monitoring/server/routes/api/v1/check_access/index.js rename to x-pack/plugins/monitoring/server/routes/api/v1/check_access/index.ts diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/cluster/clusters.js b/x-pack/plugins/monitoring/server/routes/api/v1/cluster/clusters.ts similarity index 81% rename from x-pack/plugins/monitoring/server/routes/api/v1/cluster/clusters.js rename to x-pack/plugins/monitoring/server/routes/api/v1/cluster/clusters.ts index 2a1ec03f93db6..81acd0e53f319 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/cluster/clusters.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/cluster/clusters.ts @@ -6,16 +6,19 @@ */ import { schema } from '@kbn/config-schema'; +import { LegacyRequest, LegacyServer } from '../../../../types'; import { getClustersFromRequest } from '../../../../lib/cluster/get_clusters_from_request'; import { verifyMonitoringAuth } from '../../../../lib/elasticsearch/verify_monitoring_auth'; import { handleError } from '../../../../lib/errors'; import { getIndexPatterns } from '../../../../lib/cluster/get_index_patterns'; -export function clustersRoute(server) { +export function clustersRoute(server: LegacyServer) { /* * Monitoring Home * Route Init (for checking license and compatibility for multi-cluster monitoring */ + + // TODO switch from the LegacyServer route() method to the "new platform" route methods server.route({ method: 'POST', path: '/api/monitoring/v1/clusters', @@ -30,7 +33,7 @@ export function clustersRoute(server) { }), }, }, - handler: async (req) => { + handler: async (req: LegacyRequest) => { let clusters = []; const config = server.config; @@ -43,7 +46,7 @@ export function clustersRoute(server) { filebeatIndexPattern: config.ui.logs.index, }); clusters = await getClustersFromRequest(req, indexPatterns, { - codePaths: req.payload.codePaths, + codePaths: req.payload.codePaths as string[], // TODO remove this cast when we can properly type req by using the right route handler }); } catch (err) { throw handleError(err, req); diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/cluster/index.js b/x-pack/plugins/monitoring/server/routes/api/v1/cluster/index.ts similarity index 100% rename from x-pack/plugins/monitoring/server/routes/api/v1/cluster/index.js rename to x-pack/plugins/monitoring/server/routes/api/v1/cluster/index.ts From 2fc7ad44a82029cd91cf6fdca00f8d62be8ac3ef Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Wed, 2 Mar 2022 12:58:15 -0800 Subject: [PATCH 18/37] [DOCS] Add settings for Enterprise Search (#126711) * [DOCS] Add settings for Enterprise Search * Update docs/settings/enterprise-search-settings.asciidoc Co-authored-by: Rich Kuzsma <62522248+richkuz@users.noreply.github.com> Co-authored-by: Rich Kuzsma <62522248+richkuz@users.noreply.github.com> --- .../enterprise-search-settings.asciidoc | 26 +++++++++++++++++++ docs/setup/settings.asciidoc | 6 ++--- 2 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 docs/settings/enterprise-search-settings.asciidoc diff --git a/docs/settings/enterprise-search-settings.asciidoc b/docs/settings/enterprise-search-settings.asciidoc new file mode 100644 index 0000000000000..736a7614b31ed --- /dev/null +++ b/docs/settings/enterprise-search-settings.asciidoc @@ -0,0 +1,26 @@ +[role="xpack"] +[[enterprise-search-settings-kb]] +=== Enterprise Search settings in {kib} +++++ +Enterprise Search settings +++++ + +On Elastic Cloud, you do not need to configure any settings to use Enterprise Search in {kib}. It is enabled by default. On self-managed installations, you must configure `enterpriseSearch.host`. + +`enterpriseSearch.host`:: +The http(s) URL of your Enterprise Search instance. For example, in a local self-managed setup, +set this to `http://localhost:3002`. Authentication between {kib} and the Enterprise Search host URL, +such as via OAuth, is not supported. You can also +{enterprise-search-ref}/configure-ssl-tls.html#configure-ssl-tls-in-kibana[configure {kib} to trust +your Enterprise Search TLS certificate authority]. + + +`enterpriseSearch.accessCheckTimeout`:: +When launching the Enterprise Search UI, the maximum number of milliseconds for {kib} to wait +for a response from Enterprise Search +before considering the attempt failed and logging a warning. +Default: 5000. + +`enterpriseSearch.accessCheckTimeoutWarning`:: +When launching the Enterprise Search UI, the maximum number of milliseconds for {kib} to wait for a response from +Enterprise Search before logging a warning. Default: 300. diff --git a/docs/setup/settings.asciidoc b/docs/setup/settings.asciidoc index e55a94a516d68..3a1e0f1a7f4ff 100644 --- a/docs/setup/settings.asciidoc +++ b/docs/setup/settings.asciidoc @@ -282,9 +282,6 @@ on the {kib} index at startup. {kib} users still need to authenticate with that the {kib} server uses to perform maintenance on the {kib} index at startup. This setting is an alternative to `elasticsearch.username` and `elasticsearch.password`. -| `enterpriseSearch.host` - | The http(s) URL of your Enterprise Search instance. For example, in a local self-managed setup, set this to `http://localhost:3002`. Authentication between Kibana and the Enterprise Search host URL, such as via OAuth, is not supported. You can also {enterprise-search-ref}/configure-ssl-tls.html#configure-ssl-tls-in-kibana[configure Kibana to trust your Enterprise Search TLS certificate authority]. - | `interpreter.enableInVisualize` | Enables use of interpreter in Visualize. *Default: `true`* @@ -719,6 +716,7 @@ Valid locales are: `en`, `zh-CN`, `ja-JP`. *Default: `en`* include::{kib-repo-dir}/settings/alert-action-settings.asciidoc[] include::{kib-repo-dir}/settings/apm-settings.asciidoc[] include::{kib-repo-dir}/settings/banners-settings.asciidoc[] +include::{kib-repo-dir}/settings/enterprise-search-settings.asciidoc[] include::{kib-repo-dir}/settings/fleet-settings.asciidoc[] include::{kib-repo-dir}/settings/i18n-settings.asciidoc[] include::{kib-repo-dir}/settings/logging-settings.asciidoc[] @@ -726,8 +724,8 @@ include::{kib-repo-dir}/settings/logs-ui-settings.asciidoc[] include::{kib-repo-dir}/settings/infrastructure-ui-settings.asciidoc[] include::{kib-repo-dir}/settings/monitoring-settings.asciidoc[] include::{kib-repo-dir}/settings/reporting-settings.asciidoc[] -include::secure-settings.asciidoc[] include::{kib-repo-dir}/settings/search-sessions-settings.asciidoc[] +include::secure-settings.asciidoc[] include::{kib-repo-dir}/settings/security-settings.asciidoc[] include::{kib-repo-dir}/settings/spaces-settings.asciidoc[] include::{kib-repo-dir}/settings/task-manager-settings.asciidoc[] From 0a48723f4b03b5626790256d91d10b246945e898 Mon Sep 17 00:00:00 2001 From: Nick Partridge Date: Wed, 2 Mar 2022 15:08:24 -0600 Subject: [PATCH 19/37] [Renovate] Improve insight of renovate prs (#126703) --- renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 9b673a5a9ccf6..0b6ca59edefe2 100644 --- a/renovate.json +++ b/renovate.json @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:base", ":disableDependencyDashboard"], + "extends": ["config:base"], "ignorePaths": ["**/__fixtures__/**", "**/fixtures/**"], "enabledManagers": ["npm"], "baseBranches": ["main", "7.16", "7.15"], From 703856fb15e625a2b98f856f54d30e9f9e3919eb Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Wed, 2 Mar 2022 16:15:15 -0500 Subject: [PATCH 20/37] [Rule registry] Catching possible unhandled promise rejection (#126391) * Adding unit tests for rule data client and moving error handling for writer initialization closer to source * PR feedback Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../rule_data_client/rule_data_client.test.ts | 315 ++++++++++++++++++ .../rule_data_client/rule_data_client.ts | 61 ++-- .../resource_installer.mock.ts | 4 +- .../resource_installer.ts | 2 + .../rule_data_plugin_service.ts | 4 +- 5 files changed, 353 insertions(+), 33 deletions(-) create mode 100644 x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.test.ts diff --git a/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.test.ts b/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.test.ts new file mode 100644 index 0000000000000..0a700cab50ee6 --- /dev/null +++ b/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.test.ts @@ -0,0 +1,315 @@ +/* + * 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 { left, right } from 'fp-ts/lib/Either'; +import { RuleDataClient, RuleDataClientConstructorOptions, WaitResult } from './rule_data_client'; +import { IndexInfo } from '../rule_data_plugin_service/index_info'; +import { Dataset, RuleDataWriterInitializationError } from '..'; +import { resourceInstallerMock } from '../rule_data_plugin_service/resource_installer.mock'; +import { loggingSystemMock, elasticsearchServiceMock } from 'src/core/server/mocks'; +import { IndexPatternsFetcher } from '../../../../../src/plugins/data/server'; +import { createNoMatchingIndicesError } from '../../../../../src/plugins/data_views/server/fetcher/lib/errors'; + +const mockLogger = loggingSystemMock.create().get(); +const scopedClusterClient = elasticsearchServiceMock.createScopedClusterClient().asInternalUser; +const mockResourceInstaller = resourceInstallerMock.create(); + +// Be careful setting this delay too high. Jest tests can time out +const delay = (ms: number = 3000) => new Promise((resolve) => setTimeout(resolve, ms)); + +interface GetRuleDataClientOptionsOpts { + isWriteEnabled?: boolean; + isWriterCacheEnabled?: boolean; + waitUntilReadyForReading?: Promise; + waitUntilReadyForWriting?: Promise; +} +function getRuleDataClientOptions({ + isWriteEnabled, + isWriterCacheEnabled, + waitUntilReadyForReading, + waitUntilReadyForWriting, +}: GetRuleDataClientOptionsOpts): RuleDataClientConstructorOptions { + return { + indexInfo: new IndexInfo({ + indexOptions: { + feature: 'apm', + registrationContext: 'observability.apm', + dataset: 'alerts' as Dataset, + componentTemplateRefs: [], + componentTemplates: [], + }, + kibanaVersion: '8.2.0', + }), + resourceInstaller: mockResourceInstaller, + isWriteEnabled: isWriteEnabled ?? true, + isWriterCacheEnabled: isWriterCacheEnabled ?? true, + waitUntilReadyForReading: + waitUntilReadyForReading ?? Promise.resolve(right(scopedClusterClient) as WaitResult), + waitUntilReadyForWriting: + waitUntilReadyForWriting ?? Promise.resolve(right(scopedClusterClient) as WaitResult), + logger: mockLogger, + }; +} + +describe('RuleDataClient', () => { + const getFieldsForWildcardMock = jest.fn(); + + test('options are set correctly in constructor', () => { + const namespace = 'test'; + const ruleDataClient = new RuleDataClient(getRuleDataClientOptions({})); + expect(ruleDataClient.indexName).toEqual(`.alerts-observability.apm.alerts`); + expect(ruleDataClient.kibanaVersion).toEqual('8.2.0'); + expect(ruleDataClient.indexNameWithNamespace(namespace)).toEqual( + `.alerts-observability.apm.alerts-${namespace}` + ); + expect(ruleDataClient.isWriteEnabled()).toEqual(true); + }); + + describe('getReader()', () => { + beforeAll(() => { + getFieldsForWildcardMock.mockResolvedValue(['foo']); + IndexPatternsFetcher.prototype.getFieldsForWildcard = getFieldsForWildcardMock; + }); + + beforeEach(() => { + getFieldsForWildcardMock.mockClear(); + }); + + afterAll(() => { + getFieldsForWildcardMock.mockRestore(); + }); + + test('waits until cluster client is ready before searching', async () => { + const ruleDataClient = new RuleDataClient( + getRuleDataClientOptions({ + waitUntilReadyForReading: new Promise((resolve) => + setTimeout(resolve, 3000, right(scopedClusterClient)) + ), + }) + ); + + const query = { query: { bool: { filter: { range: { '@timestamp': { gte: 0 } } } } } }; + const reader = ruleDataClient.getReader(); + await reader.search({ + body: query, + }); + + expect(scopedClusterClient.search).toHaveBeenCalledWith({ + body: query, + index: `.alerts-observability.apm.alerts*`, + }); + }); + + test('re-throws error when search throws error', async () => { + scopedClusterClient.search.mockRejectedValueOnce(new Error('something went wrong!')); + const ruleDataClient = new RuleDataClient(getRuleDataClientOptions({})); + const query = { query: { bool: { filter: { range: { '@timestamp': { gte: 0 } } } } } }; + const reader = ruleDataClient.getReader(); + + await expect( + reader.search({ + body: query, + }) + ).rejects.toThrowErrorMatchingInlineSnapshot(`"something went wrong!"`); + }); + + test('waits until cluster client is ready before getDynamicIndexPattern', async () => { + const ruleDataClient = new RuleDataClient( + getRuleDataClientOptions({ + waitUntilReadyForReading: new Promise((resolve) => + setTimeout(resolve, 3000, right(scopedClusterClient)) + ), + }) + ); + + const reader = ruleDataClient.getReader(); + expect(await reader.getDynamicIndexPattern()).toEqual({ + fields: ['foo'], + timeFieldName: '@timestamp', + title: '.alerts-observability.apm.alerts*', + }); + }); + + test('re-throws generic errors from getFieldsForWildcard', async () => { + getFieldsForWildcardMock.mockRejectedValueOnce(new Error('something went wrong!')); + const ruleDataClient = new RuleDataClient(getRuleDataClientOptions({})); + const reader = ruleDataClient.getReader(); + + await expect(reader.getDynamicIndexPattern()).rejects.toThrowErrorMatchingInlineSnapshot( + `"something went wrong!"` + ); + }); + + test('correct handles no_matching_indices errors from getFieldsForWildcard', async () => { + getFieldsForWildcardMock.mockRejectedValueOnce(createNoMatchingIndicesError([])); + const ruleDataClient = new RuleDataClient(getRuleDataClientOptions({})); + const reader = ruleDataClient.getReader(); + + expect(await reader.getDynamicIndexPattern()).toEqual({ + fields: [], + timeFieldName: '@timestamp', + title: '.alerts-observability.apm.alerts*', + }); + }); + + test('handles errors getting cluster client', async () => { + const ruleDataClient = new RuleDataClient( + getRuleDataClientOptions({ + waitUntilReadyForReading: Promise.resolve( + left(new Error('could not get cluster client')) + ), + }) + ); + + const query = { query: { bool: { filter: { range: { '@timestamp': { gte: 0 } } } } } }; + const reader = ruleDataClient.getReader(); + await expect( + reader.search({ + body: query, + }) + ).rejects.toThrowErrorMatchingInlineSnapshot(`"could not get cluster client"`); + + await expect(reader.getDynamicIndexPattern()).rejects.toThrowErrorMatchingInlineSnapshot( + `"could not get cluster client"` + ); + }); + }); + + describe('getWriter()', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('bulk()', () => { + test('logs debug and returns undefined if writing is disabled', async () => { + const ruleDataClient = new RuleDataClient( + getRuleDataClientOptions({ isWriteEnabled: false }) + ); + const writer = ruleDataClient.getWriter(); + + // Previously, a delay between calling getWriter() and using a writer function + // would cause an Unhandled promise rejection if there were any errors getting a writer + // Adding this delay in the tests to ensure this does not pop up again. + await delay(); + + expect(await writer.bulk({})).toEqual(undefined); + expect(mockLogger.debug).toHaveBeenCalledWith( + `Writing is disabled, bulk() will not write any data.` + ); + }); + + test('logs error, returns undefined and turns off writing if initialization error', async () => { + const ruleDataClient = new RuleDataClient( + getRuleDataClientOptions({ + waitUntilReadyForWriting: Promise.resolve( + left(new Error('could not get cluster client')) + ), + }) + ); + expect(ruleDataClient.isWriteEnabled()).toBe(true); + const writer = ruleDataClient.getWriter(); + + // Previously, a delay between calling getWriter() and using a writer function + // would cause an Unhandled promise rejection if there were any errors getting a writer + // Adding this delay in the tests to ensure this does not pop up again. + await delay(); + + expect(await writer.bulk({})).toEqual(undefined); + expect(mockLogger.error).toHaveBeenNthCalledWith( + 1, + new RuleDataWriterInitializationError( + 'index', + 'observability.apm', + new Error('could not get cluster client') + ) + ); + expect(mockLogger.error).toHaveBeenNthCalledWith( + 2, + `The writer for the Rule Data Client for the observability.apm registration context was not initialized properly, bulk() cannot continue, and writing will be disabled.` + ); + expect(ruleDataClient.isWriteEnabled()).toBe(false); + }); + + test('logs error, returns undefined and turns off writing if resource installation error', async () => { + const error = new Error('bad resource installation'); + mockResourceInstaller.installAndUpdateNamespaceLevelResources.mockRejectedValueOnce(error); + const ruleDataClient = new RuleDataClient(getRuleDataClientOptions({})); + expect(ruleDataClient.isWriteEnabled()).toBe(true); + const writer = ruleDataClient.getWriter(); + + // Previously, a delay between calling getWriter() and using a writer function + // would cause an Unhandled promise rejection if there were any errors getting a writer + // Adding this delay in the tests to ensure this does not pop up again. + await delay(); + + expect(await writer.bulk({})).toEqual(undefined); + expect(mockLogger.error).toHaveBeenNthCalledWith( + 1, + new RuleDataWriterInitializationError('namespace', 'observability.apm', error) + ); + expect(mockLogger.error).toHaveBeenNthCalledWith( + 2, + `The writer for the Rule Data Client for the observability.apm registration context was not initialized properly, bulk() cannot continue, and writing will be disabled.` + ); + expect(ruleDataClient.isWriteEnabled()).toBe(false); + }); + + test('logs error and returns undefined if bulk function throws error', async () => { + const error = new Error('something went wrong!'); + scopedClusterClient.bulk.mockRejectedValueOnce(error); + const ruleDataClient = new RuleDataClient(getRuleDataClientOptions({})); + expect(ruleDataClient.isWriteEnabled()).toBe(true); + const writer = ruleDataClient.getWriter(); + + // Previously, a delay between calling getWriter() and using a writer function + // would cause an Unhandled promise rejection if there were any errors getting a writer + // Adding this delay in the tests to ensure this does not pop up again. + await delay(); + + expect(await writer.bulk({})).toEqual(undefined); + expect(mockLogger.error).toHaveBeenNthCalledWith(1, error); + expect(ruleDataClient.isWriteEnabled()).toBe(true); + }); + + test('waits until cluster client is ready before calling bulk', async () => { + const ruleDataClient = new RuleDataClient( + getRuleDataClientOptions({ + waitUntilReadyForWriting: new Promise((resolve) => + setTimeout(resolve, 3000, right(scopedClusterClient)) + ), + }) + ); + + const writer = ruleDataClient.getWriter(); + // Previously, a delay between calling getWriter() and using a writer function + // would cause an Unhandled promise rejection if there were any errors getting a writer + // Adding this delay in the tests to ensure this does not pop up again. + await delay(); + + const response = await writer.bulk({}); + + expect(response).toEqual({ + body: {}, + headers: { + 'x-elastic-product': 'Elasticsearch', + }, + meta: {}, + statusCode: 200, + warnings: [], + }); + + expect(scopedClusterClient.bulk).toHaveBeenCalledWith( + { + index: `.alerts-observability.apm.alerts-default`, + require_alias: true, + }, + { meta: true } + ); + }); + }); + }); +}); diff --git a/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.ts b/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.ts index 491c9ff22d21f..6fe9d43ddbee0 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.ts @@ -18,12 +18,12 @@ import { RuleDataWriterInitializationError, } from '../rule_data_plugin_service/errors'; import { IndexInfo } from '../rule_data_plugin_service/index_info'; -import { ResourceInstaller } from '../rule_data_plugin_service/resource_installer'; +import { IResourceInstaller } from '../rule_data_plugin_service/resource_installer'; import { IRuleDataClient, IRuleDataReader, IRuleDataWriter } from './types'; -interface ConstructorOptions { +export interface RuleDataClientConstructorOptions { indexInfo: IndexInfo; - resourceInstaller: ResourceInstaller; + resourceInstaller: IResourceInstaller; isWriteEnabled: boolean; isWriterCacheEnabled: boolean; waitUntilReadyForReading: Promise; @@ -40,7 +40,7 @@ export class RuleDataClient implements IRuleDataClient { // Writers cached by namespace private writerCache: Map; - constructor(private readonly options: ConstructorOptions) { + constructor(private readonly options: RuleDataClientConstructorOptions) { this.writeEnabled = this.options.isWriteEnabled; this.writerCacheEnabled = this.options.isWriterCacheEnabled; this.writerCache = new Map(); @@ -181,43 +181,46 @@ export class RuleDataClient implements IRuleDataClient { } }; - const prepareForWritingResult = prepareForWriting(); + const prepareForWritingResult = prepareForWriting().catch((error) => { + if (error instanceof RuleDataWriterInitializationError) { + this.options.logger.error(error); + this.options.logger.error( + `The writer for the Rule Data Client for the ${indexInfo.indexOptions.registrationContext} registration context was not initialized properly, bulk() cannot continue, and writing will be disabled.` + ); + turnOffWrite(); + } else if (error instanceof RuleDataWriteDisabledError) { + this.options.logger.debug(`Writing is disabled, bulk() will not write any data.`); + } + return undefined; + }); return { bulk: async (request: estypes.BulkRequest) => { - return prepareForWritingResult - .then((clusterClient) => { + try { + const clusterClient = await prepareForWritingResult; + if (clusterClient) { const requestWithDefaultParameters = { ...request, require_alias: true, index: alias, }; - return clusterClient - .bulk(requestWithDefaultParameters, { meta: true }) - .then((response) => { - if (response.body.errors) { - const error = new errors.ResponseError(response); - this.options.logger.error(error); - } - return response; - }); - }) - .catch((error) => { - if (error instanceof RuleDataWriterInitializationError) { - this.options.logger.error(error); - this.options.logger.error( - `The writer for the Rule Data Client for the ${indexInfo.indexOptions.registrationContext} registration context was not initialized properly, bulk() cannot continue, and writing will be disabled.` - ); - turnOffWrite(); - } else if (error instanceof RuleDataWriteDisabledError) { - this.options.logger.debug(`Writing is disabled, bulk() will not write any data.`); - } else { + const response = await clusterClient.bulk(requestWithDefaultParameters, { meta: true }); + + if (response.body.errors) { + const error = new errors.ResponseError(response); this.options.logger.error(error); } + return response; + } else { + this.options.logger.debug(`Writing is disabled, bulk() will not write any data.`); + } + return undefined; + } catch (error) { + this.options.logger.error(error); - return undefined; - }); + return undefined; + } }, }; } diff --git a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.mock.ts b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.mock.ts index 0b3940b936424..6e84f569d481c 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.mock.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.mock.ts @@ -5,11 +5,11 @@ * 2.0. */ import type { PublicMethodsOf } from '@kbn/utility-types'; -import { ResourceInstaller } from './resource_installer'; +import { IResourceInstaller, ResourceInstaller } from './resource_installer'; type Schema = PublicMethodsOf; export type ResourceInstallerMock = jest.Mocked; -const createResourceInstallerMock = () => { +const createResourceInstallerMock = (): jest.Mocked => { return { installCommonResources: jest.fn(), installIndexLevelResources: jest.fn(), diff --git a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts index 8e7d13b0dc210..ab7bc28af8c13 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts @@ -10,6 +10,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { ElasticsearchClient, Logger } from 'kibana/server'; +import { PublicMethodsOf } from '@kbn/utility-types'; import { DEFAULT_ILM_POLICY_ID, ECS_COMPONENT_TEMPLATE_NAME, @@ -31,6 +32,7 @@ interface ConstructorOptions { disabledRegistrationContexts: string[]; } +export type IResourceInstaller = PublicMethodsOf; export class ResourceInstaller { constructor(private readonly options: ConstructorOptions) {} diff --git a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/rule_data_plugin_service.ts b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/rule_data_plugin_service.ts index 126be5c6d2972..b916091510319 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/rule_data_plugin_service.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/rule_data_plugin_service.ts @@ -14,7 +14,7 @@ import { INDEX_PREFIX } from '../config'; import { IRuleDataClient, RuleDataClient, WaitResult } from '../rule_data_client'; import { IndexInfo } from './index_info'; import { Dataset, IndexOptions } from './index_options'; -import { ResourceInstaller } from './resource_installer'; +import { IResourceInstaller, ResourceInstaller } from './resource_installer'; import { joinWithDash } from './utils'; /** @@ -89,7 +89,7 @@ interface ConstructorOptions { export class RuleDataService implements IRuleDataService { private readonly indicesByBaseName: Map; private readonly indicesByFeatureId: Map; - private readonly resourceInstaller: ResourceInstaller; + private readonly resourceInstaller: IResourceInstaller; private installCommonResources: Promise>; private isInitialized: boolean; From 4404a606859cbd0c110aa58da71b10d9c66126da Mon Sep 17 00:00:00 2001 From: Quynh Nguyen <43350163+qn895@users.noreply.github.com> Date: Wed, 2 Mar 2022 15:59:26 -0600 Subject: [PATCH 21/37] Disable field name option if doesn't exist in docs (#126519) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../multi_select_picker.tsx | 25 +++++++++++++++++-- .../search_panel/field_name_filter.tsx | 2 ++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/multi_select_picker/multi_select_picker.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/multi_select_picker/multi_select_picker.tsx index 8b95296b5f823..24523450a0e7d 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/multi_select_picker/multi_select_picker.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/multi_select_picker/multi_select_picker.tsx @@ -15,13 +15,16 @@ import { EuiPopoverTitle, EuiSpacer, } from '@elastic/eui'; -import React, { FC, ReactNode, useEffect, useState } from 'react'; +import React, { FC, ReactNode, useEffect, useMemo, useState } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; +import { euiDarkVars as euiThemeDark, euiLightVars as euiThemeLight } from '@kbn/ui-theme'; +import { useDataVisualizerKibana } from '../../../kibana_context'; export interface Option { name?: string | ReactNode; value: string; checked?: 'on' | 'off'; + disabled?: boolean; } const NoFilterItems = () => { @@ -41,6 +44,15 @@ const NoFilterItems = () => { ); }; +export function useCurrentEuiTheme() { + const { services } = useDataVisualizerKibana(); + const uiSettings = services.uiSettings; + return useMemo( + () => (uiSettings.get('theme:darkMode') ? euiThemeDark : euiThemeLight), + [uiSettings] + ); +} + export const MultiSelectPicker: FC<{ options: Option[]; onChange?: (items: string[]) => void; @@ -48,6 +60,8 @@ export const MultiSelectPicker: FC<{ checkedOptions: string[]; dataTestSubj: string; }> = ({ options, onChange, title, checkedOptions, dataTestSubj }) => { + const euiTheme = useCurrentEuiTheme(); + const [items, setItems] = useState(options); const [searchTerm, setSearchTerm] = useState(''); @@ -68,6 +82,7 @@ export const MultiSelectPicker: FC<{ const closePopover = () => { setIsPopoverOpen(false); + setSearchTerm(''); }; const handleOnChange = (index: number) => { @@ -126,7 +141,13 @@ export const MultiSelectPicker: FC<{ checked={checked ? 'on' : undefined} key={index} onClick={() => handleOnChange(index)} - style={{ flexDirection: 'row' }} + style={{ + flexDirection: 'row', + color: + item.disabled === true + ? euiTheme.euiColorDisabledText + : euiTheme.euiTextColor, + }} data-test-subj={`${dataTestSubj}-option-${item.value}${ checked ? '-checked' : '' }`} diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/field_name_filter.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/field_name_filter.tsx index 634bf25dbc8a0..c2d0e5d61402d 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/field_name_filter.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/field_name_filter.tsx @@ -35,6 +35,8 @@ export const DataVisualizerFieldNamesFilter: FC = ({ field.fieldName !== undefined ) { options.push({ value: field.fieldName }); + } else { + options.push({ value: field.fieldName, disabled: true }); } }); } From fc6897c17bf2356cf382d273f7be2b8e83c87626 Mon Sep 17 00:00:00 2001 From: Tobias Stadler Date: Wed, 2 Mar 2022 23:40:34 +0100 Subject: [PATCH 22/37] Fixed some typos (#125802) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Kaarina Tungseth --- docs/api/saved-objects/resolve_import_errors.asciidoc | 2 +- .../resolve_copy_saved_objects_conflicts.asciidoc | 2 +- docs/api/upgrade-assistant/default-field.asciidoc | 2 +- docs/apm/service-maps.asciidoc | 2 +- .../architecture/kibana-platform-plugin-api.asciidoc | 2 +- docs/developer/best-practices/typescript.asciidoc | 2 +- docs/developer/contributing/development-ci-metrics.asciidoc | 2 +- .../contributing/development-documentation.asciidoc | 2 +- .../contributing/interpreting-ci-failures.asciidoc | 2 +- docs/setup/connect-to-elasticsearch.asciidoc | 2 +- .../task-manager-production-considerations.asciidoc | 2 +- .../task-manager-troubleshooting.asciidoc | 6 +++--- 12 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/api/saved-objects/resolve_import_errors.asciidoc b/docs/api/saved-objects/resolve_import_errors.asciidoc index 7a57e03875e35..162e9589e4f9e 100644 --- a/docs/api/saved-objects/resolve_import_errors.asciidoc +++ b/docs/api/saved-objects/resolve_import_errors.asciidoc @@ -25,7 +25,7 @@ To resolve errors, you can: ==== Path parameters `space_id`:: - (Optional, string) An identifier for the <>. When `space_id` is unspecfied in the URL, the default space is used. + (Optional, string) An identifier for the <>. When `space_id` is unspecified in the URL, the default space is used. [[saved-objects-api-resolve-import-errors-query-params]] ==== Query parameters diff --git a/docs/api/spaces-management/resolve_copy_saved_objects_conflicts.asciidoc b/docs/api/spaces-management/resolve_copy_saved_objects_conflicts.asciidoc index d79df2c085b19..9d26f9656d3f6 100644 --- a/docs/api/spaces-management/resolve_copy_saved_objects_conflicts.asciidoc +++ b/docs/api/spaces-management/resolve_copy_saved_objects_conflicts.asciidoc @@ -68,7 +68,7 @@ Execute the <>, w `id`:::: (Required, string) The saved object ID. `overwrite`:::: - (Required, boolean) When set to `true`, the saved object from the source space (desigated by the <>) overwrites the conflicting object in the destination space. When set to `false`, this does nothing. + (Required, boolean) When set to `true`, the saved object from the source space (designated by the <>) overwrites the conflicting object in the destination space. When set to `false`, this does nothing. `destinationId`:::: (Optional, string) Specifies the destination ID that the copied object should have, if different from the current ID. `ignoreMissingReferences`::: diff --git a/docs/api/upgrade-assistant/default-field.asciidoc b/docs/api/upgrade-assistant/default-field.asciidoc index 8bdcd359d5668..bbe44d894963b 100644 --- a/docs/api/upgrade-assistant/default-field.asciidoc +++ b/docs/api/upgrade-assistant/default-field.asciidoc @@ -26,7 +26,7 @@ GET /api/upgrade_assistant/add_query_default_field/myIndex // KIBANA <1> A required array of {es} field types that generate the list of fields. -<2> An optional array of additional field names, dot-deliminated. +<2> An optional array of additional field names, dot-delimited. To add the `index.query.default_field` index setting to the specified index, {kib} generates an array of all fields from the index mapping. The fields contain the types specified in `fieldTypes`. {kib} appends any other fields specified in `otherFields` to the array of default fields. diff --git a/docs/apm/service-maps.asciidoc b/docs/apm/service-maps.asciidoc index f76b9976dd1d2..8a2beef22b6bd 100644 --- a/docs/apm/service-maps.asciidoc +++ b/docs/apm/service-maps.asciidoc @@ -84,7 +84,7 @@ image:apm/images/red-service.png[APM red service]:: Max anomaly score **≥75**. [role="screenshot"] image::apm/images/apm-service-map-anomaly.png[Example view of anomaly scores on service maps in the APM app] -If an anomaly has been detected, click *view anomalies* to view the anomaly detection metric viewier in the Machine learning app. +If an anomaly has been detected, click *view anomalies* to view the anomaly detection metric viewer in the Machine learning app. This time series analysis will display additional details on the severity and time of the detected anomalies. To learn how to create a machine learning job, see <>. diff --git a/docs/developer/architecture/kibana-platform-plugin-api.asciidoc b/docs/developer/architecture/kibana-platform-plugin-api.asciidoc index 2005a90bb87bb..9cf60cda76f75 100644 --- a/docs/developer/architecture/kibana-platform-plugin-api.asciidoc +++ b/docs/developer/architecture/kibana-platform-plugin-api.asciidoc @@ -221,7 +221,7 @@ These are the contracts exposed by the core services for each lifecycle: [cols=",,",options="header",] |=== |lifecycle |server contract|browser contract -|_contructor_ +|_constructor_ |{kib-repo}blob/{branch}/docs/development/core/server/kibana-plugin-core-server.plugininitializercontext.md[PluginInitializerContext] |{kib-repo}blob/{branch}/docs/development/core/public/kibana-plugin-core-public.plugininitializercontext.md[PluginInitializerContext] diff --git a/docs/developer/best-practices/typescript.asciidoc b/docs/developer/best-practices/typescript.asciidoc index 2631ee717c3d5..92b6818a09865 100644 --- a/docs/developer/best-practices/typescript.asciidoc +++ b/docs/developer/best-practices/typescript.asciidoc @@ -51,7 +51,7 @@ Additionally, in order to migrate into project refs, you also need to make sure ], "references": [ { "path": "../../core/tsconfig.json" }, - // add references to other TypeScript projects your plugin dependes on + // add references to other TypeScript projects your plugin depends on ] } ---- diff --git a/docs/developer/contributing/development-ci-metrics.asciidoc b/docs/developer/contributing/development-ci-metrics.asciidoc index 3a133e64ea528..2905bd72a501f 100644 --- a/docs/developer/contributing/development-ci-metrics.asciidoc +++ b/docs/developer/contributing/development-ci-metrics.asciidoc @@ -137,4 +137,4 @@ If you only want to run the build once you can run: node scripts/build_kibana_platform_plugins --validate-limits --focus {pluginId} ----------- -This command needs to apply production optimizations to get the right sizes, which means that the optimizer will take significantly longer to run and on most developmer machines will consume all of your machines resources for 20 minutes or more. If you'd like to multi-task while this is running you might need to limit the number of workers using the `--max-workers` flag. \ No newline at end of file +This command needs to apply production optimizations to get the right sizes, which means that the optimizer will take significantly longer to run and on most developer machines will consume all of your machines resources for 20 minutes or more. If you'd like to multi-task while this is running you might need to limit the number of workers using the `--max-workers` flag. \ No newline at end of file diff --git a/docs/developer/contributing/development-documentation.asciidoc b/docs/developer/contributing/development-documentation.asciidoc index 7137d5bad051c..801d0527cc2b7 100644 --- a/docs/developer/contributing/development-documentation.asciidoc +++ b/docs/developer/contributing/development-documentation.asciidoc @@ -31,7 +31,7 @@ node scripts/docs.js --open REST APIs should be documented using the following recommended formats: -* https://raw.githubusercontent.com/elastic/docs/master/shared/api-ref-ex.asciidoc[API doc templaate] +* https://raw.githubusercontent.com/elastic/docs/master/shared/api-ref-ex.asciidoc[API doc template] * https://raw.githubusercontent.com/elastic/docs/master/shared/api-definitions-ex.asciidoc[API object definition template] [discrete] diff --git a/docs/developer/contributing/interpreting-ci-failures.asciidoc b/docs/developer/contributing/interpreting-ci-failures.asciidoc index ffbe448d79a44..eead720f03c60 100644 --- a/docs/developer/contributing/interpreting-ci-failures.asciidoc +++ b/docs/developer/contributing/interpreting-ci-failures.asciidoc @@ -22,7 +22,7 @@ image::images/job_view.png[Jenkins job view showing a test failure] 1. *Git Changes:* the list of commits that were in this build which weren't in the previous build. For Pull Requests this list is calculated by comparing against the most recent Pull Request which was tested, it is not limited to build for this specific Pull Request, so it's not very useful. 2. *Test Results:* A link to the test results screen, and shortcuts to the failed tests. Functional tests capture and store the log output from each specific test, and make it visible at these links. For other test runners only the error message is visible and log output must be tracked down in the *Pipeline Steps*. 3. *Google Cloud Storage (GCS) Upload Report:* Link to the screen which lists out the artifacts uploaded to GCS during this job execution. -4. *Pipeline Steps:*: A breakdown of the pipline that was executed, along with individual log output for each step in the pipeline. +4. *Pipeline Steps:*: A breakdown of the pipeline that was executed, along with individual log output for each step in the pipeline. [discrete] === Viewing ciGroup/test Logs diff --git a/docs/setup/connect-to-elasticsearch.asciidoc b/docs/setup/connect-to-elasticsearch.asciidoc index 1d698e9087937..9e1ee62f093fe 100644 --- a/docs/setup/connect-to-elasticsearch.asciidoc +++ b/docs/setup/connect-to-elasticsearch.asciidoc @@ -55,7 +55,7 @@ https://www.elastic.co/guide/en/elasticsearch/client/index.html[{es} Client docu If you are running {kib} on our hosted {es} Service, click *View deployment details* on the *Integrations* view -to verify your {es} endpoint and Cloud ID, and create API keys for integestion. +to verify your {es} endpoint and Cloud ID, and create API keys for integration. [float] === Add sample data diff --git a/docs/user/production-considerations/task-manager-production-considerations.asciidoc b/docs/user/production-considerations/task-manager-production-considerations.asciidoc index 672c310f138e9..28c5f6e4f14c8 100644 --- a/docs/user/production-considerations/task-manager-production-considerations.asciidoc +++ b/docs/user/production-considerations/task-manager-production-considerations.asciidoc @@ -101,7 +101,7 @@ Scaling {kib} instances horizontally requires a higher degree of coordination, w A recommended strategy is to follow these steps: 1. Produce a <> as a guide to provisioning as many {kib} instances as needed. Include any growth in tasks that you predict experiencing in the near future, and a buffer to better address ad-hoc tasks. -2. After provisioning a deployment, assess whether the provisioned {kib} instances achieve the required throughput by evaluating the <> as described in <>. +2. After provisioning a deployment, assess whether the provisioned {kib} instances achieve the required throughput by evaluating the <> as described in <>. 3. If the throughput is insufficient, and {kib} instances exhibit low resource usage, incrementally scale vertically while <> the impact of these changes. 4. If the throughput is insufficient, and {kib} instances are exhibiting high resource usage, incrementally scale horizontally by provisioning new {kib} instances and reassess. diff --git a/docs/user/production-considerations/task-manager-troubleshooting.asciidoc b/docs/user/production-considerations/task-manager-troubleshooting.asciidoc index a22d46902f54c..606dd3c8a24ee 100644 --- a/docs/user/production-considerations/task-manager-troubleshooting.asciidoc +++ b/docs/user/production-considerations/task-manager-troubleshooting.asciidoc @@ -412,7 +412,7 @@ This assessment is based on the following: * Comparing the `last_successful_poll` to the `timestamp` (value of `2021-02-16T11:38:10.077Z`) at the root, where you can see the last polling cycle took place 1 second before the monitoring stats were exposed by the health monitoring API. * Comparing the `last_polling_delay` to the `timestamp` (value of `2021-02-16T11:38:10.077Z`) at the root, where you can see the last polling cycle delay took place 2 days ago, suggesting {kib} instances are not conflicting often. -* The `p50` of the `duration` shows that at least 50% of polling cycles take, at most, 13 millisconds to complete. +* The `p50` of the `duration` shows that at least 50% of polling cycles take, at most, 13 milliseconds to complete. * Evaluating the `result_frequency_percent_as_number`: ** 80% of the polling cycles completed without claiming any tasks (suggesting that there aren't any overdue tasks). ** 20% completed with Task Manager claiming tasks that were then executed. @@ -508,7 +508,7 @@ For details on achieving higher throughput by adjusting your scaling strategy, s Tasks run for too long, overrunning their schedule *Diagnosis*: -The <> theory analyzed a hypothetical scenario where both drift and load were unusually high. +The <> theory analyzed a hypothetical scenario where both drift and load were unusually high. Suppose an alternate scenario, where `drift` is high, but `load` is not, such as the following: @@ -688,7 +688,7 @@ Keep in mind that these stats give you a glimpse at a moment in time, and even t [[task-manager-health-evaluate-the-workload]] ===== Evaluate the Workload -Predicting the required throughput a deplyment might need to support Task Manager is difficult, as features can schedule an unpredictable number of tasks at a variety of scheduled cadences. +Predicting the required throughput a deployment might need to support Task Manager is difficult, as features can schedule an unpredictable number of tasks at a variety of scheduled cadences. <> provides statistics that make it easier to monitor the adequacy of the existing throughput. By evaluating the workload, the required throughput can be estimated, which is used when following the Task Manager <>. From d6f211bde845b24b347fa3a6db2be833163e508b Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Wed, 2 Mar 2022 17:42:58 -0500 Subject: [PATCH 23/37] Default to 0 when search result does not provide a took value (#126701) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../lib/wrap_scoped_cluster_client.test.ts | 33 +++++++++++++++++++ .../server/lib/wrap_scoped_cluster_client.ts | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.test.ts b/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.test.ts index 94daa0030cd60..15f5a37edb910 100644 --- a/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.test.ts +++ b/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.test.ts @@ -33,6 +33,10 @@ describe('wrapScopedClusterClient', () => { jest.useRealTimers(); }); + afterEach(() => { + jest.resetAllMocks(); + }); + test('searches with asInternalUser when specified', async () => { const scopedClusterClient = elasticsearchServiceMock.createScopedClusterClient(); const childClient = elasticsearchServiceMock.createElasticsearchClient(); @@ -119,6 +123,35 @@ describe('wrapScopedClusterClient', () => { ).rejects.toThrowErrorMatchingInlineSnapshot(`"something went wrong!"`); }); + test('handles empty search result object', async () => { + const scopedClusterClient = elasticsearchServiceMock.createScopedClusterClient(); + const childClient = elasticsearchServiceMock.createElasticsearchClient(); + + ( + scopedClusterClient.asInternalUser as unknown as jest.Mocked + ).child.mockReturnValue(childClient as unknown as Client); + const asInternalUserWrappedSearchFn = childClient.search; + // @ts-ignore incomplete return type + asInternalUserWrappedSearchFn.mockResolvedValue({}); + + const wrappedSearchClientFactory = createWrappedScopedClusterClientFactory({ + scopedClusterClient, + rule, + logger, + }); + + const wrappedSearchClient = wrappedSearchClientFactory.client(); + await wrappedSearchClient.asInternalUser.search(esQuery); + + expect(asInternalUserWrappedSearchFn).toHaveBeenCalledTimes(1); + expect(scopedClusterClient.asInternalUser.search).not.toHaveBeenCalled(); + expect(scopedClusterClient.asCurrentUser.search).not.toHaveBeenCalled(); + + const stats = wrappedSearchClientFactory.getMetrics(); + expect(stats.numSearches).toEqual(1); + expect(stats.esSearchDurationMs).toEqual(0); + }); + test('keeps track of number of queries', async () => { const scopedClusterClient = elasticsearchServiceMock.createScopedClusterClient(); const childClient = elasticsearchServiceMock.createElasticsearchClient(); diff --git a/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.ts b/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.ts index 00ee3302c88c5..dfe32a48ce438 100644 --- a/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.ts +++ b/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.ts @@ -158,7 +158,7 @@ function getWrappedSearchFn(opts: WrapEsClientOpts) { took = (result as SearchResponse).took; } - opts.logMetricsFn({ esSearchDuration: took, totalSearchDuration: durationMs }); + opts.logMetricsFn({ esSearchDuration: took ?? 0, totalSearchDuration: durationMs }); return result; } catch (e) { throw e; From 2f083bfcc715eb4d34a045e0264c3303fd2e8513 Mon Sep 17 00:00:00 2001 From: Chris Donaher Date: Wed, 2 Mar 2022 17:39:14 -0700 Subject: [PATCH 24/37] Add Internal Alert/Signal ID to Endpoint Alert telemetry (#126216) * Attach the internal signal_id to the endpoint alert to join with insights * Ensure we forward signal_id field properly * Don't think we need to explicitly define the field in the top-level since it satisfies the key:string * Updated unit test to check for signal id enrichment * Addressed some comments about alert_id enrichment * Refactored send_telemetry_events to be more performant and idiomatic * Added test cases with a non-matching enrichment or non-existing enrichment * Broke some tests that don't assume QueueTelemetryEvents are endpoint.alerts * my types were still off * Addressed comments to use more idiomatic 'toString' function * Fixed 'Cannot access signalIdMap before initialization name' in reduce by instatiating map prior to reduce Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../signals/search_after_bulk_create.ts | 8 +- .../signals/send_telemetry_events.test.ts | 76 ++++++++++++++++++- .../signals/send_telemetry_events.ts | 40 +++++++++- .../server/lib/telemetry/filters.ts | 1 + .../server/lib/telemetry/sender.test.ts | 2 + .../server/lib/telemetry/types.ts | 4 + 6 files changed, 123 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts index f8270c53b07ae..99230627cb6b8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts @@ -176,7 +176,13 @@ export const searchAfterAndBulkCreate = async ({ buildRuleMessage(`enrichedEvents.hits.hits: ${enrichedEvents.hits.hits.length}`) ); - sendAlertTelemetryEvents(logger, eventsTelemetry, enrichedEvents, buildRuleMessage); + sendAlertTelemetryEvents( + logger, + eventsTelemetry, + enrichedEvents, + createdItems, + buildRuleMessage + ); } if (!hasSortId) { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/send_telemetry_events.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/send_telemetry_events.test.ts index 991378983e1b2..36bb90936620b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/send_telemetry_events.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/send_telemetry_events.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { selectEvents } from './send_telemetry_events'; +import { selectEvents, enrichEndpointAlertsSignalID } from './send_telemetry_events'; describe('sendAlertTelemetry', () => { it('selectEvents', () => { @@ -33,6 +33,9 @@ describe('sendAlertTelemetry', () => { data_stream: { dataset: 'endpoint.events', }, + event: { + id: 'foo', + }, }, }, { @@ -47,6 +50,9 @@ describe('sendAlertTelemetry', () => { dataset: 'endpoint.alerts', other: 'x', }, + event: { + id: 'bar', + }, }, }, { @@ -58,13 +64,52 @@ describe('sendAlertTelemetry', () => { '@timestamp': 'x', key3: 'hello', data_stream: {}, + event: { + id: 'baz', + }, + }, + }, + { + _index: 'y', + _type: 'y', + _id: 'y', + _score: 0, + _source: { + '@timestamp': 'y', + key3: 'hello', + data_stream: { + dataset: 'endpoint.alerts', + other: 'y', + }, + event: { + id: 'not-in-map', + }, + }, + }, + { + _index: 'z', + _type: 'z', + _id: 'z', + _score: 0, + _source: { + '@timestamp': 'z', + key3: 'no-event-id', + data_stream: { + dataset: 'endpoint.alerts', + other: 'z', + }, }, }, ], }, }; - - const sources = selectEvents(filteredEvents); + const joinMap = new Map([ + ['foo', '1234'], + ['bar', 'abcd'], + ['baz', '4567'], + ]); + const subsetEvents = selectEvents(filteredEvents); + const sources = enrichEndpointAlertsSignalID(subsetEvents, joinMap); expect(sources).toStrictEqual([ { '@timestamp': 'x', @@ -73,6 +118,31 @@ describe('sendAlertTelemetry', () => { dataset: 'endpoint.alerts', other: 'x', }, + event: { + id: 'bar', + }, + signal_id: 'abcd', + }, + { + '@timestamp': 'y', + key3: 'hello', + data_stream: { + dataset: 'endpoint.alerts', + other: 'y', + }, + event: { + id: 'not-in-map', + }, + signal_id: undefined, + }, + { + '@timestamp': 'z', + key3: 'no-event-id', + data_stream: { + dataset: 'endpoint.alerts', + other: 'z', + }, + signal_id: undefined, }, ]); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/send_telemetry_events.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/send_telemetry_events.ts index 5904f943183c3..fc3aed36939cd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/send_telemetry_events.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/send_telemetry_events.ts @@ -11,14 +11,17 @@ import { BuildRuleMessage } from './rule_messages'; import { SignalSearchResponse, SignalSource } from './types'; import { Logger } from '../../../../../../../src/core/server'; -export interface SearchResultWithSource { +interface SearchResultSource { _source: SignalSource; } +type CreatedSignalId = string; +type AlertId = string; + export function selectEvents(filteredEvents: SignalSearchResponse): TelemetryEvent[] { // @ts-expect-error @elastic/elasticsearch _source is optional const sources: TelemetryEvent[] = filteredEvents.hits.hits.map(function ( - obj: SearchResultWithSource + obj: SearchResultSource ): TelemetryEvent { return obj._source; }); @@ -27,20 +30,49 @@ export function selectEvents(filteredEvents: SignalSearchResponse): TelemetryEve return sources.filter((obj: TelemetryEvent) => obj.data_stream?.dataset === 'endpoint.alerts'); } +export function enrichEndpointAlertsSignalID( + events: TelemetryEvent[], + signalIdMap: Map +): TelemetryEvent[] { + return events.map(function (obj: TelemetryEvent): TelemetryEvent { + obj.signal_id = undefined; + if (obj?.event?.id !== undefined) { + obj.signal_id = signalIdMap.get(obj.event.id); + } + return obj; + }); +} + export function sendAlertTelemetryEvents( logger: Logger, eventsTelemetry: ITelemetryEventsSender | undefined, filteredEvents: SignalSearchResponse, + createdEvents: SignalSource[], buildRuleMessage: BuildRuleMessage ) { if (eventsTelemetry === undefined) { return; } - const sources = selectEvents(filteredEvents); + let selectedEvents = selectEvents(filteredEvents); + if (selectedEvents.length > 0) { + // Create map of ancenstor_id -> alert_id + let signalIdMap = new Map(); + /* eslint-disable no-param-reassign */ + signalIdMap = createdEvents.reduce((signalMap, obj) => { + const ancestorId = obj['kibana.alert.original_event.id']?.toString(); + const alertId = obj._id?.toString(); + if (ancestorId !== null && ancestorId !== undefined && alertId !== undefined) { + signalMap = signalIdMap.set(ancestorId, alertId); + } + + return signalMap; + }, new Map()); + selectedEvents = enrichEndpointAlertsSignalID(selectedEvents, signalIdMap); + } try { - eventsTelemetry.queueTelemetryEvents(sources); + eventsTelemetry.queueTelemetryEvents(selectedEvents); } catch (exc) { logger.error(buildRuleMessage(`[-] queing telemetry events failed ${exc}`)); } diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/filters.ts b/x-pack/plugins/security_solution/server/lib/telemetry/filters.ts index 452717f1efb4f..bd41bc454e876 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/filters.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/filters.ts @@ -108,6 +108,7 @@ const allowlistBaseEventFields: AllowlistFields = { export const allowlistEventFields: AllowlistFields = { _id: true, '@timestamp': true, + signal_id: true, agent: true, Endpoint: true, /* eslint-disable @typescript-eslint/naming-convention */ diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/sender.test.ts b/x-pack/plugins/security_solution/server/lib/telemetry/sender.test.ts index 70852aa3093c6..d055f3843d479 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/sender.test.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/sender.test.ts @@ -35,6 +35,7 @@ describe('TelemetryEventsSender', () => { { event: { kind: 'alert', + id: 'test', }, dns: { question: { @@ -108,6 +109,7 @@ describe('TelemetryEventsSender', () => { { event: { kind: 'alert', + id: 'test', }, dns: { question: { diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/types.ts b/x-pack/plugins/security_solution/server/lib/telemetry/types.ts index 35b701552b6ba..35b531ae6941c 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/types.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/types.ts @@ -58,6 +58,10 @@ export interface TelemetryEvent { }; }; license?: ESLicense; + event?: { + id?: string; + kind?: string; + }; } // EP Policy Response From 8e7a7925f215617a0023971d70b1d346dc09619c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 2 Mar 2022 22:25:57 -0500 Subject: [PATCH 25/37] Update dependency chromedriver to ^98.0.1 (main) (#126724) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index fdb358c25fb83..bfd4c07a8fd23 100644 --- a/package.json +++ b/package.json @@ -737,7 +737,7 @@ "callsites": "^3.1.0", "chai": "3.5.0", "chance": "1.0.18", - "chromedriver": "^98.0.0", + "chromedriver": "^98.0.1", "clean-webpack-plugin": "^3.0.0", "cmd-shim": "^2.1.0", "compression-webpack-plugin": "^4.0.0", diff --git a/yarn.lock b/yarn.lock index 1994a2f42e4a5..ee914de59b4b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10754,10 +10754,10 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -chromedriver@^98.0.0: - version "98.0.0" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-98.0.0.tgz#b2c3c1941fad4cdfadad5d4c46923e02f089fd30" - integrity sha512-Oi6Th5teK+VI4nti+423/dFkENYHEMOdUvqwJHzOaNwXqLwZ8FuSaKBybgALCctGapwJbd+tmPv3qSd6tUUIHQ== +chromedriver@^98.0.1: + version "98.0.1" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-98.0.1.tgz#ccb1e36a003b4c6af0b184caa00fca8370d88f2a" + integrity sha512-/04KkHHE/K/lfwdPTQr5fxi1dWvM83p8T/IkYbyGK2PBlH7K49Dd71A9jrS+aWgXlZYkuHhbwiy2PA2QqZ5qQw== dependencies: "@testim/chrome-version" "^1.1.2" axios "^0.24.0" From d5416ed4aeed0bc19f4016aa5a4b63d911393f1b Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Thu, 3 Mar 2022 10:57:38 +0200 Subject: [PATCH 26/37] APM execution context - app, page, entitiy id (#124996) * Client side execution app level context propagation * context$ + apm rum integration * invert the context parent \ child relationship (cc @mikhail) move more things to top level context * Pass down context to apm on server * types * eslint * parent <> child * docs + eslint + jest * execution context mock * eslint * jest * jest * server jest * check * jest * storybook * jest * report the current space * fix server side context container * Remove spaces for now * docssss * jest * lint * test * docs * revert file * doc * all context params are optional * clear on page change * lint * ts * skipped test again * testing fixes * oops * code review #1 * code review #2 * getAsLabels * maps inherit dashboard context * docs * ts * Give common context to all vis editors * fix test * ts \ es \ tests * labels * missing types * docsy docs * cr #3 * improve jest * Use editor name * Update src/plugins/visualizations/public/visualize_app/components/visualize_editor.tsx Co-authored-by: Marco Liberati * fix maps context * jest tests for maps * cr * docs * Update execution_context.test.ts * docs * lint Co-authored-by: Marco Liberati --- ...-core-public.coresetup.executioncontext.md | 13 ++ .../kibana-plugin-core-public.coresetup.md | 1 + ...-core-public.corestart.executioncontext.md | 13 ++ .../kibana-plugin-core-public.corestart.md | 1 + ...core-public.executioncontextsetup.clear.md | 17 +++ ...e-public.executioncontextsetup.context_.md | 13 ++ ...n-core-public.executioncontextsetup.get.md | 17 +++ ...ublic.executioncontextsetup.getaslabels.md | 17 +++ ...lugin-core-public.executioncontextsetup.md | 30 ++++ ...n-core-public.executioncontextsetup.set.md | 24 ++++ ...executioncontextsetup.withglobalcontext.md | 24 ++++ ...lugin-core-public.executioncontextstart.md | 13 ++ ...ugin-core-public.kibanaexecutioncontext.md | 7 +- .../core/public/kibana-plugin-core-public.md | 2 + ...erver.executioncontextsetup.getaslabels.md | 15 ++ ...lugin-core-server.executioncontextsetup.md | 1 + ...ugin-core-server.kibanaexecutioncontext.md | 7 +- src/core/public/apm_system.test.ts | 4 + src/core/public/apm_system.ts | 12 ++ src/core/public/core_system.ts | 19 ++- .../execution_context_service.mock.ts | 35 +++++ .../execution_context_service.ts | 134 ++++++++++++++++++ src/core/public/execution_context/index.ts | 2 + src/core/public/http/fetch.test.ts | 40 +++++- src/core/public/http/fetch.ts | 8 +- src/core/public/http/http_service.test.ts | 10 +- src/core/public/http/http_service.ts | 7 +- src/core/public/index.ts | 11 +- src/core/public/mocks.ts | 3 + src/core/public/plugins/plugin_context.ts | 2 + .../public/plugins/plugins_service.test.ts | 3 + src/core/public/public.api.md | 28 +++- .../execution_context_container.ts | 5 +- .../execution_context_service.mock.ts | 2 + .../execution_context_service.ts | 23 +++ src/core/server/http/http_server.ts | 7 +- src/core/server/plugins/plugin_context.ts | 1 + src/core/server/server.api.md | 10 +- src/core/test_helpers/http_test_setup.ts | 4 +- src/core/types/execution_context.ts | 10 +- .../public/application/dashboard_app.tsx | 8 +- .../hooks/use_dashboard_app_state.ts | 4 - .../application/listing/dashboard_listing.tsx | 6 + .../search_interceptor.test.ts | 8 +- .../search_interceptor/search_interceptor.ts | 7 +- .../data/public/search/search_service.ts | 3 +- .../data/server/search/routes/bsearch.ts | 10 +- src/plugins/dev_tools/public/application.tsx | 16 ++- src/plugins/dev_tools/public/plugin.ts | 3 +- .../application/context/context_app.test.tsx | 3 + .../application/context/context_app.tsx | 9 +- .../application/doc/single_doc_route.tsx | 9 +- .../application/main/discover_main_route.tsx | 7 + .../main/utils/fetch_chart.test.ts | 6 +- .../application/main/utils/fetch_chart.ts | 4 - .../main/utils/fetch_documents.test.ts | 4 - .../application/main/utils/fetch_documents.ts | 4 - .../main/utils/fetch_total_hits.test.ts | 4 - .../main/utils/fetch_total_hits.ts | 4 - src/plugins/kibana_react/public/index.ts | 2 + .../public/use_execution_context/index.ts | 9 ++ .../use_execution_context.ts | 28 ++++ .../embeddable/visualize_embeddable.tsx | 16 +-- src/plugins/visualizations/public/plugin.ts | 2 + src/plugins/visualizations/public/services.ts | 4 + .../components/visualize_editor.tsx | 10 +- .../components/visualize_listing.tsx | 8 +- .../.storybook/context/execution_context.ts | 27 ++++ .../fleet/.storybook/context/index.tsx | 2 + .../__jest__/policy_table.test.tsx | 2 + x-pack/plugins/lens/public/app_plugin/app.tsx | 16 ++- .../lens/public/app_plugin/mounter.tsx | 1 + .../plugins/lens/public/app_plugin/types.ts | 2 + .../lens/public/mocks/services_mock.tsx | 1 + .../maps/common/execution_context.test.ts | 36 +++++ .../plugins/maps/common/execution_context.ts | 18 +-- .../es_geo_grid_source.test.ts | 15 +- x-pack/plugins/maps/public/kibana_services.ts | 1 + .../routes/list_page/maps_list_view.tsx | 7 + .../routes/map_page/map_app/map_app.tsx | 7 + x-pack/plugins/maps/public/util.test.js | 54 ++++++- x-pack/plugins/maps/public/util.ts | 30 +++- .../plugins/maps/server/mvt/get_grid_tile.ts | 5 +- x-pack/plugins/maps/server/mvt/get_tile.ts | 5 +- 84 files changed, 909 insertions(+), 113 deletions(-) create mode 100644 docs/development/core/public/kibana-plugin-core-public.coresetup.executioncontext.md create mode 100644 docs/development/core/public/kibana-plugin-core-public.corestart.executioncontext.md create mode 100644 docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.clear.md create mode 100644 docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.context_.md create mode 100644 docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.get.md create mode 100644 docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.getaslabels.md create mode 100644 docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.md create mode 100644 docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.set.md create mode 100644 docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.withglobalcontext.md create mode 100644 docs/development/core/public/kibana-plugin-core-public.executioncontextstart.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.executioncontextsetup.getaslabels.md create mode 100644 src/core/public/execution_context/execution_context_service.mock.ts create mode 100644 src/core/public/execution_context/execution_context_service.ts create mode 100644 src/plugins/kibana_react/public/use_execution_context/index.ts create mode 100644 src/plugins/kibana_react/public/use_execution_context/use_execution_context.ts create mode 100644 x-pack/plugins/fleet/.storybook/context/execution_context.ts create mode 100644 x-pack/plugins/maps/common/execution_context.test.ts diff --git a/docs/development/core/public/kibana-plugin-core-public.coresetup.executioncontext.md b/docs/development/core/public/kibana-plugin-core-public.coresetup.executioncontext.md new file mode 100644 index 0000000000000..be5689ad7b080 --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.coresetup.executioncontext.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [CoreSetup](./kibana-plugin-core-public.coresetup.md) > [executionContext](./kibana-plugin-core-public.coresetup.executioncontext.md) + +## CoreSetup.executionContext property + +[ExecutionContextSetup](./kibana-plugin-core-public.executioncontextsetup.md) + +Signature: + +```typescript +executionContext: ExecutionContextSetup; +``` diff --git a/docs/development/core/public/kibana-plugin-core-public.coresetup.md b/docs/development/core/public/kibana-plugin-core-public.coresetup.md index 9488b8a26b867..31793ec6f7a58 100644 --- a/docs/development/core/public/kibana-plugin-core-public.coresetup.md +++ b/docs/development/core/public/kibana-plugin-core-public.coresetup.md @@ -17,6 +17,7 @@ export interface CoreSetup + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [CoreStart](./kibana-plugin-core-public.corestart.md) > [executionContext](./kibana-plugin-core-public.corestart.executioncontext.md) + +## CoreStart.executionContext property + +[ExecutionContextStart](./kibana-plugin-core-public.executioncontextstart.md) + +Signature: + +```typescript +executionContext: ExecutionContextStart; +``` diff --git a/docs/development/core/public/kibana-plugin-core-public.corestart.md b/docs/development/core/public/kibana-plugin-core-public.corestart.md index ae67696e12501..edd80e1adb9f9 100644 --- a/docs/development/core/public/kibana-plugin-core-public.corestart.md +++ b/docs/development/core/public/kibana-plugin-core-public.corestart.md @@ -20,6 +20,7 @@ export interface CoreStart | [chrome](./kibana-plugin-core-public.corestart.chrome.md) | ChromeStart | [ChromeStart](./kibana-plugin-core-public.chromestart.md) | | [deprecations](./kibana-plugin-core-public.corestart.deprecations.md) | DeprecationsServiceStart | [DeprecationsServiceStart](./kibana-plugin-core-public.deprecationsservicestart.md) | | [docLinks](./kibana-plugin-core-public.corestart.doclinks.md) | DocLinksStart | [DocLinksStart](./kibana-plugin-core-public.doclinksstart.md) | +| [executionContext](./kibana-plugin-core-public.corestart.executioncontext.md) | ExecutionContextStart | [ExecutionContextStart](./kibana-plugin-core-public.executioncontextstart.md) | | [fatalErrors](./kibana-plugin-core-public.corestart.fatalerrors.md) | FatalErrorsStart | [FatalErrorsStart](./kibana-plugin-core-public.fatalerrorsstart.md) | | [http](./kibana-plugin-core-public.corestart.http.md) | HttpStart | [HttpStart](./kibana-plugin-core-public.httpstart.md) | | [i18n](./kibana-plugin-core-public.corestart.i18n.md) | I18nStart | [I18nStart](./kibana-plugin-core-public.i18nstart.md) | diff --git a/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.clear.md b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.clear.md new file mode 100644 index 0000000000000..94936b94d0710 --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.clear.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [ExecutionContextSetup](./kibana-plugin-core-public.executioncontextsetup.md) > [clear](./kibana-plugin-core-public.executioncontextsetup.clear.md) + +## ExecutionContextSetup.clear() method + +clears the context + +Signature: + +```typescript +clear(): void; +``` +Returns: + +void + diff --git a/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.context_.md b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.context_.md new file mode 100644 index 0000000000000..d6c74db6d603e --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.context_.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [ExecutionContextSetup](./kibana-plugin-core-public.executioncontextsetup.md) > [context$](./kibana-plugin-core-public.executioncontextsetup.context_.md) + +## ExecutionContextSetup.context$ property + +The current context observable + +Signature: + +```typescript +context$: Observable; +``` diff --git a/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.get.md b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.get.md new file mode 100644 index 0000000000000..65e9b1218649d --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.get.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [ExecutionContextSetup](./kibana-plugin-core-public.executioncontextsetup.md) > [get](./kibana-plugin-core-public.executioncontextsetup.get.md) + +## ExecutionContextSetup.get() method + +Get the current top level context + +Signature: + +```typescript +get(): KibanaExecutionContext; +``` +Returns: + +KibanaExecutionContext + diff --git a/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.getaslabels.md b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.getaslabels.md new file mode 100644 index 0000000000000..0f0bda4e2913e --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.getaslabels.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [ExecutionContextSetup](./kibana-plugin-core-public.executioncontextsetup.md) > [getAsLabels](./kibana-plugin-core-public.executioncontextsetup.getaslabels.md) + +## ExecutionContextSetup.getAsLabels() method + +returns apm labels + +Signature: + +```typescript +getAsLabels(): Labels; +``` +Returns: + +Labels + diff --git a/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.md b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.md new file mode 100644 index 0000000000000..01581d2e80a5c --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.md @@ -0,0 +1,30 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [ExecutionContextSetup](./kibana-plugin-core-public.executioncontextsetup.md) + +## ExecutionContextSetup interface + +Kibana execution context. Used to provide execution context to Elasticsearch, reporting, performance monitoring, etc. + +Signature: + +```typescript +export interface ExecutionContextSetup +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [context$](./kibana-plugin-core-public.executioncontextsetup.context_.md) | Observable<KibanaExecutionContext> | The current context observable | + +## Methods + +| Method | Description | +| --- | --- | +| [clear()](./kibana-plugin-core-public.executioncontextsetup.clear.md) | clears the context | +| [get()](./kibana-plugin-core-public.executioncontextsetup.get.md) | Get the current top level context | +| [getAsLabels()](./kibana-plugin-core-public.executioncontextsetup.getaslabels.md) | returns apm labels | +| [set(c$)](./kibana-plugin-core-public.executioncontextsetup.set.md) | Set the current top level context | +| [withGlobalContext(context)](./kibana-plugin-core-public.executioncontextsetup.withglobalcontext.md) | merges the current top level context with the specific event context | + diff --git a/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.set.md b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.set.md new file mode 100644 index 0000000000000..e3dcea78c827a --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.set.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [ExecutionContextSetup](./kibana-plugin-core-public.executioncontextsetup.md) > [set](./kibana-plugin-core-public.executioncontextsetup.set.md) + +## ExecutionContextSetup.set() method + +Set the current top level context + +Signature: + +```typescript +set(c$: KibanaExecutionContext): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| c$ | KibanaExecutionContext | | + +Returns: + +void + diff --git a/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.withglobalcontext.md b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.withglobalcontext.md new file mode 100644 index 0000000000000..574d0fd989750 --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.executioncontextsetup.withglobalcontext.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [ExecutionContextSetup](./kibana-plugin-core-public.executioncontextsetup.md) > [withGlobalContext](./kibana-plugin-core-public.executioncontextsetup.withglobalcontext.md) + +## ExecutionContextSetup.withGlobalContext() method + +merges the current top level context with the specific event context + +Signature: + +```typescript +withGlobalContext(context?: KibanaExecutionContext): KibanaExecutionContext; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| context | KibanaExecutionContext | | + +Returns: + +KibanaExecutionContext + diff --git a/docs/development/core/public/kibana-plugin-core-public.executioncontextstart.md b/docs/development/core/public/kibana-plugin-core-public.executioncontextstart.md new file mode 100644 index 0000000000000..0d210ba5bb1c4 --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.executioncontextstart.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [ExecutionContextStart](./kibana-plugin-core-public.executioncontextstart.md) + +## ExecutionContextStart type + +See [ExecutionContextSetup](./kibana-plugin-core-public.executioncontextsetup.md). + +Signature: + +```typescript +export declare type ExecutionContextStart = ExecutionContextSetup; +``` diff --git a/docs/development/core/public/kibana-plugin-core-public.kibanaexecutioncontext.md b/docs/development/core/public/kibana-plugin-core-public.kibanaexecutioncontext.md index 6266639b63976..d8f8a77d84b2f 100644 --- a/docs/development/core/public/kibana-plugin-core-public.kibanaexecutioncontext.md +++ b/docs/development/core/public/kibana-plugin-core-public.kibanaexecutioncontext.md @@ -10,9 +10,10 @@ Represents a meta-information about a Kibana entity initiating a search request. ```typescript export declare type KibanaExecutionContext = { - readonly type: string; - readonly name: string; - readonly id: string; + readonly type?: string; + readonly name?: string; + readonly page?: string; + readonly id?: string; readonly description?: string; readonly url?: string; child?: KibanaExecutionContext; diff --git a/docs/development/core/public/kibana-plugin-core-public.md b/docs/development/core/public/kibana-plugin-core-public.md index b51f5ed833fd3..fca697144a872 100644 --- a/docs/development/core/public/kibana-plugin-core-public.md +++ b/docs/development/core/public/kibana-plugin-core-public.md @@ -62,6 +62,7 @@ The plugin integrates with the core system via lifecycle events: `setup` | [DeprecationsServiceStart](./kibana-plugin-core-public.deprecationsservicestart.md) | DeprecationsService provides methods to fetch domain deprecation details from the Kibana server. | | [DocLinksStart](./kibana-plugin-core-public.doclinksstart.md) | | | [ErrorToastOptions](./kibana-plugin-core-public.errortoastoptions.md) | Options available for [IToasts](./kibana-plugin-core-public.itoasts.md) error APIs. | +| [ExecutionContextSetup](./kibana-plugin-core-public.executioncontextsetup.md) | Kibana execution context. Used to provide execution context to Elasticsearch, reporting, performance monitoring, etc. | | [FatalErrorInfo](./kibana-plugin-core-public.fatalerrorinfo.md) | Represents the message and stack of a fatal Error | | [FatalErrorsSetup](./kibana-plugin-core-public.fatalerrorssetup.md) | FatalErrors stop the Kibana Public Core and displays a fatal error screen with details about the Kibana build and the error. | | [HttpFetchOptions](./kibana-plugin-core-public.httpfetchoptions.md) | All options that may be used with a [HttpHandler](./kibana-plugin-core-public.httphandler.md). | @@ -160,6 +161,7 @@ The plugin integrates with the core system via lifecycle events: `setup` | [ChromeBreadcrumb](./kibana-plugin-core-public.chromebreadcrumb.md) | | | [ChromeHelpExtensionLinkBase](./kibana-plugin-core-public.chromehelpextensionlinkbase.md) | | | [ChromeHelpExtensionMenuLink](./kibana-plugin-core-public.chromehelpextensionmenulink.md) | | +| [ExecutionContextStart](./kibana-plugin-core-public.executioncontextstart.md) | See [ExecutionContextSetup](./kibana-plugin-core-public.executioncontextsetup.md). | | [FatalErrorsStart](./kibana-plugin-core-public.fatalerrorsstart.md) | FatalErrors stop the Kibana Public Core and displays a fatal error screen with details about the Kibana build and the error. | | [HttpStart](./kibana-plugin-core-public.httpstart.md) | See [HttpSetup](./kibana-plugin-core-public.httpsetup.md) | | [IToasts](./kibana-plugin-core-public.itoasts.md) | Methods for adding and removing global toast messages. See [ToastsApi](./kibana-plugin-core-public.toastsapi.md). | diff --git a/docs/development/core/server/kibana-plugin-core-server.executioncontextsetup.getaslabels.md b/docs/development/core/server/kibana-plugin-core-server.executioncontextsetup.getaslabels.md new file mode 100644 index 0000000000000..c8816a3deee4d --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.executioncontextsetup.getaslabels.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ExecutionContextSetup](./kibana-plugin-core-server.executioncontextsetup.md) > [getAsLabels](./kibana-plugin-core-server.executioncontextsetup.getaslabels.md) + +## ExecutionContextSetup.getAsLabels() method + +Signature: + +```typescript +getAsLabels(): apm.Labels; +``` +Returns: + +apm.Labels + diff --git a/docs/development/core/server/kibana-plugin-core-server.executioncontextsetup.md b/docs/development/core/server/kibana-plugin-core-server.executioncontextsetup.md index 24591648ad953..7fdc4d1ec1d57 100644 --- a/docs/development/core/server/kibana-plugin-core-server.executioncontextsetup.md +++ b/docs/development/core/server/kibana-plugin-core-server.executioncontextsetup.md @@ -15,5 +15,6 @@ export interface ExecutionContextSetup | Method | Description | | --- | --- | +| [getAsLabels()](./kibana-plugin-core-server.executioncontextsetup.getaslabels.md) | | | [withContext(context, fn)](./kibana-plugin-core-server.executioncontextsetup.withcontext.md) | Keeps track of execution context while the passed function is executed. Data are carried over all async operations spawned by the passed function. The nested calls stack the registered context on top of each other. | diff --git a/docs/development/core/server/kibana-plugin-core-server.kibanaexecutioncontext.md b/docs/development/core/server/kibana-plugin-core-server.kibanaexecutioncontext.md index 0d65a3662da6f..792af8f693869 100644 --- a/docs/development/core/server/kibana-plugin-core-server.kibanaexecutioncontext.md +++ b/docs/development/core/server/kibana-plugin-core-server.kibanaexecutioncontext.md @@ -10,9 +10,10 @@ Represents a meta-information about a Kibana entity initiating a search request. ```typescript export declare type KibanaExecutionContext = { - readonly type: string; - readonly name: string; - readonly id: string; + readonly type?: string; + readonly name?: string; + readonly page?: string; + readonly id?: string; readonly description?: string; readonly url?: string; child?: KibanaExecutionContext; diff --git a/src/core/public/apm_system.test.ts b/src/core/public/apm_system.test.ts index 842d5de7e5afc..0a3a1dee63e57 100644 --- a/src/core/public/apm_system.test.ts +++ b/src/core/public/apm_system.test.ts @@ -13,6 +13,7 @@ import type { Transaction } from '@elastic/apm-rum'; import { ApmSystem } from './apm_system'; import { Subject } from 'rxjs'; import { InternalApplicationStart } from './application/types'; +import { executionContextServiceMock } from './execution_context/execution_context_service.mock'; const initMock = init as jest.Mocked; const apmMock = apm as DeeplyMockedKeys; @@ -96,6 +97,7 @@ describe('ApmSystem', () => { application: { currentAppId$, } as any as InternalApplicationStart, + executionContext: executionContextServiceMock.createInternalStartContract(), }); expect(mark).toHaveBeenCalledWith('apm-start'); @@ -118,6 +120,7 @@ describe('ApmSystem', () => { application: { currentAppId$, } as any as InternalApplicationStart, + executionContext: executionContextServiceMock.createInternalStartContract(), }); currentAppId$.next('myapp'); @@ -145,6 +148,7 @@ describe('ApmSystem', () => { application: { currentAppId$, } as any as InternalApplicationStart, + executionContext: executionContextServiceMock.createInternalStartContract(), }); currentAppId$.next('myapp'); diff --git a/src/core/public/apm_system.ts b/src/core/public/apm_system.ts index 2231f394381f0..4e116c0a0182d 100644 --- a/src/core/public/apm_system.ts +++ b/src/core/public/apm_system.ts @@ -10,6 +10,7 @@ import type { ApmBase, AgentConfigOptions, Transaction } from '@elastic/apm-rum' import { modifyUrl } from '@kbn/std'; import { CachedResourceObserver } from './apm_resource_counter'; import type { InternalApplicationStart } from './application'; +import { ExecutionContextStart } from './execution_context'; /** "GET protocol://hostname:port/pathname" */ const HTTP_REQUEST_TRANSACTION_NAME_REGEX = @@ -27,6 +28,7 @@ interface ApmConfig extends AgentConfigOptions { interface StartDeps { application: InternalApplicationStart; + executionContext: ExecutionContextStart; } export class ApmSystem { @@ -34,6 +36,7 @@ export class ApmSystem { private pageLoadTransaction?: Transaction; private resourceObserver: CachedResourceObserver; private apm?: ApmBase; + /** * `apmConfig` would be populated with relevant APM RUM agent * configuration if server is started with elastic.apm.* config. @@ -64,6 +67,15 @@ export class ApmSystem { this.markPageLoadStart(); + start.executionContext.context$.subscribe((c) => { + // We're using labels because we want the context to be indexed + // https://www.elastic.co/guide/en/apm/get-started/current/metadata.html + const apmContext = start.executionContext.getAsLabels(); + this.apm?.addLabels(apmContext); + }); + + // TODO: Start a new transaction every page change instead of every app change. + /** * Register listeners for navigation changes and capture them as * route-change transactions after Kibana app is bootstrapped diff --git a/src/core/public/core_system.ts b/src/core/public/core_system.ts index 3d3331d54792b..1aa01c13dd375 100644 --- a/src/core/public/core_system.ts +++ b/src/core/public/core_system.ts @@ -31,6 +31,7 @@ import { DeprecationsService } from './deprecations'; import { ThemeService } from './theme'; import { CoreApp } from './core_app'; import type { InternalApplicationSetup, InternalApplicationStart } from './application/types'; +import { ExecutionContextService } from './execution_context'; interface Params { rootDomElement: HTMLElement; @@ -87,6 +88,7 @@ export class CoreSystem { private readonly theme: ThemeService; private readonly rootDomElement: HTMLElement; private readonly coreContext: CoreContext; + private readonly executionContext: ExecutionContextService; private fatalErrorsSetup: FatalErrorsSetup | null = null; constructor(params: Params) { @@ -121,6 +123,7 @@ export class CoreSystem { this.application = new ApplicationService(); this.integrations = new IntegrationsService(); this.deprecations = new DeprecationsService(); + this.executionContext = new ExecutionContextService(); this.plugins = new PluginsService(this.coreContext, injectedMetadata.uiPlugins); this.coreApp = new CoreApp(this.coreContext); @@ -137,7 +140,13 @@ export class CoreSystem { }); await this.integrations.setup(); this.docLinks.setup(); - const http = this.http.setup({ injectedMetadata, fatalErrors: this.fatalErrorsSetup }); + + const executionContext = this.executionContext.setup(); + const http = this.http.setup({ + injectedMetadata, + fatalErrors: this.fatalErrorsSetup, + executionContext, + }); const uiSettings = this.uiSettings.setup({ http, injectedMetadata }); const notifications = this.notifications.setup({ uiSettings }); const theme = this.theme.setup({ injectedMetadata }); @@ -153,6 +162,7 @@ export class CoreSystem { notifications, theme, uiSettings, + executionContext, }; // Services that do not expose contracts at setup @@ -201,6 +211,11 @@ export class CoreSystem { targetDomElement: notificationsTargetDomElement, }); const application = await this.application.start({ http, theme, overlays }); + + const executionContext = this.executionContext.start({ + curApp$: application.currentAppId$, + }); + const chrome = await this.chrome.start({ application, docLinks, @@ -216,6 +231,7 @@ export class CoreSystem { application, chrome, docLinks, + executionContext, http, theme, savedObjects, @@ -248,6 +264,7 @@ export class CoreSystem { return { application, + executionContext, }; } catch (error) { if (this.fatalErrorsSetup) { diff --git a/src/core/public/execution_context/execution_context_service.mock.ts b/src/core/public/execution_context/execution_context_service.mock.ts new file mode 100644 index 0000000000000..3941aa333cfa2 --- /dev/null +++ b/src/core/public/execution_context/execution_context_service.mock.ts @@ -0,0 +1,35 @@ +/* + * 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 { PublicMethodsOf } from '@kbn/utility-types'; +import { BehaviorSubject } from 'rxjs'; + +import { ExecutionContextService, ExecutionContextSetup } from './execution_context_service'; + +const createContractMock = (): jest.Mocked => ({ + context$: new BehaviorSubject({}), + clear: jest.fn(), + set: jest.fn(), + get: jest.fn(), + getAsLabels: jest.fn(), + withGlobalContext: jest.fn(), +}); + +const createMock = (): jest.Mocked> => ({ + setup: jest.fn().mockReturnValue(createContractMock()), + start: jest.fn().mockReturnValue(createContractMock()), + stop: jest.fn(), +}); + +export const executionContextServiceMock = { + create: createMock, + createSetupContract: createContractMock, + createStartContract: createContractMock, + createInternalSetupContract: createContractMock, + createInternalStartContract: createContractMock, +}; diff --git a/src/core/public/execution_context/execution_context_service.ts b/src/core/public/execution_context/execution_context_service.ts new file mode 100644 index 0000000000000..bf13a7351f9b5 --- /dev/null +++ b/src/core/public/execution_context/execution_context_service.ts @@ -0,0 +1,134 @@ +/* + * 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 { isEqual, isUndefined, omitBy } from 'lodash'; +import { BehaviorSubject, Observable, Subscription } from 'rxjs'; +import { CoreService, KibanaExecutionContext } from '../../types'; + +// Should be exported from elastic/apm-rum +export type LabelValue = string | number | boolean; + +export interface Labels { + [key: string]: LabelValue; +} + +/** + * Kibana execution context. + * Used to provide execution context to Elasticsearch, reporting, performance monitoring, etc. + * @public + **/ +export interface ExecutionContextSetup { + /** + * The current context observable + **/ + context$: Observable; + /** + * Set the current top level context + **/ + set(c$: KibanaExecutionContext): void; + /** + * Get the current top level context + **/ + get(): KibanaExecutionContext; + /** + * clears the context + **/ + clear(): void; + /** + * returns apm labels + **/ + getAsLabels(): Labels; + /** + * merges the current top level context with the specific event context + **/ + withGlobalContext(context?: KibanaExecutionContext): KibanaExecutionContext; +} + +/** + * See {@link ExecutionContextSetup}. + * @public + */ +export type ExecutionContextStart = ExecutionContextSetup; + +export interface StartDeps { + curApp$: Observable; +} + +/** @internal */ +export class ExecutionContextService + implements CoreService +{ + private context$: BehaviorSubject = new BehaviorSubject({}); + private appId?: string; + private subscription: Subscription = new Subscription(); + private contract?: ExecutionContextSetup; + + public setup() { + this.contract = { + context$: this.context$.asObservable(), + clear: () => { + this.context$.next({}); + }, + set: (c: KibanaExecutionContext) => { + const newVal = { + ...this.context$.value, + ...c, + }; + if (!isEqual(newVal, this.context$.value)) { + this.context$.next(newVal); + } + }, + get: () => { + return this.mergeContext(); + }, + getAsLabels: () => { + return this.removeUndefined({ + name: this.appId, + id: this.context$.value?.id, + page: this.context$.value?.page, + }) as Labels; + }, + withGlobalContext: (context: KibanaExecutionContext) => { + return this.mergeContext(context); + }, + }; + + return this.contract; + } + + public start({ curApp$ }: StartDeps) { + const start = this.contract!; + + // Track app id changes and clear context on app change + this.subscription.add( + curApp$.subscribe((appId) => { + this.appId = appId; + start.clear(); + }) + ); + + return start; + } + + public stop() { + this.subscription.unsubscribe(); + } + + private removeUndefined(context: KibanaExecutionContext = {}) { + return omitBy(context, isUndefined); + } + + private mergeContext(context: KibanaExecutionContext = {}): KibanaExecutionContext { + return { + name: this.appId, + url: window.location.pathname, + ...this.context$.value, + ...context, + }; + } +} diff --git a/src/core/public/execution_context/index.ts b/src/core/public/execution_context/index.ts index b15a967ac714a..f160b0ecea67b 100644 --- a/src/core/public/execution_context/index.ts +++ b/src/core/public/execution_context/index.ts @@ -8,3 +8,5 @@ export type { KibanaExecutionContext } from '../../types'; export { ExecutionContextContainer } from './execution_context_container'; +export { ExecutionContextService } from './execution_context_service'; +export type { ExecutionContextSetup, ExecutionContextStart } from './execution_context_service'; diff --git a/src/core/public/http/fetch.test.ts b/src/core/public/http/fetch.test.ts index e897d69057e02..0691e2443c17f 100644 --- a/src/core/public/http/fetch.test.ts +++ b/src/core/public/http/fetch.test.ts @@ -15,6 +15,7 @@ import { first } from 'rxjs/operators'; import { Fetch } from './fetch'; import { BasePath } from './base_path'; import { HttpResponse, HttpFetchOptionsWithPath } from './types'; +import { executionContextServiceMock } from '../execution_context/execution_context_service.mock'; function delay(duration: number) { return new Promise((r) => setTimeout(r, duration)); @@ -23,9 +24,11 @@ function delay(duration: number) { const BASE_PATH = 'http://localhost/myBase'; describe('Fetch', () => { + const executionContextMock = executionContextServiceMock.createSetupContract(); const fetchInstance = new Fetch({ basePath: new BasePath(BASE_PATH), kibanaVersion: 'VERSION', + executionContext: executionContextMock, }); afterEach(() => { fetchMock.restore(); @@ -230,13 +233,15 @@ describe('Fetch', () => { it('should inject context headers if provided', async () => { fetchMock.get('*', {}); + const context = { + type: 'test-type', + name: 'test-name', + description: 'test-description', + id: '42', + }; + executionContextMock.withGlobalContext.mockReturnValue(context); await fetchInstance.fetch('/my/path', { - context: { - type: 'test-type', - name: 'test-name', - description: 'test-description', - id: '42', - }, + context, }); expect(fetchMock.lastOptions()!.headers).toMatchObject({ @@ -245,6 +250,29 @@ describe('Fetch', () => { }); }); + it('should include top level context context headers if provided', async () => { + fetchMock.get('*', {}); + + const context = { + type: 'test-type', + name: 'test-name', + description: 'test-description', + id: '42', + }; + executionContextMock.withGlobalContext.mockReturnValue({ + ...context, + name: 'banana', + }); + await fetchInstance.fetch('/my/path', { + context, + }); + + expect(fetchMock.lastOptions()!.headers).toMatchObject({ + 'x-kbn-context': + '%7B%22type%22%3A%22test-type%22%2C%22name%22%3A%22banana%22%2C%22description%22%3A%22test-description%22%2C%22id%22%3A%2242%22%7D', + }); + }); + it('should return response', async () => { fetchMock.get('*', { foo: 'bar' }); const json = await fetchInstance.fetch('/my/path'); diff --git a/src/core/public/http/fetch.ts b/src/core/public/http/fetch.ts index 4ee81f4b47aa0..9a333161e1b7a 100644 --- a/src/core/public/http/fetch.ts +++ b/src/core/public/http/fetch.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { omitBy } from 'lodash'; +import { isEmpty, omitBy } from 'lodash'; import { format } from 'url'; import { BehaviorSubject } from 'rxjs'; @@ -22,11 +22,12 @@ import { HttpFetchError } from './http_fetch_error'; import { HttpInterceptController } from './http_intercept_controller'; import { interceptRequest, interceptResponse } from './intercept'; import { HttpInterceptHaltError } from './http_intercept_halt_error'; -import { ExecutionContextContainer } from '../execution_context'; +import { ExecutionContextContainer, ExecutionContextSetup } from '../execution_context'; interface Params { basePath: IBasePath; kibanaVersion: string; + executionContext: ExecutionContextSetup; } const JSON_CONTENT = /^(application\/(json|x-javascript)|text\/(x-)?javascript|x-json)(;.*)?$/; @@ -107,6 +108,7 @@ export class Fetch { }; private createRequest(options: HttpFetchOptionsWithPath): Request { + const context = this.params.executionContext.withGlobalContext(options.context); // Merge and destructure options out that are not applicable to the Fetch API. const { query, @@ -125,7 +127,7 @@ export class Fetch { 'Content-Type': 'application/json', ...options.headers, 'kbn-version': this.params.kibanaVersion, - ...(options.context ? new ExecutionContextContainer(options.context).toHeader() : {}), + ...(!isEmpty(context) ? new ExecutionContextContainer(context).toHeader() : {}), }), }; diff --git a/src/core/public/http/http_service.test.ts b/src/core/public/http/http_service.test.ts index 2b41991904d97..698fa876433d4 100644 --- a/src/core/public/http/http_service.test.ts +++ b/src/core/public/http/http_service.test.ts @@ -14,6 +14,7 @@ import { fatalErrorsServiceMock } from '../fatal_errors/fatal_errors_service.moc import { injectedMetadataServiceMock } from '../injected_metadata/injected_metadata_service.mock'; import { HttpService } from './http_service'; import { Observable } from 'rxjs'; +import { executionContextServiceMock } from '../execution_context/execution_context_service.mock'; describe('interceptors', () => { afterEach(() => fetchMock.restore()); @@ -22,9 +23,10 @@ describe('interceptors', () => { fetchMock.get('*', {}); const injectedMetadata = injectedMetadataServiceMock.createSetupContract(); const fatalErrors = fatalErrorsServiceMock.createSetupContract(); + const executionContext = executionContextServiceMock.createSetupContract(); const httpService = new HttpService(); - const setup = httpService.setup({ fatalErrors, injectedMetadata }); + const setup = httpService.setup({ fatalErrors, injectedMetadata, executionContext }); const setupInterceptor = jest.fn(); setup.intercept({ request: setupInterceptor }); @@ -47,7 +49,8 @@ describe('#setup()', () => { const injectedMetadata = injectedMetadataServiceMock.createSetupContract(); const fatalErrors = fatalErrorsServiceMock.createSetupContract(); const httpService = new HttpService(); - httpService.setup({ fatalErrors, injectedMetadata }); + const executionContext = executionContextServiceMock.createSetupContract(); + httpService.setup({ fatalErrors, injectedMetadata, executionContext }); const loadingServiceSetup = loadingServiceMock.setup.mock.results[0].value; // We don't verify that this Observable comes from Fetch#getLoadingCount$() to avoid complex mocking expect(loadingServiceSetup.addLoadingCountSource).toHaveBeenCalledWith(expect.any(Observable)); @@ -59,7 +62,8 @@ describe('#stop()', () => { const injectedMetadata = injectedMetadataServiceMock.createSetupContract(); const fatalErrors = fatalErrorsServiceMock.createSetupContract(); const httpService = new HttpService(); - httpService.setup({ fatalErrors, injectedMetadata }); + const executionContext = executionContextServiceMock.createSetupContract(); + httpService.setup({ fatalErrors, injectedMetadata, executionContext }); httpService.start(); httpService.stop(); expect(loadingServiceMock.stop).toHaveBeenCalled(); diff --git a/src/core/public/http/http_service.ts b/src/core/public/http/http_service.ts index a9719cfce67af..390130da4e07d 100644 --- a/src/core/public/http/http_service.ts +++ b/src/core/public/http/http_service.ts @@ -15,10 +15,12 @@ import { LoadingCountService } from './loading_count_service'; import { Fetch } from './fetch'; import { CoreService } from '../../types'; import { ExternalUrlService } from './external_url_service'; +import { ExecutionContextSetup } from '../execution_context'; interface HttpDeps { injectedMetadata: InjectedMetadataSetup; fatalErrors: FatalErrorsSetup; + executionContext: ExecutionContextSetup; } /** @internal */ @@ -27,14 +29,15 @@ export class HttpService implements CoreService { private readonly loadingCount = new LoadingCountService(); private service?: HttpSetup; - public setup({ injectedMetadata, fatalErrors }: HttpDeps): HttpSetup { + public setup({ injectedMetadata, fatalErrors, executionContext }: HttpDeps): HttpSetup { const kibanaVersion = injectedMetadata.getKibanaVersion(); const basePath = new BasePath( injectedMetadata.getBasePath(), injectedMetadata.getServerBasePath(), injectedMetadata.getPublicBaseUrl() ); - const fetchService = new Fetch({ basePath, kibanaVersion }); + + const fetchService = new Fetch({ basePath, kibanaVersion, executionContext }); const loadingCount = this.loadingCount.setup({ fatalErrors }); loadingCount.addLoadingCountSource(fetchService.getRequestCount$()); diff --git a/src/core/public/index.ts b/src/core/public/index.ts index ded7db9c6f892..50d8bf304ddf8 100644 --- a/src/core/public/index.ts +++ b/src/core/public/index.ts @@ -65,6 +65,7 @@ import { DocLinksStart } from './doc_links'; import { SavedObjectsStart } from './saved_objects'; import { DeprecationsServiceStart } from './deprecations'; import type { ThemeServiceSetup, ThemeServiceStart } from './theme'; +import { ExecutionContextSetup, ExecutionContextStart } from './execution_context'; export type { PackageInfo, @@ -194,7 +195,11 @@ export type { MountPoint, UnmountCallback, PublicUiSettingsParams } from './type export { URL_MAX_LENGTH } from './core_app'; -export type { KibanaExecutionContext } from './execution_context'; +export type { + KibanaExecutionContext, + ExecutionContextSetup, + ExecutionContextStart, +} from './execution_context'; /** * Core services exposed to the `Plugin` setup lifecycle @@ -221,6 +226,8 @@ export interface CoreSetup, any, any]>, []>(() => Promise.resolve([createCoreStartMock({ basePath }), pluginStartDeps, pluginStartContract]) @@ -76,6 +78,7 @@ function createCoreStartMock({ basePath = '' } = {}) { application: applicationServiceMock.createStartContract(), chrome: chromeServiceMock.createStartContract(), docLinks: docLinksServiceMock.createStartContract(), + executionContext: executionContextServiceMock.createStartContract(), http: httpServiceMock.createStartContract({ basePath }), i18n: i18nServiceMock.createStartContract(), notifications: notificationServiceMock.createStartContract(), diff --git a/src/core/public/plugins/plugin_context.ts b/src/core/public/plugins/plugin_context.ts index 345aea4b6cac8..8c085d3de2369 100644 --- a/src/core/public/plugins/plugin_context.ts +++ b/src/core/public/plugins/plugin_context.ts @@ -88,6 +88,7 @@ export function createPluginSetupContext< registerAppUpdater: (statusUpdater$) => deps.application.registerAppUpdater(statusUpdater$), }, fatalErrors: deps.fatalErrors, + executionContext: deps.executionContext, http: deps.http, notifications: deps.notifications, uiSettings: deps.uiSettings, @@ -129,6 +130,7 @@ export function createPluginStartContext< getUrlForApp: deps.application.getUrlForApp, }, docLinks: deps.docLinks, + executionContext: deps.executionContext, http: deps.http, chrome: omit(deps.chrome, 'getComponent'), i18n: deps.i18n, diff --git a/src/core/public/plugins/plugins_service.test.ts b/src/core/public/plugins/plugins_service.test.ts index c4e3b7990ba32..40976424b7edd 100644 --- a/src/core/public/plugins/plugins_service.test.ts +++ b/src/core/public/plugins/plugins_service.test.ts @@ -36,6 +36,7 @@ import { docLinksServiceMock } from '../doc_links/doc_links_service.mock'; import { savedObjectsServiceMock } from '../saved_objects/saved_objects_service.mock'; import { deprecationsServiceMock } from '../deprecations/deprecations_service.mock'; import { themeServiceMock } from '../theme/theme_service.mock'; +import { executionContextServiceMock } from '../execution_context/execution_context_service.mock'; export let mockPluginInitializers: Map; @@ -85,6 +86,7 @@ describe('PluginsService', () => { mockSetupDeps = { application: applicationServiceMock.createInternalSetupContract(), fatalErrors: fatalErrorsServiceMock.createSetupContract(), + executionContext: executionContextServiceMock.createSetupContract(), http: httpServiceMock.createSetupContract(), injectedMetadata: injectedMetadataServiceMock.createStartContract(), notifications: notificationServiceMock.createSetupContract(), @@ -100,6 +102,7 @@ describe('PluginsService', () => { mockStartDeps = { application: applicationServiceMock.createInternalStartContract(), docLinks: docLinksServiceMock.createStartContract(), + executionContext: executionContextServiceMock.createStartContract(), http: httpServiceMock.createStartContract(), chrome: chromeServiceMock.createStartContract(), i18n: i18nServiceMock.createStartContract(), diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md index 4cf845de4617d..e3f2822b5a7c8 100644 --- a/src/core/public/public.api.md +++ b/src/core/public/public.api.md @@ -401,6 +401,8 @@ export interface CoreSetup; @@ -429,6 +431,8 @@ export interface CoreStart { // (undocumented) docLinks: DocLinksStart; // (undocumented) + executionContext: ExecutionContextStart; + // (undocumented) fatalErrors: FatalErrorsStart; // (undocumented) http: HttpStart; @@ -461,6 +465,7 @@ export class CoreSystem { // (undocumented) start(): Promise<{ application: InternalApplicationStart; + executionContext: ExecutionContextSetup; } | undefined>; // (undocumented) stop(): void; @@ -511,6 +516,20 @@ export interface ErrorToastOptions extends ToastOptions { toastMessage?: string; } +// @public +export interface ExecutionContextSetup { + clear(): void; + context$: Observable; + get(): KibanaExecutionContext; + // Warning: (ae-forgotten-export) The symbol "Labels" needs to be exported by the entry point index.d.ts + getAsLabels(): Labels_2; + set(c$: KibanaExecutionContext): void; + withGlobalContext(context?: KibanaExecutionContext): KibanaExecutionContext; +} + +// @public +export type ExecutionContextStart = ExecutionContextSetup; + // @public export interface FatalErrorInfo { // (undocumented) @@ -751,9 +770,10 @@ export interface IUiSettingsClient { // @public export type KibanaExecutionContext = { - readonly type: string; - readonly name: string; - readonly id: string; + readonly type?: string; + readonly name?: string; + readonly page?: string; + readonly id?: string; readonly description?: string; readonly url?: string; child?: KibanaExecutionContext; @@ -1522,6 +1542,6 @@ export interface UserProvidedValues { // Warnings were encountered during analysis: // -// src/core/public/core_system.ts:173:21 - (ae-forgotten-export) The symbol "InternalApplicationStart" needs to be exported by the entry point index.d.ts +// src/core/public/core_system.ts:183:21 - (ae-forgotten-export) The symbol "InternalApplicationStart" needs to be exported by the entry point index.d.ts ``` diff --git a/src/core/server/execution_context/execution_context_container.ts b/src/core/server/execution_context/execution_context_container.ts index de895bcff5ecb..1528df6c23140 100644 --- a/src/core/server/execution_context/execution_context_container.ts +++ b/src/core/server/execution_context/execution_context_container.ts @@ -50,9 +50,10 @@ export interface IExecutionContextContainer { } function stringify(ctx: KibanaExecutionContext): string { - const stringifiedCtx = `${encodeURIComponent(ctx.type)}:${encodeURIComponent( + const encodeURIComponentIfNotEmpty = (val?: string) => encodeURIComponent(val || ''); + const stringifiedCtx = `${encodeURIComponentIfNotEmpty(ctx.type)}:${encodeURIComponentIfNotEmpty( ctx.name - )}:${encodeURIComponent(ctx.id!)}`; + )}:${encodeURIComponentIfNotEmpty(ctx.id)}`; return ctx.child ? `${stringifiedCtx};${stringify(ctx.child)}` : stringifiedCtx; } diff --git a/src/core/server/execution_context/execution_context_service.mock.ts b/src/core/server/execution_context/execution_context_service.mock.ts index 68aab7a5b84f8..85768eb423f26 100644 --- a/src/core/server/execution_context/execution_context_service.mock.ts +++ b/src/core/server/execution_context/execution_context_service.mock.ts @@ -26,6 +26,7 @@ const createExecutionContextMock = () => { get: jest.fn(), getParentContextFrom: jest.fn(), getAsHeader: jest.fn(), + getAsLabels: jest.fn(), }; mock.withContext.mockImplementation(withContextMock); return mock; @@ -38,6 +39,7 @@ const createInternalSetupContractMock = () => { const createSetupContractMock = () => { const mock: jest.Mocked = { withContext: jest.fn(), + getAsLabels: jest.fn(), }; mock.withContext.mockImplementation(withContextMock); return mock; diff --git a/src/core/server/execution_context/execution_context_service.ts b/src/core/server/execution_context/execution_context_service.ts index 6e2b809e23043..03ae2cb36c9ec 100644 --- a/src/core/server/execution_context/execution_context_service.ts +++ b/src/core/server/execution_context/execution_context_service.ts @@ -6,6 +6,8 @@ * Side Public License, v 1. */ import { AsyncLocalStorage } from 'async_hooks'; +import apm from 'elastic-apm-node'; +import { isUndefined, omitBy } from 'lodash'; import type { Subscription } from 'rxjs'; import type { CoreService, KibanaExecutionContext } from '../../types'; @@ -39,6 +41,10 @@ export interface IExecutionContext { * returns serialized representation to send as a header **/ getAsHeader(): string | undefined; + /** + * returns apm labels + **/ + getAsLabels(): apm.Labels; } /** @@ -61,6 +67,7 @@ export interface ExecutionContextSetup { * The nested calls stack the registered context on top of each other. **/ withContext(context: KibanaExecutionContext | undefined, fn: (...args: any[]) => R): R; + getAsLabels(): apm.Labels; } /** @@ -97,6 +104,7 @@ export class ExecutionContextService setRequestId: this.setRequestId.bind(this), get: this.get.bind(this), getAsHeader: this.getAsHeader.bind(this), + getAsLabels: this.getAsLabels.bind(this), }; } @@ -108,6 +116,7 @@ export class ExecutionContextService withContext: this.withContext.bind(this), get: this.get.bind(this), getAsHeader: this.getAsHeader.bind(this), + getAsLabels: this.getAsLabels.bind(this), }; } @@ -161,4 +170,18 @@ export class ExecutionContextService return `${requestId}${executionContextStr}`; } + + private getAsLabels() { + if (!this.enabled) return {}; + const executionContext = this.contextStore.getStore()?.toJSON(); + + return omitBy( + { + name: executionContext?.name, + id: executionContext?.id, + page: executionContext?.page, + }, + isUndefined + ); + } } diff --git a/src/core/server/http/http_server.ts b/src/core/server/http/http_server.ts index 4623b09b19e29..813f8e9784332 100644 --- a/src/core/server/http/http_server.ts +++ b/src/core/server/http/http_server.ts @@ -21,6 +21,7 @@ import agent from 'elastic-apm-node'; import type { Duration } from 'moment'; import { Observable } from 'rxjs'; import { take } from 'rxjs/operators'; +import apm from 'elastic-apm-node'; import { Logger, LoggerFactory } from '../logging'; import { HttpConfig } from './http_config'; import type { InternalExecutionContextSetup } from '../execution_context'; @@ -338,7 +339,11 @@ export class HttpServer { const requestId = getRequestId(request, config.requestId); const parentContext = executionContext?.getParentContextFrom(request.headers); - if (parentContext) executionContext?.set(parentContext); + + if (executionContext && parentContext) { + executionContext.set(parentContext); + apm.addLabels(executionContext.getAsLabels()); + } executionContext?.setRequestId(requestId); diff --git a/src/core/server/plugins/plugin_context.ts b/src/core/server/plugins/plugin_context.ts index 18abbe88c4913..983a12627b7f3 100644 --- a/src/core/server/plugins/plugin_context.ts +++ b/src/core/server/plugins/plugin_context.ts @@ -161,6 +161,7 @@ export function createPluginSetupContext( }, executionContext: { withContext: deps.executionContext.withContext, + getAsLabels: deps.executionContext.getAsLabels, }, http: { createCookieSessionStorageFactory: deps.http.createCookieSessionStorageFactory, diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index d7ed4928e1cf5..5fe1942ed8453 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -7,6 +7,7 @@ /// import { AddConfigDeprecation } from '@kbn/config'; +import apm from 'elastic-apm-node'; import Boom from '@hapi/boom'; import { ByteSizeValue } from '@kbn/config-schema'; import { CliArgs } from '@kbn/config'; @@ -994,6 +995,8 @@ export class EventLoopDelaysMonitor { // @public (undocumented) export interface ExecutionContextSetup { + // (undocumented) + getAsLabels(): apm.Labels; withContext(context: KibanaExecutionContext | undefined, fn: (...args: any[]) => R): R; } @@ -1319,9 +1322,10 @@ export interface IUiSettingsClient { // @public export type KibanaExecutionContext = { - readonly type: string; - readonly name: string; - readonly id: string; + readonly type?: string; + readonly name?: string; + readonly page?: string; + readonly id?: string; readonly description?: string; readonly url?: string; child?: KibanaExecutionContext; diff --git a/src/core/test_helpers/http_test_setup.ts b/src/core/test_helpers/http_test_setup.ts index 468034dffceb9..67b340898aab4 100644 --- a/src/core/test_helpers/http_test_setup.ts +++ b/src/core/test_helpers/http_test_setup.ts @@ -9,6 +9,7 @@ import { HttpService } from '../public/http'; import { fatalErrorsServiceMock } from '../public/fatal_errors/fatal_errors_service.mock'; import { injectedMetadataServiceMock } from '../public/injected_metadata/injected_metadata_service.mock'; +import { executionContextServiceMock } from '../public/execution_context/execution_context_service.mock'; export type SetupTap = ( injectedMetadata: ReturnType, @@ -28,7 +29,8 @@ export function setup(tap: SetupTap = defaultTap) { tap(injectedMetadata, fatalErrors); const httpService = new HttpService(); - const http = httpService.setup({ fatalErrors, injectedMetadata }); + const executionContext = executionContextServiceMock.createSetupContract(); + const http = httpService.setup({ fatalErrors, injectedMetadata, executionContext }); return { httpService, injectedMetadata, fatalErrors, http }; } diff --git a/src/core/types/execution_context.ts b/src/core/types/execution_context.ts index 1b985a73f410b..d790b8d855fd4 100644 --- a/src/core/types/execution_context.ts +++ b/src/core/types/execution_context.ts @@ -16,11 +16,13 @@ export type KibanaExecutionContext = { /** * Kibana application initated an operation. * */ - readonly type: string; // 'visualization' | 'actions' | 'server' | ..; - /** public name of a user-facing feature */ - readonly name: string; // 'TSVB' | 'Lens' | 'action_execution' | ..; + readonly type?: string; // 'visualization' | 'actions' | 'server' | ..; + /** public name of an application or a user-facing feature */ + readonly name?: string; // 'TSVB' | 'Lens' | 'action_execution' | ..; + /** a stand alone, logical unit such as an application page or tab */ + readonly page?: string; /** unique value to identify the source */ - readonly id: string; + readonly id?: string; /** human readable description. For example, a vis title, action name */ readonly description?: string; /** in browser - url to navigate to a current page, on server - endpoint path, for task: task SO url */ diff --git a/src/plugins/dashboard/public/application/dashboard_app.tsx b/src/plugins/dashboard/public/application/dashboard_app.tsx index 7aedbe9e11001..a32e6643a4e3a 100644 --- a/src/plugins/dashboard/public/application/dashboard_app.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app.tsx @@ -11,7 +11,7 @@ import React, { useEffect, useMemo } from 'react'; import { useDashboardSelector } from './state'; import { useDashboardAppState } from './hooks'; -import { useKibana } from '../../../kibana_react/public'; +import { useKibana, useExecutionContext } from '../../../kibana_react/public'; import { getDashboardBreadcrumb, getDashboardTitle, @@ -48,6 +48,12 @@ export function DashboardApp({ [core.notifications.toasts, history, uiSettings] ); + useExecutionContext(core.executionContext, { + type: 'application', + page: 'app', + id: savedDashboardId || 'new', + }); + const dashboardState = useDashboardSelector((state) => state.dashboardStateReducer); const dashboardAppState = useDashboardAppState({ history, diff --git a/src/plugins/dashboard/public/application/hooks/use_dashboard_app_state.ts b/src/plugins/dashboard/public/application/hooks/use_dashboard_app_state.ts index 98b3d761f350e..26641dc52e3d5 100644 --- a/src/plugins/dashboard/public/application/hooks/use_dashboard_app_state.ts +++ b/src/plugins/dashboard/public/application/hooks/use_dashboard_app_state.ts @@ -220,11 +220,7 @@ export const useDashboardAppState = ({ savedDashboard, data, executionContext: { - type: 'application', - name: 'dashboard', - id: savedDashboard.id ?? 'unsaved_dashboard', description: savedDashboard.title, - url: history.location.pathname, }, }); if (canceled || !dashboardContainer) { diff --git a/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx b/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx index 5b53fc47e06a4..65374ad723f23 100644 --- a/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx +++ b/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx @@ -35,6 +35,7 @@ import { DashboardUnsavedListing } from './dashboard_unsaved_listing'; import { confirmCreateWithUnsaved, confirmDiscardUnsavedChanges } from './confirm_overlays'; import { getDashboardListItemLink } from './get_dashboard_list_item_link'; import { DASHBOARD_PANELS_UNSAVED_ID } from '../lib/dashboard_session_storage'; +import { useExecutionContext } from '../../../../kibana_react/public'; export interface DashboardListingProps { kbnUrlStateStorage: IKbnUrlStateStorage; @@ -67,6 +68,11 @@ export const DashboardListing = ({ dashboardSessionStorage.getDashboardIdsWithUnsavedChanges() ); + useExecutionContext(core.executionContext, { + type: 'application', + page: 'list', + }); + // Set breadcrumbs useEffect useEffect(() => { setBreadcrumbs([ 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 968dd870489fe..f1e2e903cadde 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 @@ -119,6 +119,7 @@ describe('SearchInterceptor', () => { }), uiSettings: mockCoreSetup.uiSettings, http: mockCoreSetup.http, + executionContext: mockCoreSetup.executionContext, session: sessionService, theme: themeServiceMock.createSetupContract(), }); @@ -543,7 +544,12 @@ describe('SearchInterceptor', () => { .catch(() => {}); expect(fetchMock.mock.calls[0][0]).toEqual( expect.objectContaining({ - options: { sessionId, isStored: true, isRestore: true, strategy: 'ese' }, + options: { + sessionId, + isStored: true, + isRestore: true, + strategy: 'ese', + }, }) ); 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 7dc1ce6dee078..251e191d589e3 100644 --- a/src/plugins/data/public/search/search_interceptor/search_interceptor.ts +++ b/src/plugins/data/public/search/search_interceptor/search_interceptor.ts @@ -61,6 +61,7 @@ import { SearchAbortController } from './search_abort_controller'; export interface SearchInterceptorDeps { bfetch: BfetchPublicSetup; http: CoreSetup['http']; + executionContext: CoreSetup['executionContext']; uiSettings: CoreSetup['uiSettings']; startServices: Promise<[CoreStart, any, unknown]>; toasts: ToastsSetup; @@ -297,10 +298,14 @@ export class SearchInterceptor { } }) as Promise; } else { + const { executionContext, ...rest } = options || {}; return this.batchedFetch( { request, - options: this.getSerializableOptions(options), + options: this.getSerializableOptions({ + ...rest, + executionContext: this.deps.executionContext.withGlobalContext(executionContext), + }), }, abortSignal ); diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index 961599de713df..b21ad44c7bd6d 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -89,7 +89,7 @@ export class SearchService implements Plugin { constructor(private initializerContext: PluginInitializerContext) {} public setup( - { http, getStartServices, notifications, uiSettings, theme }: CoreSetup, + { http, getStartServices, notifications, uiSettings, executionContext, theme }: CoreSetup, { bfetch, expressions, usageCollection, nowProvider }: SearchServiceSetupDependencies ): ISearchSetup { this.usageCollector = createUsageCollector(getStartServices, usageCollection); @@ -108,6 +108,7 @@ export class SearchService implements Plugin { this.searchInterceptor = new SearchInterceptor({ bfetch, toasts: notifications.toasts, + executionContext, http, uiSettings, startServices: getStartServices(), diff --git a/src/plugins/data/server/search/routes/bsearch.ts b/src/plugins/data/server/search/routes/bsearch.ts index 314de4254851f..25b1bd0d7009d 100644 --- a/src/plugins/data/server/search/routes/bsearch.ts +++ b/src/plugins/data/server/search/routes/bsearch.ts @@ -9,6 +9,7 @@ import { catchError, first } from 'rxjs/operators'; import { BfetchServerSetup } from 'src/plugins/bfetch/server'; import type { ExecutionContextSetup } from 'src/core/server'; +import apm from 'elastic-apm-node'; import { IKibanaSearchRequest, IKibanaSearchResponse, @@ -33,9 +34,10 @@ export function registerBsearchRoute( */ onBatchItem: async ({ request: requestData, options }) => { const { executionContext, ...restOptions } = options || {}; + return executionContextService.withContext(executionContext, () => { + apm.addLabels(executionContextService.getAsLabels()); - return executionContextService.withContext(executionContext, () => - search + return search .search(requestData, restOptions) .pipe( first(), @@ -49,8 +51,8 @@ export function registerBsearchRoute( }; }) ) - .toPromise() - ); + .toPromise(); + }); }, }; }); diff --git a/src/plugins/dev_tools/public/application.tsx b/src/plugins/dev_tools/public/application.tsx index a3ec8fc0a9af2..bcfde68abd99c 100644 --- a/src/plugins/dev_tools/public/application.tsx +++ b/src/plugins/dev_tools/public/application.tsx @@ -15,8 +15,14 @@ import { I18nProvider } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { euiThemeVars } from '@kbn/ui-theme'; -import { ApplicationStart, ChromeStart, ScopedHistory, CoreTheme } from 'src/core/public'; -import { KibanaThemeProvider } from '../../kibana_react/public'; +import type { + ApplicationStart, + ChromeStart, + ScopedHistory, + CoreTheme, + ExecutionContextStart, +} from 'src/core/public'; +import { KibanaThemeProvider, useExecutionContext } from '../../kibana_react/public'; import type { DocTitleService, BreadcrumbService } from './services'; import { DevToolApp } from './dev_tool'; @@ -24,6 +30,7 @@ import { DevToolApp } from './dev_tool'; export interface AppServices { docTitleService: DocTitleService; breadcrumbService: BreadcrumbService; + executionContext: ExecutionContextStart; } interface DevToolsWrapperProps { @@ -64,6 +71,11 @@ function DevToolsWrapper({ breadcrumbService.setBreadcrumbs(activeDevTool.title); }, [activeDevTool, docTitleService, breadcrumbService]); + useExecutionContext(appServices.executionContext, { + type: 'application', + page: activeDevTool.id, + }); + return (
    diff --git a/src/plugins/dev_tools/public/plugin.ts b/src/plugins/dev_tools/public/plugin.ts index 1876bf278513e..ee729c8f4400c 100644 --- a/src/plugins/dev_tools/public/plugin.ts +++ b/src/plugins/dev_tools/public/plugin.ts @@ -61,7 +61,7 @@ export class DevToolsPlugin implements Plugin { element.classList.add('devAppWrapper'); const [core] = await getStartServices(); - const { application, chrome } = core; + const { application, chrome, executionContext } = core; this.docTitleService.setup(chrome.docTitle.change); this.breadcrumbService.setup(chrome.setBreadcrumbs); @@ -69,6 +69,7 @@ export class DevToolsPlugin implements Plugin { const appServices = { breadcrumbService: this.breadcrumbService, docTitleService: this.docTitleService, + executionContext, }; const { renderApp } = await import('./application'); diff --git a/src/plugins/discover/public/application/context/context_app.test.tsx b/src/plugins/discover/public/application/context/context_app.test.tsx index c9089a6c1111c..cf1e7a98e01a3 100644 --- a/src/plugins/discover/public/application/context/context_app.test.tsx +++ b/src/plugins/discover/public/application/context/context_app.test.tsx @@ -46,6 +46,9 @@ describe('ContextApp test', () => { toastNotifications: { addDanger: () => {} }, navigation: mockNavigationPlugin, core: { + executionContext: { + set: jest.fn(), + }, notifications: { toasts: [] }, theme: { theme$: themeServiceMock.createStartContract().theme$ }, }, diff --git a/src/plugins/discover/public/application/context/context_app.tsx b/src/plugins/discover/public/application/context/context_app.tsx index 8d2a6b2c04815..dcf1c6b11e68e 100644 --- a/src/plugins/discover/public/application/context/context_app.tsx +++ b/src/plugins/discover/public/application/context/context_app.tsx @@ -25,6 +25,7 @@ import { ContextAppContent } from './context_app_content'; import { SurrDocType } from './services/context'; import { DocViewFilterFn } from '../../services/doc_views/doc_views_types'; import { useDiscoverServices } from '../../utils/use_discover_services'; +import { useExecutionContext } from '../../../../kibana_react/public'; import { generateFilters } from '../../../../data/public'; const ContextAppContentMemoized = memo(ContextAppContent); @@ -36,11 +37,17 @@ export interface ContextAppProps { export const ContextApp = ({ indexPattern, anchorId }: ContextAppProps) => { const services = useDiscoverServices(); - const { uiSettings, capabilities, indexPatterns, navigation, filterManager } = services; + const { uiSettings, capabilities, indexPatterns, navigation, filterManager, core } = services; const isLegacy = useMemo(() => uiSettings.get(DOC_TABLE_LEGACY), [uiSettings]); const useNewFieldsApi = useMemo(() => !uiSettings.get(SEARCH_FIELDS_FROM_SOURCE), [uiSettings]); + useExecutionContext(core.executionContext, { + type: 'application', + page: 'context', + id: indexPattern.id || '', + }); + /** * Context app state */ diff --git a/src/plugins/discover/public/application/doc/single_doc_route.tsx b/src/plugins/discover/public/application/doc/single_doc_route.tsx index d11c6bdca76a0..e2bdc6dc799e6 100644 --- a/src/plugins/discover/public/application/doc/single_doc_route.tsx +++ b/src/plugins/discover/public/application/doc/single_doc_route.tsx @@ -16,6 +16,7 @@ import { withQueryParams } from '../../utils/with_query_params'; import { useMainRouteBreadcrumb } from '../../utils/use_navigation_props'; import { Doc } from './components/doc'; import { useDiscoverServices } from '../../utils/use_discover_services'; +import { useExecutionContext } from '../../../../kibana_react/public'; export interface SingleDocRouteProps { /** @@ -31,11 +32,17 @@ export interface DocUrlParams { const SingleDoc = ({ id }: SingleDocRouteProps) => { const services = useDiscoverServices(); - const { chrome, timefilter } = services; + const { chrome, timefilter, core } = services; const { indexPatternId, index } = useParams(); const breadcrumb = useMainRouteBreadcrumb(); + useExecutionContext(core.executionContext, { + type: 'application', + page: 'single-doc', + id: indexPatternId, + }); + useEffect(() => { chrome.setBreadcrumbs([ ...getRootBreadcrumbs(breadcrumb), diff --git a/src/plugins/discover/public/application/main/discover_main_route.tsx b/src/plugins/discover/public/application/main/discover_main_route.tsx index d5950085b94c7..dcf229d36b1e0 100644 --- a/src/plugins/discover/public/application/main/discover_main_route.tsx +++ b/src/plugins/discover/public/application/main/discover_main_route.tsx @@ -24,6 +24,7 @@ import { LoadingIndicator } from '../../components/common/loading_indicator'; import { DiscoverError } from '../../components/common/error_alert'; import { useDiscoverServices } from '../../utils/use_discover_services'; import { getUrlTracker } from '../../kibana_services'; +import { useExecutionContext } from '../../../../kibana_react/public'; const DiscoverMainAppMemoized = memo(DiscoverMainApp); @@ -50,6 +51,12 @@ export function DiscoverMainRoute() { >([]); const { id } = useParams(); + useExecutionContext(core.executionContext, { + type: 'application', + page: 'app', + id: id || 'new', + }); + const navigateToOverview = useCallback(() => { core.application.navigateToApp('kibanaOverview', { path: '#' }); }, [core.application]); diff --git a/src/plugins/discover/public/application/main/utils/fetch_chart.test.ts b/src/plugins/discover/public/application/main/utils/fetch_chart.test.ts index 4c68eff54f579..b1f736fa4b224 100644 --- a/src/plugins/discover/public/application/main/utils/fetch_chart.test.ts +++ b/src/plugins/discover/public/application/main/utils/fetch_chart.test.ts @@ -117,7 +117,7 @@ describe('test fetchCharts', () => { }); }); - test('fetch$ is called with execution context containing savedSearch id', async () => { + test('fetch$ is called with request specific execution context', async () => { const fetch$Mock = jest.fn().mockReturnValue(of(requestResult)); savedSearchMockWithTimeField.searchSource.fetch$ = fetch$Mock; @@ -126,10 +126,6 @@ describe('test fetchCharts', () => { expect(fetch$Mock.mock.calls[0][0].executionContext).toMatchInlineSnapshot(` Object { "description": "fetch chart data and total hits", - "id": "the-saved-search-id-with-timefield", - "name": "discover", - "type": "application", - "url": "/", } `); }); diff --git a/src/plugins/discover/public/application/main/utils/fetch_chart.ts b/src/plugins/discover/public/application/main/utils/fetch_chart.ts index 00cb9c43caccf..1ea2594a89d97 100644 --- a/src/plugins/discover/public/application/main/utils/fetch_chart.ts +++ b/src/plugins/discover/public/application/main/utils/fetch_chart.ts @@ -40,11 +40,7 @@ export function fetchChart( const chartAggConfigs = updateSearchSource(searchSource, interval, data); const executionContext = { - type: 'application', - name: 'discover', description: 'fetch chart data and total hits', - url: window.location.pathname, - id: savedSearch.id ?? '', }; const fetch$ = searchSource diff --git a/src/plugins/discover/public/application/main/utils/fetch_documents.test.ts b/src/plugins/discover/public/application/main/utils/fetch_documents.test.ts index 000d3282c38b3..1e73f5de3a3f6 100644 --- a/src/plugins/discover/public/application/main/utils/fetch_documents.test.ts +++ b/src/plugins/discover/public/application/main/utils/fetch_documents.test.ts @@ -57,10 +57,6 @@ describe('test fetchDocuments', () => { expect(fetch$Mock.mock.calls[0][0].executionContext).toMatchInlineSnapshot(` Object { "description": "fetch total hits", - "id": "the-saved-search-id", - "name": "discover", - "type": "application", - "url": "/", } `); }); diff --git a/src/plugins/discover/public/application/main/utils/fetch_documents.ts b/src/plugins/discover/public/application/main/utils/fetch_documents.ts index dbf972265547e..8338839e8b0ac 100644 --- a/src/plugins/discover/public/application/main/utils/fetch_documents.ts +++ b/src/plugins/discover/public/application/main/utils/fetch_documents.ts @@ -32,11 +32,7 @@ export const fetchDocuments = ( } const executionContext = { - type: 'application', - name: 'discover', description: 'fetch documents', - url: window.location.pathname, - id: savedSearch.id ?? '', }; const fetch$ = searchSource diff --git a/src/plugins/discover/public/application/main/utils/fetch_total_hits.test.ts b/src/plugins/discover/public/application/main/utils/fetch_total_hits.test.ts index ba7b6a765aa2e..a5485c1a2e2e9 100644 --- a/src/plugins/discover/public/application/main/utils/fetch_total_hits.test.ts +++ b/src/plugins/discover/public/application/main/utils/fetch_total_hits.test.ts @@ -51,10 +51,6 @@ describe('test fetchTotalHits', () => { expect(fetch$Mock.mock.calls[0][0].executionContext).toMatchInlineSnapshot(` Object { "description": "fetch total hits", - "id": "the-saved-search-id", - "name": "discover", - "type": "application", - "url": "/", } `); }); diff --git a/src/plugins/discover/public/application/main/utils/fetch_total_hits.ts b/src/plugins/discover/public/application/main/utils/fetch_total_hits.ts index af2d55e23cf32..e696570f05cf0 100644 --- a/src/plugins/discover/public/application/main/utils/fetch_total_hits.ts +++ b/src/plugins/discover/public/application/main/utils/fetch_total_hits.ts @@ -30,11 +30,7 @@ export function fetchTotalHits( } const executionContext = { - type: 'application', - name: 'discover', description: 'fetch total hits', - url: window.location.pathname, - id: savedSearch.id ?? '', }; const fetch$ = searchSource diff --git a/src/plugins/kibana_react/public/index.ts b/src/plugins/kibana_react/public/index.ts index baed839d41123..94e8b505f1dd2 100644 --- a/src/plugins/kibana_react/public/index.ts +++ b/src/plugins/kibana_react/public/index.ts @@ -39,6 +39,8 @@ export { createReactOverlays } from './overlays'; export { useUiSetting, useUiSetting$ } from './ui_settings'; +export { useExecutionContext } from './use_execution_context'; + export type { TableListViewProps, TableListViewState } from './table_list_view'; export { TableListView } from './table_list_view'; diff --git a/src/plugins/kibana_react/public/use_execution_context/index.ts b/src/plugins/kibana_react/public/use_execution_context/index.ts new file mode 100644 index 0000000000000..f36d094eb86d4 --- /dev/null +++ b/src/plugins/kibana_react/public/use_execution_context/index.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export { useExecutionContext } from './use_execution_context'; diff --git a/src/plugins/kibana_react/public/use_execution_context/use_execution_context.ts b/src/plugins/kibana_react/public/use_execution_context/use_execution_context.ts new file mode 100644 index 0000000000000..e2c538056153c --- /dev/null +++ b/src/plugins/kibana_react/public/use_execution_context/use_execution_context.ts @@ -0,0 +1,28 @@ +/* + * 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 { KibanaExecutionContext, CoreStart } from 'kibana/public'; +import useDeepCompareEffect from 'react-use/lib/useDeepCompareEffect'; + +/** + * Set and clean up application level execution context + * @param executionContext + * @param context + */ +export function useExecutionContext( + executionContext: CoreStart['executionContext'], + context: KibanaExecutionContext +) { + useDeepCompareEffect(() => { + executionContext.set(context); + + return () => { + executionContext.clear(); + }; + }, [context]); +} diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx index efc3bbf8314f8..3d3c98ce4aaea 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx @@ -39,7 +39,7 @@ import { ExpressionAstExpression, } from '../../../../plugins/expressions/public'; import { Vis, SerializedVis } from '../vis'; -import { getExpressions, getTheme, getUiActions } from '../services'; +import { getExecutionContext, getExpressions, getTheme, getUiActions } from '../services'; import { VIS_EVENT_TO_TRIGGER } from './events'; import { VisualizeEmbeddableFactoryDeps } from './visualize_embeddable_factory'; import { getSavedVisualization } from '../utils/saved_visualize_utils'; @@ -398,20 +398,18 @@ export class VisualizeEmbeddable }; private async updateHandler() { - const parentContext = this.parent?.getInput().executionContext; + const parentContext = this.parent?.getInput().executionContext || getExecutionContext().get(); const child: KibanaExecutionContext = { type: 'visualization', name: this.vis.type.name, - id: this.vis.id ?? 'an_unsaved_vis', + id: this.vis.id ?? 'new', description: this.vis.title || this.input.title || this.vis.type.name, url: this.output.editUrl, }; - const context = parentContext - ? { - ...parentContext, - child, - } - : child; + const context = { + ...parentContext, + child, + }; const expressionParams: IExpressionLoaderParams = { searchContext: { diff --git a/src/plugins/visualizations/public/plugin.ts b/src/plugins/visualizations/public/plugin.ts index 92bcf1dfe6a96..88b9d35d5255f 100644 --- a/src/plugins/visualizations/public/plugin.ts +++ b/src/plugins/visualizations/public/plugin.ts @@ -36,6 +36,7 @@ import { setDocLinks, setSpaces, setTheme, + setExecutionContext, } from './services'; import { createVisEmbeddableFromObject, @@ -372,6 +373,7 @@ export class VisualizationsPlugin setTimeFilter(data.query.timefilter.timefilter); setAggs(data.search.aggs); setOverlays(core.overlays); + setExecutionContext(core.executionContext); setChrome(core.chrome); if (spaces) { diff --git a/src/plugins/visualizations/public/services.ts b/src/plugins/visualizations/public/services.ts index 37aea45fa3f58..8564c8225f1a7 100644 --- a/src/plugins/visualizations/public/services.ts +++ b/src/plugins/visualizations/public/services.ts @@ -16,6 +16,7 @@ import type { SavedObjectsStart, DocLinksStart, ThemeServiceStart, + ExecutionContextSetup, } from '../../../core/public'; import type { TypesStart } from './vis_types'; import { createGetterSetter } from '../../../plugins/kibana_utils/public'; @@ -65,4 +66,7 @@ export const [getOverlays, setOverlays] = createGetterSetter('Over export const [getChrome, setChrome] = createGetterSetter('Chrome'); +export const [getExecutionContext, setExecutionContext] = + createGetterSetter('ExecutionContext'); + export const [getSpaces, setSpaces] = createGetterSetter('Spaces', false); diff --git a/src/plugins/visualizations/public/visualize_app/components/visualize_editor.tsx b/src/plugins/visualizations/public/visualize_app/components/visualize_editor.tsx index 45241ec501084..c281b211768a1 100644 --- a/src/plugins/visualizations/public/visualize_app/components/visualize_editor.tsx +++ b/src/plugins/visualizations/public/visualize_app/components/visualize_editor.tsx @@ -11,7 +11,7 @@ import React, { useEffect, useState } from 'react'; import { useParams } from 'react-router-dom'; import { EventEmitter } from 'events'; -import { useKibana } from '../../../../kibana_react/public'; +import { useExecutionContext, useKibana } from '../../../../kibana_react/public'; import { useChromeVisibility, useSavedVisInstance, @@ -41,6 +41,14 @@ export const VisualizeEditor = ({ onAppLeave }: VisualizeAppProps) => { originatingApp, visualizationIdFromUrl ); + + const editorName = savedVisInstance?.vis.type.title.toLowerCase().replace(' ', '_') || ''; + useExecutionContext(services.executionContext, { + type: 'application', + page: `editor${editorName ? `:${editorName}` : ''}`, + id: visualizationIdFromUrl || 'new', + }); + const { appState, hasUnappliedChanges } = useVisualizeAppState( services, eventEmitter, diff --git a/src/plugins/visualizations/public/visualize_app/components/visualize_listing.tsx b/src/plugins/visualizations/public/visualize_app/components/visualize_listing.tsx index cf219b1cda117..a180cf78feeb2 100644 --- a/src/plugins/visualizations/public/visualize_app/components/visualize_listing.tsx +++ b/src/plugins/visualizations/public/visualize_app/components/visualize_listing.tsx @@ -21,7 +21,7 @@ import { findListItems } from '../../utils/saved_visualize_utils'; import { showNewVisModal } from '../../wizard'; import { getTypes } from '../../services'; import { SavedObjectsFindOptionsReference } from '../../../../../core/public'; -import { useKibana, TableListView } from '../../../../kibana_react/public'; +import { useKibana, TableListView, useExecutionContext } from '../../../../kibana_react/public'; import { VISUALIZE_ENABLE_LABS_SETTING } from '../../../../visualizations/public'; import { VisualizeServices } from '../types'; import { VisualizeConstants } from '../../../common/constants'; @@ -31,6 +31,7 @@ export const VisualizeListing = () => { const { services: { application, + executionContext, chrome, history, toastNotifications, @@ -49,6 +50,11 @@ export const VisualizeListing = () => { const closeNewVisModal = useRef(() => {}); const listingLimit = savedObjectsPublic.settings.getListingLimit(); + useExecutionContext(executionContext, { + type: 'application', + page: 'list', + }); + useEffect(() => { if (pathname === '/new') { // In case the user navigated to the page via the /visualize/new URL we start the dialog immediately diff --git a/x-pack/plugins/fleet/.storybook/context/execution_context.ts b/x-pack/plugins/fleet/.storybook/context/execution_context.ts new file mode 100644 index 0000000000000..d3a15e200129b --- /dev/null +++ b/x-pack/plugins/fleet/.storybook/context/execution_context.ts @@ -0,0 +1,27 @@ +/* + * 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 { ExecutionContextSetup } from 'kibana/public'; +import { of } from 'rxjs'; + +export const getExecutionContext = () => { + const exec: ExecutionContextSetup = { + context$: of({}), + get: () => { + return {}; + }, + clear: () => {}, + set: (context: Record) => {}, + getAsLabels: () => { + return {}; + }, + withGlobalContext: () => { + return {}; + }, + }; + + return exec; +}; diff --git a/x-pack/plugins/fleet/.storybook/context/index.tsx b/x-pack/plugins/fleet/.storybook/context/index.tsx index eb19a1145ba75..fbcbd4fd3a081 100644 --- a/x-pack/plugins/fleet/.storybook/context/index.tsx +++ b/x-pack/plugins/fleet/.storybook/context/index.tsx @@ -31,6 +31,7 @@ import { stubbedStartServices } from './stubs'; import { getDocLinks } from './doc_links'; import { getCloud } from './cloud'; import { getShare } from './share'; +import { getExecutionContext } from './execution_context'; // TODO: clintandrewhall - this is not ideal, or complete. The root context of Fleet applications // requires full start contracts of its dependencies. As a result, we have to mock all of those contracts @@ -52,6 +53,7 @@ export const StorybookContext: React.FC<{ storyContext?: StoryContext }> = ({ () => ({ ...stubbedStartServices, application: getApplication(), + executionContext: getExecutionContext(), chrome: getChrome(), cloud: { ...getCloud({ isCloudEnabled }), diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/policy_table.test.tsx b/x-pack/plugins/index_lifecycle_management/__jest__/policy_table.test.tsx index 3a1c2dd36812f..89f7d4795429a 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/policy_table.test.tsx +++ b/x-pack/plugins/index_lifecycle_management/__jest__/policy_table.test.tsx @@ -25,11 +25,13 @@ import { init as initHttp } from '../public/application/services/http'; import { init as initUiMetric } from '../public/application/services/ui_metric'; import { KibanaContextProvider } from '../public/shared_imports'; import { PolicyListContextProvider } from '../public/application/sections/policy_list/policy_list_context'; +import { executionContextServiceMock } from 'src/core/public/execution_context/execution_context_service.mock'; initHttp( new HttpService().setup({ injectedMetadata: injectedMetadataServiceMock.createSetupContract(), fatalErrors: fatalErrorsServiceMock.createSetupContract(), + executionContext: executionContextServiceMock.createSetupContract(), }) ); initUiMetric(usageCollectionPluginMock.createSetupContract()); diff --git a/x-pack/plugins/lens/public/app_plugin/app.tsx b/x-pack/plugins/lens/public/app_plugin/app.tsx index 3660c3d3db0cb..5ef9e05cf590b 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.tsx @@ -13,7 +13,7 @@ import { createKbnUrlStateStorage, withNotifyOnErrors, } from '../../../../../src/plugins/kibana_utils/public'; -import { useKibana } from '../../../../../src/plugins/kibana_react/public'; +import { useExecutionContext, useKibana } from '../../../../../src/plugins/kibana_react/public'; import { OnSaveProps } from '../../../../../src/plugins/saved_objects/public'; import { syncQueryStateWithUrl } from '../../../../../src/plugins/data/public'; import { LensAppProps, LensAppServices } from './types'; @@ -71,6 +71,7 @@ export function App({ getOriginatingAppName, spaces, http, + executionContext, // Temporarily required until the 'by value' paradigm is default. dashboardFeatureFlag, } = lensAppServices; @@ -111,6 +112,7 @@ export function App({ undefined ); const [isGoBackToVizEditorModalVisible, setIsGoBackToVizEditorModalVisible] = useState(false); + const savedObjectId = (initialInput as LensByReferenceInput)?.savedObjectId; useEffect(() => { if (currentDoc) { @@ -122,6 +124,12 @@ export function App({ setIndicateNoData(true); }, [setIndicateNoData]); + useExecutionContext(executionContext, { + type: 'application', + id: savedObjectId || 'new', + page: 'editor', + }); + useEffect(() => { if (indicateNoData) { setIndicateNoData(false); @@ -132,11 +140,9 @@ export function App({ () => Boolean( // Temporarily required until the 'by value' paradigm is default. - dashboardFeatureFlag.allowByValueEmbeddables && - isLinkedToOriginatingApp && - !(initialInput as LensByReferenceInput)?.savedObjectId + dashboardFeatureFlag.allowByValueEmbeddables && isLinkedToOriginatingApp && !savedObjectId ), - [dashboardFeatureFlag.allowByValueEmbeddables, isLinkedToOriginatingApp, initialInput] + [dashboardFeatureFlag.allowByValueEmbeddables, isLinkedToOriginatingApp, savedObjectId] ); useEffect(() => { diff --git a/x-pack/plugins/lens/public/app_plugin/mounter.tsx b/x-pack/plugins/lens/public/app_plugin/mounter.tsx index 28db5e9f4c43a..6f2fd4e8026ad 100644 --- a/x-pack/plugins/lens/public/app_plugin/mounter.tsx +++ b/x-pack/plugins/lens/public/app_plugin/mounter.tsx @@ -77,6 +77,7 @@ export async function getLensServices( usageCollection, savedObjectsTagging, attributeService, + executionContext: coreStart.executionContext, http: coreStart.http, chrome: coreStart.chrome, overlays: coreStart.overlays, diff --git a/x-pack/plugins/lens/public/app_plugin/types.ts b/x-pack/plugins/lens/public/app_plugin/types.ts index bdd7bebd991e7..25fff038c4814 100644 --- a/x-pack/plugins/lens/public/app_plugin/types.ts +++ b/x-pack/plugins/lens/public/app_plugin/types.ts @@ -12,6 +12,7 @@ import type { ApplicationStart, AppMountParameters, ChromeStart, + ExecutionContextStart, HttpStart, IUiSettingsClient, NotificationsStart, @@ -114,6 +115,7 @@ export interface HistoryLocationState { export interface LensAppServices { http: HttpStart; + executionContext: ExecutionContextStart; chrome: ChromeStart; overlays: OverlayStart; storage: IStorageWrapper; diff --git a/x-pack/plugins/lens/public/mocks/services_mock.tsx b/x-pack/plugins/lens/public/mocks/services_mock.tsx index 9fa6d61370a17..6681811744da4 100644 --- a/x-pack/plugins/lens/public/mocks/services_mock.tsx +++ b/x-pack/plugins/lens/public/mocks/services_mock.tsx @@ -112,6 +112,7 @@ export function makeDefaultServices( chrome: core.chrome, overlays: core.overlays, uiSettings: core.uiSettings, + executionContext: core.executionContext, navigation: navigationStartMock, notifications: core.notifications, attributeService: makeAttributeService(), diff --git a/x-pack/plugins/maps/common/execution_context.test.ts b/x-pack/plugins/maps/common/execution_context.test.ts new file mode 100644 index 0000000000000..25e3813a7e8f0 --- /dev/null +++ b/x-pack/plugins/maps/common/execution_context.test.ts @@ -0,0 +1,36 @@ +/* + * 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 { makeExecutionContext } from './execution_context'; + +describe('makeExecutionContext', () => { + test('returns basic fields if nothing is provided', () => { + const context = makeExecutionContext({}); + expect(context).toStrictEqual({ + name: 'maps', + type: 'application', + }); + }); + + test('merges in context', () => { + const context = makeExecutionContext({ id: '123' }); + expect(context).toStrictEqual({ + name: 'maps', + type: 'application', + id: '123', + }); + }); + + test('omits undefined values', () => { + const context = makeExecutionContext({ id: '123', description: undefined }); + expect(context).toStrictEqual({ + name: 'maps', + type: 'application', + id: '123', + }); + }); +}); diff --git a/x-pack/plugins/maps/common/execution_context.ts b/x-pack/plugins/maps/common/execution_context.ts index 23de29cfa8cd7..4a11eb5d89029 100644 --- a/x-pack/plugins/maps/common/execution_context.ts +++ b/x-pack/plugins/maps/common/execution_context.ts @@ -5,14 +5,16 @@ * 2.0. */ +import { isUndefined, omitBy } from 'lodash'; import { APP_ID } from './constants'; -export function makeExecutionContext(id: string, url: string, description?: string) { - return { - name: APP_ID, - type: 'application', - id, - description: description || '', - url, - }; +export function makeExecutionContext(context: { id?: string; url?: string; description?: string }) { + return omitBy( + { + name: APP_ID, + type: 'application', + ...context, + }, + isUndefined + ); } diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts index e2f9959b25d31..a26bd341613b2 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts @@ -5,8 +5,14 @@ * 2.0. */ +import { coreMock } from '../../../../../../../src/core/public/mocks'; import { MapExtent, VectorSourceRequestMeta } from '../../../../common/descriptor_types'; -import { getHttp, getIndexPatternService, getSearchService } from '../../../kibana_services'; +import { + getExecutionContext, + getHttp, + getIndexPatternService, + getSearchService, +} from '../../../kibana_services'; import { ESGeoGridSource } from './es_geo_grid_source'; import { ES_GEO_FIELD_TYPE, @@ -129,6 +135,13 @@ describe('ESGeoGridSource', () => { }, }, }); + + const coreStartMock = coreMock.createStart(); + coreStartMock.executionContext.get.mockReturnValue({ + name: 'some-app', + }); + // @ts-expect-error + getExecutionContext.mockReturnValue(coreStartMock.executionContext); }); afterEach(() => { diff --git a/x-pack/plugins/maps/public/kibana_services.ts b/x-pack/plugins/maps/public/kibana_services.ts index 54e4964b35f03..d8197902c73ac 100644 --- a/x-pack/plugins/maps/public/kibana_services.ts +++ b/x-pack/plugins/maps/public/kibana_services.ts @@ -33,6 +33,7 @@ export const getUiSettings = () => coreStart.uiSettings; export const getIsDarkMode = () => getUiSettings().get('theme:darkMode', false); export const getIndexPatternSelectComponent = () => pluginsStart.data.ui.IndexPatternSelect; export const getHttp = () => coreStart.http; +export const getExecutionContext = () => coreStart.executionContext; export const getTimeFilter = () => pluginsStart.data.query.timefilter.timefilter; export const getToasts = () => coreStart.notifications.toasts; export const getSavedObjectsClient = () => coreStart.savedObjects.client; diff --git a/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx b/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx index 571cba64a06c4..dab284b0b71e4 100644 --- a/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx +++ b/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx @@ -17,6 +17,7 @@ import { getMapsCapabilities, getToasts, getCoreChrome, + getExecutionContext, getNavigateToApp, getSavedObjectsClient, getSavedObjectsTagging, @@ -121,6 +122,12 @@ async function deleteMaps(items: object[]) { } export function MapsListView() { + getExecutionContext().set({ + type: 'application', + page: 'list', + id: '', + }); + const isReadOnly = !getMapsCapabilities().save; getCoreChrome().docTitle.change(getAppTitle()); diff --git a/x-pack/plugins/maps/public/routes/map_page/map_app/map_app.tsx b/x-pack/plugins/maps/public/routes/map_page/map_app/map_app.tsx index 9aede248e1877..a341246f748f3 100644 --- a/x-pack/plugins/maps/public/routes/map_page/map_app/map_app.tsx +++ b/x-pack/plugins/maps/public/routes/map_page/map_app/map_app.tsx @@ -16,6 +16,7 @@ import { type Filter, FilterStateStore } from '@kbn/es-query'; import type { Query, TimeRange, DataView } from 'src/plugins/data/common'; import { getData, + getExecutionContext, getCoreChrome, getMapsCapabilities, getNavigation, @@ -115,6 +116,12 @@ export class MapApp extends React.Component { componentDidMount() { this._isMounted = true; + getExecutionContext().set({ + type: 'application', + page: 'editor', + id: this.props.savedMap.getSavedObjectId() || 'new', + }); + this._autoRefreshSubscription = getTimeFilter() .getAutoRefreshFetch$() .pipe( diff --git a/x-pack/plugins/maps/public/util.test.js b/x-pack/plugins/maps/public/util.test.js index d8861063fc637..7fc88578b378a 100644 --- a/x-pack/plugins/maps/public/util.test.js +++ b/x-pack/plugins/maps/public/util.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { getGlyphUrl } from './util'; +import { getGlyphUrl, makePublicExecutionContext } from './util'; const MOCK_EMS_SETTINGS = { isEMSEnabled: () => true, @@ -62,3 +62,55 @@ describe('getGlyphUrl', () => { }); }); }); + +describe('makePublicExecutionContext', () => { + let injectedContext = {}; + beforeAll(() => { + require('./kibana_services').getExecutionContext = () => ({ + get: () => injectedContext, + }); + }); + + test('creates basic context when no top level context is provided', () => { + const context = makePublicExecutionContext('test'); + expect(context).toStrictEqual({ + description: 'test', + name: 'maps', + type: 'application', + url: '/', + }); + }); + + test('merges with top level context if its from the same app', () => { + injectedContext = { + name: 'maps', + id: '1234', + }; + const context = makePublicExecutionContext('test'); + expect(context).toStrictEqual({ + description: 'test', + name: 'maps', + type: 'application', + url: '/', + id: '1234', + }); + }); + + test('nests inside top level context if its from a different app', () => { + injectedContext = { + name: 'other-app', + id: '1234', + }; + const context = makePublicExecutionContext('test'); + expect(context).toStrictEqual({ + name: 'other-app', + id: '1234', + child: { + description: 'test', + type: 'application', + name: 'maps', + url: '/', + }, + }); + }); +}); diff --git a/x-pack/plugins/maps/public/util.ts b/x-pack/plugins/maps/public/util.ts index 4adb8b35bfcea..66244ea5f6768 100644 --- a/x-pack/plugins/maps/public/util.ts +++ b/x-pack/plugins/maps/public/util.ts @@ -8,7 +8,13 @@ import { EMSClient, FileLayer, TMSService } from '@elastic/ems-client'; import type { KibanaExecutionContext } from 'kibana/public'; import { FONTS_API_PATH } from '../common/constants'; -import { getHttp, getTilemap, getEMSSettings, getMapsEmsStart } from './kibana_services'; +import { + getHttp, + getTilemap, + getEMSSettings, + getMapsEmsStart, + getExecutionContext, +} from './kibana_services'; import { getLicenseId } from './licensed_features'; import { makeExecutionContext } from '../common/execution_context'; @@ -67,9 +73,21 @@ export function isRetina(): boolean { return window.devicePixelRatio === 2; } -export function makePublicExecutionContext( - id: string, - description?: string -): KibanaExecutionContext { - return makeExecutionContext(id, window.location.pathname, description); +export function makePublicExecutionContext(description: string): KibanaExecutionContext { + const topLevelContext = getExecutionContext().get(); + const context = makeExecutionContext({ + url: window.location.pathname, + description, + }); + + // Distinguish between running in maps app vs. embedded + return topLevelContext.name !== undefined && topLevelContext.name !== context.name + ? { + ...topLevelContext, + child: context, + } + : { + ...topLevelContext, + ...context, + }; } diff --git a/x-pack/plugins/maps/server/mvt/get_grid_tile.ts b/x-pack/plugins/maps/server/mvt/get_grid_tile.ts index 193a3d74e2dca..28effa5eabfba 100644 --- a/x-pack/plugins/maps/server/mvt/get_grid_tile.ts +++ b/x-pack/plugins/maps/server/mvt/get_grid_tile.ts @@ -56,7 +56,10 @@ export async function getEsGridTile({ }; const tile = await core.executionContext.withContext( - makeExecutionContext('mvt:get_grid_tile', url), + makeExecutionContext({ + description: 'mvt:get_grid_tile', + url, + }), async () => { return await context.core.elasticsearch.client.asCurrentUser.transport.request( { diff --git a/x-pack/plugins/maps/server/mvt/get_tile.ts b/x-pack/plugins/maps/server/mvt/get_tile.ts index 2c8b6dd4b113d..7e9bc01c5c317 100644 --- a/x-pack/plugins/maps/server/mvt/get_tile.ts +++ b/x-pack/plugins/maps/server/mvt/get_tile.ts @@ -57,7 +57,10 @@ export async function getEsTile({ }; const tile = await core.executionContext.withContext( - makeExecutionContext('mvt:get_tile', url), + makeExecutionContext({ + description: 'mvt:get_tile', + url, + }), async () => { return await context.core.elasticsearch.client.asCurrentUser.transport.request( { From 954e3d3eaaf2220d7e129869fe728edb1cb65a5c Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Thu, 3 Mar 2022 10:15:34 +0100 Subject: [PATCH 27/37] FTR simulate mocha dry run (#126702) This PR works around a bug in mocha's dry run execution by collecting the tests without actually running mocha. --- .../fake_mocha_types.ts | 1 + .../functional_test_runner.ts | 70 ++++++++++++++++++- 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/packages/kbn-test/src/functional_test_runner/fake_mocha_types.ts b/packages/kbn-test/src/functional_test_runner/fake_mocha_types.ts index dec381fb04b56..96ebcd79c4e43 100644 --- a/packages/kbn-test/src/functional_test_runner/fake_mocha_types.ts +++ b/packages/kbn-test/src/functional_test_runner/fake_mocha_types.ts @@ -31,6 +31,7 @@ export interface Test { file?: string; parent?: Suite; isPassed: () => boolean; + pending?: boolean; } export interface Runner extends EventEmitter { diff --git a/packages/kbn-test/src/functional_test_runner/functional_test_runner.ts b/packages/kbn-test/src/functional_test_runner/functional_test_runner.ts index 53ec36dfbe55c..9f21d8bd595b5 100644 --- a/packages/kbn-test/src/functional_test_runner/functional_test_runner.ts +++ b/packages/kbn-test/src/functional_test_runner/functional_test_runner.ts @@ -6,7 +6,8 @@ * Side Public License, v 1. */ -import Path from 'path'; +import { writeFileSync, mkdirSync } from 'fs'; +import Path, { dirname } from 'path'; import { ToolingLog } from '@kbn/dev-utils'; import { REPO_ROOT } from '@kbn/utils'; @@ -98,6 +99,15 @@ export class FunctionalTestRunner { reporterOptions ); + // there's a bug in mocha's dry run, see https://github.com/mochajs/mocha/issues/4838 + // until we can update to a mocha version where this is fixed, we won't actually + // execute the mocha dry run but simulate it by reading the suites and tests of + // the mocha object and writing a report file with similar structure to the json report + // (just leave out some execution details like timing, retry and erros) + if (config.get('mochaOpts.dryRun')) { + return this.simulateMochaDryRun(mocha); + } + await this.lifecycle.beforeTests.trigger(mocha.suite); this.log.info('Starting tests'); @@ -244,4 +254,62 @@ export class FunctionalTestRunner { this.closed = true; await this.lifecycle.cleanup.trigger(); } + + simulateMochaDryRun(mocha: any) { + interface TestEntry { + file: string; + title: string; + fullTitle: string; + } + + const getFullTitle = (node: Test | Suite): string => { + const parentTitle = node.parent && getFullTitle(node.parent); + return parentTitle ? `${parentTitle} ${node.title}` : node.title; + }; + + let suiteCount = 0; + const passes: TestEntry[] = []; + const pending: TestEntry[] = []; + + const collectTests = (suite: Suite) => { + for (const subSuite of suite.suites) { + suiteCount++; + for (const test of subSuite.tests) { + const testEntry = { + title: test.title, + fullTitle: getFullTitle(test), + file: test.file || '', + }; + if (test.pending) { + pending.push(testEntry); + } else { + passes.push(testEntry); + } + } + collectTests(subSuite); + } + }; + + collectTests(mocha.suite); + + const reportData = { + stats: { + suites: suiteCount, + tests: passes.length + pending.length, + passes: passes.length, + pending: pending.length, + failures: 0, + }, + tests: [...passes, ...pending], + passes, + pending, + failures: [], + }; + + const reportPath = mocha.options.reporterOptions.output; + mkdirSync(dirname(reportPath), { recursive: true }); + writeFileSync(reportPath, JSON.stringify(reportData, null, 2), 'utf8'); + + return 0; + } } From 555ec91f51b8f0a8d2a759aea59c604bd29f7ebe Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Thu, 3 Mar 2022 10:55:42 +0100 Subject: [PATCH 28/37] Fix multi terms performance bottleneck (#126575) --- .../search/aggs/utils/get_aggs_formats.test.ts | 4 ++-- .../search/aggs/utils/get_aggs_formats.ts | 16 +++++++++++++--- .../xy_visualization/color_assignment.ts | 3 ++- .../public/xy_visualization/expression.tsx | 18 +++++++++++++----- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/plugins/data/common/search/aggs/utils/get_aggs_formats.test.ts b/src/plugins/data/common/search/aggs/utils/get_aggs_formats.test.ts index 8510acf1572c7..963fe024c1f8f 100644 --- a/src/plugins/data/common/search/aggs/utils/get_aggs_formats.test.ts +++ b/src/plugins/data/common/search/aggs/utils/get_aggs_formats.test.ts @@ -126,7 +126,7 @@ describe('getAggsFormats', () => { const mapping = { id: 'multi_terms', params: { - paramsPerField: Array(terms.length).fill({ id: 'terms' }), + paramsPerField: [{ id: 'terms' }, { id: 'terms' }, { id: 'terms' }], }, }; @@ -141,7 +141,7 @@ describe('getAggsFormats', () => { const mapping = { id: 'multi_terms', params: { - paramsPerField: Array(terms.length).fill({ id: 'terms' }), + paramsPerField: [{ id: 'terms' }, { id: 'terms' }, { id: 'terms' }], separator: ' - ', }, }; diff --git a/src/plugins/data/common/search/aggs/utils/get_aggs_formats.ts b/src/plugins/data/common/search/aggs/utils/get_aggs_formats.ts index f14f981fdec65..e514cc24f93ca 100644 --- a/src/plugins/data/common/search/aggs/utils/get_aggs_formats.ts +++ b/src/plugins/data/common/search/aggs/utils/get_aggs_formats.ts @@ -12,6 +12,7 @@ import { i18n } from '@kbn/i18n'; import { FieldFormat, FieldFormatInstanceType, + FieldFormatParams, FieldFormatsContentType, IFieldFormat, SerializedFieldFormat, @@ -133,11 +134,20 @@ export function getAggsFormats(getFieldFormat: GetFieldFormat): FieldFormatInsta static id = 'multi_terms'; static hidden = true; + private formatCache: Map, FieldFormat> = new Map(); + convert = (val: unknown, type: FieldFormatsContentType) => { const params = this._params; - const formats = (params.paramsPerField as SerializedFieldFormat[]).map((fieldParams) => - getFieldFormat({ id: fieldParams.id, params: fieldParams }) - ); + const formats = (params.paramsPerField as SerializedFieldFormat[]).map((fieldParams) => { + const isCached = this.formatCache.has(fieldParams); + const cachedFormat = + this.formatCache.get(fieldParams) || + getFieldFormat({ id: fieldParams.id, params: fieldParams }); + if (!isCached) { + this.formatCache.set(fieldParams, cachedFormat); + } + return cachedFormat; + }); if (String(val) === '__other__') { return params.otherBucketLabel; diff --git a/x-pack/plugins/lens/public/xy_visualization/color_assignment.ts b/x-pack/plugins/lens/public/xy_visualization/color_assignment.ts index e1e2ba75b50c4..2c56725438421 100644 --- a/x-pack/plugins/lens/public/xy_visualization/color_assignment.ts +++ b/x-pack/plugins/lens/public/xy_visualization/color_assignment.ts @@ -59,6 +59,7 @@ export function getColorAssignments( } const splitAccessor = layer.splitAccessor; const column = data.tables[layer.layerId]?.columns.find(({ id }) => id === splitAccessor); + const columnFormatter = column && formatFactory(column.meta.params); const splits = !column || !data.tables[layer.layerId] ? [] @@ -66,7 +67,7 @@ export function getColorAssignments( data.tables[layer.layerId].rows.map((row) => { let value = row[splitAccessor]; if (value && !isPrimitive(value)) { - value = formatFactory(column.meta.params).convert(value); + value = columnFormatter?.convert(value) ?? value; } else { value = String(value); } diff --git a/x-pack/plugins/lens/public/xy_visualization/expression.tsx b/x-pack/plugins/lens/public/xy_visualization/expression.tsx index ea0e336ff2f08..fb8ad127a394e 100644 --- a/x-pack/plugins/lens/public/xy_visualization/expression.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/expression.tsx @@ -42,11 +42,13 @@ import type { ExpressionRenderDefinition, Datatable, DatatableRow, + DatatableColumn, } from 'src/plugins/expressions/public'; import { IconType } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { RenderMode } from 'src/plugins/expressions'; import { ThemeServiceStart } from 'kibana/public'; +import { FieldFormat } from 'src/plugins/field_formats/common'; import { EmptyPlaceholder } from '../../../../../src/plugins/charts/public'; import { KibanaThemeProvider } from '../../../../../src/plugins/kibana_react/public'; import type { ILensInterpreterRenderHandlers, LensFilterEvent, LensBrushEvent } from '../types'; @@ -599,6 +601,7 @@ export function XYChart({ : undefined, }, }; + return ( (); + for (const column of table.columns) { + formatterPerColumn.set(column, formatFactory(column.meta.params)); + } + // what if row values are not primitive? That is the case of, for instance, Ranges // remaps them to their serialized version with the formatHint metadata // In order to do it we need to make a copy of the table as the raw one is required for more features (filters, etc...) later on @@ -744,7 +752,7 @@ export function XYChart({ // pre-format values for ordinal x axes because there can only be a single x axis formatter on chart level (!isPrimitive(record) || (column.id === xAccessor && xScaleType === 'ordinal')) ) { - newRow[column.id] = formatFactory(column.meta.params).convert(record); + newRow[column.id] = formatterPerColumn.get(column)!.convert(record); } } return newRow; @@ -798,6 +806,8 @@ export function XYChart({ ); const formatter = table?.columns.find((column) => column.id === accessor)?.meta?.params; + const splitHint = table.columns.find((col) => col.id === splitAccessor)?.meta?.params; + const splitFormatter = formatFactory(splitHint); const seriesProps: SeriesSpec = { splitSeriesAccessors: splitAccessor ? [splitAccessor] : [], @@ -857,8 +867,6 @@ export function XYChart({ }, }, name(d) { - const splitHint = table.columns.find((col) => col.id === splitAccessor)?.meta?.params; - // For multiple y series, the name of the operation is used on each, either: // * Key - Y name // * Formatted value - Y name @@ -871,7 +879,7 @@ export function XYChart({ splitAccessor && !layersAlreadyFormatted[splitAccessor] ) { - return formatFactory(splitHint).convert(key); + return splitFormatter.convert(key); } return splitAccessor && i === 0 ? key : columnToLabelMap[key] ?? ''; }) @@ -885,7 +893,7 @@ export function XYChart({ if (splitAccessor && layersAlreadyFormatted[splitAccessor]) { return d.seriesKeys[0]; } - return formatFactory(splitHint).convert(d.seriesKeys[0]); + return splitFormatter.convert(d.seriesKeys[0]); } // This handles both split and single-y cases: // * If split series without formatting, show the value literally From 83105bdc96e89c6408af5cb0813923e1a99c9de3 Mon Sep 17 00:00:00 2001 From: Esteban Beltran Date: Thu, 3 Mar 2022 11:38:00 +0100 Subject: [PATCH 29/37] [Cases] Refactor: Move cases action buttons out of timelines (#126265) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * WIP * WIP2 * Use new cases context hooks to open and close the flyout * Update timelines to use new hooks * CLose flyout on create success * Add back sucess toast * Move code to a dedicated component * Add CasesContext to observability * Remove dependency * Small refactor * Use observabilityAppId instead of observabilityFeatureId for buttons * Add CasesContext to timetable * Fix detection engine test cases * Fix broken tests * Fix broken tests * Rename hook * Add test cases for cases context ui * Add test for new hook * Remove state from the provider context * Remove basevalue * apply suggested renaming * Add usecallback * Add reducer types, fix test type, remove redundant check * Accept attachments as a prop for the cases select modal * Expose useCasesAddToExistingCase hook, reducer code and global component * use the new hook to open the select cases modasl * Fix tests and types * Add tests for cases global components * [Fleet] showing agent policy creation error message on UI (#125931) * showing agent policy creation error message on UI * mapping the error instead of showing from the backend Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> * [ResponseOps] Adds tooltip to time window selector in ES query rule flyout (#125764) * [Lens] Allow detaching from global time range (#125563) * allow detaching from global time range * add test * fix time field recognition * fix tests Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> * [Fleet] refactor auto upgrade package policies logic (#125909) * refactor upgrade package policies * fixed tests * code cleanup * review improvements * added api test Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> * skip flaky suite (#126027) * Remove deprecated api (#125524) * [Fleet] Remove deprecated kibana APIs - License * Remove basePath from FleetApp * Replace AsyncPlugin with Plugin * Get fieldFormats from fieldFormats plugin rather than data plugin * Fix ts errors * Attempt fixing wrong type * Move licenseService to FleetStartDeps * Fix types and mocks Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> * Upgrade `markdown-it` dependency (`10.0.0` → `12.3.2`). (#125526) * skipping failing tests (#126039) * remove unused deprecated code and use field format plugin directly for data view field editor (#126029) * [data views] Improve preview pane (#126013) * fix preview pane * fix preview pane * one less span tag Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> * [Alerting] Provide services to set context for recovered alerts (#124972) * Rename alert instance to alert and add create fn to alert factory * Rename alert instance to alert and add create fn to alert factory * Fixing types * Fixing types * Adding flag for rule types to opt into setting recovery context * Only showing context in action variable menu if flag set to true * Adding recovery functions to createAlertFactory * Setting recovery in index threshold and fixing types * Fixing lint issues and some refactoring * Cleanup * Functional tests for index threshold rule recovery context * Return array of recovered alerts instead of record * Fixing types * Fixing types * Cleanup * Handling nulls and more tests * Updating developer docs * Making getRecoveryAlerts non-optional * Setting unknown in index threshold recovery value * PR feedback * Adding a test Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> * [Discover] Re-introduce saved_searches test (#126059) * [Archive Migration] index pattern without timefield (#125870) * kbn_archive date_nanos * kbn_archive date_nanos in context and discover * kbn_archiver more date_nanos tests * split out kbnArchiver for index_pattern_without_timefield * remove date_nanos files from a different PR * update another test for usage of the same archives * set default index pattern for test * remove duplicate const kibanaServer Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> * delete unused es_archive visualize_embedding (#126001) * delete unused es_archive * remove other unused es_archive * more unused es_archives Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> * Bump packages (#126119) * url-parse 1.5.3 -> 1.5.9 * follow-redirects 1.y.z -> 1.14.9 * Add tests for all cases selector and attachments * Add tests for use add to existing case hook * First version of the cases timeline actions * export add alert to new case button from cases plugin * Make Cases ECS compatible with timelines and security_solution * Delete new case button * Add helpers * Use the cases hook directly for add to new case * Remov unused dependencies * Rename callbacks, remove timelines calls * Fixing tests for the dropdown * Fix broken test * mocking cases for tests * Fix detectiosn tests * Observability now uses the new cases hooks * Wrap events viewer into cases context * Open the create case flyout if create case was selected in the modal * Fix cases mocks for security_solution * Update tests * Add tests for use cases toast * Improve cases mock * delete security mock * replace tests mocks for cases * fix import mock * Do not require onRowClick * Show the toast inside the modal * show the toast inside the flyout * remove toast logic from the consumer plugin * fix typescript types * Rename type * Fix broken test * Fix file name and broken test * Use internal navigation hook * Update hook dependencies * Move useCaseToast * Fix mock paths * fix eslint * Add test cases for the toast content * Add cases context to the overview page Co-authored-by: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: István Zoltán Szabó Co-authored-by: Joe Reuter Co-authored-by: Tiago Costa Co-authored-by: Cristina Amico Co-authored-by: Aleh Zasypkin Co-authored-by: Gloria Hornero Co-authored-by: Matthew Kime Co-authored-by: Ying Mao Co-authored-by: Maja Grubic Co-authored-by: Lee Drengenberg Co-authored-by: Joe Portner <5295965+jportner@users.noreply.github.com> --- x-pack/plugins/cases/common/ui/types.ts | 2 +- .../cases/public/common/translations.ts | 14 ++ .../public/common/use_cases_toast.test.tsx | 75 +++++++++++ .../cases/public/common/use_cases_toast.tsx | 82 ++++++++++++ .../all_cases_selector_modal.tsx | 6 +- ...cases_add_to_existing_case_modal.test.tsx} | 8 +- .../use_cases_add_to_existing_case_modal.tsx | 36 +++++- .../use_cases_add_to_new_case_flyout.test.tsx | 1 + .../use_cases_add_to_new_case_flyout.tsx | 13 +- x-pack/plugins/cases/public/index.tsx | 2 +- .../public/methods/get_rule_id_from_event.ts | 46 +++++++ x-pack/plugins/cases/public/mocks.ts | 10 +- .../public/mocks}/mock_cases_context.tsx | 0 x-pack/plugins/cases/public/plugin.ts | 4 + x-pack/plugins/cases/public/types.ts | 4 + .../alerts_table_t_grid.tsx | 81 +++++++----- .../alerts_table_t_grid/translations.ts | 22 ++++ .../pages/overview/old_overview_page.tsx | 26 +++- .../common/components/events_viewer/index.tsx | 121 +++++++++--------- .../common/lib/kibana/__mocks__/index.ts | 2 + .../alert_context_menu.test.tsx | 2 + .../timeline_actions/alert_context_menu.tsx | 9 +- .../use_add_to_case_actions.tsx | 112 +++++++++++----- .../components/alerts_table/translations.ts | 14 ++ .../take_action_dropdown/index.test.tsx | 2 + .../components/take_action_dropdown/index.tsx | 4 +- .../detection_engine.test.tsx | 2 +- .../side_panel/event_details/footer.test.tsx | 2 + .../timeline/body/actions/index.test.tsx | 2 + .../body/events/event_column_view.test.tsx | 2 + .../components/timeline/body/index.test.tsx | 6 +- .../timeline/eql_tab_content/index.test.tsx | 2 +- .../pinned_tab_content/index.test.tsx | 2 +- .../timeline/query_tab_content/index.test.tsx | 2 +- 34 files changed, 565 insertions(+), 153 deletions(-) create mode 100644 x-pack/plugins/cases/public/common/use_cases_toast.test.tsx create mode 100644 x-pack/plugins/cases/public/common/use_cases_toast.tsx rename x-pack/plugins/cases/public/components/all_cases/selector_modal/{uses_cases_add_to_existing_case_modal.test.tsx => use_cases_add_to_existing_case_modal.test.tsx} (89%) create mode 100644 x-pack/plugins/cases/public/methods/get_rule_id_from_event.ts rename x-pack/plugins/{security_solution/public/common/mock => cases/public/mocks}/mock_cases_context.tsx (100%) create mode 100644 x-pack/plugins/observability/public/pages/alerts/containers/alerts_table_t_grid/translations.ts diff --git a/x-pack/plugins/cases/common/ui/types.ts b/x-pack/plugins/cases/common/ui/types.ts index 95135f4a0e9a0..8abc0805b8a3f 100644 --- a/x-pack/plugins/cases/common/ui/types.ts +++ b/x-pack/plugins/cases/common/ui/types.ts @@ -185,7 +185,7 @@ export interface RuleEcs { id?: string[]; rule_id?: string[]; name?: string[]; - false_positives: string[]; + false_positives?: string[]; saved_id?: string[]; timeline_id?: string[]; timeline_title?: string[]; diff --git a/x-pack/plugins/cases/public/common/translations.ts b/x-pack/plugins/cases/public/common/translations.ts index c4535c8f8da2f..046eb67d38b24 100644 --- a/x-pack/plugins/cases/public/common/translations.ts +++ b/x-pack/plugins/cases/public/common/translations.ts @@ -254,3 +254,17 @@ export const MAX_LENGTH_ERROR = (field: string, length: number) => export const LINK_APPROPRIATE_LICENSE = i18n.translate('xpack.cases.common.appropriateLicense', { defaultMessage: 'appropriate license', }); + +export const CASE_SUCCESS_TOAST = (title: string) => + i18n.translate('xpack.cases.actions.caseSuccessToast', { + values: { title }, + defaultMessage: 'An alert has been added to "{title}"', + }); + +export const CASE_SUCCESS_SYNC_TEXT = i18n.translate('xpack.cases.actions.caseSuccessSyncText', { + defaultMessage: 'Alerts in this case have their status synched with the case status', +}); + +export const VIEW_CASE = i18n.translate('xpack.cases.actions.viewCase', { + defaultMessage: 'View Case', +}); diff --git a/x-pack/plugins/cases/public/common/use_cases_toast.test.tsx b/x-pack/plugins/cases/public/common/use_cases_toast.test.tsx new file mode 100644 index 0000000000000..9bd6a6675a5c1 --- /dev/null +++ b/x-pack/plugins/cases/public/common/use_cases_toast.test.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 { renderHook } from '@testing-library/react-hooks'; +import { useToasts } from '../common/lib/kibana'; +import { AppMockRenderer, createAppMockRenderer, TestProviders } from '../common/mock'; +import { CaseToastSuccessContent, useCasesToast } from './use_cases_toast'; +import { mockCase } from '../containers/mock'; +import React from 'react'; +import userEvent from '@testing-library/user-event'; + +jest.mock('../common/lib/kibana'); + +const useToastsMock = useToasts as jest.Mock; + +describe('Use cases toast hook', () => { + describe('Toast hook', () => { + const successMock = jest.fn(); + useToastsMock.mockImplementation(() => { + return { + addSuccess: successMock, + }; + }); + it('should create a success tost when invoked with a case', () => { + const { result } = renderHook( + () => { + return useCasesToast(); + }, + { wrapper: TestProviders } + ); + result.current.showSuccessAttach(mockCase); + expect(successMock).toHaveBeenCalled(); + }); + }); + describe('Toast content', () => { + let appMockRender: AppMockRenderer; + const onViewCaseClick = jest.fn(); + beforeEach(() => { + appMockRender = createAppMockRenderer(); + onViewCaseClick.mockReset(); + }); + + it('renders a correct successfull message with synced alerts', () => { + const result = appMockRender.render( + + ); + expect(result.getByTestId('toaster-content-sync-text')).toHaveTextContent( + 'Alerts in this case have their status synched with the case status' + ); + expect(result.getByTestId('toaster-content-case-view-link')).toHaveTextContent('View Case'); + expect(onViewCaseClick).not.toHaveBeenCalled(); + }); + + it('renders a correct successfull message with not synced alerts', () => { + const result = appMockRender.render( + + ); + expect(result.queryByTestId('toaster-content-sync-text')).toBeFalsy(); + expect(result.getByTestId('toaster-content-case-view-link')).toHaveTextContent('View Case'); + expect(onViewCaseClick).not.toHaveBeenCalled(); + }); + + it('Calls the onViewCaseClick when clicked', () => { + const result = appMockRender.render( + + ); + userEvent.click(result.getByTestId('toaster-content-case-view-link')); + expect(onViewCaseClick).toHaveBeenCalled(); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/common/use_cases_toast.tsx b/x-pack/plugins/cases/public/common/use_cases_toast.tsx new file mode 100644 index 0000000000000..98cc7fa1d8faa --- /dev/null +++ b/x-pack/plugins/cases/public/common/use_cases_toast.tsx @@ -0,0 +1,82 @@ +/* + * 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 { EuiButtonEmpty, EuiText } from '@elastic/eui'; +import React from 'react'; +import styled from 'styled-components'; +import { toMountPoint } from '../../../../../src/plugins/kibana_react/public'; +import { Case } from '../../common'; +import { useToasts } from '../common/lib/kibana'; +import { useCaseViewNavigation } from '../common/navigation'; +import { CASE_SUCCESS_SYNC_TEXT, CASE_SUCCESS_TOAST, VIEW_CASE } from './translations'; + +const LINE_CLAMP = 3; +const Title = styled.span` + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: ${LINE_CLAMP}; + -webkit-box-orient: vertical; + overflow: hidden; +`; +const EuiTextStyled = styled(EuiText)` + ${({ theme }) => ` + margin-bottom: ${theme.eui?.paddingSizes?.s ?? 8}px; + `} +`; + +export const useCasesToast = () => { + const { navigateToCaseView } = useCaseViewNavigation(); + + const toasts = useToasts(); + + return { + showSuccessAttach: (theCase: Case) => { + const onViewCaseClick = () => { + navigateToCaseView({ + detailName: theCase.id, + }); + }; + return toasts.addSuccess({ + color: 'success', + iconType: 'check', + title: toMountPoint({CASE_SUCCESS_TOAST(theCase.title)}), + text: toMountPoint( + + ), + }); + }, + }; +}; +export const CaseToastSuccessContent = ({ + syncAlerts, + onViewCaseClick, +}: { + syncAlerts: boolean; + onViewCaseClick: () => void; +}) => { + return ( + <> + {syncAlerts && ( + + {CASE_SUCCESS_SYNC_TEXT} + + )} + + {VIEW_CASE} + + + ); +}; +CaseToastSuccessContent.displayName = 'CaseToastSuccessContent'; diff --git a/x-pack/plugins/cases/public/components/all_cases/selector_modal/all_cases_selector_modal.tsx b/x-pack/plugins/cases/public/components/all_cases/selector_modal/all_cases_selector_modal.tsx index 08c99c5159399..ba553b28a34e0 100644 --- a/x-pack/plugins/cases/public/components/all_cases/selector_modal/all_cases_selector_modal.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/selector_modal/all_cases_selector_modal.tsx @@ -26,7 +26,7 @@ export interface AllCasesSelectorModalProps { */ alertData?: Omit; hiddenStatuses?: CaseStatusWithAllStatus[]; - onRowClick: (theCase?: Case) => void; + onRowClick?: (theCase?: Case) => void; updateCase?: (newCase: Case) => void; onClose?: () => void; attachments?: CaseAttachments; @@ -52,7 +52,9 @@ export const AllCasesSelectorModal = React.memo( const onClick = useCallback( (theCase?: Case) => { closeModal(); - onRowClick(theCase); + if (onRowClick) { + onRowClick(theCase); + } }, [closeModal, onRowClick] ); diff --git a/x-pack/plugins/cases/public/components/all_cases/selector_modal/uses_cases_add_to_existing_case_modal.test.tsx b/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.test.tsx similarity index 89% rename from x-pack/plugins/cases/public/components/all_cases/selector_modal/uses_cases_add_to_existing_case_modal.test.tsx rename to x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.test.tsx index 6eeff6102ae6a..6a224949db8be 100644 --- a/x-pack/plugins/cases/public/components/all_cases/selector_modal/uses_cases_add_to_existing_case_modal.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.test.tsx @@ -12,6 +12,7 @@ import React from 'react'; import { CasesContext } from '../../cases_context'; import { CasesContextStoreActionsList } from '../../cases_context/cases_context_reducer'; import { useCasesAddToExistingCaseModal } from './use_cases_add_to_existing_case_modal'; +jest.mock('../../../common/use_cases_toast'); describe('use cases add to existing case modal hook', () => { const dispatch = jest.fn(); @@ -65,7 +66,7 @@ describe('use cases add to existing case modal hook', () => { ); }); - it('should dispatch the close action when invoked', () => { + it('should dispatch the close action for modal and flyout when invoked', () => { const { result } = renderHook( () => { return useCasesAddToExistingCaseModal(defaultParams()); @@ -78,5 +79,10 @@ describe('use cases add to existing case modal hook', () => { type: CasesContextStoreActionsList.CLOSE_ADD_TO_CASE_MODAL, }) ); + expect(dispatch).toHaveBeenCalledWith( + expect.objectContaining({ + type: CasesContextStoreActionsList.CLOSE_CREATE_CASE_FLYOUT, + }) + ); }); }); diff --git a/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.tsx b/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.tsx index b2ad07c2375df..5341f5be4183d 100644 --- a/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.tsx @@ -7,15 +7,36 @@ import { useCallback } from 'react'; import { AllCasesSelectorModalProps } from '.'; +import { useCasesToast } from '../../../common/use_cases_toast'; +import { Case } from '../../../containers/types'; import { CasesContextStoreActionsList } from '../../cases_context/cases_context_reducer'; import { useCasesContext } from '../../cases_context/use_cases_context'; +import { useCasesAddToNewCaseFlyout } from '../../create/flyout/use_cases_add_to_new_case_flyout'; export const useCasesAddToExistingCaseModal = (props: AllCasesSelectorModalProps) => { + const createNewCaseFlyout = useCasesAddToNewCaseFlyout({ + attachments: props.attachments, + onClose: props.onClose, + // TODO there's no need for onSuccess to be async. This will be fixed + // in a follow up clean up + onSuccess: async (theCase?: Case) => { + if (props.onRowClick) { + return props.onRowClick(theCase); + } + }, + }); const { dispatch } = useCasesContext(); + const casesToasts = useCasesToast(); + const closeModal = useCallback(() => { dispatch({ type: CasesContextStoreActionsList.CLOSE_ADD_TO_CASE_MODAL, }); + // in case the flyout was also open when selecting + // create a new case + dispatch({ + type: CasesContextStoreActionsList.CLOSE_CREATE_CASE_FLYOUT, + }); }, [dispatch]); const openModal = useCallback(() => { @@ -23,6 +44,19 @@ export const useCasesAddToExistingCaseModal = (props: AllCasesSelectorModalProps type: CasesContextStoreActionsList.OPEN_ADD_TO_CASE_MODAL, payload: { ...props, + onRowClick: (theCase?: Case) => { + // when the case is undefined in the modal + // the user clicked "create new case" + if (theCase === undefined) { + closeModal(); + createNewCaseFlyout.open(); + } else { + casesToasts.showSuccessAttach(theCase); + if (props.onRowClick) { + props.onRowClick(theCase); + } + } + }, onClose: () => { closeModal(); if (props.onClose) { @@ -37,7 +71,7 @@ export const useCasesAddToExistingCaseModal = (props: AllCasesSelectorModalProps }, }, }); - }, [closeModal, dispatch, props]); + }, [casesToasts, closeModal, createNewCaseFlyout, dispatch, props]); return { open: openModal, close: closeModal, diff --git a/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.test.tsx b/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.test.tsx index 103e24c4b7a65..e569b1ee79952 100644 --- a/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.test.tsx +++ b/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.test.tsx @@ -12,6 +12,7 @@ import React from 'react'; import { CasesContext } from '../../cases_context'; import { CasesContextStoreActionsList } from '../../cases_context/cases_context_reducer'; import { useCasesAddToNewCaseFlyout } from './use_cases_add_to_new_case_flyout'; +jest.mock('../../../common/use_cases_toast'); describe('use cases add to new case flyout hook', () => { const dispatch = jest.fn(); diff --git a/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.tsx b/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.tsx index e4ae4d72f48da..5422ab9be995d 100644 --- a/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.tsx +++ b/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.tsx @@ -6,12 +6,15 @@ */ import { useCallback } from 'react'; +import { useCasesToast } from '../../../common/use_cases_toast'; +import { Case } from '../../../containers/types'; import { CasesContextStoreActionsList } from '../../cases_context/cases_context_reducer'; import { useCasesContext } from '../../cases_context/use_cases_context'; import { CreateCaseFlyoutProps } from './create_case_flyout'; export const useCasesAddToNewCaseFlyout = (props: CreateCaseFlyoutProps) => { const { dispatch } = useCasesContext(); + const casesToasts = useCasesToast(); const closeFlyout = useCallback(() => { dispatch({ @@ -30,6 +33,14 @@ export const useCasesAddToNewCaseFlyout = (props: CreateCaseFlyoutProps) => { return props.onClose(); } }, + onSuccess: async (theCase: Case) => { + if (theCase) { + casesToasts.showSuccessAttach(theCase); + } + if (props.onSuccess) { + return props.onSuccess(theCase); + } + }, afterCaseCreated: async (...args) => { closeFlyout(); if (props.afterCaseCreated) { @@ -38,7 +49,7 @@ export const useCasesAddToNewCaseFlyout = (props: CreateCaseFlyoutProps) => { }, }, }); - }, [closeFlyout, dispatch, props]); + }, [casesToasts, closeFlyout, dispatch, props]); return { open: openFlyout, close: closeFlyout, diff --git a/x-pack/plugins/cases/public/index.tsx b/x-pack/plugins/cases/public/index.tsx index 0190df8204fc1..42dd1a9419991 100644 --- a/x-pack/plugins/cases/public/index.tsx +++ b/x-pack/plugins/cases/public/index.tsx @@ -21,7 +21,7 @@ export type { GetCreateCaseFlyoutProps } from './methods/get_create_case_flyout' export type { GetAllCasesSelectorModalProps } from './methods/get_all_cases_selector_modal'; export type { GetRecentCasesProps } from './methods/get_recent_cases'; -export type { CaseAttachments } from './types'; +export type { CaseAttachments, SupportedCaseAttachment } from './types'; export type { ICasesDeepLinkId } from './common/navigation'; export { diff --git a/x-pack/plugins/cases/public/methods/get_rule_id_from_event.ts b/x-pack/plugins/cases/public/methods/get_rule_id_from_event.ts new file mode 100644 index 0000000000000..b07ba032e7b19 --- /dev/null +++ b/x-pack/plugins/cases/public/methods/get_rule_id_from_event.ts @@ -0,0 +1,46 @@ +/* + * 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 { ALERT_RULE_NAME, ALERT_RULE_UUID } from '@kbn/rule-data-utils'; +import { get } from 'lodash/fp'; +import { Ecs } from '../../common'; + +type Maybe = T | null; +interface Event { + data: EventNonEcsData[]; + ecs: Ecs; +} +interface EventNonEcsData { + field: string; + value?: Maybe; +} + +export function getRuleIdFromEvent(event: Event): { + id: string; + name: string; +} { + const ruleUuidData = event && event.data.find(({ field }) => field === ALERT_RULE_UUID); + const ruleNameData = event && event.data.find(({ field }) => field === ALERT_RULE_NAME); + const ruleUuidValueData = ruleUuidData && ruleUuidData.value && ruleUuidData.value[0]; + const ruleNameValueData = ruleNameData && ruleNameData.value && ruleNameData.value[0]; + + const ruleUuid = + ruleUuidValueData ?? + get(`ecs.${ALERT_RULE_UUID}[0]`, event) ?? + get(`ecs.signal.rule.id[0]`, event) ?? + null; + const ruleName = + ruleNameValueData ?? + get(`ecs.${ALERT_RULE_NAME}[0]`, event) ?? + get(`ecs.signal.rule.name[0]`, event) ?? + null; + + return { + id: ruleUuid, + name: ruleName, + }; +} diff --git a/x-pack/plugins/cases/public/mocks.ts b/x-pack/plugins/cases/public/mocks.ts index f7f80170a8775..a3876e9e19322 100644 --- a/x-pack/plugins/cases/public/mocks.ts +++ b/x-pack/plugins/cases/public/mocks.ts @@ -5,12 +5,13 @@ * 2.0. */ +import { mockCasesContext } from './mocks/mock_cases_context'; import { CasesUiStart } from './types'; -const createStartContract = (): jest.Mocked => ({ +export const mockCasesContract = (): jest.Mocked => ({ canUseCases: jest.fn(), getCases: jest.fn(), - getCasesContext: jest.fn(), + getCasesContext: jest.fn().mockImplementation(() => mockCasesContext), getAllCasesSelectorModal: jest.fn(), getAllCasesSelectorModalNoProvider: jest.fn(), getCreateCaseFlyout: jest.fn(), @@ -20,8 +21,11 @@ const createStartContract = (): jest.Mocked => ({ getUseCasesAddToNewCaseFlyout: jest.fn(), getUseCasesAddToExistingCaseModal: jest.fn(), }, + helpers: { + getRuleIdFromEvent: jest.fn(), + }, }); export const casesPluginMock = { - createStartContract, + createStartContract: mockCasesContract, }; diff --git a/x-pack/plugins/security_solution/public/common/mock/mock_cases_context.tsx b/x-pack/plugins/cases/public/mocks/mock_cases_context.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/common/mock/mock_cases_context.tsx rename to x-pack/plugins/cases/public/mocks/mock_cases_context.tsx diff --git a/x-pack/plugins/cases/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts index 9dbc6ea35125a..31185ae78f076 100644 --- a/x-pack/plugins/cases/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -21,6 +21,7 @@ import { CasesUiConfigType } from '../common/ui/types'; import { getCasesContextLazy } from './methods/get_cases_context'; import { useCasesAddToNewCaseFlyout } from './components/create/flyout/use_cases_add_to_new_case_flyout'; import { useCasesAddToExistingCaseModal } from './components/all_cases/selector_modal/use_cases_add_to_existing_case_modal'; +import { getRuleIdFromEvent } from './methods/get_rule_id_from_event'; /** * @public @@ -52,6 +53,9 @@ export class CasesUiPlugin implements Plugin ({ ...acc, [d.field]: d.value }), {}); const [openActionsPopoverId, setActionsPopover] = useState(null); const { - timelines, + cases, application: {}, - } = useKibana().services; + } = useKibana().services; const parseObservabilityAlert = useMemo( () => parseAlert(observabilityRuleTypeRegistry), @@ -158,10 +161,6 @@ function ObservabilityActions({ const alert = parseObservabilityAlert(dataFieldEs); const { prepend } = core.http.basePath; - const afterCaseSelection = useCallback(() => { - setActionsPopover(null); - }, []); - const closeActionsPopover = useCallback(() => { setActionsPopover(null); }, []); @@ -171,35 +170,59 @@ function ObservabilityActions({ }, []); const casePermissions = useGetUserCasesPermissions(); - const event = useMemo(() => { - return { - data, - _id: eventId, - ecs: ecsData, - }; - }, [data, eventId, ecsData]); - const ruleId = alert.fields['kibana.alert.rule.uuid'] ?? null; const linkToRule = ruleId ? prepend(paths.management.ruleDetails(ruleId)) : null; + const caseAttachments: CaseAttachments = useMemo(() => { + return ecsData?._id + ? [ + { + alertId: ecsData?._id ?? '', + index: ecsData?._index ?? '', + owner: observabilityFeatureId, + type: CommentType.alert, + rule: cases.helpers.getRuleIdFromEvent({ ecs: ecsData, data: data ?? [] }), + }, + ] + : []; + }, [ecsData, cases.helpers, data]); + + const createCaseFlyout = cases.hooks.getUseCasesAddToNewCaseFlyout({ + attachments: caseAttachments, + }); + + const selectCaseModal = cases.hooks.getUseCasesAddToExistingCaseModal({ + attachments: caseAttachments, + }); + + const handleAddToNewCaseClick = useCallback(() => { + createCaseFlyout.open(); + closeActionsPopover(); + }, [createCaseFlyout, closeActionsPopover]); + + const handleAddToExistingCaseClick = useCallback(() => { + selectCaseModal.open(); + closeActionsPopover(); + }, [closeActionsPopover, selectCaseModal]); + const actionsMenuItems = useMemo(() => { return [ ...(casePermissions?.crud ? [ - timelines.getAddToExistingCaseButton({ - event, - casePermissions, - appId: observabilityAppId, - owner: observabilityFeatureId, - onClose: afterCaseSelection, - }), - timelines.getAddToNewCaseButton({ - event, - casePermissions, - appId: observabilityAppId, - owner: observabilityFeatureId, - onClose: afterCaseSelection, - }), + + {ADD_TO_EXISTING_CASE} + , + + {ADD_TO_NEW_CASE} + , ] : []), @@ -215,7 +238,7 @@ function ObservabilityActions({ ] : []), ]; - }, [afterCaseSelection, casePermissions, timelines, event, linkToRule]); + }, [casePermissions?.crud, handleAddToExistingCaseClick, handleAddToNewCaseClick, linkToRule]); const actionsToolTip = actionsMenuItems.length <= 0 diff --git a/x-pack/plugins/observability/public/pages/alerts/containers/alerts_table_t_grid/translations.ts b/x-pack/plugins/observability/public/pages/alerts/containers/alerts_table_t_grid/translations.ts new file mode 100644 index 0000000000000..c72dc4c943759 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/alerts/containers/alerts_table_t_grid/translations.ts @@ -0,0 +1,22 @@ +/* + * 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'; + +export const ADD_TO_EXISTING_CASE = i18n.translate( + 'xpack.observability.detectionEngine.alerts.actions.addToCase', + { + defaultMessage: 'Add to existing case', + } +); + +export const ADD_TO_NEW_CASE = i18n.translate( + 'xpack.observability.detectionEngine.alerts.actions.addToNewCase', + { + defaultMessage: 'Add to new case', + } +); diff --git a/x-pack/plugins/observability/public/pages/overview/old_overview_page.tsx b/x-pack/plugins/observability/public/pages/overview/old_overview_page.tsx index 4d4ef5b814843..ac5900ca3dc6a 100644 --- a/x-pack/plugins/observability/public/pages/overview/old_overview_page.tsx +++ b/x-pack/plugins/observability/public/pages/overview/old_overview_page.tsx @@ -8,6 +8,8 @@ import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiHorizontalRule } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { useMemo, useRef, useCallback } from 'react'; +import { observabilityFeatureId } from '../../../common'; +import { useKibana } from '../../../../../../src/plugins/kibana_react/public'; import { useTrackPageview } from '../..'; import { EmptySections } from '../../components/app/empty_sections'; import { ObservabilityHeaderMenu } from '../../components/app/header'; @@ -28,6 +30,8 @@ import { DataSections } from './data_sections'; import { LoadingObservability } from './loading_observability'; import { AlertsTableTGrid } from '../alerts/containers/alerts_table_t_grid/alerts_table_t_grid'; import { SectionContainer } from '../../components/app/section'; +import { ObservabilityAppServices } from '../../application/types'; +import { useGetUserCasesPermissions } from '../../hooks/use_get_user_cases_permissions'; interface Props { routeParams: RouteParams<'/overview'>; } @@ -85,6 +89,10 @@ export function OverviewPage({ routeParams }: Props) { return refetch.current && refetch.current(); }, []); + const kibana = useKibana(); + const CasesContext = kibana.services.cases.getCasesContext(); + const userPermissions = useGetUserCasesPermissions(); + if (hasAnyData === undefined) { return ; } @@ -130,12 +138,18 @@ export function OverviewPage({ routeParams }: Props) { })} hasError={false} > - + + + diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx index a9fd9a5d9d44f..5e3fc4e81f9dc 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx @@ -13,7 +13,7 @@ import type { Filter } from '@kbn/es-query'; import { inputsModel, inputsSelectors, State } from '../../store'; import { inputsActions } from '../../store/actions'; import { ControlColumnProps, RowRenderer, TimelineId } from '../../../../common/types/timeline'; -import { APP_UI_ID } from '../../../../common/constants'; +import { APP_ID, APP_UI_ID } from '../../../../common/constants'; import { timelineSelectors, timelineActions } from '../../../timelines/store/timeline'; import type { SubsetTimelineModel, TimelineModel } from '../../../timelines/store/timeline/model'; import { Status } from '../../../../common/detection_engine/schemas/common/schemas'; @@ -27,7 +27,7 @@ import { TGridCellAction } from '../../../../../timelines/common/types'; import { DetailsPanel } from '../../../timelines/components/side_panel'; import { CellValueElementProps } from '../../../timelines/components/timeline/cell_rendering'; import { FIELDS_WITHOUT_CELL_ACTIONS } from '../../lib/cell_actions/constants'; -import { useKibana } from '../../lib/kibana'; +import { useGetUserCasesPermissions, useKibana } from '../../lib/kibana'; import { GraphOverlay } from '../../../timelines/components/graph_overlay'; import { CreateFieldEditorActions, @@ -109,7 +109,7 @@ const StatefulEventsViewerComponent: React.FC = ({ unit, }) => { const dispatch = useDispatch(); - const { timelines: timelinesUi } = useKibana().services; + const { timelines: timelinesUi, cases: casesUi } = useKibana().services; const { browserFields, dataViewId, @@ -179,63 +179,68 @@ const StatefulEventsViewerComponent: React.FC = ({ const createFieldComponent = useCreateFieldButton(scopeId, id, editorActionsRef); + const casesPermissions = useGetUserCasesPermissions(); + const CasesContext = casesUi.getCasesContext(); + return ( <> - - - {timelinesUi.getTGrid<'embedded'>({ - additionalFilters, - appId: APP_UI_ID, - browserFields, - bulkActions, - columns, - dataProviders, - dataViewId, - defaultCellActions, - deletedEventIds, - disabledCellActions: FIELDS_WITHOUT_CELL_ACTIONS, - docValueFields, - end, - entityType, - filters: globalFilters, - filterStatus: currentFilter, - globalFullScreen, - graphEventId, - graphOverlay, - hasAlertsCrud, - id, - indexNames: selectedPatterns, - indexPattern, - isLive, - isLoadingIndexPattern, - itemsPerPage, - itemsPerPageOptions, - kqlMode, - leadingControlColumns, - onRuleChange, - query, - renderCellValue, - rowRenderers, - runtimeMappings, - setQuery, - sort, - start, - tGridEventRenderedViewEnabled, - trailingControlColumns, - type: 'embedded', - unit, - createFieldComponent, - })} - - - + + + + {timelinesUi.getTGrid<'embedded'>({ + additionalFilters, + appId: APP_UI_ID, + browserFields, + bulkActions, + columns, + dataProviders, + dataViewId, + defaultCellActions, + deletedEventIds, + disabledCellActions: FIELDS_WITHOUT_CELL_ACTIONS, + docValueFields, + end, + entityType, + filters: globalFilters, + filterStatus: currentFilter, + globalFullScreen, + graphEventId, + graphOverlay, + hasAlertsCrud, + id, + indexNames: selectedPatterns, + indexPattern, + isLive, + isLoadingIndexPattern, + itemsPerPage, + itemsPerPageOptions, + kqlMode, + leadingControlColumns, + onRuleChange, + query, + renderCellValue, + rowRenderers, + runtimeMappings, + setQuery, + sort, + start, + tGridEventRenderedViewEnabled, + trailingControlColumns, + type: 'embedded', + unit, + createFieldComponent, + })} + + + + ); }; diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts index aacc1dc951693..b76b5ee99843e 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts @@ -18,6 +18,7 @@ import { createWithKibanaMock, } from '../kibana_react.mock'; import { APP_UI_ID } from '../../../../../common/constants'; +import { mockCasesContract } from '../../../../../../cases/public/mocks'; const mockStartServicesMock = createStartServicesMock(); export const KibanaServices = { get: jest.fn(), getKibanaVersion: jest.fn(() => '8.0.0') }; @@ -28,6 +29,7 @@ export const useKibana = jest.fn().mockReturnValue({ get: jest.fn(), set: jest.fn(), }, + cases: mockCasesContract(), data: { ...mockStartServicesMock.data, search: { diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.test.tsx index 3c9d2115f7ef2..d5fc54c5cbac7 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.test.tsx @@ -12,6 +12,7 @@ import { TestProviders } from '../../../../common/mock'; import React from 'react'; import { Ecs } from '../../../../../common/ecs'; import { mockTimelines } from '../../../../common/mock/mock_timelines_plugin'; +import { mockCasesContract } from '../../../../../../cases/public/mocks'; const ecsRowData: Ecs = { _id: '1', @@ -51,6 +52,7 @@ jest.mock('../../../../common/lib/kibana', () => ({ application: { capabilities: { siem: { crud_alerts: true, read_alerts: true } }, }, + cases: mockCasesContract(), }, }), useGetUserCasesPermissions: jest.fn().mockReturnValue({ diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.tsx index b5e630de50f79..d472b9bf3f191 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.tsx @@ -33,7 +33,6 @@ import { useExceptionFlyout } from './use_add_exception_flyout'; import { useExceptionActions } from './use_add_exception_actions'; import { useEventFilterModal } from './use_event_filter_modal'; import { Status } from '../../../../../common/detection_engine/schemas/common/schemas'; -import { useKibana } from '../../../../common/lib/kibana'; import { ATTACH_ALERT_TO_CASE_FOR_ROW } from '../../../../timelines/components/timeline/body/translations'; import { useEventFilterAction } from './use_event_filter_action'; import { useAddToCaseActions } from './use_add_to_case_actions'; @@ -65,16 +64,15 @@ const AlertContextMenuComponent: React.FC { + const onMenuItemClick = useCallback(() => { setPopover(false); }, []); const ruleId = get(0, ecsRowData?.kibana?.alert?.rule?.uuid); const ruleName = get(0, ecsRowData?.kibana?.alert?.rule?.name); - const { timelines: timelinesUi } = useKibana().services; - const { addToCaseActionProps, addToCaseActionItems } = useAddToCaseActions({ + const { addToCaseActionItems } = useAddToCaseActions({ ecsData: ecsRowData, - afterCaseSelection: afterItemSelection, + onMenuItemClick, timelineId, ariaLabel: ATTACH_ALERT_TO_CASE_FOR_ROW({ ariaRowindex, columnValues }), }); @@ -186,7 +184,6 @@ const AlertContextMenuComponent: React.FC - {addToCaseActionProps && timelinesUi.getAddToCaseAction(addToCaseActionProps)} {items.length > 0 && (
    diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx index cc0ef8d4e8b79..2ca4525c7e1ab 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx @@ -5,16 +5,19 @@ * 2.0. */ -import { useMemo } from 'react'; +import React, { useCallback, useMemo } from 'react'; +import { EuiContextMenuItem } from '@elastic/eui'; +import { CommentType } from '../../../../../../cases/common'; +import { CaseAttachments } from '../../../../../../cases/public'; import { useGetUserCasesPermissions, useKibana } from '../../../../common/lib/kibana'; import type { TimelineNonEcsData } from '../../../../../common/search_strategy'; import { TimelineId } from '../../../../../common/types'; -import { APP_ID, APP_UI_ID } from '../../../../../common/constants'; -import { useInsertTimeline } from '../../../../cases/components/use_insert_timeline'; +import { APP_ID } from '../../../../../common/constants'; import { Ecs } from '../../../../../common/ecs'; +import { ADD_TO_EXISTING_CASE, ADD_TO_NEW_CASE } from '../translations'; export interface UseAddToCaseActions { - afterCaseSelection: () => void; + onMenuItemClick: () => void; ariaLabel?: string; ecsData?: Ecs; nonEcsData?: TimelineNonEcsData[]; @@ -22,51 +25,92 @@ export interface UseAddToCaseActions { } export const useAddToCaseActions = ({ - afterCaseSelection, + onMenuItemClick, ariaLabel, ecsData, nonEcsData, timelineId, }: UseAddToCaseActions) => { - const { timelines: timelinesUi } = useKibana().services; + const { cases: casesUi } = useKibana().services; const casePermissions = useGetUserCasesPermissions(); - const insertTimelineHook = useInsertTimeline; + const hasWritePermissions = casePermissions?.crud ?? false; - const addToCaseActionProps = useMemo( - () => - ecsData?._id - ? { - ariaLabel, - event: { data: nonEcsData ?? [], ecs: ecsData, _id: ecsData?._id }, - useInsertTimeline: insertTimelineHook, - casePermissions, - appId: APP_UI_ID, + const caseAttachments: CaseAttachments = useMemo(() => { + return ecsData?._id + ? [ + { + alertId: ecsData?._id ?? '', + index: ecsData?._index ?? '', owner: APP_ID, - onClose: afterCaseSelection, - } - : null, - [ecsData, ariaLabel, nonEcsData, insertTimelineHook, casePermissions, afterCaseSelection] - ); - const hasWritePermissions = casePermissions?.crud ?? false; - const addToCaseActionItems = useMemo( - () => + type: CommentType.alert, + rule: casesUi.helpers.getRuleIdFromEvent({ ecs: ecsData, data: nonEcsData ?? [] }), + }, + ] + : []; + }, [casesUi.helpers, ecsData, nonEcsData]); + + const createCaseFlyout = casesUi.hooks.getUseCasesAddToNewCaseFlyout({ + attachments: caseAttachments, + onClose: onMenuItemClick, + }); + + const selectCaseModal = casesUi.hooks.getUseCasesAddToExistingCaseModal({ + attachments: caseAttachments, + onClose: onMenuItemClick, + }); + + const handleAddToNewCaseClick = useCallback(() => { + // TODO rename this, this is really `closePopover()` + onMenuItemClick(); + createCaseFlyout.open(); + }, [onMenuItemClick, createCaseFlyout]); + + const handleAddToExistingCaseClick = useCallback(() => { + // TODO rename this, this is really `closePopover()` + onMenuItemClick(); + selectCaseModal.open(); + }, [onMenuItemClick, selectCaseModal]); + + const addToCaseActionItems = useMemo(() => { + if ( [ TimelineId.detectionsPage, TimelineId.detectionsRulesDetailsPage, TimelineId.active, ].includes(timelineId as TimelineId) && - hasWritePermissions && - addToCaseActionProps - ? [ - timelinesUi.getAddToExistingCaseButton(addToCaseActionProps), - timelinesUi.getAddToNewCaseButton(addToCaseActionProps), - ] - : [], - [addToCaseActionProps, hasWritePermissions, timelineId, timelinesUi] - ); + hasWritePermissions + ) { + return [ + // add to existing case menu item + + {ADD_TO_EXISTING_CASE} + , + // add to new case menu item + + {ADD_TO_NEW_CASE} + , + ]; + } + return []; + }, [ + ariaLabel, + handleAddToExistingCaseClick, + handleAddToNewCaseClick, + hasWritePermissions, + timelineId, + ]); return { addToCaseActionItems, - addToCaseActionProps, }; }; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/translations.ts b/x-pack/plugins/security_solution/public/detections/components/alerts_table/translations.ts index 590b5759ecae4..bdddd8ab46207 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/translations.ts @@ -285,3 +285,17 @@ export const TRIGGERED = i18n.translate( defaultMessage: 'Triggered', } ); + +export const ADD_TO_EXISTING_CASE = i18n.translate( + 'xpack.securitySolution.detectionEngine.alerts.actions.addToCase', + { + defaultMessage: 'Add to existing case', + } +); + +export const ADD_TO_NEW_CASE = i18n.translate( + 'xpack.securitySolution.detectionEngine.alerts.actions.addToNewCase', + { + defaultMessage: 'Add to new case', + } +); diff --git a/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.test.tsx index 0c525a2d77706..a15a717f6f42a 100644 --- a/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.test.tsx @@ -17,6 +17,7 @@ import { TestProviders } from '../../../common/mock'; import { mockTimelines } from '../../../common/mock/mock_timelines_plugin'; import { createStartServicesMock } from '../../../common/lib/kibana/kibana_react.mock'; import { useKibana } from '../../../common/lib/kibana'; +import { mockCasesContract } from '../../../../../cases/public/mocks'; jest.mock('../user_info', () => ({ useUserData: jest.fn().mockReturnValue([{ canUserCRUD: true, hasIndexWrite: true }]), @@ -82,6 +83,7 @@ describe('take action dropdown', () => { services: { ...mockStartServicesMock, timelines: { ...mockTimelines }, + cases: mockCasesContract(), application: { capabilities: { siem: { crud_alerts: true, read_alerts: true } }, }, diff --git a/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.tsx b/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.tsx index 8ad76c70247bf..d9dfcd0fee7da 100644 --- a/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.tsx @@ -137,7 +137,7 @@ export const TakeActionDropdown = React.memo( disabled: !isEndpointEvent, }); - const afterCaseSelection = useCallback(() => { + const onMenuItemClick = useCallback(() => { closePopoverHandler(); }, [closePopoverHandler]); @@ -175,7 +175,7 @@ export const TakeActionDropdown = React.memo( const { addToCaseActionItems } = useAddToCaseActions({ ecsData, nonEcsData: detailsData?.map((d) => ({ field: d.field, value: d.values })) ?? [], - afterCaseSelection, + onMenuItemClick, timelineId, }); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx index 4b6cbb6f7e16d..4891c75744e38 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx @@ -24,7 +24,7 @@ import { createStore, State } from '../../../common/store'; import { mockHistory, Router } from '../../../common/mock/router'; import { mockTimelines } from '../../../common/mock/mock_timelines_plugin'; import { mockBrowserFields } from '../../../common/containers/source/mock'; -import { mockCasesContext } from '../../../common/mock/mock_cases_context'; +import { mockCasesContext } from '../../../../../cases/public/mocks/mock_cases_context'; // Test will fail because we will to need to mock some core services to make the test work // For now let's forget about SiemSearchBar and QueryBar diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/footer.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/footer.test.tsx index 71d6f6253010d..4a0b7d0fe0501 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/footer.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/footer.test.tsx @@ -15,6 +15,7 @@ import { mockAlertDetailsData } from '../../../../common/components/event_detail import type { TimelineEventsDetailsItem } from '../../../../../common/search_strategy'; import { KibanaServices, useKibana } from '../../../../common/lib/kibana'; import { coreMock } from '../../../../../../../../src/core/public/mocks'; +import { mockCasesContract } from '../../../../../../cases/public/mocks'; const ecsData: Ecs = { _id: '1', @@ -114,6 +115,7 @@ describe('event details footer component', () => { }, query: jest.fn(), }, + cases: mockCasesContract(), }, }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/actions/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/actions/index.test.tsx index b6e6aa40876cc..7a94dcef31cf7 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/actions/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/actions/index.test.tsx @@ -12,6 +12,7 @@ import { TestProviders, mockTimelineModel, mockTimelineData } from '../../../../ import { Actions } from '.'; import { mockTimelines } from '../../../../../common/mock/mock_timelines_plugin'; import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features'; +import { mockCasesContract } from '../../../../../../../cases/public/mocks'; jest.mock('../../../../../detections/components/user_info', () => ({ useUserData: jest.fn().mockReturnValue([{ canUserCRUD: true, hasIndexWrite: true }]), @@ -43,6 +44,7 @@ jest.mock('../../../../../common/lib/kibana', () => ({ siem: { crud_alerts: true, read_alerts: true }, }, }, + cases: mockCasesContract(), uiSettings: { get: jest.fn(), }, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.test.tsx index b9e04060881d4..890175ac8daf9 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.test.tsx @@ -20,6 +20,7 @@ import { getDefaultControlColumn } from '../control_columns'; import { testLeadingControlColumn } from '../../../../../common/mock/mock_timeline_control_columns'; import { mockTimelines } from '../../../../../common/mock/mock_timelines_plugin'; import { getActionsColumnWidth } from '../../../../../../../timelines/public'; +import { mockCasesContract } from '../../../../../../../cases/public/mocks'; jest.mock('../../../../../common/hooks/use_experimental_features'); const useIsExperimentalFeatureEnabledMock = useIsExperimentalFeatureEnabled as jest.Mock; @@ -40,6 +41,7 @@ jest.mock('../../../../../common/lib/kibana', () => ({ siem: { crud_alerts: true, read_alerts: true }, }, }, + cases: mockCasesContract(), }, }), useToasts: jest.fn().mockReturnValue({ diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.test.tsx index 66a140987475c..f616b4afc2af5 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.test.tsx @@ -24,12 +24,12 @@ import { useMountAppended } from '../../../../common/utils/use_mount_appended'; import { timelineActions } from '../../../store/timeline'; import { ColumnHeaderOptions, TimelineTabs } from '../../../../../common/types/timeline'; import { defaultRowRenderers } from './renderers'; -import { mockCasesContext } from '../../../../common/mock/mock_cases_context'; jest.mock('../../../../common/lib/kibana/hooks'); jest.mock('../../../../common/hooks/use_app_toasts'); jest.mock('../../../../common/lib/kibana', () => { const originalModule = jest.requireActual('../../../../common/lib/kibana'); + const mockCasesContract = jest.requireActual('../../../../../../cases/public/mocks'); return { ...originalModule, useKibana: jest.fn().mockReturnValue({ @@ -41,9 +41,7 @@ jest.mock('../../../../common/lib/kibana', () => { siem: { crud_alerts: true, read_alerts: true }, }, }, - cases: { - getCasesContext: () => mockCasesContext, - }, + cases: mockCasesContract.mockCasesContract(), data: { search: jest.fn(), query: jest.fn(), diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/eql_tab_content/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/eql_tab_content/index.test.tsx index 43622b7e45365..943abc88cf2b0 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/eql_tab_content/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/eql_tab_content/index.test.tsx @@ -23,7 +23,7 @@ import { useTimelineEventsDetails } from '../../../containers/details/index'; import { useSourcererDataView } from '../../../../common/containers/sourcerer'; import { mockSourcererScope } from '../../../../common/containers/sourcerer/mocks'; import { useDraggableKeyboardWrapper as mockUseDraggableKeyboardWrapper } from '../../../../../../timelines/public/components'; -import { mockCasesContext } from '../../../../common/mock/mock_cases_context'; +import { mockCasesContext } from '../../../../../../cases/public/mocks/mock_cases_context'; jest.mock('../../../containers/index', () => ({ useTimelineEvents: jest.fn(), diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.test.tsx index ffe50f935b9fe..954f54fdba777 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.test.tsx @@ -24,7 +24,7 @@ import { mockSourcererScope } from '../../../../common/containers/sourcerer/mock import { PinnedTabContentComponent, Props as PinnedTabContentComponentProps } from '.'; import { Direction } from '../../../../../common/search_strategy'; import { useDraggableKeyboardWrapper as mockUseDraggableKeyboardWrapper } from '../../../../../../timelines/public/components'; -import { mockCasesContext } from '../../../../common/mock/mock_cases_context'; +import { mockCasesContext } from '../../../../../../cases/public/mocks/mock_cases_context'; jest.mock('../../../containers/index', () => ({ useTimelineEvents: jest.fn(), diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.test.tsx index 019bedacbffe8..c16afa945cc08 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.test.tsx @@ -26,7 +26,7 @@ import { useSourcererDataView } from '../../../../common/containers/sourcerer'; import { mockSourcererScope } from '../../../../common/containers/sourcerer/mocks'; import { Direction } from '../../../../../common/search_strategy'; import * as helpers from '../helpers'; -import { mockCasesContext } from '../../../../common/mock/mock_cases_context'; +import { mockCasesContext } from '../../../../../../cases/public/mocks/mock_cases_context'; jest.mock('../../../containers/index', () => ({ useTimelineEvents: jest.fn(), From 2880a759088f4fd975e79d10d55d1045756e2948 Mon Sep 17 00:00:00 2001 From: Miriam <31922082+MiriamAparicio@users.noreply.github.com> Date: Thu, 3 Mar 2022 10:48:26 +0000 Subject: [PATCH 30/37] [APM] add cypress-axe to e2e tests to check A11y (#126610) * [APM] add cypress-axe to e2e tests to check A11y * check A11y in dependecy overview * PR comments --- .../read_only_user/dependencies.spec.ts | 24 +++++++++++++++++ .../errors/error_details.spec.ts | 8 ++++++ .../read_only_user/errors/errors_page.spec.ts | 8 ++++++ .../service_inventory.spec.ts | 9 ++++++- .../service_overview/service_overview.spec.ts | 8 ++++++ .../transactions_overview.spec.ts | 15 +++++++++-- .../apm/ftr_e2e/cypress/support/commands.ts | 27 +++++++++++++++++++ 7 files changed, 96 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/dependencies.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/dependencies.spec.ts index 2c2e93d463c50..22ac5a72733e4 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/dependencies.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/dependencies.spec.ts @@ -6,6 +6,7 @@ */ import { synthtrace } from '../../../synthtrace'; import { opbeans } from '../../fixtures/synthtrace/opbeans'; +import { checkA11y } from '../../support/commands'; const start = '2021-10-10T00:00:00.000Z'; const end = '2021-10-10T00:15:00.000Z'; @@ -43,6 +44,17 @@ describe('Dependencies', () => { cy.contains('h1', 'postgresql'); }); + + it('has no detectable a11y violations on load', () => { + cy.visit( + `/app/apm/services/opbeans-java/dependencies?${new URLSearchParams( + timeRange + )}` + ); + cy.contains('a[role="tab"]', 'Dependencies'); + // set skipFailures to true to not fail the test when there are accessibility failures + checkA11y({ skipFailures: true }); + }); }); describe('dependency overview page', () => { @@ -62,6 +74,18 @@ describe('Dependencies', () => { cy.contains('h1', 'opbeans-java'); }); + + it('has no detectable a11y violations on load', () => { + cy.visit( + `/app/apm/backends/overview?${new URLSearchParams({ + ...timeRange, + backendName: 'postgresql', + })}` + ); + cy.contains('h1', 'postgresql'); + // set skipFailures to true to not fail the test when there are accessibility failures + checkA11y({ skipFailures: true }); + }); }); describe('service overview page', () => { diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/errors/error_details.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/errors/error_details.spec.ts index f2479b7400732..beaf1837c834c 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/errors/error_details.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/errors/error_details.spec.ts @@ -7,6 +7,7 @@ import url from 'url'; import { synthtrace } from '../../../../synthtrace'; +import { checkA11y } from '../../../support/commands'; import { generateData } from './generate_data'; const start = '2021-10-10T00:00:00.000Z'; @@ -39,6 +40,13 @@ describe('Error details', () => { await synthtrace.clean(); }); + it('has no detectable a11y violations on load', () => { + cy.visit(errorDetailsPageHref); + cy.contains('Error group 00000'); + // set skipFailures to true to not fail the test when there are accessibility failures + checkA11y({ skipFailures: true }); + }); + describe('when error has no occurrences', () => { it('shows an empty message', () => { cy.visit( diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/errors/errors_page.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/errors/errors_page.spec.ts index d08e22092d592..6ff4795cbcb18 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/errors/errors_page.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/errors/errors_page.spec.ts @@ -7,6 +7,7 @@ import url from 'url'; import { synthtrace } from '../../../../synthtrace'; +import { checkA11y } from '../../../support/commands'; import { generateData } from './generate_data'; const start = '2021-10-10T00:00:00.000Z'; @@ -41,6 +42,13 @@ describe('Errors page', () => { await synthtrace.clean(); }); + it('has no detectable a11y violations on load', () => { + cy.visit(javaServiceErrorsPageHref); + cy.contains('Error occurrences'); + // set skipFailures to true to not fail the test when there are accessibility failures + checkA11y({ skipFailures: true }); + }); + describe('when service has no errors', () => { it('shows empty message', () => { cy.visit(nodeServiceErrorsPageHref); diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_inventory/service_inventory.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_inventory/service_inventory.spec.ts index f74a1d122e426..40afece0ce908 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_inventory/service_inventory.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_inventory/service_inventory.spec.ts @@ -7,6 +7,7 @@ import url from 'url'; import { synthtrace } from '../../../../synthtrace'; import { opbeans } from '../../../fixtures/synthtrace/opbeans'; +import { checkA11y } from '../../../support/commands'; const timeRange = { rangeFrom: '2021-10-10T00:00:00.000Z', @@ -53,6 +54,12 @@ describe('When navigating to the service inventory', () => { cy.visit(serviceInventoryHref); }); + it('has no detectable a11y violations on load', () => { + cy.contains('h1', 'Services'); + // set skipFailures to true to not fail the test when there are accessibility failures + checkA11y({ skipFailures: true }); + }); + it('has a list of services', () => { cy.contains('opbeans-node'); cy.contains('opbeans-java'); @@ -93,7 +100,7 @@ describe('When navigating to the service inventory', () => { cy.wait(aliasNames); }); - it.skip('when selecting a different time range and clicking the update button', () => { + it('when selecting a different time range and clicking the update button', () => { cy.wait(aliasNames); cy.selectAbsoluteTimeRange( diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/service_overview.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/service_overview.spec.ts index 31586651cbb84..fcd9e472cc7eb 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/service_overview.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/service_overview.spec.ts @@ -8,6 +8,7 @@ import url from 'url'; import { synthtrace } from '../../../../synthtrace'; import { opbeans } from '../../../fixtures/synthtrace/opbeans'; +import { checkA11y } from '../../../support/commands'; const start = '2021-10-10T00:00:00.000Z'; const end = '2021-10-10T00:15:00.000Z'; @@ -102,6 +103,13 @@ describe('Service Overview', () => { cy.loginAsReadOnlyUser(); cy.visit(baseUrl); }); + + it('has no detectable a11y violations on load', () => { + cy.contains('opbeans-node'); + // set skipFailures to true to not fail the test when there are accessibility failures + checkA11y({ skipFailures: true }); + }); + it('transaction latency chart', () => { cy.get('[data-test-subj="latencyChart"]'); }); diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/transactions_overview/transactions_overview.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/transactions_overview/transactions_overview.spec.ts index 3deb4b8619f60..fb8468f42474e 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/transactions_overview/transactions_overview.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/transactions_overview/transactions_overview.spec.ts @@ -8,11 +8,12 @@ import url from 'url'; import { synthtrace } from '../../../../synthtrace'; import { opbeans } from '../../../fixtures/synthtrace/opbeans'; +import { checkA11y } from '../../../support/commands'; const start = '2021-10-10T00:00:00.000Z'; const end = '2021-10-10T00:15:00.000Z'; -const serviceOverviewHref = url.format({ +const serviceTransactionsHref = url.format({ pathname: '/app/apm/services/opbeans-node/transactions', query: { rangeFrom: start, rangeTo: end }, }); @@ -35,8 +36,18 @@ describe('Transactions Overview', () => { cy.loginAsReadOnlyUser(); }); + it('has no detectable a11y violations on load', () => { + cy.visit(serviceTransactionsHref); + cy.contains('aria-selected="true"', 'Transactions').should( + 'have.class', + 'euiTab-isSelected' + ); + // set skipFailures to true to not fail the test when there are accessibility failures + checkA11y({ skipFailures: true }); + }); + it('persists transaction type selected when navigating to Overview tab', () => { - cy.visit(serviceOverviewHref); + cy.visit(serviceTransactionsHref); cy.get('[data-test-subj="headerFilterTransactionType"]').should( 'have.value', 'request' diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/support/commands.ts b/x-pack/plugins/apm/ftr_e2e/cypress/support/commands.ts index cb66d6db809f3..91edae9046f6d 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/support/commands.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/support/commands.ts @@ -6,6 +6,11 @@ */ import 'cypress-real-events/support'; import { Interception } from 'cypress/types/net-stubbing'; +import 'cypress-axe'; +import { + AXE_CONFIG, + AXE_OPTIONS, +} from 'test/accessibility/services/a11y/constants'; Cypress.Commands.add('loginAsReadOnlyUser', () => { cy.loginAs({ username: 'apm_read_user', password: 'changeme' }); @@ -78,3 +83,25 @@ Cypress.Commands.add( }); } ); + +// A11y configuration + +const axeConfig = { + ...AXE_CONFIG, +}; +const axeOptions = { + ...AXE_OPTIONS, + runOnly: [...AXE_OPTIONS.runOnly, 'best-practice'], +}; + +export const checkA11y = ({ skipFailures }: { skipFailures: boolean }) => { + // https://github.com/component-driven/cypress-axe#cychecka11y + cy.injectAxe(); + cy.configureAxe(axeConfig); + const context = '.kbnAppWrapper'; // Scopes a11y checks to only our app + /** + * We can get rid of the last two params when we don't need to add skipFailures + * params = (context, options, violationCallback, skipFailures) + */ + cy.checkA11y(context, axeOptions, undefined, skipFailures); +}; From c302779004f0f40f7a3807d83e20f614df47066d Mon Sep 17 00:00:00 2001 From: Miriam <31922082+MiriamAparicio@users.noreply.github.com> Date: Thu, 3 Mar 2022 10:49:03 +0000 Subject: [PATCH 31/37] Update e2e documentation and add note about a11y checks (#126675) * Update e2e documentation and add note about a11y checks * fix typo --- x-pack/plugins/apm/dev_docs/testing.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/apm/dev_docs/testing.md b/x-pack/plugins/apm/dev_docs/testing.md index f6a8298ef9d0c..6c35979add784 100644 --- a/x-pack/plugins/apm/dev_docs/testing.md +++ b/x-pack/plugins/apm/dev_docs/testing.md @@ -37,6 +37,7 @@ Once the tests finish, the instances will be terminated. ``` node scripts/test/api --server ``` + Start Elasticsearch and Kibana instances. ### Run all tests @@ -44,6 +45,7 @@ Start Elasticsearch and Kibana instances. ``` node scripts/test/api --runner ``` + Run all tests. The test server needs to be running, see [Start Test Server](#start-test-server). ### Update snapshots (from Kibana root) @@ -53,6 +55,7 @@ To update snapshots append `--updateSnapshots` to the `functional_test_runner` c ``` node scripts/functional_test_runner --config x-pack/test/apm_api_integration/[basic | trial]/config.ts --quiet --updateSnapshots ``` + The test server needs to be running, see [Start Test Server](#start-test-server). The API tests are located in [`x-pack/test/apm_api_integration/`](/x-pack/test/apm_api_integration/). @@ -66,11 +69,23 @@ The API tests are located in [`x-pack/test/apm_api_integration/`](/x-pack/test/a ## E2E Tests (Cypress) +The E2E tests are located in [`x-pack/plugins/apm/ftr_e2e`](../ftr_e2e) + +### Start test server + ``` -node scripts/test/e2e [--trial] [--help] +node x-pack/plugins/apm/scripts/test/e2e.js --server ``` -The E2E tests are located in [`x-pack/plugins/apm/ftr_e2e`](../ftr_e2e) +### Run tests + +``` +node x-pack/plugins/apm/scripts/test/e2e.js --open +``` + +### A11y checks + +Accessibility tests are added on the e2e with `checkA11y()`, they will run together with cypress. --- From efcdbb66dda385174a509fffd132e12003e31dc4 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Thu, 3 Mar 2022 15:04:04 +0300 Subject: [PATCH 32/37] [TSVB] Multi-field group by (#126015) * fieldSelect * activate multifield support for table * update table>pivot request_processor * fix some tests * apply some changes * fix JEST * push initial logic for series request_processor * fix some broken cases for Table tab * update convert_series_to_datatable / convert_series_to_vars * add some logic * fix table/terms * do some logic * fix some issues * push some logic * navigation to Lens * fix CI * add excludedFieldFormatsIds param into excludedFieldFormatsIds * fix ci * fix translations * fix some comments * fix series_agg label * update labels in lens Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- docs/user/dashboard/tsvb.asciidoc | 16 -- .../timeseries/common/calculate_label.test.ts | 5 +- .../timeseries/common/fields_utils.test.ts | 100 +++++++++- .../timeseries/common/fields_utils.ts | 67 ++++++- .../timeseries/common/types/index.ts | 4 +- .../timeseries/common/types/panel_model.ts | 17 +- .../timeseries/common/types/vis_data.ts | 2 +- .../components/aggs/field_select.tsx | 149 -------------- .../aggs/field_select/field_select.tsx | 185 ++++++++++++++++++ .../aggs/field_select/field_select_item.tsx | 76 +++++++ .../aggs/field_select/field_select_utils.ts | 109 +++++++++++ .../components/aggs/field_select/index.ts | 9 + .../aggs/field_select/multi_field_select.tsx | 65 ++++++ .../components/aggs/filter_ratio.js | 6 +- .../components/aggs/filter_ratio.test.js | 3 + .../application/components/aggs/percentile.js | 6 +- .../aggs/percentile_rank/percentile_rank.tsx | 8 +- .../components/aggs/positive_rate.js | 6 +- .../application/components/aggs/std_agg.js | 6 +- .../components/aggs/std_deviation.js | 6 +- .../application/components/aggs/top_hit.js | 12 +- .../application/components/annotation_row.tsx | 8 +- .../application/components/index_pattern.js | 6 +- .../lib/check_if_numeric_metric.test.ts | 3 +- .../lib/convert_series_to_datatable.test.ts | 4 +- .../lib/convert_series_to_datatable.ts | 5 +- .../components/lib/convert_series_to_vars.js | 15 +- .../components/panel_config/table.tsx | 30 ++- .../splits/__snapshots__/terms.test.js.snap | 3 +- .../components/splits/group_by_select.js | 75 ------- .../components/splits/group_by_select.tsx | 75 +++++++ .../application/components/splits/terms.js | 14 +- .../components/timeseries_visualization.tsx | 1 + .../application/components/vis_types/index.ts | 3 + .../components/vis_types/table/config.js | 6 +- .../components/vis_types/table/vis.js | 61 ++++-- .../timeseries/public/trigger_action/index.ts | 19 +- .../server/lib/vis_data/get_table_data.ts | 15 +- .../server/lib/vis_data/helpers/get_splits.ts | 2 +- .../series/date_histogram.js | 3 +- .../series/date_histogram.test.js | 3 +- .../series/split_by_everything.js | 3 +- .../series/split_by_terms.js | 38 ++-- .../table/date_histogram.ts | 3 +- .../request_processors/table/pivot.ts | 28 ++- .../lib/vis_data/request_processors/types.ts | 3 +- .../series/format_label.ts | 51 +++-- .../response_processors/series/series_agg.js | 2 +- .../response_processors/table/series_agg.ts | 2 +- .../visualizations/public/vis_types/types.ts | 2 +- .../page_objects/visual_builder_page.ts | 4 +- .../metrics/kibana_metrics_adapter.ts | 4 +- .../indexpattern_suggestions.test.tsx | 2 +- .../indexpattern_suggestions.ts | 12 +- .../operations/layer_helpers.ts | 19 +- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 57 files changed, 1007 insertions(+), 376 deletions(-) delete mode 100644 src/plugins/vis_types/timeseries/public/application/components/aggs/field_select.tsx create mode 100644 src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/field_select.tsx create mode 100644 src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/field_select_item.tsx create mode 100644 src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/field_select_utils.ts create mode 100644 src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/index.ts create mode 100644 src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/multi_field_select.tsx delete mode 100644 src/plugins/vis_types/timeseries/public/application/components/splits/group_by_select.js create mode 100644 src/plugins/vis_types/timeseries/public/application/components/splits/group_by_select.tsx diff --git a/docs/user/dashboard/tsvb.asciidoc b/docs/user/dashboard/tsvb.asciidoc index a097e34b20911..56e3606c18b72 100644 --- a/docs/user/dashboard/tsvb.asciidoc +++ b/docs/user/dashboard/tsvb.asciidoc @@ -276,20 +276,4 @@ For other types of month over month calculations, use <> o Calculating the duration between the start and end of an event is unsupported in *TSVB* because *TSVB* requires correlation between different time periods. *TSVB* requires that the duration is pre-calculated. -==== - -[discrete] -[group-on-multiple-fields] -.*How do I group on multiple fields?* -[%collapsible] -==== - -To group with multiple fields, create runtime fields in the {data-source} you are visualizing. - -. Create a runtime field. Refer to <> for more information. -+ -[role="screenshot"] -image::images/tsvb_group_by_multiple_fields.png[Group by multiple fields] - -. Create a *TSVB* visualization and group by this field. ==== \ No newline at end of file diff --git a/src/plugins/vis_types/timeseries/common/calculate_label.test.ts b/src/plugins/vis_types/timeseries/common/calculate_label.test.ts index 7083711246e7b..7e612ed1aaddd 100644 --- a/src/plugins/vis_types/timeseries/common/calculate_label.test.ts +++ b/src/plugins/vis_types/timeseries/common/calculate_label.test.ts @@ -9,6 +9,7 @@ import { calculateLabel } from './calculate_label'; import type { Metric } from './types'; import { SanitizedFieldType } from './types'; +import { KBN_FIELD_TYPES } from '../../../data/common'; describe('calculateLabel(metric, metrics)', () => { test('returns the metric.alias if set', () => { @@ -90,7 +91,7 @@ describe('calculateLabel(metric, metrics)', () => { { id: 1, type: 'max', field: 'network.out.bytes', alias: 'Outbound Traffic' }, metric, ] as unknown as Metric[]; - const fields: SanitizedFieldType[] = [{ name: '2', label: '2', type: 'field' }]; + const fields: SanitizedFieldType[] = [{ name: '2', label: '2', type: KBN_FIELD_TYPES.DATE }]; expect(() => calculateLabel(metric, metrics, fields)).toThrowError('Field "3" not found'); }); @@ -101,7 +102,7 @@ describe('calculateLabel(metric, metrics)', () => { { id: 1, type: 'max', field: 'network.out.bytes', alias: 'Outbound Traffic' }, metric, ] as unknown as Metric[]; - const fields: SanitizedFieldType[] = [{ name: '2', label: '2', type: 'field' }]; + const fields: SanitizedFieldType[] = [{ name: '2', label: '2', type: KBN_FIELD_TYPES.DATE }]; expect(calculateLabel(metric, metrics, fields, false)).toBe('Max of 3'); }); diff --git a/src/plugins/vis_types/timeseries/common/fields_utils.test.ts b/src/plugins/vis_types/timeseries/common/fields_utils.test.ts index 228dfbfd2db9d..6dd00d803b7c3 100644 --- a/src/plugins/vis_types/timeseries/common/fields_utils.test.ts +++ b/src/plugins/vis_types/timeseries/common/fields_utils.test.ts @@ -6,8 +6,16 @@ * Side Public License, v 1. */ -import { toSanitizedFieldType } from './fields_utils'; -import type { FieldSpec } from '../../../data/common'; +import { + getFieldsForTerms, + toSanitizedFieldType, + getMultiFieldLabel, + createCachedFieldValueFormatter, +} from './fields_utils'; +import { FieldSpec, KBN_FIELD_TYPES } from '../../../data/common'; +import { DataView } from '../../../data_views/common'; +import { stubLogstashDataView } from '../../../data/common/stubs'; +import { FieldFormatsRegistry, StringFormat } from '../../../field_formats/common'; describe('fields_utils', () => { describe('toSanitizedFieldType', () => { @@ -59,4 +67,92 @@ describe('fields_utils', () => { expect(toSanitizedFieldType(fields)).toMatchInlineSnapshot(`Array []`); }); }); + + describe('getFieldsForTerms', () => { + test('should return fields as array', () => { + expect(getFieldsForTerms('field')).toEqual(['field']); + expect(getFieldsForTerms(['field', 'field1'])).toEqual(['field', 'field1']); + }); + + test('should exclude empty values', () => { + expect(getFieldsForTerms([null, ''])).toEqual([]); + }); + + test('should return empty array in case of undefined field', () => { + expect(getFieldsForTerms(undefined)).toEqual([]); + }); + }); + + describe('getMultiFieldLabel', () => { + test('should return label for single field', () => { + expect( + getMultiFieldLabel( + ['field'], + [{ name: 'field', label: 'Label', type: KBN_FIELD_TYPES.DATE }] + ) + ).toBe('Label'); + }); + + test('should return label for multi fields', () => { + expect( + getMultiFieldLabel( + ['field', 'field1'], + [ + { name: 'field', label: 'Label', type: KBN_FIELD_TYPES.DATE }, + { name: 'field2', label: 'Label1', type: KBN_FIELD_TYPES.DATE }, + ] + ) + ).toBe('Label + 1 other'); + }); + + test('should return label for multi fields (2 others)', () => { + expect( + getMultiFieldLabel( + ['field', 'field1', 'field2'], + [ + { name: 'field', label: 'Label', type: KBN_FIELD_TYPES.DATE }, + { name: 'field1', label: 'Label1', type: KBN_FIELD_TYPES.DATE }, + { name: 'field3', label: 'Label2', type: KBN_FIELD_TYPES.DATE }, + ] + ) + ).toBe('Label + 2 others'); + }); + }); + + describe('createCachedFieldValueFormatter', () => { + let dataView: DataView; + + beforeEach(() => { + dataView = stubLogstashDataView; + }); + + test('should use data view formatters', () => { + const getFormatterForFieldSpy = jest.spyOn(dataView, 'getFormatterForField'); + + const cache = createCachedFieldValueFormatter(dataView); + + cache('bytes', '10001'); + cache('bytes', '20002'); + + expect(getFormatterForFieldSpy).toHaveBeenCalledTimes(1); + }); + + test('should use default formatters in case of Data view not defined', () => { + const fieldFormatServiceMock = { + getDefaultInstance: jest.fn().mockReturnValue(new StringFormat()), + } as unknown as FieldFormatsRegistry; + + const cache = createCachedFieldValueFormatter( + null, + [{ name: 'field', label: 'Label', type: KBN_FIELD_TYPES.STRING }], + fieldFormatServiceMock + ); + + cache('field', '10001'); + cache('field', '20002'); + + expect(fieldFormatServiceMock.getDefaultInstance).toHaveBeenCalledTimes(1); + expect(fieldFormatServiceMock.getDefaultInstance).toHaveBeenCalledWith('string'); + }); + }); }); diff --git a/src/plugins/vis_types/timeseries/common/fields_utils.ts b/src/plugins/vis_types/timeseries/common/fields_utils.ts index d6987b9cdae9c..02a62b9246d54 100644 --- a/src/plugins/vis_types/timeseries/common/fields_utils.ts +++ b/src/plugins/vis_types/timeseries/common/fields_utils.ts @@ -5,11 +5,12 @@ * 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 { FieldSpec } from '../../../data/common'; -import { isNestedField } from '../../../data/common'; -import { FetchedIndexPattern, SanitizedFieldType } from './types'; +import { isNestedField, FieldSpec, DataView } from '../../../data/common'; import { FieldNotFoundError } from './errors'; +import type { FetchedIndexPattern, SanitizedFieldType } from './types'; +import { FieldFormat, FieldFormatsRegistry, FIELD_FORMAT_IDS } from '../../../field_formats/common'; export const extractFieldLabel = ( fields: SanitizedFieldType[], @@ -49,3 +50,63 @@ export const toSanitizedFieldType = (fields: FieldSpec[]) => type: field.type, } as SanitizedFieldType) ); + +export const getFieldsForTerms = (fields: string | Array | undefined): string[] => { + return fields ? ([fields].flat().filter(Boolean) as string[]) : []; +}; + +export const getMultiFieldLabel = (fieldForTerms: string[], fields?: SanitizedFieldType[]) => { + const firstFieldLabel = fields ? extractFieldLabel(fields, fieldForTerms[0]) : fieldForTerms[0]; + + if (fieldForTerms.length > 1) { + return i18n.translate('visTypeTimeseries.fieldUtils.multiFieldLabel', { + defaultMessage: '{firstFieldLabel} + {count} {count, plural, one {other} other {others}}', + values: { + firstFieldLabel, + count: fieldForTerms.length - 1, + }, + }); + } + return firstFieldLabel ?? ''; +}; + +export const createCachedFieldValueFormatter = ( + dataView?: DataView | null, + fields?: SanitizedFieldType[], + fieldFormatService?: FieldFormatsRegistry, + excludedFieldFormatsIds: FIELD_FORMAT_IDS[] = [] +) => { + const cache = new Map(); + + return (fieldName: string, value: string, contentType: 'text' | 'html' = 'text') => { + const cachedFormatter = cache.get(fieldName); + if (cachedFormatter) { + return cachedFormatter.convert(value, contentType); + } + + if (dataView && !excludedFieldFormatsIds.includes(dataView.fieldFormatMap?.[fieldName]?.id)) { + const field = dataView.fields.getByName(fieldName); + if (field) { + const formatter = dataView.getFormatterForField(field); + + if (formatter) { + cache.set(fieldName, formatter); + return formatter.convert(value, contentType); + } + } + } else if (fieldFormatService && fields) { + const f = fields.find((item) => item.name === fieldName); + + if (f) { + const formatter = fieldFormatService.getDefaultInstance(f.type); + + if (formatter) { + cache.set(fieldName, formatter); + return formatter.convert(value, contentType); + } + } + } + }; +}; + +export const MULTI_FIELD_VALUES_SEPARATOR = ' › '; diff --git a/src/plugins/vis_types/timeseries/common/types/index.ts b/src/plugins/vis_types/timeseries/common/types/index.ts index 01b200c6774d1..001ea02eb355a 100644 --- a/src/plugins/vis_types/timeseries/common/types/index.ts +++ b/src/plugins/vis_types/timeseries/common/types/index.ts @@ -7,7 +7,7 @@ */ import { Filter } from '@kbn/es-query'; -import { IndexPattern, Query } from '../../../../data/common'; +import { IndexPattern, KBN_FIELD_TYPES, Query } from '../../../../data/common'; import { Panel } from './panel_model'; export type { Metric, Series, Panel, MetricType } from './panel_model'; @@ -28,7 +28,7 @@ export interface FetchedIndexPattern { export interface SanitizedFieldType { name: string; - type: string; + type: KBN_FIELD_TYPES; label?: string; } diff --git a/src/plugins/vis_types/timeseries/common/types/panel_model.ts b/src/plugins/vis_types/timeseries/common/types/panel_model.ts index 40bd5632c3a80..1ccf7412a3e98 100644 --- a/src/plugins/vis_types/timeseries/common/types/panel_model.ts +++ b/src/plugins/vis_types/timeseries/common/types/panel_model.ts @@ -6,10 +6,15 @@ * Side Public License, v 1. */ -import { METRIC_TYPES, Query } from '../../../../data/common'; +import { Query, METRIC_TYPES, KBN_FIELD_TYPES } from '../../../../data/common'; import { PANEL_TYPES, TOOLTIP_MODES, TSVB_METRIC_TYPES } from '../enums'; -import { IndexPatternValue, Annotation } from './index'; -import { ColorRules, BackgroundColorRules, BarColorRules, GaugeColorRules } from './color_rules'; +import type { IndexPatternValue, Annotation } from './index'; +import type { + ColorRules, + BackgroundColorRules, + BarColorRules, + GaugeColorRules, +} from './color_rules'; interface MetricVariable { field?: string; @@ -109,7 +114,7 @@ export interface Series { steps: number; terms_direction?: string; terms_exclude?: string; - terms_field?: string; + terms_field?: string | Array; terms_include?: string; terms_order_by?: string; terms_size?: string; @@ -155,10 +160,10 @@ export interface Panel { markdown_scrollbars: number; markdown_vertical_align?: string; max_bars: number; - pivot_id?: string; + pivot_id?: string | Array; pivot_label?: string; pivot_rows?: string; - pivot_type?: string; + pivot_type?: KBN_FIELD_TYPES | Array; series: Series[]; show_grid: number; show_legend: number; diff --git a/src/plugins/vis_types/timeseries/common/types/vis_data.ts b/src/plugins/vis_types/timeseries/common/types/vis_data.ts index 07c078a6e8aae..de507fb9ecc33 100644 --- a/src/plugins/vis_types/timeseries/common/types/vis_data.ts +++ b/src/plugins/vis_types/timeseries/common/types/vis_data.ts @@ -46,7 +46,7 @@ export interface PanelSeries { export interface PanelData { id: string; - label: string; + label: string | string[]; labelFormatted?: string; data: PanelDataArray[]; seriesId: string; diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select.tsx b/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select.tsx deleted file mode 100644 index d5665211b7f73..0000000000000 --- a/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select.tsx +++ /dev/null @@ -1,149 +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 { i18n } from '@kbn/i18n'; -import React, { ReactNode } from 'react'; -import { - EuiComboBox, - EuiComboBoxProps, - EuiComboBoxOptionOption, - EuiFormRow, - htmlIdGenerator, -} from '@elastic/eui'; -import { getIndexPatternKey } from '../../../../common/index_patterns_utils'; -import type { SanitizedFieldType, IndexPatternValue } from '../../../../common/types'; -import type { TimeseriesUIRestrictions } from '../../../../common/ui_restrictions'; - -import { isFieldEnabled } from '../../../../common/check_ui_restrictions'; - -interface FieldSelectProps { - label: string | ReactNode; - type: string; - fields: Record; - indexPattern: IndexPatternValue; - value?: string | null; - onChange: (options: Array>) => void; - disabled?: boolean; - restrict?: string[]; - placeholder?: string; - uiRestrictions?: TimeseriesUIRestrictions; - 'data-test-subj'?: string; -} - -const defaultPlaceholder = i18n.translate('visTypeTimeseries.fieldSelect.selectFieldPlaceholder', { - defaultMessage: 'Select field...', -}); - -const isFieldTypeEnabled = (fieldRestrictions: string[], fieldType: string) => - fieldRestrictions.length ? fieldRestrictions.includes(fieldType) : true; - -const sortByLabel = (a: EuiComboBoxOptionOption, b: EuiComboBoxOptionOption) => { - const getNormalizedString = (option: EuiComboBoxOptionOption) => - (option.label || '').toLowerCase(); - - return getNormalizedString(a).localeCompare(getNormalizedString(b)); -}; - -export function FieldSelect({ - label, - type, - fields, - indexPattern = '', - value = '', - onChange, - disabled = false, - restrict = [], - placeholder = defaultPlaceholder, - uiRestrictions, - 'data-test-subj': dataTestSubj = 'metricsIndexPatternFieldsSelect', -}: FieldSelectProps) { - const htmlId = htmlIdGenerator(); - - let selectedOptions: Array> = []; - let newPlaceholder = placeholder; - const fieldsSelector = getIndexPatternKey(indexPattern); - - const groupedOptions: EuiComboBoxProps['options'] = Object.values( - (fields[fieldsSelector] || []).reduce>>( - (acc, field) => { - if (placeholder === field?.name) { - newPlaceholder = field.label ?? field.name; - } - - if ( - isFieldTypeEnabled(restrict, field.type) && - isFieldEnabled(field.name, type, uiRestrictions) - ) { - const item: EuiComboBoxOptionOption = { - value: field.name, - label: field.label ?? field.name, - }; - - const fieldTypeOptions = acc[field.type]?.options; - - if (fieldTypeOptions) { - fieldTypeOptions.push(item); - } else { - acc[field.type] = { - options: [item], - label: field.type, - }; - } - - if (value === item.value) { - selectedOptions.push(item); - } - } - - return acc; - }, - {} - ) - ); - - // sort groups - groupedOptions.sort(sortByLabel); - - // sort items - groupedOptions.forEach((group) => { - if (Array.isArray(group.options)) { - group.options.sort(sortByLabel); - } - }); - - const isInvalid = Boolean(value && fields[fieldsSelector] && !selectedOptions.length); - - if (value && !selectedOptions.length) { - selectedOptions = [{ label: value, id: 'INVALID_FIELD' }]; - } - - return ( - - - - ); -} diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/field_select.tsx b/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/field_select.tsx new file mode 100644 index 0000000000000..27f4d96381fda --- /dev/null +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/field_select.tsx @@ -0,0 +1,185 @@ +/* + * 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, { useCallback, useMemo, ReactNode } from 'react'; +import { i18n } from '@kbn/i18n'; +import { + EuiComboBoxOptionOption, + EuiComboBoxProps, + EuiFormRow, + htmlIdGenerator, + DragDropContextProps, +} from '@elastic/eui'; + +import { FieldSelectItem } from './field_select_item'; +import { IndexPatternValue, SanitizedFieldType } from '../../../../../common/types'; +import { TimeseriesUIRestrictions } from '../../../../../common/ui_restrictions'; +import { getIndexPatternKey } from '../../../../../common/index_patterns_utils'; +import { MultiFieldSelect } from './multi_field_select'; +import { + addNewItem, + deleteItem, + swapItems, + getGroupedOptions, + findInGroupedOptions, + INVALID_FIELD_ID, + MAX_MULTI_FIELDS_ITEMS, + updateItem, +} from './field_select_utils'; + +interface FieldSelectProps { + label: string | ReactNode; + type: string; + uiRestrictions?: TimeseriesUIRestrictions; + restrict?: string[]; + value?: string | Array | null; + fields: Record; + indexPattern: IndexPatternValue; + onChange: (selectedValues: Array) => void; + disabled?: boolean; + placeholder?: string; + allowMultiSelect?: boolean; + 'data-test-subj'?: string; + fullWidth?: boolean; +} + +const getPreselectedFields = ( + placeholder?: string, + options?: Array> +) => placeholder && findInGroupedOptions(options, placeholder)?.label; + +export function FieldSelect({ + label, + fullWidth, + type, + value, + fields, + indexPattern, + uiRestrictions, + restrict, + onChange, + disabled, + placeholder, + allowMultiSelect = false, + 'data-test-subj': dataTestSubj, +}: FieldSelectProps) { + const htmlId = htmlIdGenerator(); + const fieldsSelector = getIndexPatternKey(indexPattern); + const selectedIds = useMemo(() => [value ?? null].flat(), [value]); + + const groupedOptions = useMemo( + () => getGroupedOptions(type, selectedIds, fields[fieldsSelector], uiRestrictions, restrict), + [fields, fieldsSelector, restrict, selectedIds, type, uiRestrictions] + ); + + const selectedOptionsMap = useMemo(() => { + const map = new Map['selectedOptions']>(); + if (selectedIds) { + const addIntoSet = (item: string) => { + const option = findInGroupedOptions(groupedOptions, item); + if (option) { + map.set(item, [option]); + } else { + map.set(item, [{ label: item, id: INVALID_FIELD_ID }]); + } + }; + + selectedIds.forEach((v) => v && addIntoSet(v)); + } + return map; + }, [groupedOptions, selectedIds]); + + const invalidSelectedOptions = useMemo( + () => + [...selectedOptionsMap.values()] + .flat() + .filter((item) => item?.label && item?.id === INVALID_FIELD_ID) + .map((item) => item!.label), + [selectedOptionsMap] + ); + + const onFieldSelectItemChange = useCallback( + (index: number = 0, [selectedItem]) => { + onChange(updateItem(selectedIds, selectedItem?.value, index)); + }, + [selectedIds, onChange] + ); + + const onNewItemAdd = useCallback( + (index?: number) => onChange(addNewItem(selectedIds, index)), + [selectedIds, onChange] + ); + + const onDeleteItem = useCallback( + (index?: number) => onChange(deleteItem(selectedIds, index)), + [onChange, selectedIds] + ); + + const onDragEnd: DragDropContextProps['onDragEnd'] = useCallback( + ({ source, destination }) => { + if (destination && source.index !== destination?.index) { + onChange(swapItems(selectedIds, source.index, destination.index)); + } + }, + [onChange, selectedIds] + ); + + const FieldSelectItemFactory = useMemo( + () => (props: { value?: string | null; index?: number }) => + ( + = MAX_MULTI_FIELDS_ITEMS} + disableDelete={!allowMultiSelect || selectedIds?.length <= 1} + /> + ), + [ + groupedOptions, + selectedOptionsMap, + disabled, + onNewItemAdd, + onDeleteItem, + onFieldSelectItemChange, + placeholder, + allowMultiSelect, + selectedIds?.length, + ] + ); + + return ( + + {selectedIds?.length > 1 ? ( + + ) : ( + + )} + + ); +} diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/field_select_item.tsx b/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/field_select_item.tsx new file mode 100644 index 0000000000000..79ebd247fffa8 --- /dev/null +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/field_select_item.tsx @@ -0,0 +1,76 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { + EuiComboBox, + EuiComboBoxOptionOption, + EuiComboBoxProps, + EuiFlexGroup, + EuiFlexItem, +} from '@elastic/eui'; + +import { AddDeleteButtons } from '../../add_delete_buttons'; +import { INVALID_FIELD_ID } from './field_select_utils'; + +export interface FieldSelectItemProps { + onChange: (options: Array>) => void; + options: EuiComboBoxProps['options']; + selectedOptions: EuiComboBoxProps['selectedOptions']; + placeholder?: string; + disabled?: boolean; + disableAdd?: boolean; + disableDelete?: boolean; + onNewItemAdd?: () => void; + onDeleteItem?: () => void; +} + +const defaultPlaceholder = i18n.translate('visTypeTimeseries.fieldSelect.selectFieldPlaceholder', { + defaultMessage: 'Select field...', +}); + +export function FieldSelectItem({ + options, + selectedOptions, + placeholder = defaultPlaceholder, + disabled, + disableAdd, + disableDelete, + + onChange, + onDeleteItem, + onNewItemAdd, +}: FieldSelectItemProps) { + const isInvalid = Boolean(selectedOptions?.find((item) => item.id === INVALID_FIELD_ID)); + + return ( + + + + + + + + + ); +} diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/field_select_utils.ts b/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/field_select_utils.ts new file mode 100644 index 0000000000000..40d80a014e36b --- /dev/null +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/field_select_utils.ts @@ -0,0 +1,109 @@ +/* + * 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 { EuiComboBoxOptionOption, EuiComboBoxProps } from '@elastic/eui'; +import { isFieldEnabled } from '../../../../../common/check_ui_restrictions'; + +import type { SanitizedFieldType } from '../../../../..//common/types'; +import type { TimeseriesUIRestrictions } from '../../../../../common/ui_restrictions'; + +export const INVALID_FIELD_ID = 'INVALID_FIELD'; +export const MAX_MULTI_FIELDS_ITEMS = 4; + +export const getGroupedOptions = ( + type: string, + selectedIds: Array, + fields: SanitizedFieldType[] = [], + uiRestrictions: TimeseriesUIRestrictions | undefined, + restrict: string[] = [] +): EuiComboBoxProps['options'] => { + const isFieldTypeEnabled = (fieldType: string) => + restrict.length ? restrict.includes(fieldType) : true; + + const sortByLabel = (a: EuiComboBoxOptionOption, b: EuiComboBoxOptionOption) => { + const getNormalizedString = (option: EuiComboBoxOptionOption) => + (option.label || '').toLowerCase(); + + return getNormalizedString(a).localeCompare(getNormalizedString(b)); + }; + + const groupedOptions: EuiComboBoxProps['options'] = Object.values( + fields.reduce>>((acc, field) => { + if (isFieldTypeEnabled(field.type) && isFieldEnabled(field.name, type, uiRestrictions)) { + const item: EuiComboBoxOptionOption = { + value: field.name, + label: field.label ?? field.name, + disabled: selectedIds.includes(field.name), + }; + + const fieldTypeOptions = acc[field.type]?.options; + + if (fieldTypeOptions) { + fieldTypeOptions.push(item); + } else { + acc[field.type] = { + options: [item], + label: field.type, + }; + } + } + + return acc; + }, {}) + ); + + // sort groups + groupedOptions.sort(sortByLabel); + + // sort items + groupedOptions.forEach((group) => { + if (Array.isArray(group.options)) { + group.options.sort(sortByLabel); + } + }); + + return groupedOptions; +}; + +export const findInGroupedOptions = ( + groupedOptions: EuiComboBoxProps['options'], + fieldName: string +) => + (groupedOptions || []) + .map((i) => i.options) + .flat() + .find((i) => i?.value === fieldName); + +export const updateItem = ( + existingItems: Array, + value: string | null = null, + index: number = 0 +) => { + const arr = [...existingItems]; + arr[index] = value; + return arr; +}; + +export const addNewItem = (existingItems: Array, insertAfter: number = 0) => { + const arr = [...existingItems]; + arr.splice(insertAfter + 1, 0, null); + return arr; +}; + +export const deleteItem = (existingItems: Array, index: number = 0) => + existingItems.filter((item, i) => i !== index); + +export const swapItems = ( + existingItems: Array, + source: number = 0, + destination: number = 0 +) => { + const arr = [...existingItems]; + arr.splice(destination, 0, arr.splice(source, 1)[0]); + return arr; +}; diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/index.ts b/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/index.ts new file mode 100644 index 0000000000000..5dc0b1edaaff3 --- /dev/null +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/index.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export { FieldSelect } from './field_select'; diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/multi_field_select.tsx b/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/multi_field_select.tsx new file mode 100644 index 0000000000000..7b96a599c8a4f --- /dev/null +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/field_select/multi_field_select.tsx @@ -0,0 +1,65 @@ +/* + * 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 { + EuiDragDropContext, + EuiDroppable, + DragDropContextProps, + EuiDraggable, + EuiFlexGroup, + EuiFlexItem, + EuiPanel, + EuiIcon, +} from '@elastic/eui'; +import React, { FunctionComponent } from 'react'; + +const DROPPABLE_ID = 'onDragEnd'; + +const dragAriaLabel = i18n.translate('visTypeTimeseries.fieldSelect.dragAriaLabel', { + defaultMessage: 'Drag field', +}); + +export function MultiFieldSelect(props: { + values: Array; + onDragEnd: DragDropContextProps['onDragEnd']; + WrappedComponent: FunctionComponent<{ value?: string | null; index?: number }>; +}) { + return ( + + + {props.values.map((value, index) => ( + + {(provided) => ( + + + + + + + + + + + )} + + ))} + + + ); +} diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/filter_ratio.js b/src/plugins/vis_types/timeseries/public/application/components/aggs/filter_ratio.js index 9f8285bc97e29..b24ac14717561 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/aggs/filter_ratio.js +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/filter_ratio.js @@ -168,7 +168,11 @@ export const FilterRatioAgg = (props) => { restrict={getSupportedFieldsByMetricType(model.metric_agg)} indexPattern={indexPattern} value={model.field} - onChange={handleSelectChange('field')} + onChange={(value) => + handleChange({ + field: value?.[0], + }) + } /> ) : null} diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/filter_ratio.test.js b/src/plugins/vis_types/timeseries/public/application/components/aggs/filter_ratio.test.js index 38305395bfbb6..bebbbc6f8614f 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/aggs/filter_ratio.test.js +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/filter_ratio.test.js @@ -72,6 +72,7 @@ describe('TSVB Filter Ratio', () => { label: 'number', options: [ { + disabled: false, label: 'system.cpu.user.pct', value: 'system.cpu.user.pct', }, @@ -95,6 +96,7 @@ describe('TSVB Filter Ratio', () => { "label": "date", "options": Array [ Object { + "disabled": false, "label": "@timestamp", "value": "@timestamp", }, @@ -104,6 +106,7 @@ describe('TSVB Filter Ratio', () => { "label": "number", "options": Array [ Object { + "disabled": false, "label": "system.cpu.user.pct", "value": "system.cpu.user.pct", }, diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/percentile.js b/src/plugins/vis_types/timeseries/public/application/components/aggs/percentile.js index b9512249de945..c098eb83ddf98 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/aggs/percentile.js +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/percentile.js @@ -90,7 +90,11 @@ export function PercentileAgg(props) { restrict={RESTRICT_FIELDS} indexPattern={indexPattern} value={model.field} - onChange={handleSelectChange('field')} + onChange={(value) => + handleChange({ + field: value?.[0], + }) + } /> diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/percentile_rank/percentile_rank.tsx b/src/plugins/vis_types/timeseries/public/application/components/aggs/percentile_rank/percentile_rank.tsx index 664c59b27fa39..57dfa23c815d8 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/aggs/percentile_rank/percentile_rank.tsx +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/percentile_rank/percentile_rank.tsx @@ -45,7 +45,7 @@ interface PercentileRankAggProps { series: Series; dragHandleProps: DragHandleProps; onAdd(): void; - onChange(): void; + onChange(partialModel: Record): void; onDelete(): void; } @@ -111,7 +111,11 @@ export const PercentileRankAgg = (props: PercentileRankAggProps) => { restrict={RESTRICT_FIELDS} indexPattern={indexPattern} value={model.field ?? ''} - onChange={handleSelectChange('field')} + onChange={(value) => + props.onChange({ + field: value?.[0], + }) + } /> diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/positive_rate.js b/src/plugins/vis_types/timeseries/public/application/components/aggs/positive_rate.js index 20ae5ecd24310..35786efa98c5f 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/aggs/positive_rate.js +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/positive_rate.js @@ -111,7 +111,11 @@ export const PositiveRateAgg = (props) => { restrict={[KBN_FIELD_TYPES.NUMBER]} indexPattern={indexPattern} value={model.field} - onChange={handleSelectChange('field')} + onChange={(value) => + handleChange({ + field: value?.[0], + }) + } uiRestrictions={props.uiRestrictions} fullWidth /> diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/std_agg.js b/src/plugins/vis_types/timeseries/public/application/components/aggs/std_agg.js index 722e9021b8a60..61579c9656d5e 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/aggs/std_agg.js +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/std_agg.js @@ -68,7 +68,11 @@ export function StandardAgg(props) { restrict={restrictFields} indexPattern={indexPattern} value={model.field} - onChange={handleSelectChange('field')} + onChange={(value) => + handleChange({ + field: value?.[0], + }) + } uiRestrictions={uiRestrictions} fullWidth /> diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/std_deviation.js b/src/plugins/vis_types/timeseries/public/application/components/aggs/std_deviation.js index f9a54cb111740..375d576f8cf28 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/aggs/std_deviation.js +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/std_deviation.js @@ -119,7 +119,11 @@ const StandardDeviationAggUi = (props) => { restrict={RESTRICT_FIELDS} indexPattern={indexPattern} value={model.field} - onChange={handleSelectChange('field')} + onChange={(value) => + handleChange({ + field: value?.[0], + }) + } /> diff --git a/src/plugins/vis_types/timeseries/public/application/components/aggs/top_hit.js b/src/plugins/vis_types/timeseries/public/application/components/aggs/top_hit.js index 7fa708331ac55..7dec7d94236e0 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/aggs/top_hit.js +++ b/src/plugins/vis_types/timeseries/public/application/components/aggs/top_hit.js @@ -180,7 +180,11 @@ const TopHitAggUi = (props) => { restrict={aggWithOptionsRestrictFields} indexPattern={indexPattern} value={model.field} - onChange={handleSelectChange('field')} + onChange={(value) => + handleChange({ + field: value?.[0], + }) + } /> @@ -242,7 +246,11 @@ const TopHitAggUi = (props) => { } restrict={ORDER_DATE_RESTRICT_FIELDS} value={model.order_by} - onChange={handleSelectChange('order_by')} + onChange={(value) => + handleChange({ + order_by: value?.[0], + }) + } indexPattern={indexPattern} fields={fields} data-test-subj="topHitOrderByFieldSelect" diff --git a/src/plugins/vis_types/timeseries/public/application/components/annotation_row.tsx b/src/plugins/vis_types/timeseries/public/application/components/annotation_row.tsx index 856948cb7601e..562fb75089e19 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/annotation_row.tsx +++ b/src/plugins/vis_types/timeseries/public/application/components/annotation_row.tsx @@ -148,8 +148,12 @@ export const AnnotationRow = ({ /> } restrict={RESTRICT_FIELDS} - value={model.time_field} - onChange={handleChange(TIME_FIELD_KEY)} + value={model[TIME_FIELD_KEY]} + onChange={(value) => + onChange({ + [TIME_FIELD_KEY]: value?.[0] ?? undefined, + }) + } indexPattern={model.index_pattern} fields={fields} /> diff --git a/src/plugins/vis_types/timeseries/public/application/components/index_pattern.js b/src/plugins/vis_types/timeseries/public/application/components/index_pattern.js index 217b3948e1cd8..7b3ae5f3e16ef 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/index_pattern.js +++ b/src/plugins/vis_types/timeseries/public/application/components/index_pattern.js @@ -259,7 +259,11 @@ export const IndexPattern = ({ restrict={RESTRICT_FIELDS} value={model[timeFieldName]} disabled={disabled} - onChange={handleSelectChange(timeFieldName)} + onChange={(value) => + onChange({ + [timeFieldName]: value?.[0], + }) + } indexPattern={model[indexPatternName]} fields={fields} placeholder={ diff --git a/src/plugins/vis_types/timeseries/public/application/components/lib/check_if_numeric_metric.test.ts b/src/plugins/vis_types/timeseries/public/application/components/lib/check_if_numeric_metric.test.ts index eb6ea561fec84..2eaee96099110 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/lib/check_if_numeric_metric.test.ts +++ b/src/plugins/vis_types/timeseries/public/application/components/lib/check_if_numeric_metric.test.ts @@ -11,6 +11,7 @@ import { TSVB_METRIC_TYPES } from '../../../../common/enums'; import { checkIfNumericMetric } from './check_if_numeric_metric'; import type { Metric } from '../../../../common/types'; +import type { VisFields } from '../../lib/fetch_fields'; describe('checkIfNumericMetric(metric, fields, indexPattern)', () => { const indexPattern = { id: 'some_id' }; @@ -20,7 +21,7 @@ describe('checkIfNumericMetric(metric, fields, indexPattern)', () => { { name: 'string field', type: 'string' }, { name: 'date field', type: 'date' }, ], - }; + } as VisFields; it('should return true for Count metric', () => { const metric = { type: METRIC_TYPES.COUNT } as Metric; diff --git a/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts b/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts index 15151a9e21bc5..08ee275d144ea 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts +++ b/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts @@ -201,11 +201,11 @@ describe('convert series to datatables', () => { expect(tables.series1.rows.length).toEqual(8); const expected1 = series[0].data.map((d) => { - d.push(parseInt(series[0].label, 10)); + d.push(parseInt([series[0].label].flat()[0], 10)); return d; }); const expected2 = series[1].data.map((d) => { - d.push(parseInt(series[1].label, 10)); + d.push(parseInt([series[1].label].flat()[0], 10)); return d; }); expect(tables.series1.rows).toEqual([...expected1, ...expected2]); diff --git a/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.ts b/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.ts index 8e7c1694357c8..62397e3b1d8c2 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.ts +++ b/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.ts @@ -10,6 +10,7 @@ import { DatatableRow, DatatableColumn, DatatableColumnType } from 'src/plugins/ import { Query } from 'src/plugins/data/common'; import { TimeseriesVisParams } from '../../../types'; import type { PanelData, Metric } from '../../../../common/types'; +import { getMultiFieldLabel, getFieldsForTerms } from '../../../../common/fields_utils'; import { BUCKET_TYPES, TSVB_METRIC_TYPES } from '../../../../common/enums'; import { fetchIndexPattern } from '../../../../common/index_patterns_utils'; import { getDataStart } from '../../../services'; @@ -131,7 +132,7 @@ export const convertSeriesToDataTable = async ( id++; columns.push({ id, - name: layer.terms_field || '', + name: getMultiFieldLabel(getFieldsForTerms(layer.terms_field)), isMetric: false, type: BUCKET_TYPES.TERMS, }); @@ -154,7 +155,7 @@ export const convertSeriesToDataTable = async ( const row: DatatableRow = [rowData[0], rowData[1]]; // If the layer is split by terms aggregation, the data array should also contain the split value. if (isGroupedByTerms || filtersColumn) { - row.push(seriesPerLayer[j].label); + row.push([seriesPerLayer[j].label].flat()[0]); } return row; }); diff --git a/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_vars.js b/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_vars.js index 867ba673cf1dd..34efcf678d7a6 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_vars.js +++ b/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_vars.js @@ -16,6 +16,7 @@ import { getMetricsField } from './get_metrics_field'; import { createFieldFormatter } from './create_field_formatter'; import { labelDateFormatter } from './label_date_formatter'; import moment from 'moment'; +import { getFieldsForTerms } from '../../../../common/fields_utils'; export const convertSeriesToVars = (series, model, getConfig = null, fieldFormatMap) => { const variables = {}; @@ -50,10 +51,16 @@ export const convertSeriesToVars = (series, model, getConfig = null, fieldFormat }), }, }; - const rowLabel = - seriesModel.split_mode === BUCKET_TYPES.TERMS - ? createFieldFormatter(seriesModel.terms_field, fieldFormatMap)(row.label) - : row.label; + + let rowLabel = row.label; + if (seriesModel.split_mode === BUCKET_TYPES.TERMS) { + const fieldsForTerms = getFieldsForTerms(seriesModel.terms_field); + + if (fieldsForTerms.length === 1) { + rowLabel = createFieldFormatter(fieldsForTerms[0], fieldFormatMap)(row.label); + } + } + set(variables, varName, data); set(variables, `${label}.label`, rowLabel); diff --git a/src/plugins/vis_types/timeseries/public/application/components/panel_config/table.tsx b/src/plugins/vis_types/timeseries/public/application/components/panel_config/table.tsx index 57ae699d281a0..cefcd9c2e5421 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/panel_config/table.tsx +++ b/src/plugins/vis_types/timeseries/public/application/components/panel_config/table.tsx @@ -23,7 +23,6 @@ import { EuiHorizontalRule, EuiCode, EuiText, - EuiComboBoxOptionOption, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -65,16 +64,27 @@ export class TablePanelConfig extends Component< this.setState({ selectedTab }); } - handlePivotChange = (selectedOption: Array>) => { + handlePivotChange = (selectedOptions: Array) => { const { fields, model } = this.props; - const pivotId = get(selectedOption, '[0].value', null); - const field = fields[getIndexPatternKey(model.index_pattern)].find((f) => f.name === pivotId); - const pivotType = get(field, 'type', model.pivot_type); - this.props.onChange({ - pivot_id: pivotId, - pivot_type: pivotType, - }); + const getPivotType = (fieldName?: string | null): KBN_FIELD_TYPES | null => { + const field = fields[getIndexPatternKey(model.index_pattern)].find( + (f) => f.name === fieldName + ); + return get(field, 'type', null); + }; + + this.props.onChange( + selectedOptions.length === 1 + ? { + pivot_id: selectedOptions[0] || undefined, + pivot_type: getPivotType(selectedOptions[0]) || undefined, + } + : { + pivot_id: selectedOptions, + pivot_type: selectedOptions.map((item) => getPivotType(item)), + } + ); }; handleTextChange = @@ -129,6 +139,8 @@ export class TablePanelConfig extends Component< onChange={this.handlePivotChange} uiRestrictions={this.context.uiRestrictions} type={BUCKET_TYPES.TERMS} + allowMultiSelect={true} + fullWidth={true} /> diff --git a/src/plugins/vis_types/timeseries/public/application/components/splits/__snapshots__/terms.test.js.snap b/src/plugins/vis_types/timeseries/public/application/components/splits/__snapshots__/terms.test.js.snap index 524e35f9d29e1..b7c5095535fbc 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/splits/__snapshots__/terms.test.js.snap +++ b/src/plugins/vis_types/timeseries/public/application/components/splits/__snapshots__/terms.test.js.snap @@ -20,13 +20,14 @@ exports[`src/legacy/core_plugins/metrics/public/components/splits/terms.test.js } labelType="label" > - ({ - ...field, - disabled: !isGroupByFieldsEnabled(field.value, uiRestrictions), - })); - - const selectedValue = props.value || 'everything'; - const selectedOption = modeOptions.find((option) => { - return selectedValue === option.value; - }); - - return ( - - ); -} - -GroupBySelectUi.propTypes = { - onChange: PropTypes.func, - value: PropTypes.string, - uiRestrictions: PropTypes.object, -}; - -export const GroupBySelect = injectI18n(GroupBySelectUi); diff --git a/src/plugins/vis_types/timeseries/public/application/components/splits/group_by_select.tsx b/src/plugins/vis_types/timeseries/public/application/components/splits/group_by_select.tsx new file mode 100644 index 0000000000000..9c0e26b642f8b --- /dev/null +++ b/src/plugins/vis_types/timeseries/public/application/components/splits/group_by_select.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 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 React from 'react'; +import { EuiComboBox, EuiComboBoxOptionOption, EuiComboBoxProps } from '@elastic/eui'; +import { isGroupByFieldsEnabled } from '../../../../common/check_ui_restrictions'; +import type { TimeseriesUIRestrictions } from '../../../../common/ui_restrictions'; + +interface GroupBySelectProps { + id: string; + onChange: EuiComboBoxProps['onChange']; + value?: string; + uiRestrictions: TimeseriesUIRestrictions; +} + +const getAvailableOptions = () => [ + { + label: i18n.translate('visTypeTimeseries.splits.groupBySelect.modeOptions.everythingLabel', { + defaultMessage: 'Everything', + }), + value: 'everything', + }, + { + label: i18n.translate('visTypeTimeseries.splits.groupBySelect.modeOptions.filterLabel', { + defaultMessage: 'Filter', + }), + value: 'filter', + }, + { + label: i18n.translate('visTypeTimeseries.splits.groupBySelect.modeOptions.filtersLabel', { + defaultMessage: 'Filters', + }), + value: 'filters', + }, + { + label: i18n.translate('visTypeTimeseries.splits.groupBySelect.modeOptions.termsLabel', { + defaultMessage: 'Terms', + }), + value: 'terms', + }, +]; + +export const GroupBySelect = ({ + id, + onChange, + value = 'everything', + uiRestrictions, +}: GroupBySelectProps) => { + const modeOptions = getAvailableOptions().map((field) => ({ + ...field, + disabled: !isGroupByFieldsEnabled(field.value, uiRestrictions), + })); + + const selectedOption: EuiComboBoxOptionOption | undefined = modeOptions.find( + (option) => value === option.value + ); + + return ( + + ); +}; diff --git a/src/plugins/vis_types/timeseries/public/application/components/splits/terms.js b/src/plugins/vis_types/timeseries/public/application/components/splits/terms.js index 80810f552d3a1..4810932c9b4ac 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/splits/terms.js +++ b/src/plugins/vis_types/timeseries/public/application/components/splits/terms.js @@ -7,7 +7,7 @@ */ import PropTypes from 'prop-types'; -import React from 'react'; +import React, { useCallback } from 'react'; import { get, find } from 'lodash'; import { GroupBySelect } from './group_by_select'; import { createTextHandler } from '../lib/create_text_handler'; @@ -91,6 +91,15 @@ export const SplitByTermsUI = ({ const selectedField = find(fields[fieldsSelector], ({ name }) => name === model.terms_field); const selectedFieldType = get(selectedField, 'type'); + const onTermsFieldChange = useCallback( + (selectedOptions) => { + onChange({ + terms_field: selectedOptions.length === 1 ? selectedOptions[0] : selectedOptions, + }); + }, + [onChange] + ); + if ( seriesQuantity && model.stacked === STACKED_OPTIONS.PERCENT && @@ -142,11 +151,12 @@ export const SplitByTermsUI = ({ ]} data-test-subj="groupByField" indexPattern={indexPattern} - onChange={handleSelectChange('terms_field')} + onChange={onTermsFieldChange} value={model.terms_field} fields={fields} uiRestrictions={uiRestrictions} type={'terms'} + allowMultiSelect={true} /> diff --git a/src/plugins/vis_types/timeseries/public/application/components/timeseries_visualization.tsx b/src/plugins/vis_types/timeseries/public/application/components/timeseries_visualization.tsx index ae699880784a9..7787f0f6929b2 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/timeseries_visualization.tsx +++ b/src/plugins/vis_types/timeseries/public/application/components/timeseries_visualization.tsx @@ -190,6 +190,7 @@ function TimeseriesVisualization({ onUiState={handleUiState} syncColors={syncColors} palettesService={palettesService} + indexPattern={indexPattern} fieldFormatMap={indexPattern?.fieldFormatMap} /> diff --git a/src/plugins/vis_types/timeseries/public/application/components/vis_types/index.ts b/src/plugins/vis_types/timeseries/public/application/components/vis_types/index.ts index 653b2985ed1ae..512a9d1ff9169 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/vis_types/index.ts +++ b/src/plugins/vis_types/timeseries/public/application/components/vis_types/index.ts @@ -15,6 +15,7 @@ import { PaletteRegistry } from 'src/plugins/charts/public'; import { TimeseriesVisParams } from '../../../types'; import type { TimeseriesVisData, PanelData } from '../../../../common/types'; import type { FieldFormatMap } from '../../../../../../data/common'; +import { FetchedIndexPattern } from '../../../../common/types'; /** * Lazy load each visualization type, since the only one is presented on the screen at the same time. @@ -62,5 +63,7 @@ export interface TimeseriesVisProps { getConfig: IUiSettingsClient['get']; syncColors: boolean; palettesService: PaletteRegistry; + indexPattern?: FetchedIndexPattern['indexPattern']; + /** @deprecated please use indexPattern.fieldFormatMap instead **/ fieldFormatMap?: FieldFormatMap; } diff --git a/src/plugins/vis_types/timeseries/public/application/components/vis_types/table/config.js b/src/plugins/vis_types/timeseries/public/application/components/vis_types/table/config.js index f62120ed5f3ee..f3cb92b31b309 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/vis_types/table/config.js +++ b/src/plugins/vis_types/timeseries/public/application/components/vis_types/table/config.js @@ -221,7 +221,11 @@ export class TableSeriesConfig extends Component { fields={this.props.fields} indexPattern={this.props.panel.index_pattern} value={model.aggregate_by} - onChange={handleSelectChange('aggregate_by')} + onChange={(value) => + this.props.onChange({ + aggregate_by: value?.[0], + }) + } fullWidth restrict={[ KBN_FIELD_TYPES.NUMBER, diff --git a/src/plugins/vis_types/timeseries/public/application/components/vis_types/table/vis.js b/src/plugins/vis_types/timeseries/public/application/components/vis_types/table/vis.js index 3e828a1b833bf..549aa1b70082f 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/vis_types/table/vis.js +++ b/src/plugins/vis_types/timeseries/public/application/components/vis_types/table/vis.js @@ -18,11 +18,17 @@ import { isSortable } from './is_sortable'; import { EuiToolTip, EuiIcon } from '@elastic/eui'; import { replaceVars } from '../../lib/replace_vars'; import { ExternalUrlErrorModal } from '../../lib/external_url_error_modal'; -import { FIELD_FORMAT_IDS } from '../../../../../../../../plugins/field_formats/common'; import { FormattedMessage } from '@kbn/i18n-react'; import { getFieldFormats, getCoreStart } from '../../../../services'; import { DATA_FORMATTERS } from '../../../../../common/enums'; -import { getValueOrEmpty } from '../../../../../common/empty_label'; +import { FIELD_FORMAT_IDS } from '../../../../../../../../plugins/field_formats/common'; + +import { + createCachedFieldValueFormatter, + getFieldsForTerms, + getMultiFieldLabel, + MULTI_FIELD_VALUES_SEPARATOR, +} from '../../../../../common/fields_utils'; function getColor(rules, colorKey, value) { let color; @@ -49,12 +55,7 @@ function sanitizeUrl(url) { class TableVis extends Component { constructor(props) { super(props); - - const fieldFormatsService = getFieldFormats(); - const DateFormat = fieldFormatsService.getType(FIELD_FORMAT_IDS.DATE); - - this.dateFormatter = new DateFormat({}, this.props.getConfig); - + this.fieldFormatsService = getFieldFormats(); this.state = { accessDeniedDrilldownUrl: null, }; @@ -74,17 +75,21 @@ class TableVis extends Component { } }; - renderRow = (row) => { + renderRow = (row, pivotIds, fieldValuesFormatter) => { const { model, fieldFormatMap, getConfig } = this.props; - let rowDisplay = getValueOrEmpty( - model.pivot_type === 'date' ? this.dateFormatter.convert(row.key) : row.key - ); + let rowDisplay = row.key; + + if (pivotIds.length) { + rowDisplay = pivotIds + .map((item, index) => { + const value = [row.key ?? null].flat()[index]; + const formatted = fieldValuesFormatter(item, value, 'html'); - // we should skip url field formatting for key if tsvb have drilldown_url - if (fieldFormatMap?.[model.pivot_id]?.id !== FIELD_FORMAT_IDS.URL || !model.drilldown_url) { - const formatter = createFieldFormatter(model?.pivot_id, fieldFormatMap, 'html'); - rowDisplay = ; // eslint-disable-line react/no-danger + // eslint-disable-next-line react/no-danger + return ; + }) + .reduce((prev, curr) => [prev, MULTI_FIELD_VALUES_SEPARATOR, curr]); } if (model.drilldown_url) { @@ -150,7 +155,7 @@ class TableVis extends Component { ); }; - renderHeader() { + renderHeader(pivotIds) { const { model, uiState, onUiState, visData } = this.props; const stateKey = `${model.type}.sort`; const sort = uiState.get(stateKey, { @@ -210,7 +215,7 @@ class TableVis extends Component { ); }); - const label = visData.pivot_label || model.pivot_label || model.pivot_id; + const label = visData.pivot_label || model.pivot_label || getMultiFieldLabel(pivotIds); let sortIcon; if (sort.column === '_default_') { sortIcon = sort.order === 'asc' ? 'sortUp' : 'sortDown'; @@ -240,13 +245,26 @@ class TableVis extends Component { closeExternalUrlErrorModal = () => this.setState({ accessDeniedDrilldownUrl: null }); render() { - const { visData } = this.props; + const { visData, model, indexPattern } = this.props; const { accessDeniedDrilldownUrl } = this.state; - const header = this.renderHeader(); + const fields = (model.pivot_type ? [model.pivot_type ?? null].flat() : []).map( + (type, index) => ({ + name: [model.pivot_id ?? null].flat()[index], + type, + }) + ); + const fieldValuesFormatter = createCachedFieldValueFormatter( + indexPattern, + fields, + this.fieldFormatsService, + model.drilldown_url ? [FIELD_FORMAT_IDS.URL] : [] + ); + const pivotIds = getFieldsForTerms(model.pivot_id); + const header = this.renderHeader(pivotIds); let rows = null; if (isArray(visData.series) && visData.series.length) { - rows = visData.series.map(this.renderRow); + rows = visData.series.map((item) => this.renderRow(item, pivotIds, fieldValuesFormatter)); } return ( @@ -285,6 +303,7 @@ TableVis.propTypes = { uiState: PropTypes.object, pageNumber: PropTypes.number, getConfig: PropTypes.func, + indexPattern: PropTypes.object, }; // default export required for React.Lazy diff --git a/src/plugins/vis_types/timeseries/public/trigger_action/index.ts b/src/plugins/vis_types/timeseries/public/trigger_action/index.ts index d3329bee803a1..8e757b98c125d 100644 --- a/src/plugins/vis_types/timeseries/public/trigger_action/index.ts +++ b/src/plugins/vis_types/timeseries/public/trigger_action/index.ts @@ -16,6 +16,7 @@ import { getDataSourceInfo } from './get_datasource_info'; import { getFieldType } from './get_field_type'; import { getSeries } from './get_series'; import { getYExtents } from './get_extents'; +import { getFieldsForTerms } from '../../common/fields_utils'; const SUPPORTED_FORMATTERS = ['bytes', 'percent', 'number']; @@ -99,13 +100,21 @@ export const triggerTSVBtoLensConfiguration = async ( } const palette = layer.palette as PaletteOutput; + const splitFields = getFieldsForTerms(layer.terms_field); // in case of terms in a date field, we want to apply the date_histogram let splitWithDateHistogram = false; - if (layer.terms_field && layer.split_mode === 'terms') { - const fieldType = await getFieldType(indexPatternId, layer.terms_field); - if (fieldType === 'date') { - splitWithDateHistogram = true; + if (layer.terms_field && layer.split_mode === 'terms' && splitFields) { + for (const f of splitFields) { + const fieldType = await getFieldType(indexPatternId, f); + + if (fieldType === 'date') { + if (splitFields.length === 1) { + splitWithDateHistogram = true; + } else { + return null; + } + } } } @@ -114,7 +123,7 @@ export const triggerTSVBtoLensConfiguration = async ( timeFieldName: timeField, chartType, axisPosition: layer.separate_axis ? layer.axis_position : model.axis_position, - ...(layer.terms_field && { splitField: layer.terms_field }), + ...(layer.terms_field && { splitFields }), splitWithDateHistogram, ...(layer.split_mode !== 'everything' && { splitMode: layer.split_mode }), ...(splitFilters.length > 0 && { splitFilters }), diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/get_table_data.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/get_table_data.ts index 2b63749fac642..9f8bf18683ca5 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/get_table_data.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/get_table_data.ts @@ -14,7 +14,7 @@ import { handleErrorResponse } from './handle_error_response'; import { processBucket } from './table/process_bucket'; import { createFieldsFetcher } from '../search_strategies/lib/fields_fetcher'; -import { extractFieldLabel } from '../../../common/fields_utils'; +import { getFieldsForTerms, getMultiFieldLabel } from '../../../common/fields_utils'; import { isAggSupported } from './helpers/check_aggs'; import { isConfigurationFeatureEnabled } from '../../../common/check_ui_restrictions'; import { FilterCannotBeAppliedError, PivotNotSelectedForTableError } from '../../../common/errors'; @@ -62,12 +62,15 @@ export async function getTableData( }); const calculatePivotLabel = async () => { - if (panel.pivot_id && panelIndex.indexPattern?.id) { - const fields = await extractFields({ id: panelIndex.indexPattern.id }); + const pivotIds = getFieldsForTerms(panel.pivot_id); - return extractFieldLabel(fields, panel.pivot_id); + if (pivotIds.length) { + const fields = panelIndex.indexPattern?.id + ? await extractFields({ id: panelIndex.indexPattern.id }) + : []; + + return getMultiFieldLabel(pivotIds, fields); } - return panel.pivot_id; }; const meta: DataResponseMeta = { @@ -85,7 +88,7 @@ export async function getTableData( } }); - if (!panel.pivot_id) { + if (!getFieldsForTerms(panel.pivot_id).length) { throw new PivotNotSelectedForTableError(); } diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/helpers/get_splits.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/helpers/get_splits.ts index 1754fa6569dcd..a28883b72980b 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/helpers/get_splits.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/helpers/get_splits.ts @@ -54,7 +54,7 @@ export async function getSplits { expect(doc.aggs.test.meta).toMatchInlineSnapshot(` Object { - "index": undefined, + "dataViewId": undefined, + "indexPatternString": undefined, "intervalString": "900000ms", "panelId": "panelId", "seriesId": "test", diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_everything.js b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_everything.js index 497b0106deec4..6cefb08c23686 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_everything.js +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_everything.js @@ -7,12 +7,13 @@ */ import { overwrite } from '../../helpers'; +import { getFieldsForTerms } from '../../../../../common/fields_utils'; export function splitByEverything(req, panel, series) { return (next) => (doc) => { if ( series.split_mode === 'everything' || - (series.split_mode === 'terms' && !series.terms_field) + (series.split_mode === 'terms' && !getFieldsForTerms(series.terms_field).length) ) { overwrite(doc, `aggs.${series.id}.filter.match_all`, {}); } diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_terms.js b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_terms.js index 9c2bdbe03f886..07e8ef4a0e5fd 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_terms.js +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_terms.js @@ -10,25 +10,41 @@ import { overwrite } from '../../helpers'; import { basicAggs } from '../../../../../common/basic_aggs'; import { getBucketsPath } from '../../helpers/get_buckets_path'; import { bucketTransform } from '../../helpers/bucket_transform'; -import { validateField } from '../../../../../common/fields_utils'; +import { getFieldsForTerms, validateField } from '../../../../../common/fields_utils'; export function splitByTerms(req, panel, series, esQueryConfig, seriesIndex) { return (next) => (doc) => { - if (series.split_mode === 'terms' && series.terms_field) { - const termsField = series.terms_field; + const termsIds = getFieldsForTerms(series.terms_field); + + if (series.split_mode === 'terms' && termsIds.length) { + const termsType = termsIds.length > 1 ? 'multi_terms' : 'terms'; const orderByTerms = series.terms_order_by; - validateField(termsField, seriesIndex); + termsIds.forEach((termsField) => { + validateField(termsField, seriesIndex); + }); const direction = series.terms_direction || 'desc'; const metric = series.metrics.find((item) => item.id === orderByTerms); - overwrite(doc, `aggs.${series.id}.terms.field`, termsField); - overwrite(doc, `aggs.${series.id}.terms.size`, series.terms_size); + + if (termsType === 'multi_terms') { + overwrite( + doc, + `aggs.${series.id}.${termsType}.terms`, + termsIds.map((item) => ({ + field: item, + })) + ); + } else { + overwrite(doc, `aggs.${series.id}.${termsType}.field`, termsIds[0]); + } + + overwrite(doc, `aggs.${series.id}.${termsType}.size`, series.terms_size); if (series.terms_include) { - overwrite(doc, `aggs.${series.id}.terms.include`, series.terms_include); + overwrite(doc, `aggs.${series.id}.${termsType}.include`, series.terms_include); } if (series.terms_exclude) { - overwrite(doc, `aggs.${series.id}.terms.exclude`, series.terms_exclude); + overwrite(doc, `aggs.${series.id}.${termsType}.exclude`, series.terms_exclude); } if (metric && metric.type !== 'count' && ~basicAggs.indexOf(metric.type)) { const sortAggKey = `${orderByTerms}-SORT`; @@ -37,12 +53,12 @@ export function splitByTerms(req, panel, series, esQueryConfig, seriesIndex) { orderByTerms, sortAggKey ); - overwrite(doc, `aggs.${series.id}.terms.order`, { [bucketPath]: direction }); + overwrite(doc, `aggs.${series.id}.${termsType}.order`, { [bucketPath]: direction }); overwrite(doc, `aggs.${series.id}.aggs`, { [sortAggKey]: fn(metric) }); } else if (['_key', '_count'].includes(orderByTerms)) { - overwrite(doc, `aggs.${series.id}.terms.order`, { [orderByTerms]: direction }); + overwrite(doc, `aggs.${series.id}.${termsType}.order`, { [orderByTerms]: direction }); } else { - overwrite(doc, `aggs.${series.id}.terms.order`, { _count: direction }); + overwrite(doc, `aggs.${series.id}.${termsType}.order`, { _count: direction }); } } return next(doc); diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/date_histogram.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/date_histogram.ts index a458c870be7d9..246c133e93608 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/date_histogram.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/date_histogram.ts @@ -24,7 +24,8 @@ export const dateHistogram: TableRequestProcessorsFunction = const meta: TableSearchRequestMeta = { timeField, - index: panel.use_kibana_indexes ? seriesIndex.indexPattern?.id : undefined, + dataViewId: panel.use_kibana_indexes ? seriesIndex.indexPattern?.id : undefined, + indexPatternString: seriesIndex.indexPatternString, panelId: panel.id, }; diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/pivot.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/pivot.ts index 692d4ea23bc59..4c28cfb442e14 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/pivot.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/pivot.ts @@ -8,7 +8,7 @@ import { get, last } from 'lodash'; import { overwrite, getBucketsPath, bucketTransform } from '../../helpers'; - +import { getFieldsForTerms } from '../../../../../common/fields_utils'; import { basicAggs } from '../../../../../common/basic_aggs'; import type { TableRequestProcessorsFunction } from './types'; @@ -18,15 +18,29 @@ export const pivot: TableRequestProcessorsFunction = (next) => (doc) => { const { sort } = req.body.state; + const pivotIds = getFieldsForTerms(panel.pivot_id); + const termsType = pivotIds.length > 1 ? 'multi_terms' : 'terms'; + + if (pivotIds.length) { + if (termsType === 'multi_terms') { + overwrite( + doc, + `aggs.pivot.${termsType}.terms`, + pivotIds.map((item: string) => ({ + field: item, + })) + ); + } else { + overwrite(doc, `aggs.pivot.${termsType}.field`, pivotIds[0]); + } + + overwrite(doc, `aggs.pivot.${termsType}.size`, panel.pivot_rows); - if (panel.pivot_id) { - overwrite(doc, 'aggs.pivot.terms.field', panel.pivot_id); - overwrite(doc, 'aggs.pivot.terms.size', panel.pivot_rows); if (sort) { const series = panel.series.find((item) => item.id === sort.column); const metric = series && last(series.metrics); if (metric && metric.type === 'count') { - overwrite(doc, 'aggs.pivot.terms.order', { _count: sort.order }); + overwrite(doc, `aggs.pivot.${termsType}.order`, { _count: sort.order }); } else if (metric && series && basicAggs.includes(metric.type)) { const sortAggKey = `${metric.id}-SORT`; const fn = bucketTransform[metric.type]; @@ -34,10 +48,10 @@ export const pivot: TableRequestProcessorsFunction = metric.id, sortAggKey ); - overwrite(doc, `aggs.pivot.terms.order`, { [bucketPath]: sort.order }); + overwrite(doc, `aggs.pivot.${termsType}.order`, { [bucketPath]: sort.order }); overwrite(doc, `aggs.pivot.aggs`, { [sortAggKey]: fn(metric) }); } else { - overwrite(doc, 'aggs.pivot.terms.order', { + overwrite(doc, `aggs.pivot.${termsType}.order`, { _key: get(sort, 'order', 'asc'), }); } diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/types.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/types.ts index 58124c825e916..2c6aa2a495766 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/types.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/types.ts @@ -7,5 +7,6 @@ */ export interface BaseMeta { - index?: string; + dataViewId?: string; + indexPatternString?: string; } diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/response_processors/series/format_label.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/response_processors/series/format_label.ts index 6d824c1c7f43e..813cf1a5b9a6f 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/response_processors/series/format_label.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/response_processors/series/format_label.ts @@ -6,46 +6,67 @@ * Side Public License, v 1. */ -import { KBN_FIELD_TYPES } from '@kbn/field-types'; -import { BUCKET_TYPES, PANEL_TYPES } from '../../../../../common/enums'; +import { BUCKET_TYPES, PANEL_TYPES, TSVB_METRIC_TYPES } from '../../../../../common/enums'; +import { + createCachedFieldValueFormatter, + getFieldsForTerms, + MULTI_FIELD_VALUES_SEPARATOR, +} from '../../../../../common/fields_utils'; import type { Panel, PanelData, Series } from '../../../../../common/types'; import type { FieldFormatsRegistry } from '../../../../../../../field_formats/common'; import type { createFieldsFetcher } from '../../../search_strategies/lib/fields_fetcher'; import type { CachedIndexPatternFetcher } from '../../../search_strategies/lib/cached_index_pattern_fetcher'; +import type { BaseMeta } from '../../request_processors/types'; +import { SanitizedFieldType } from '../../../../../common/types'; export function formatLabel( resp: unknown, panel: Panel, series: Series, - meta: any, + meta: BaseMeta, extractFields: ReturnType, fieldFormatService: FieldFormatsRegistry, cachedIndexPatternFetcher: CachedIndexPatternFetcher ) { return (next: (results: PanelData[]) => unknown) => async (results: PanelData[]) => { const { terms_field: termsField, split_mode: splitMode } = series; + const termsIds = getFieldsForTerms(termsField); - const isKibanaIndexPattern = panel.use_kibana_indexes || panel.index_pattern === ''; - // no need to format labels for markdown as they also used there as variables keys const shouldFormatLabels = - isKibanaIndexPattern && - termsField && + // no need to format labels for series_agg + !series.metrics.some((m) => m.type === TSVB_METRIC_TYPES.SERIES_AGG) && + termsIds.length && splitMode === BUCKET_TYPES.TERMS && + // no need to format labels for markdown as they also used there as variables keys panel.type !== PANEL_TYPES.MARKDOWN; if (shouldFormatLabels) { - const { indexPattern } = await cachedIndexPatternFetcher({ id: meta.index }); - const getFieldFormatByName = (fieldName: string) => - fieldFormatService.deserialize(indexPattern?.fieldFormatMap?.[fieldName]); + const fetchedIndex = meta.dataViewId + ? await cachedIndexPatternFetcher({ id: meta.dataViewId }) + : undefined; + + let fields: SanitizedFieldType[] = []; + + if (!fetchedIndex?.indexPattern && meta.indexPatternString) { + fields = await extractFields(meta.indexPatternString); + } + + const formatField = createCachedFieldValueFormatter( + fetchedIndex?.indexPattern, + fields, + fieldFormatService + ); results .filter(({ seriesId }) => series.id === seriesId) .forEach((item) => { - const formattedLabel = getFieldFormatByName(termsField!).convert(item.label); - item.label = formattedLabel; - const termsFieldType = indexPattern?.fields.find(({ name }) => name === termsField)?.type; - if (termsFieldType === KBN_FIELD_TYPES.DATE) { - item.labelFormatted = formattedLabel; + const formatted = termsIds + .map((i, index) => formatField(i, [item.label].flat()[index])) + .join(MULTI_FIELD_VALUES_SEPARATOR); + + if (formatted) { + item.label = formatted; + item.labelFormatted = formatted; } }); } diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/response_processors/series/series_agg.js b/src/plugins/vis_types/timeseries/server/lib/vis_data/response_processors/series/series_agg.js index 532f5fd07f597..305d6c6fc5b34 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/response_processors/series/series_agg.js +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/response_processors/series/series_agg.js @@ -33,7 +33,7 @@ export function seriesAgg(resp, panel, series, meta, extractFields) { return (fn && fn(acc)) || acc; }, targetSeries); - const fieldsForSeries = meta.index ? await extractFields({ id: meta.index }) : []; + const fieldsForSeries = meta.dataViewId ? await extractFields({ id: meta.dataViewId }) : []; results.push({ id: `${series.id}`, diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/response_processors/table/series_agg.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/response_processors/table/series_agg.ts index b4bc082bab849..45829a930605f 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/response_processors/table/series_agg.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/response_processors/table/series_agg.ts @@ -36,7 +36,7 @@ export const seriesAgg: TableResponseProcessorsFunction = const fn = SeriesAgg[series.aggregate_function]; const data = fn(targetSeries); - const fieldsForSeries = meta.index ? await extractFields({ id: meta.index }) : []; + const fieldsForSeries = meta.dataViewId ? await extractFields({ id: meta.dataViewId }) : []; results.push({ id: `${series.id}`, diff --git a/src/plugins/visualizations/public/vis_types/types.ts b/src/plugins/visualizations/public/vis_types/types.ts index b89af7bd2cdbf..60332c0f66964 100644 --- a/src/plugins/visualizations/public/vis_types/types.ts +++ b/src/plugins/visualizations/public/vis_types/types.ts @@ -98,7 +98,7 @@ export interface VisualizeEditorLayersContext { chartType?: string; axisPosition?: string; termsParams?: Record; - splitField?: string; + splitFields?: string[]; splitMode?: string; splitFilters?: SplitByFilters[]; palette?: PaletteOutput; diff --git a/test/functional/page_objects/visual_builder_page.ts b/test/functional/page_objects/visual_builder_page.ts index 4054656028b6e..f08845b230710 100644 --- a/test/functional/page_objects/visual_builder_page.ts +++ b/test/functional/page_objects/visual_builder_page.ts @@ -802,9 +802,7 @@ export class VisualBuilderPageObject extends FtrService { } public async checkSelectedMetricsGroupByValue(value: string) { - const groupBy = await this.find.byCssSelector( - '.tvbAggRow--split [data-test-subj="comboBoxInput"]' - ); + const groupBy = await this.testSubjects.find('groupBySelect'); return await this.comboBox.isOptionSelected(groupBy, value); } diff --git a/x-pack/plugins/infra/server/lib/adapters/metrics/kibana_metrics_adapter.ts b/x-pack/plugins/infra/server/lib/adapters/metrics/kibana_metrics_adapter.ts index 2a87c9cbca994..3e1be0196231a 100644 --- a/x-pack/plugins/infra/server/lib/adapters/metrics/kibana_metrics_adapter.ts +++ b/x-pack/plugins/infra/server/lib/adapters/metrics/kibana_metrics_adapter.ts @@ -83,7 +83,9 @@ export class KibanaMetricsAdapter implements InfraMetricsAdapter { series: panel.series.map((series) => { return { id: series.id, - label: series.label, + // In case of grouping by multiple fields, "series.label" is array. + // If infra will perform this type of grouping, the following code needs to be updated + label: [series.label].flat()[0], data: series.data.map((point) => ({ timestamp: point[0] as number, value: point[1] as number | null, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx index c25b8b7264077..72639f3582583 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx @@ -1604,7 +1604,7 @@ describe('IndexPattern Data Source suggestions', () => { const updatedContext = [ { ...context[0], - splitField: 'source', + splitFields: ['source'], splitMode: 'terms', termsParams: { size: 10, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts index 0e6fbf02a491e..8e4017a583a91 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts @@ -181,10 +181,16 @@ function createNewTimeseriesLayerWithMetricAggregationFromVizEditor( ): IndexPatternLayer | undefined { const { timeFieldName, splitMode, splitFilters, metrics, timeInterval } = layer; const dateField = indexPattern.getFieldByName(timeFieldName!); - const splitField = layer.splitField ? indexPattern.getFieldByName(layer.splitField) : null; + + const splitFields = layer.splitFields + ? (layer.splitFields + .map((item) => indexPattern.getFieldByName(item)) + .filter(Boolean) as IndexPatternField[]) + : null; + // generate the layer for split by terms - if (splitMode === 'terms' && splitField) { - return getSplitByTermsLayer(indexPattern, splitField, dateField, layer); + if (splitMode === 'terms' && splitFields?.length) { + return getSplitByTermsLayer(indexPattern, splitFields, dateField, layer); // generate the layer for split by filters } else if (splitMode?.includes('filter') && splitFilters && splitFilters.length) { return getSplitByFiltersLayer(indexPattern, dateField, layer); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.ts index ab7ee8992f2fe..5f51b53123170 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.ts @@ -1672,12 +1672,13 @@ export function computeLayerFromContext( export function getSplitByTermsLayer( indexPattern: IndexPattern, - splitField: IndexPatternField, + splitFields: IndexPatternField[], dateField: IndexPatternField | undefined, layer: VisualizeEditorLayersContext ): IndexPatternLayer { const { termsParams, metrics, timeInterval, splitWithDateHistogram } = layer; const copyMetricsArray = [...metrics]; + const computedLayer = computeLayerFromContext( metrics.length === 1, copyMetricsArray, @@ -1686,7 +1687,9 @@ export function getSplitByTermsLayer( layer.label ); + const [baseField, ...secondaryFields] = splitFields; const columnId = generateId(); + let termsLayer = insertNewColumn({ op: splitWithDateHistogram ? 'date_histogram' : 'terms', layer: insertNewColumn({ @@ -1701,10 +1704,22 @@ export function getSplitByTermsLayer( }, }), columnId, - field: splitField, + field: baseField, indexPattern, visualizationGroups: [], }); + + if (secondaryFields.length) { + termsLayer = updateColumnParam({ + layer: termsLayer, + columnId, + paramName: 'secondaryFields', + value: secondaryFields.map((i) => i.name), + }); + + termsLayer = updateDefaultLabels(termsLayer, indexPattern); + } + const termsColumnParams = termsParams as TermsIndexPatternColumn['params']; if (termsColumnParams) { for (const [param, value] of Object.entries(termsColumnParams)) { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 487fe67b85a00..66b5f0e9bf1ef 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -5795,7 +5795,6 @@ "visTypeTimeseries.externalUrlErrorModal.closeButtonLabel": "閉じる", "visTypeTimeseries.externalUrlErrorModal.headerTitle": "この外部URLへのアクセスはまだ有効ではありません", "visTypeTimeseries.fetchFields.loadIndexPatternFieldsErrorMessage": "index_pattern フィールドを読み込めません", - "visTypeTimeseries.fieldSelect.fieldIsNotValid": "\"{fieldParameter}\"フィールドは無効であり、現在のインデックスで使用できません。新しいフィールドを選択してください。", "visTypeTimeseries.fieldSelect.selectFieldPlaceholder": "フィールドを選択してください...", "visTypeTimeseries.filterCannotBeAppliedError": "この構成ではフィルターを適用できません", "visTypeTimeseries.filterRatio.aggregationLabel": "アグリゲーション", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index b515f1416eb99..2b5d5bf560da8 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -5805,7 +5805,6 @@ "visTypeTimeseries.externalUrlErrorModal.closeButtonLabel": "关闭", "visTypeTimeseries.externalUrlErrorModal.headerTitle": "尚未启用对此外部 URL 的访问权限", "visTypeTimeseries.fetchFields.loadIndexPatternFieldsErrorMessage": "无法加载 index_pattern 字段", - "visTypeTimeseries.fieldSelect.fieldIsNotValid": "“{fieldParameter}”字段无效,无法用于当前索引。请选择新字段。", "visTypeTimeseries.fieldSelect.selectFieldPlaceholder": "选择字段......", "visTypeTimeseries.filterCannotBeAppliedError": "在此配置下,不能应用该“筛选”", "visTypeTimeseries.filterRatio.aggregationLabel": "聚合", From 8b994478cb87c7288e26ebd849d33addbd9ca5a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Thu, 3 Mar 2022 13:36:50 +0100 Subject: [PATCH 33/37] [backport] Use new backport action (#126542) --- .github/workflows/backport-next.yml | 27 --------------------------- .github/workflows/backport.yml | 24 +++++------------------- 2 files changed, 5 insertions(+), 46 deletions(-) delete mode 100644 .github/workflows/backport-next.yml diff --git a/.github/workflows/backport-next.yml b/.github/workflows/backport-next.yml deleted file mode 100644 index 6779bb4247241..0000000000000 --- a/.github/workflows/backport-next.yml +++ /dev/null @@ -1,27 +0,0 @@ -on: - pull_request_target: - branches: - - main - types: - - labeled - - closed - -jobs: - backport: - name: Backport PR - runs-on: ubuntu-latest - if: | - github.event.pull_request.merged == true - && contains(github.event.pull_request.labels.*.name, 'auto-backport-next') - && ( - (github.event.action == 'labeled' && github.event.label.name == 'auto-backport-next') - || (github.event.action == 'closed') - ) - steps: - - name: Backport Action - uses: sqren/backport-github-action@v7.3.1 - with: - github_token: ${{secrets.KIBANAMACHINE_TOKEN}} - - - name: Backport log - run: cat /home/runner/.backport/backport.log diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml index d126ea6ec9b38..375854b9c54b7 100644 --- a/.github/workflows/backport.yml +++ b/.github/workflows/backport.yml @@ -9,6 +9,7 @@ on: jobs: backport: name: Backport PR + runs-on: ubuntu-latest if: | github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'auto-backport') @@ -16,26 +17,11 @@ jobs: (github.event.action == 'labeled' && github.event.label.name == 'auto-backport') || (github.event.action == 'closed') ) - runs-on: ubuntu-latest steps: - - name: Checkout Actions - uses: actions/checkout@v2 - with: - repository: 'elastic/kibana-github-actions' - ref: main - path: ./actions - - - name: Install Actions - run: npm install --production --prefix ./actions - - - name: Fix Version Label Gaps - uses: ./actions/fix-version-gaps + - name: Backport Action + uses: sqren/backport-github-action@v7.4.0 with: github_token: ${{secrets.KIBANAMACHINE_TOKEN}} - - name: Run Backport - uses: ./actions/backport - with: - github_token: ${{secrets.KIBANAMACHINE_TOKEN}} - commit_user: kibanamachine - commit_email: 42973632+kibanamachine@users.noreply.github.com + - name: Backport log + run: cat ~/.backport/backport.log From 24b5855df3bd26b83c2de1aedb8b182c2caa3b32 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 3 Mar 2022 13:01:40 +0000 Subject: [PATCH 34/37] skip flaky suite (#126664) --- .../public/pages/findings/findings_table.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.test.tsx index 0fa106fda1c8f..085baae19899d 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_table.test.tsx @@ -54,7 +54,8 @@ const getFakeFindings = (): CspFinding & { id: string } => ({ type TableProps = PropsOf; -describe('', () => { +// FLAKY: https://github.com/elastic/kibana/issues/126664 +describe.skip('', () => { it('renders the zero state when status success and data has a length of zero ', async () => { const props: TableProps = { status: 'success', From 3c7499fa542066553618fa0ffc5fce643f6ac534 Mon Sep 17 00:00:00 2001 From: Sandra G Date: Thu, 3 Mar 2022 08:32:31 -0500 Subject: [PATCH 35/37] add dev doc about rules and alerts (#123840) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../monitoring/dev_docs/rules_alerts.md | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 x-pack/plugins/monitoring/dev_docs/rules_alerts.md diff --git a/x-pack/plugins/monitoring/dev_docs/rules_alerts.md b/x-pack/plugins/monitoring/dev_docs/rules_alerts.md new file mode 100644 index 0000000000000..1a3fb28167f7d --- /dev/null +++ b/x-pack/plugins/monitoring/dev_docs/rules_alerts.md @@ -0,0 +1,81 @@ +# Rules and Alerts + +## Rule Classes +Rules and their alert states are represented through classes in `/server/alerts`. Each rule has a unique class and inherits from the `BaseRule`. Rules are instantiated through the `AlertsFactory` class. + +### BaseRule Class +- contains the executor method for all rules +- executor calls fetchClusters method, fetchData method on the child class, and processData method +- processData creates the alert instances and executes alert actions +Handles firing alerts per node, cluster, or index +executeActions +### Rule class +- each rule has its own class that is instantiated with properties unique to the rule +- the fetchData method is called from the execute method on the `BaseRule`. It fetches data and determines whether the rule condition has been met + +## Instantiating Rule Classes +Rules are instantiated during registration, creation, and when getting an existing rule and its alert states + +### Rule registration +During plugin setup rules are registered by instantiating each rule class by calling `AlertsFactory.getAll()` and getting the rule type options by calling `getRuleType` method on each class + +### Rule creation +- all default rules are created with route `/api/monitoring/v1/alerts/enable` +- rules are created by calling `AlertsFactory.getAll()` and then `createIfDoesNotExist` +- all rules are created with default server log action +- we delete any existing legacy watcher alerts before creating new rules + +### Rule creation with alerts +Periodically a status call from the UI is made to `/api/monitoring/v1/alert/{clusterUuid}/status` (`fetchStatus`). Queries for existing rules by calling `AlertsFactory.getByType` and returns array of rule classes nested by type. Then fetches the state of each rule and returns to the UI an object of rules by type and its alert states if any. + +## Alert data in the UI +Any view that displays alert data in some way will have a `fetchAlerts` in the `getPageData` callback sent to `PageTemplate` that is called periodically. Alerts will be part of the state passed to child components. + +Alerts are mainly represented through menus available when clicking on badges located in various places in the UI. They represent Rules when in setup mode and Alerts when not in setup mode. They can be organized by category `/public/alerts/lib/get_alert_panels_by_category.tsx` or node `/public/alerts/lib/get_alert_panels_by_node.tsx`. + +## Behavior + +### Management +- rules created via modal or dropdown menu within the app +- creating rules within the app creates ALL rules with all default options +- a single rule or a single rule with custom options can only be created in Management +- rules can be modified/customized in Stack Monitoring or Management +- rules can only be deleted in Management +- multiple rules of the same type can exist +- creating all rules does not override existing rules + +### Alerting +Alerts are fired in 3 contexts: Node, Cluster, Index + +#### Node context +- CPU Usage +- Disk Usage +- Memory Usage +- Missing Monitoring Data +- Threadpool search rejections +- Threadpool write rejections +#### Cluster context +- CCR Read Exceptions +- Cluster Health +- Elasticsearch Version Mismatch +- Logstash Version Mismatch +- Kibana Version Mismatch +- License Expiration +- Nodes Changed +#### Index context +- Shard Size + + +## Notable Features Between Versions +### 7.15 +- [multiple types of the same rule](https://github.com/elastic/kibana/pull/106457) +- [allow default rule to be created/managed in Management](https://github.com/elastic/kibana/pull/106457) +### 7.14 +- [alert per node/index instead of per cluster](https://github.com/elastic/kibana/pull/102544) +- [stops auto creating default rule, remove allowedSpaces config](https://github.com/elastic/kibana/pull/101565) +### 7.13 +- [stops creating alerts in all spaces and looks at config monitoring.cluster_alerts.allowedSpaces](https://github.com/elastic/kibana/pull/99128) +### 7.12.0 +- [disable and delete deprecated cluster based watcher alerts](https://github.com/elastic/kibana/pull/85047) + + From f88e8b59bbf9c9818eff5ede49d2ae19db87c30d Mon Sep 17 00:00:00 2001 From: Byron Hulcher Date: Thu, 3 Mar 2022 09:00:26 -0500 Subject: [PATCH 36/37] [Workplace Search] New SharePoint Server integration tile (#126549) --- .../custom_integrations/common/index.ts | 2 ++ .../apis/custom_integration/integrations.ts | 2 +- .../assets/source_icons/sharepoint_server.svg | 1 + .../enterprise_search/server/integrations.ts | 18 ++++++++++++++++++ 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 x-pack/plugins/enterprise_search/public/assets/source_icons/sharepoint_server.svg diff --git a/src/plugins/custom_integrations/common/index.ts b/src/plugins/custom_integrations/common/index.ts index 7881a4a0ca880..46cf778bf0139 100755 --- a/src/plugins/custom_integrations/common/index.ts +++ b/src/plugins/custom_integrations/common/index.ts @@ -27,6 +27,7 @@ export const INTEGRATION_CATEGORY_DISPLAY = { kubernetes: 'Kubernetes', languages: 'Languages', message_queue: 'Message queue', + microsoft_365: 'Microsoft 365', monitoring: 'Monitoring', network: 'Network', notification: 'Notification', @@ -41,6 +42,7 @@ export const INTEGRATION_CATEGORY_DISPLAY = { // Kibana added communications: 'Communications', + enterprise_search: 'Enterprise search', file_storage: 'File storage', language_client: 'Language client', upload_file: 'Upload a file', diff --git a/test/api_integration/apis/custom_integration/integrations.ts b/test/api_integration/apis/custom_integration/integrations.ts index 4d3915f5f2294..c49aefe91925f 100644 --- a/test/api_integration/apis/custom_integration/integrations.ts +++ b/test/api_integration/apis/custom_integration/integrations.ts @@ -22,7 +22,7 @@ export default function ({ getService }: FtrProviderContext) { expect(resp.body).to.be.an('array'); - expect(resp.body.length).to.be(35); + expect(resp.body.length).to.be(36); // Test for sample data card expect(resp.body.findIndex((c: { id: string }) => c.id === 'sample_data_all')).to.be.above( diff --git a/x-pack/plugins/enterprise_search/public/assets/source_icons/sharepoint_server.svg b/x-pack/plugins/enterprise_search/public/assets/source_icons/sharepoint_server.svg new file mode 100644 index 0000000000000..aebfd7a8e49c0 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/assets/source_icons/sharepoint_server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/x-pack/plugins/enterprise_search/server/integrations.ts b/x-pack/plugins/enterprise_search/server/integrations.ts index fe8e584b65bed..ebe98d4e805ac 100644 --- a/x-pack/plugins/enterprise_search/server/integrations.ts +++ b/x-pack/plugins/enterprise_search/server/integrations.ts @@ -235,6 +235,24 @@ const workplaceSearchIntegrations: WorkplaceSearchIntegration[] = [ categories: ['file_storage'], uiInternalPath: '/app/enterprise_search/workplace_search/sources/add/share_point', }, + { + id: 'sharepoint_server', + title: i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.integrations.sharepointServerName', + { + defaultMessage: 'SharePoint Server', + } + ), + description: i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.integrations.sharepointServerDescription', + { + defaultMessage: + 'Search over your files stored on Microsoft SharePoint Server with Workplace Search.', + } + ), + categories: ['enterprise_search', 'file_storage', 'microsoft_365'], + uiInternalPath: '/app/enterprise_search/workplace_search/sources/add/sharepoint_server', + }, { id: 'slack', title: i18n.translate('xpack.enterpriseSearch.workplaceSearch.integrations.slackName', { From 97adf28a72d1d479529139bbedc4cf867f9f573d Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Thu, 3 Mar 2022 15:15:35 +0100 Subject: [PATCH 37/37] [main] update ES client version to 8.2.0-canary1 (#126430) * [main] update ES client version to 8.2.0-canary1 * fix type errors - batch 1 * fix more type errors Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- package.json | 2 +- .../server/routes/api/templates/register_fetch_route.ts | 1 + .../routes/api/component_templates/register_get_route.ts | 2 ++ .../server/routes/api/templates/register_get_routes.ts | 2 ++ .../revert_model_snapshot_flyout.tsx | 6 +++--- .../ml/server/models/job_service/model_snapshots.ts | 6 +++++- yarn.lock | 8 ++++---- 7 files changed, 18 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index bfd4c07a8fd23..a2022e05c86cb 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "@elastic/apm-synthtrace": "link:bazel-bin/packages/elastic-apm-synthtrace", "@elastic/charts": "43.1.1", "@elastic/datemath": "link:bazel-bin/packages/elastic-datemath", - "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.1.0-canary.3", + "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.2.0-canary.1", "@elastic/ems-client": "8.0.0", "@elastic/eui": "48.1.1", "@elastic/filesaver": "1.1.2", diff --git a/x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_fetch_route.ts b/x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_fetch_route.ts index 11811c7b7d26c..b14dd17d3c11c 100644 --- a/x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_fetch_route.ts +++ b/x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_fetch_route.ts @@ -74,6 +74,7 @@ async function fetchTemplates( const response = isLegacy ? await client.indices.getTemplate({}, options) : await client.indices.getIndexTemplate({}, options); + // @ts-expect-error TemplateSerialized.index_patterns not compatible with IndicesIndexTemplate.index_patterns return response; } diff --git a/x-pack/plugins/index_management/server/routes/api/component_templates/register_get_route.ts b/x-pack/plugins/index_management/server/routes/api/component_templates/register_get_route.ts index 039eb24f4d9d6..9e54e80c71484 100644 --- a/x-pack/plugins/index_management/server/routes/api/component_templates/register_get_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/component_templates/register_get_route.ts @@ -36,6 +36,7 @@ export function registerGetAllRoute({ router, lib: { handleEsError } }: RouteDep const body = componentTemplates.map((componentTemplate: ComponentTemplateFromEs) => { const deserializedComponentTemplateListItem = deserializeComponentTemplateList( componentTemplate, + // @ts-expect-error TemplateSerialized.index_patterns not compatible with IndicesIndexTemplate.index_patterns indexTemplates ); return deserializedComponentTemplateListItem; @@ -70,6 +71,7 @@ export function registerGetAllRoute({ router, lib: { handleEsError } }: RouteDep await client.asCurrentUser.indices.getIndexTemplate(); return response.ok({ + // @ts-expect-error TemplateSerialized.index_patterns not compatible with IndicesIndexTemplate.index_patterns body: deserializeComponentTemplate(componentTemplates[0], indexTemplates), }); } catch (error) { diff --git a/x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts b/x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts index 8eedcee590fd5..93d65e162da71 100644 --- a/x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts +++ b/x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts @@ -34,6 +34,7 @@ export function registerGetAllRoute({ router, lib: { handleEsError } }: RouteDep legacyTemplatesEs, cloudManagedTemplatePrefix ); + // @ts-expect-error TemplateSerialized.index_patterns not compatible with IndicesIndexTemplate.index_patterns const templates = deserializeTemplateList(templatesEs, cloudManagedTemplatePrefix); const body = { @@ -92,6 +93,7 @@ export function registerGetOneRoute({ router, lib: { handleEsError } }: RouteDep if (indexTemplates.length > 0) { return response.ok({ body: deserializeTemplate( + // @ts-expect-error TemplateSerialized.index_patterns not compatible with IndicesIndexTemplate.index_patterns { ...indexTemplates[0].index_template, name }, cloudManagedTemplatePrefix ), diff --git a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx index 498a27834d050..9305927618872 100644 --- a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx @@ -230,7 +230,7 @@ export const RevertModelSnapshotFlyout: FC = ({ fadeChart={true} overlayRanges={[ { - start: currentSnapshot.latest_record_time_stamp, + start: currentSnapshot.latest_record_time_stamp!, end: job.data_counts.latest_record_timestamp!, color: '#ff0000', }, @@ -253,7 +253,7 @@ export const RevertModelSnapshotFlyout: FC = ({ @@ -333,7 +333,7 @@ export const RevertModelSnapshotFlyout: FC = ({

  • B>kJp2FAPf1mUIq;E?R8xjV)K-m>UQ{$nM@F_4^{YO!o-ihi_cf#Gl3 z9l3T{@WxkH)>hP3_T9W@7&y|6>Q5G8eQ+rnOr(GuzFJg_lCIPtKZ~s>l@xtbQnyc) z599cOaU%Os<8s>;W0}GCQ4aL#%B=ISG`1IsZ9O1iNG&PC|gN3HD2HFgf!xg=GFv;av!w!g(+ zmE1ygYd&k`Mc;KNQZ0_oDP<=$i)gaP3(@au9}0%V3neAO7gjf%M)Z#@uK(HziO^@5 z`s%G_h-#DeAHlEiT59!PPa$u!LYG_5lV$u2C1zg~2w!+aQ=y(pFlT>vRip$j-3cQ2 zrr+m44m#xt>$~W@WqXT_$_e?o0;G39vx0-6aK@rePTTg8qy+cO=E8$P`fOiK742xZCzQZ%Pv^1 zAaP)TVD=s@UWzH4DyB|+joslkp&#G$l>-P#fZfJQ@2&aV0;Rr1A2HGy7rA8Ul?E>N zOlo{KN>Yi7w^Wx4JlW6rIem$eXaY8u0V^6(ero4kJrECmU~a77_}&^ql>Fx=2#yuF z&=({5Hh#;$!-d5qD)%8D69&?KfIXDR(-S7l0xy`^ICxcLoK>{dV)6uc8hiN>t60ux zn|-s74i87`ly}Qk{r*M-RA{bTgSGlQgOvW~ZfC27-=aHatS8Gj-X3XR%(WiezI~*K z9b(~;%gzMa*U!#$6pn;RzTh$&Hf5KQMo--VZJC?^bH-iSaBdT-Ls^jvr66qSrN~ET zo8$@%U0M$m3Nne!5^%;}p_Bd}E`w8oTgZwEsO;IB)~*urH#nRGl`CCe`@#*F7mX{9 zWayC5d&%(w+!4)j0$!sbz}MJRgR<{ z6#qy=D`?Y&*)ZRQj-=I$aF{Ml6u$`m&MQmI+`1E{6vXedisD(UtGHLPkQj1NHYZ=L zR*=0Nfo)@GNS0KtA8@*+#83SldBe}0K{+1NG@?xRsGMMrPyK>4L#rfV->TN?68M9L z1N$nYaN6FOaNV^tseW5~rvnG}7vhL{NsiL3{@|tV?h)$iPX1!S zeQ|hi`Tk>n`k{Z9@H}w54#NY-WVH2Fvt4P(!bbbhqwwiJ8!_5+lG6HY9~kS_n)tuTOwzyg$Ty<6(HU`X=yJ!Y&p zhFjx%>_t+h@mdDmg$tCJg8eH((M3OI%DKzihw4?L53~<``oRxE8ON0$b*0Jt5})Rt z&n?Q|7NuQ)KNn!cdiJl7KCx_zi)?s`dY=CtkiqH1{8t)r%w&H=xZJpn8<0xf@nz&9 zFzC43&Ic`o%TbVh3FmzO`bLI`>wj}L*G;jGK}r!2*e$X|{E;H}s_ErcB3|G|>ThJx zDvw8rFlHr5xquBv-P7v~S-wf0h3+s?ij#9$=khXeZ4!K``lp^8w@Q3ob=e<@za?&n zfP!qFusGF9R{gEx%J6>|MEija`(|tYcSNMk zfpIGW0G z7i1|UQc_VVHG2OItR#>`5*N(@{m5l}{S@=H338+e;AKmdYVa32YeKoK(tepifjrr5 z$&-`MUSE+KO?X0ss^uAJh(K707OCh(i3I!*M=>#NYBoaKP^hn_1d8+fVRZ4QO?oLf z>_O*734BpehjuzLHVoWkcxjo$@2OFe>g{no zanGG-fF?6wKTB&|rvPpgAudMM_DWm6q3%^aCl>ZMLIlJ2hsFgwXBR7K#WuJe&eylr+TB`!{QyeC0|yD#jtn9w-vT^o*QBLP26xPUQdK zBI2C!1AP&ULf3Z)x8>i=YxI!bnf&868r*O&z`!U9N|X6v{hV_@Si*;`Fv6Tu%p&Go z7#9&K(@7~ubdy~-LQCrNywMv5d>d}LTc?;qkWatg6n=J{Y7(7yhy})fGbsG^s**H( z{~@)^(eRN06lC~J6vi=eXmBRPU%|oyIGe8<)?Z@bj2j-IXYo&M*)ZW= zMEW}ZgZl2E$F3Z?p`P^Zo`)47o8vbJ`mM-urV>{3P%4B9Du_N;JvV$R!Q2bBdGW(y z0Tn97+k5=GJZ->EQ()&(dQ?YC&AqF(YxtYbq)b^feuj#s3~`r+vt0M+HvzsMaO3#W z@S=?8+MkM0s$1?mv)KSWPGD0Mb=rlWezWL9399pKxpc!+~E|prlb*q~4 z?NXBG&9wb!UPH&m^M=O=|M|fs?hh5Oe8`7}E;GDhlvNNV?5U5}qJZlkYO=c%F+M1t z6S-gLkas6Yurb@>OAX~BQ&%S^Jzy~9@w)p&nS#ttXl^4tQTO9d?+)Uxx^U7zCEjBG zk49GG&QVAAs(E-|LD>JEPsRMVEVTp5^*KrT!b!J^$q|dQ0rM()3g)cY1(D$J?iSVX zmWr7jMMX|BIzBEd*V*~L8PT*u+k$JBc2EO}#3V3(frclDgv`q~IH;BI+8a10v{L?i zn{`e6Zw@MR`}+ZfJ^&?ptawmT?E#UBO(yw8$=#Qh*e(;&o|exn7xYYZpu*C9x<~cX zQ`Xuo3}==O)Z%0HF&9d7r!N^w*{a~w;e^;x4B#<$hwDiZpUMnK!CgK6tn?j6!8AHH z#G(;*ZQtv?&d&em3T3SmOj3Dy&p=hW0z0Cbl1!T9v7z3~037z2{O73anqus6{~-T3 zq7^}|+)^zuvRcYff&44-Ee|G?NZj;sMVlnmhz&^Uv^}jX-PGL;Ifkf1|62xxUJd}n zwf}#B##)sSGZMglDkkRayK|9__q3X!#T+C_d>_ug8KEV)mC`cJsImF>o6-~V0V9nE zuv+o%2R&}i>}XD$TNT^bEwe2Q_Hcq{{JSRf%`1bN8sp#lDQ~lz-nB7(L~3fQ zuKWf3)aoAe^DJNgXz{n_tnEXms~j1-m5(EQZRMBsV2G2CJZ$UwmE79?)1lI2tZ-fb z!HwbQi7B|4+Hkh`w`vn{MLr7v(yLTjR;C;P6eRtb>EakHzSs=Wnvc6OPyu4p$@f}a zib(*^qmFmO8K$b(5)BC$w#6UCeNqupXM}zHOGIXbPsP*dn%z0-DE~?4XmG>p>nPox z|4C=c{~zhhG&&izORR}S2TJs;i%GPevT>voaZq#YA1#@g%ru!A5bx6EG?VZ_irVvg zO+k{8)brx6V@>DR6m%sA0v{VgL@*#=#=AWSJzc7Z{eSQfhAl7^6YfP8ckuZC z(AQ}YW0EwyzABsdMrF4I&#r@N^}OHn3T~KZsJ{N}NXGBWN(=Oatz9mtMWC~$d1u=( z0+Xx*PDv~PuYbbXqoqZYQ9kiItuNRwUiSA7!@$OjGj1%AaRYWH{!Civ>r@h(_>T-p zbW>@j1>(4p_D2kPu?RK&aWtV-nb$TNfwIdpG`nD`Dg**f(7`eWTwI3Egv1I2q6)%k z%KQpMn|vJ`@VF^P4`7di!0YcG*>deGovw+CK^`ycond24xFNR1BVnyFb=1bFMdBRe z)CS%{r=ml?=U6sV`h=rSfo^vCRwVFCq^MMZ!`SG~EY7qIIDBJbo?QAj23@>c89IsnjmGA4~Nvx}g@b${W z$iYpg5^z>FW&QW+GV==i_Y(u4!vDIlaE7|^;spPgnbC;21w=x?V0`qw7K2r?@%mz4 zn9PIW3OMwaO0YA*QcSVO9N zV71YZ_(9`ZVUYVl<2uK467_Fy)x(vo{f(C)yP&G-l+$cK!lu3P`zw&8JsR&K1C0!{ z0rTnr(h2p&Vxg226TSkIoySXG3p@)QaZ8DI{*^iclw?k*3Px@tI`)m1-wC@KNc~E; zs7Z8mLO!~XLRW3`-OErc9TCs2NmExUm@8X~+}o+++el(Hh01zs+) zIa*h^s+wX%DcZbm0#VqAK7A(WGdp=7YDgx$AS9|o-98UzB3 zEtF21P$*t668=`*TFl!4L^=&FmX@#u1p(t4fvQQAf#H`?8ZMVT64lthLhPe$-*)mM zUlCf10?QV1Y$zNLlMI&Hx5S+c2*MF2r@45w6;!?qX|olJ)6SOMdJ@Q=OG3ZiKX`&b zRE_OO6?!=lKy3>V*Ti<0`SgmrLfzDY)G}!qdw+x6Yt>S=NF@X$^x31R7?vP94k~@* zIQ^PKAve`YL}HRZ^}I@H85pWVCR!)FSlv)nah)Ev4IVYiSIO=egdn(=F<|+?Ev?`bX5#;^ePF zHt=R1ku(y^KKr<(^f$6TfWRYS5ad^*IV~CB}hTv!x zVgaaDkCGZCw&4K(VccPXoM!ue^bLb(xx5j-{7B$Rvg)=jM*dVM{S!aFXmF(eSZU}0 zy1>+$x6$?WoW^Emq4y4K$(QL=99=G+Z}tc=;?w$a7Wz7MeB$ms z`ZZzagd;Pj?Pf@l2Fod&{RRT_*2)^R-ctHEvn$u+LHSt5Kkv)mYLSSt_ocmZ74da6 z2XKXpoP+&ad~}Q0RP)ESGLG;SK;UHGbgi#H-fD|dn%q*0x?C;yy;_qo6>B&-wqnc4 z!w6K*sf}4TN&p}34u;T%lYWH7%B;4TF(a?V&_6xOaepLmDGyz|%rAm$)NLrXm_CjT9 zDy2@~3U7Z-$V~}V(@yQYote$>#gdy>(9ml{HM9&uD{*qgC94`kOS z0v>v!&v_;B04ogy1w;j(vrZ~;|A&@ZPw+;WnBLOATsjQr z&*v-sRov*G#vdg&Pn0Es;n}!~^u;=u%=2@6jQrqmEpQ*gk)lNMzRNP}@Cm(H%t!i= zB{yoU(6P+_+J>j`LzSI%PY6EDy73Ry)k92Q{^b_QV`uo#nwjftfxr8ER$wnf`u1hs1Gl94`-A5n!qjy(fgKoNFCl!ahyXa-9gi*^ zbMWIt*W}#A%W7fMmxaYC%Z4w@ODmuGJCCgo7hJABb5|xb=&UB07Fo}9MI~^4+_=U5 zU1Qww0RsrY0D{la$k=zK<$4Jql7$4N0 z^+krepj9v$skb!$dE?&4)q?4!E0i}l%pcBWI*sg#x(YNqd8?F+cpuxF9$A$4UvdooH$K~?!RmD+xmr+t=p@hWfm>q-% zMDn}(AaeAKmZKi&3(o5r=(+P)eIU7ic<8~14Gsx8&pP!qi`rg&T3(fKbGw`9T5Yy_ zD}4I{^~}uY+H9`TIs>G@^({Od1n%-dKYe<5gM4(w(NFnqfGUB`j;|>m(M|MYnw+e- zQGsS(XIT48k8|^no64D_I*x{oqe14q0Ob$nz_QrD z(I|Y#P}7jX#jxyyq6h6K#kaew9Wg#$rI>Ce`z3Oeo+F-Ky;}XOyun^)#*s} z;ZuE`vDaMr!v~maNgum)MpLDQ+a?pn#;W7jD5qgR8Wi#1hnIXAOBirTpP~I0mvBbv z%s;M}-pUF6c~`MT4OY!Ohf!2B(pC132*$j+eAhxs@qj-Pow~Z;krD6vYsbW&R`1Ci zK|T*uSQ$^t&(0O_y+(6Or9$2pXA-s0%ABI!!2&&nWzir#T{Tczk=FzZ{Q_jhKCW^lWwNE;E(PwS0afSORNZBdz48 z_BzIug0~lUw4i3L>8J38=tdGMuUor^LVf=NFME=dMIu&tC@s4UErAutNT$<)_Sj)D zqyVq&P?vr2LR@H~GE9cMj`vdxb5v6@+8%c;jMOJ!#B7xoPE;vw8pIf?6ABdyL zFnXh~VP1g!PVmJ+9m)?&N!E9}W_-c{!ULvDi5$Jdq$K;&Dch785b0aL-I@u*2n6sR z+Mdxy**`R?lUisl!a`hmInG zcs?^W;6yS3HKRuG8!>%E3NmM(P*e&@5ezn0X1&fxDD>k}i$e%CG@c<7IPo`YM@B}j zMd&?J92^|jUhc?0E_OW;PE1Ukjo5f6%utg0=y~6nBqk?sYz-z*w9nnPy@5jSr=X7I(b$3LEhey}VZkQ>J+6i(- z`0J-iImx?zhXvQ}!Qbfs=^>smiK&=O>kgYziS{J6gO=m0@Yd%KEUUT3%xq!)#oEMY zX2lzd1=wHc9uYXoDJh@$?JO~_sD8=IirDj;+U<(1qt>6EFc3z%#8XZu9i7TrwM7jsepH*)$IdKNcsjDn^EQ(a z&rd|N3QEqqtfTu9Wuel1Kb}}9njqMO00^U(zH_22Z-k>xKfjVUr}*`8D|H@wt=ZX8>AhEJxRp+9)E&ex3e<;{H{Pv)&XMB@|ZkEdkVG!HfEW+{sl zf#N5x1k2E7dr#H2@A0QZG7khYK=MYTyLql9Zi!XQ-`Df8U6jbh-j3>1T6zeL7W9-D zCS7*AM9#CRv$Q-DX0ufMa@hmm&rF!H&Ce9gi}vv~FEu)Jy45C!fh%nm=&=j$JO^mG zE6K><1?5CuB!dqQ$6oS>8_*1~`OvH}K!G-P z(ZqyqP@PX8CNj+J5!C`+8s`C8K_^^c`${~lpyA`u5rC%oOzgK=SOLs3S#@{-x_A5; zEyHN~aI7G4vcDlZ%1KEU_U7qoRStYy^Nx~Zz9yl{-n8^Whqk_)!j*^C0MTU_!RE&HN9(R=WBMggDey;x=7HAdSteiPoS zQIH`!wvBn&`BPVVZMO*e2lqsD`2fT^z8?7q;5Hr^e{k|2;xNtR0W&LQ)352&74W?O z3IRwR80y6q5UNOzfQGLS!Z19U`Eyqdeuf2X+^3C7MK9^sD{OXub}QbP6hB@hF;=UP zpQ7G8no;GKnMm%}gMJ1w%=FvZM# ztgEM@vRN>Lke`r#iz}F>XNE<~9`5JT&y}WF4U3B>-3)p*QPPZLqYaHhEbPu1>fmN6 z`#{1BphHP4yxrRXAr+7ieXYJ|{cZwOF7dZ;Rzf(4*^%D&XVRwmvr_59 z2|Eu%7jF0?&hz&nyBgY9kat_`CG-cJbhtAW$FJ8YnIR){4hTb!og8 zk{DQ@D|Mfstu15s3BEi2yS0Z2Sr&t@Ur~H6xs?{4Y5(U1@CgWjMct_BC&66z;|ed6 z7jeIVeVdx2-P^R{jrD8lEG!!g*}qFLqsT5~e#b;5EEFi~DfE*2_AQ;dZEo(H#ZT;| zmclJA1Yu%r=Y)4svAL6zK5YwvLE|L2^mX|(TM8aeJXbv)tltjKE1P11kk!9r_UgBy zo3w1bXM?mT!)cvnHOW$ZL!$~hai+QW12|eiS22%mom++T3~Izr_jP-0lGSJJg|942 zvrk-`Jp5o84+x2X1$vzL_!m1^EJ%?z^0_9Lz?R~gCcn4%j| z*uZ!K1fiiQdTT9&4wq@X-9TT*SwfL7l}<2#FcRvqZSk}|-+Y1R0D-M`2UcJ_S3l8Z zIC(ePoB&+tvc4gxaAfi(g9<}ZWPwp|a6|F!-*|lgXu!pd`ZpdM+!R;b<3gWIyROg- z(PbrkM>Lh=jIJoiyLTA5gr-D&M>H+S+Zv8vGvXJ^7(yIDF< zfdO`}wws=!CbJvVUUh8%m^7>_*nJg#K&uk;dA|WUFhoHH2w=YjrAlnI#?q2_A^jx54bj8&KA(O$hM|E4OE@8^fe;!3?5|;qgyI-eNTHZc`G*RbnhxwOmLjW>zE$@Sd1=W7g{BZ~_1w#MU zAx%z|j6Gpl-6KSMHPbx)>^Hx@;j-e6{U|}r9m9*UhQvW&3vSxYUtEz89RLgN^Fo9} z76mkcza3T255Rd(_hX#)^o*8pLiPj&7RXIm=JS@xMTI|7;G{hX@pJmF%A-p_2t{1v zybUFV?1&`RI4iTFVaoPrD3$zzb-o<4I?~G~=;F$`kfbbVb)X_Ulph+^BU~5i8i2xI zR*_DyyR|}`qwDKJA{_x6u3WI%Hg5Z^H~TAhMOzWNhv>0S`z;rVA(D_>PkxpxP`h~|$%EIXI`~3Y|XVu4jYnS}4Nk15$H+;m3t?Khv zHk`oss;7re20kWy6Q2TLwJSR7B-c5m_#?KCPI(=q@X0cvfdPl|m6zGtw7Jwqw}S1dbJi z2i$l)xU)b?vatT_nNV>N3R35n!>(sUYin!S83qQ1^FNacpVC%S^t|zN9+q}(*SY~= zl{QxInb2aTfnZ3d%0ZxU5zYnY`P~i{d%0TtrxpAb->_k40kvw>Quq(GPWhyi z6m=s?-6K{#IeI~C5%gZ-zPWNVB64{nVX?R!k;h{m(31)qLg>H6R~q5<0Xjs>$we%Z z@{qtdkH#OuaW!@cM_>o4o*v;6N)NDxiAzW~X)cqQmIjgXBEOp^&@rc#_nS73wK|YV zA&dqIT3lDkfxz#2(3gL{FPx$-RB52i=bUs{4yx#;C>ttBcn1!+f=JYOU!aRN2ti4q zpfR?V>y_mkbX22u$LajGp2@w22PH+54@qz0VfB1;5i=#E)`rq^GEQDl-hFpf%p|~7 zYGGL5$pr_ON+hai!zAE|T07r7u<~$KE^vf%2z0?^dh>KqXAb>wHKw_|`IO;Bl2Bf@ zO}$_JyO0q+%!WucV&p=R`nh01^n1;MGKVm)lX$m9-UbZE_pC8o zjbc8y`8WiFE2}R`4EOv*4B}NhT`S>z>Jc90q54RE z2(&+4IcM}Q(KumTQ=foqpyIsKMQXH2LUuW&Z+T8SyqRwbUUO${GnG5~j_QLKxO6>J z@Z6$@(!(oMmtUHXz;VsVP=54Be=OoRY2IZgU{yhfTHWk1}w}=lTCEAhY{~hK~s`m z1fUf(JSjVzNq9aJTl)!HcBPh=A=#b5*)!>H*QtE;hwU)4hUnK5-{Y@1xv3MG9+&4`G@`G<*WZ}P zg8E0s`9Cl5oQf4EJ6 z!3777e0x_D@V_mmpTN}XIZ;|$;54)a%_c028hd{w%?zky^y+&Y zHak7>627;Q%O|r#muUHYSu@jrHy}rJGQ6j#ogG{yP(!@xb1Af7BcI3VhOQaLFqmUl z4Zi6O;CVY#J`tBf<#m)j+ZFL)S@%(G&}=MIDX44z7FTY#x!UFt9!dATzQ>Y(?k;K0 zsaHTGb%R#>dwQv+i+8HsVeZ%{PL)-n6KbV-Kc?Ebc9oy%P;c3*E!ZV4@ zcp4u|{rxFUD&LGG-V_t6$kryg6Ge%SoR}?^>2nz@3L#}U)&04b_2C zyU{}Zedmy=B}ELyWGvxWf$=l$fp-N|AUps>wxg!S(;%!Sqg=QFBWkKwqw;q2af}&g z1)cc1+FNU81r6U`nQT0@f=)QU^p?52PH4lYNzA-CKzKkTfB{_SGU-O$5S;YSv(KOC z!xw9;z_?`ykvwP=DM6C8V%!>iQ~&L1Zvue^NES7#uZ z^uU+Qa#OJIN~2(;_x429!1hcwd%FYq%SK#xwi^a{wc~uj)O0tbohyD1Pb5=HUg#r7FE4<$qh%6MgsC% zxwLpi?Y87K%3@+s3-aC{kA+EvI5k|toqRC5e(*7zg`%XA(>n#SpHc}^btqbc>R4#- zS*Nn6Jp6}UW~&s)r{C8xgTNcRf;lMsmc#z>ix5MP(JMM*=3xW%L3_itzXv%I#l>{P zHuqO#0!{7NueMDdpXDIkUlPV(X&SP)tw~L71Pco_>YQ-mHr!30pfNcly(?kn*9!XIge--M`tR^(;Hk30Xo-x472Y+O0}!BN-j@0*BLELI>2)`Y^Y z0&Sh>NfsI5Z!dNoSWR>KULLnKRB$0sS2ADhXZ+2#b1B~#e}vc&NjRZtV15b~^3_Ga zjJ?fPib|rB4$CEzc*K+V%X_yYTD?64r^z5yd*kC(icONj37k;RUJS_G zQ1Lvq;b#-t!rp3(bplYKG9M^?PNGiTYF-&d|M24itCbTU^`*>1J*q__Jf?2)lIK#d zU|>k$hx*GXedNmd+5^j~h*})_G^|mIuj4%pWvaG>h|GJ!>X*8CW&Mpx4#&lSjFhah zN}rZ1S*0R;e#D=cmULfQe@FQT2F+2DWz`uyen&0eO-^1N{$P0V3p19v?J89p_F}C! z6NTH$a@M8~5-}jZq1RQ}&-3DRhy@3@m!2H5QTekd5d!-Kx*uxk#(PQ>>07wx*cZw6 zy1;nJB<_65LBpfY`4SxdZN*SednIYg~}s+!APg?iwekS=b07EZMW@ zySkfTBtcN8784YWvsxP$hsqdby%_76>0C;U zFfav~r%vVkrj2vM#nX!QO{?D*4ZZ60~Q91L` z)^3t)tk$mcpKy;wJ`e6`O~o7 zE;~5iKIrh+u?Ea$Drdy1w=UU&_mt{J!*%?`g*K)VT>xe*{Q8+^>)k842$|`)X*s92 zK-%&egjSb9PtUszklacO_G?A%wR$tFYk9gHkme5VgGi-Dw`7@S@_YUBT+m#Fka|*RI!p+#A+}gS%X%)=pie;&42DJvg zIU5gX7@`qxq35Uco9&S${>oGAUlz5Llu{vfM^D8$_{Li~&W31OwUBZWLkQsQP40`z z%s0cSYaH1V&50ktBFE}ES|XKEX#h#fqwW=QnMHJ9^TM&NBpR7{x$LjpYwN77s+b?- zIpcZJvip;btNtsnb6i9`!vQaG(WeK}01i_a-hQkl|Ei2|!X}pAz4E z8-k`PTo+YQh4oMRb0NP^SM@%rmR_-V-JBgNs*Svy{Aeg;z!i{bMD=`9~z%@{lA%?f&E0F7^6X{bYW zrc1Q#Y5Z5)=!BK}CGwiP?SOXQ* zdxCm?*9#|&;UUWi*oS8EyFOjbo)2@3Do!X_S~7TFB;>3i>fHj<)6+|E#R2=LFVCk+ zs;WUOUi-2bf}gq;Br#(bMumDUNA*+_RSKp=v%$@)SMLfF)|ev57Ew8 z3<+@*vzjjM$V`zY*=7&@oKiH=Yv-gQy1F}p$jMevH%0jfkV6zhl@&LZtWzq^(ZDik z#`ES~yg?x!g>i6j3^d*x)cy$)w z&GHE^O?)^N$xE`2s+W?97lrEXSLhZKv~w=T>M*QD5h?iL+nBd0Q3I2v>rS6m-gNTN zl}^njX$~?502yK@{hliKevPXz?QYPf(8{I_v!{uMjlV85(NR#w(t3bSE^MxI>@NO$ zl``h|9QZ^tzqg&7Km;DU{Su(##Tvu=^MOp+bn>!fgtMF4kCra)u0-{lj>8_$&6`h9 zUObEq5je7kXxefttZDclL|ZnuW$!&lzPZ}zh_EHX8`y7ac643OMK_W%K!S|BLAO7| z7xBcB51gkCTIC?{#Id?CK>>*8Wr<>f@#hX@PzYibZ<`C?81+e{mZUZ4P5g#q$)MuN zveQ*-uG!BRH!&ihLjM2logaeT8qZ%BX6-k_Z<#1_r@UK}jf^`hg@J}$^Hp6T6@3~K zz9X773l0m{86%ntCpj9|(Ic8QOCAeXx(AsJB)mEc5>amdb|GBCK*O7mTQma@ILt_b z5wM@6{@HKd>euPh%IP@H>2h1h>}L<;ySuyF9^pr^GS7?Whttg-RN>wlqyDpf1s|<^ zvjg=-b0CIP8Qr2K%w0im(UfR5z16UO5Fa!EpT_%`57EI7Go&shK^#_a)10_H<|6Ig zl$i=+5IGll*Kv6qixc*!AQBW42|0iS4B%vmD;BhMF@A);K!bLpC_e7&(1PV1rUM!Q7#HZ%ttbXMx6ZyQE89N18rmhedVjFiTuh5=d1~?>63Y zkWUOxMP1LiAkOe3&TRSE88%$m@sDQlFDfS;nWq6s!`#%>ba9i96!vwL34K$cX?1jt zl|8#}n}miLWTlSttSwsU=eV*8Yp5#YQq}8yl7^n2+7$FOnFm1q$D;1w?!tUUJSislp$GtWQ&HzwSO31c#6QwpiN4 z|LudPr6R94%s}AdEBH%k{=d;}NrSKxhJ&tXA*>rw!KuWz-oK6&wCmD0RT0Bf>F`3$GOyVS@$i0IE0)d>l3j8@86}%x*R-S^)B;uWfTUcPm z=2NM5UeH+Yb(r=)_dCqeK1)X_lm-bv7#;DEODwCIs1T9e`)yZT0P`>$=Fkcqd%Iz? z{`nvLwCM{WVw%5u!8P!AnH!@u#o@LWF#(XJr6N@z29?DfaEz+AXDchA0)+X!YdKmo z)6D_y&Sc+pz3ss*q}P(Ao~0Ca>sSs`z_GconsNj`AF~!h87N?1G!3X@!E2i8>(mc1 z!2*Y~8I6%c6Vcf6lq50JD`YT^7w)|V=K2)Q;x>6&`gb36c)S(U>G3;!1R@fRo9f5} z_SYK{@Jno{~_it;^O?DXn!z36D$zi-912n zAi=G1cXuZ^1P|UgP2+CC-JRg>uEB!`cbHe;`@8=;vzS@V^4Xu~Q>W^@t6-i>F}HW{ zSZ4%aU#;?VJ|2cb_~GdlDKCP3NPCMONs72!5Y>@~AF;>8j;IKp0D{UZ?|`sRr55}) zy!;Qyk?c>IRe^&N7gT~%H*;|!B{e5%=SDS9EDZ8fdf2zR>p$wFhIVXU>^JKfIlL0~ z8`V4vx}38L8P(J->6rhl#c5tfv!q?X^eS-Mbk;6%Q+O6YJ@xD3tzZP81a0j--d)_@ zjr&G{!RU{_NFJdou+B+eS~?zhRa8`d57K1nC`K_7uX|m{I=j01dwm!i9`06_=L;Gc ziKpj8*HtO|XSg!FA2Gc$z7xJ2qvL*X2|nVtrex>Iy~}V03=F?*^;336Kc+s>Tf+oE=2RQ*@5REv7Dzz7ayU zV_%SxOB3a@2(nsUe$Up)0DCj94vYMFZnlOP$chpj%YskxIU=^l9$Vl1O86-BK!$1urK8XwyWQRd6;+j-3EDV>&JucSBH$4 zu}R3R)9pFOJ3L8V?v-f3%2!;j)j*q?;`l^12@LbVucs<&naZI5u>ek5frbs{#5m0> zK&H>ezIA9gJYLm<+2kqaV#b(Ia*Ll_5@99q$r&CdIaC{vkn`ybGvOlqD1A^Ba{dy1 zQgTaDP)!J)Q{$altqCK}Ks&(tBL63R3hnP$_qJjMQ?`Yu=ci3z))kfbnoH;#2DzkM zO89E!V}jot2srq2Nj@=jgkK(U{fOfc1*tg^@xx>d{EVnz(UUWWw@JP6N2sRtBjZm- zyJsF`ox7!1!XDOj-Mgh_v+IX=OsO?<7{_JP2{YW`XfgF;xQ4N8|0)0mRMmrs7cDC^ zcxcPq!vp_|-HM>8DOH4c?oe4-^j#z+De~&|@7{IZ0{5vrC8Y0Cf^0NoDu%h%j_-(m zNYjqX3k8{SPfj0Z_AcLO8G0)OjPDZZ9DJ=pxLcvS?di1YicCNN#{H!H1K!-|C~Ix* zX%WEfd|V;d^T?$tl}dPHrTmPZn<`E)y|!-mU~VgCf4owmQE33&L0ZY`s~cH=#)W+5 zYgk^UT!X)PKA#!)?+a1%eLqce zwhpc>gk3{0dIuHa{Y2%(NYcc`o7n4Uo5H>ry^qE`H(=+0Vm+>qSd6X0TWJ)4u`aR% zp^ER8MK4ot9J*wgX5tM>p5^F%ztOR0=5kQLBOeS3N&oYu-jK`?A8%{+)@F_DATGv% zVDLK?JYV)TuO}bwk*gH7s2EJj+Atl$g8H|3b{s~-xqVSi=t6q=$ho|%b-Jp*yO>l` zqSEfsCNXOQZE}NK%qcZWCzeLaCr*h31&cg8EYaB3jq9IUKSMwKVQ)XPf*G<3VlZes zFR=a7W+h=Ojom{lD0QYNLsax6DVcCAx4jRu&?b`XDHyRXJPf{TvbI6dY?)F}O^KKU zi7jp`WZTv_R)zcFnhM;H960B&F+epfN?QAy0VvP5vg*2#)vJlIX3e(Es5WM}c^}>U zPwlOAYC9g*`gD7*v=^$Kdr-rkU(%e1<r)e@>p&9@vuPRLwj7gxx1;d{BXRH8H#|73L{JZmgq@*{gPkrvAT9L4T zg)}UrHcU_cYHo(>dq%adW=?9Qmnt>@Pe8E0cXTdeO4gqk>nDuY-hkcF@Yk^vB`%cZ zMHJdBxpJ!Cw(H2|NUF%d8&c9ij&d?{eUyVaLo%w!D4vgf&i=i6AL1qHoO%`vD$C_WFKU8!0?lsk_bFy?g@487`zC^8d=Da9lCDR#f_%9{AE$PB52uBSlujMhg z9zDyLD(|5-sa2lL-Jnj4z#8Sh;pJ9*-bDVw7>}(eC2NF`E&QZdLMRDImtoCnp7UQR zH8uSLhJ0Pw61D@&Is5yt+${!-Ab!8lvlt>Pt!pKzF9VlodV(_!nN47^u_$f=muRe12ju%Vs0mKn2yIJI^RuVl zp!CKua*#oNGqQi~be64#(r?pWDP&Q<(Whm&=>x!zL9l1SH#GRSK8f@Zuk1~)pF1_?_UU6s84W^6fo-4I>Y zIq#y6s)ZUNOuivFIO;>>s`4|}q6Ny~454~3Tk7|ijRgTz@zLI8ZWdc}HHof%J+A^J z2T2-W2%vQEmYppqZ#H18*^KqTNIwLz?RsS*^?xiD5hOo6`0*M_v)W|_-6SB5dQQb= z6yxl*`se4CmE}b8ZoWb5N|m3J>0aXy)c0?Wx+gex?%xkkb_IVSA^mEo=}>mVuTlRQ zYR_2KXioHhkM)-+x4HUyGy|uE`Ue`dHe)BX((APACo`vn>jzqFKFDhp%XrOsk^E|B z;3Zy>byIOc^eAqII|OJej2PhOZ{8Kr_4Qhldy(JPyNXCw#TNA#o^ogMXN37z_K(x1 zx_|gX+sJDsliufg7Q}v4`SFtA3wW;^<3&#Oe>y<7jEb%w7{inW>d$$|ZSzM9FYb04 zRHXTTF^ofs;dNanD3zsCh(EUIzR>}w#?(fO*EJtmRu20HD^B~WXprV0JCN)!hS5SB z^bA39^o-?y2AE3rILIjwjNhDYK`R?X#~~L7piKGu=R7xyJZXZME?coGYC4oG>bFzj zWLPccj-;WZB(ksyxrOkxDX)xjO)+{5S6yM47E+jFoY;-Q-x+6Ksi{qOd08A=b{SY! zMCk0mjkUEO zjg9ZnC5F%L(&WkLn8|>G&6|Fc{7hlAeZ7(c0VkJ~?Ccs?WFM7Qm=~!YFp5YljV?G6 zZN&Jd-WSYZN_q?aNy_ojbrA08jxZio)7-`e2=*U%6!P{Bhsq4NrBn^sOX59k~LbEdoeVn=xLFPZbxerpu9R%S{+91jv>4t zfkSP8d-2;o!145b7y#Rdl1qRp=O;Dt+@(7uHT9IIIz6|F?!;c|CA_BWtC%b6&`?``^}qwQJzFhU zJ;Vj4j4D_%YyJJwTpHDk416pwUeN+Pq6@2BRE5pdC-J+nrCCns|K)i$V_~xy)9vdv zV^cmPy*VLo`Cjju8UI_pxAB(mjlcuDSk0*fgbXMUfL3T$5Uqg_-nOUQsuEl_-QLMA zwgs?S#?;H)-|v9nu(QQdY}~6~05v*K~n^5Ev71dlYBVgQRPhmyqm`_p9qLI401BijyqBN)cpXgO~}y zMW*3EK+Lv{%Ud}VnI0&rG|&(F>zP3jXy<%x&Q3UZdYPg7F6>&PYfOHxqUm?*vG|Uw z1E_Rm@P^}|ltCpv@D{UtjIVz|pd(@D za%uZ#uk$B2Nv+_X`EjB+=t`VL`nP|xvkmQ_X@On{9fny>;$=I3!<)lm4I|7?vTQ!2 z_qbn$!B9uDibIn(&s!gy6?QguV{T0w&@co#WdM4L^19-DXcRz)OcKoB12IFNm~ z^TpcS7>)FhF_9I@1$nM;$mddXV%N{ok(%)?4K1eUib|30!*>3LLihO(fV1wxj;QR9 z^C6!e-sW;SNkL<$_i1rHmwImGpU6nH+LUziVx=W`lY~MM)8F3N>MzMmZ_@m4IjBec z|Mxpf)xP*G@1@lC|7!pS23KH|;IekSjpx-w|2?!M;t_teSQ61ANngNzmvsp@g*W}a zEr9nTX(Pad5{9any-=t*#9_pp;G0wZo}@COXskJMCc}J>o{EzOqZCU0Wi10qcRpC#4iMH zgVCdp#swXxsyCw)yh8C++*&Zcd$`0g6#4s^$BxDFA_bPj1IYprBXtKIMKw=kQej?; zz4k(T7R^ipuc7mJm=aD{f;&AYN`EN<2^YV((i$yz3*C@JvU{UeA|}oz_a}ejpPmt0 z8m;S;qWhEy1{K}Yo?lr^ROMMl>E}}3Mk-8!J!gs~7#TiatimG|<7Oxpx9(dUGR5k{ zFq03*bm}Qs{$Q82VlkN=n5!Xri-S~)*O&n+9hWa@&>xTYL$9*T$DZC4rTh@ z@IPPW%Ply9=`1Cs6O+ufxjHQMFPken*wV|H>RcypUt3pkU9rD-qVT|N@(wJnso@eaiU+?FF<_v0-4bFD7hD?31sWY43JLOD_36rZ?w)mZ z5Q_R({>}TFy-eJC>$w+`R@`3|Cx+hkQC}7m^i`I*^;pcTSIVe!Jb282tpG+IlUPvr zaVT$~W{aru7@v*bg&L7x&st(aA?3Tf53K!z?9f$*Jlh_feBlY~$p zN|uaflLDHnI8mSbm%XFTm~+YP93BHA#JGny#BmaV-*F|jc&@W34x*x+TWlZ8x%)ul zP&V&LB*--2>WnNC14`}2|)$TV_|uD?mBi(o$TBJ!B%lO-uH7i_l0c=!q|5& z*EJu{mM+w(=-vS^`Y+Agf1{1OEH!39p5I zV<6FYj~=*9hlgkOVwcfEc36b$^fuxTt~`p#@uX77qRc;jRD2Xh$dy7jZOS{(g|jh4 z@HgrQNUA(H+M>7X!D(HCl%qG7td8xwP1&=|PKN@mtJ(t-I+pl?CYfpIozTUu%=0+! z;MawpApf4$Cj-Yun2RUo+8Iqu3JrwF0LYg1VQKxZ*jr@K8P{{Z5vy#ev}Tl!cDsC< z6ww}G^77l{P60xbPFk*3X>!c_o`~LxXf;L^$%w?xHBSxpeN_6R^tR?EU5hU#eS>D zk#AS122Kec3wEZ%He*XeZ54J$He*US>t$BD2Wh?VKy8|x_ zr8YsXM%6R*jd?5I+MZ}5iq53Xe9oSHQYy9U=cQgkn+i{VQnJr!o1(=CV+BRACviv! z=1}5{lZTZgsJhY`{_O9SHbV=@O&Fe9@P>lSYKYP8ghomhYrzl&&>>jZM9KMw&jqi@ z0;vY*l-FR>+Dt+w`6FRGlkw)D9Ju8Rh4>cqzQV>-LqHSV)xGf-$_CayVya9vb zZqOQjKEjXE=Bq;2Z*m14OHC(SC`}1(X9wtD#hp1ontE-=L+ii?MZ^53#VvH%A#7~R zOC{m?`?Mvp%&woWrZj9#z7+5_stx#WR2#rqQt}=;!Y}WA@yM>3kl+}PSB*jErUKl* zcXIYDLNn470C_Yc8RlYHkC*Tp)f_S&VuZFCGs+cY0xYEEV^?c0m%j~auNw^~|8+~L zB(HciAF_09**w|bg;+j!izhz&EgOh4u&5@V<1F2Bkj`jY_0nX zq^Bv(wAoNN7Gn~sWlE9e`3oqO&5$bK$=op53N@vwAS`CJ8PnS1z+|Trh|ZTthAH0Ih;L(4`oauT-` zhs_wKBi;}V$3Gr-qf3h#fV{5^(6u_G1bd#R-Zhio77+a4`4PT^tH>hVhb zkZLQ#JXY3g1j)(o%aKFJpn*|2bQKrw4IX5;!`|4-91g+$KVrO(-b1k;^3f5w_49p9 zw!-7-1wJ$?CZ|&3URX3DJhiXDe!XyDSl?xz# zNU;GAbU@%;d$XHUGB6dmum}#BKl5q$ou-R?;8qDEDU~}SBNfAoKvnZ7Z;8Ru5LLaC zVxyxV6(fNm+-Jxg3H)iLynv{JRlf{+ir)vy&q{ouuN39NQnQnV9I2?&LB_@894c)p zn8*kDz~|UiOt07t0EJX7;w`up{V%u$q^K(Yvz$uET4wGTufZ)smpNHs=)W$BzPVqf zpB7rmwkK+6PS1P|B$Yt$r%}%o&CpgK)NqmzyL9oRr?@rvFzejQH|+35kd07O%gpvL3to^ zW=v1$3xPLugH0zaKB~xHGz&Hx))Yo2rLrFpzdq0F0O{*~PwxIPX3@$VTn)?%jD`T% zIn6uGz!`o;35Z&>e^1jJL^_OjlCYP253?sIXA)<33K8Qyp}2R<6s33qSvK}vvJKVo zKb^%zHIy(@#v>4X6E;ffCtqv5L2JEBza3qXVBr-AX^_x1#4GFFyCBJ?rZwD2)2*e) zE+}`?5UR$+!BAvuS>6{^EavKE_{vqYOYHyuBE1vNN4#ea<(k_vKupsUk zF?$VQ(J!Fv(jswHSsfot6#$m#?Hcz0*TIo90(l7i4na-sYhf2tN;d}N{dtl_D9005 zQBO@&F;Jh+2{B)B&Nd8T%QG3{&qO?IF-HKYfA7uzWARS-BSEOELeN|4I;C9t;jNTM z{a4DPI7*68{*`i+@{xmG!GERPiL^6E0qM1rpGPi6>H;9oW+W{@mhpITzfnyoilHO4 zf3IZUkN^9X#HJv%J$C5MG5>#qzVb!|)G(v%Dd2%C`^T@>U20{|k{}ub)7yhHqU@ZD z3E;DbpTUznZcst6o&4H&_#H%_?b7g%gkEF+nNLr080T=*4qml=6g7+%}A((x|Lyas815vUOW{aHB4SPT!rb?^4dzMkq2>&U1?BkHw_RUE2Oc60k<1_7%!C3-WIZ;O zWArY3zp!92DK&H~T{?LVC3N$>{1GIazs}hN2$4i+4j#@>;h5R+PPR%U@xZht%1RcN zZ^$<$Y>`mm-!v*D$CGN4gvKcKr&^XX|Lz8IZXlN`zT0k=#{6HJ7)Zh*qKfv%Y<`|9=%TA3X3sTlwE`{_H97 z+wU%3ib9JqLCGM^SAB;_;~%)L3q5pE9Wl%F**TrzceFj@wR)c-vJua1R;@fqcT5L9 z639)0#E;EM3>xPn?M`Qjb_@7j*8#e{j3}U~a=}Coz zNDn>r-aH7YW-6#6_+mP8tM3l zQnLFv8$t)Oenj~a+Aa5Cj6hS(60BLP(SxpC80Nnk?O&V~CR`hi8l$C61aun@q>3C| z4OEe03LA45$_oM!fH@JMTP0n(9Lp&)ZwiM!TC?T%L`7_$Q7ni}UnE7#Q|1txr09I(Pgf^Kc* z&~UFLYiWrvbmiC~2-5Y)1?4pJ^Aq>Z&n;X~-Gz^LtYx6&2%Ns$EHQj>sb_-*w7skv-%7$NzYI0Qcju-O}NhbBmg60DZ+@Y zs>ztBGSs0g_w_)+DDekyB{-h&K-KFlZGARqrEONh0e|C(?9w50ht=He&rCBE)#Y-u ztQ+pbQs*4s+dsH+E1I!p(SEvpZq>s{PF>vxSy*WB8&K&iLkhhYQ4UwUG;-=+1+7)F zW_J9~#A;*xhb^i~gt=~+0Vt2JkuPkv(EfG(?x)FcTH^mKEK`5K*D@|(=GLr(HMUZ% zF8Ez)P3;^-YBvd|xowosj1i{I*pyL4PrLkEF7?!Ij`nJie*oWdsa|-XO&UntfDay6 zGDz|1`5E@ZRddzLna)CWynL&o5!pBuh=>5@#33=Tf!Ay)9M{5Xe9{t)HKbP4*QEp)&f{nqrbIzN7P>pW!7fjq!3+2?~=9{9Pf|Bc9BYs!zhQ- zt~bbJpyRqO7^USX+|Mvtxl&mM`#I+iBTM8!xge{VETXI3GAFQ5z-2}j^8R1fLBvuH zm{Id#PML6si#QOJMo?4TYtoEj@H;CBr{@YVlD4@+b}TpO%^gWq7kq zJ!wui4!Wo?v3s)V%L373#&}ych^sdgFDNRhk}Vu~s6A*D<1$;#h!N*Gsglc-=Hm`1 z^!cJf=c?s1x*}K3XepVcSXxZrf>$hxqGi%@5$3~rFx6AkW8{KrDQab6K3GaLYd<^b zfgI?rD75q3LB*?0oNz4cSXfTkjR;H_*$YhHal8CO*Vv3I> zu$-FH7xbHyV58AuZXay+^;QkLHarNxaksMwxpWaycz7y7SJg20L_hPJ{A)x|%KkK+ zC_Pr9koka534XM)6IzaiMo9+Vye)T8<`rn*y&b>%kIbbcvQ|?j0^mYP66qw*j{fjV zbGh9W^b^a*hL$=iDA^&XA!vawJR9YAoixZ`0KH4Cfr!Q}ZoXd2L9!z2+-0nbSzU5{ zJ#SE3*N+^YLDq@7@c1flkwCN<&KC{EuU(O(q~2vaeE9u)?aj((?x8|d*ylnVsGsEs z5vg&(hg01IjkY#oPD1?WO7%fkPm!JlhJ>X(->?aV(wLJ7hp6=Dal)ks_CmF{DIeo} zRm!=c(PatcWCe|t-`i00MaC;9Od!i|Xk4(lN;zL1gMf^M@GS4ok;^Vc~I<{6|^ldyiWN}J3Igst>ZFFS}1I6QN zC;O{;*&oKUw`h8@>CZ0Zfm^9pvrnfM76T9}K^a}XuhTg!RS0J3aqeGggbL zYNLN$8E&nHW;Q%9y=HsY1^y~J-WdMv;f;Jd$(R`7SIhc@GhJ5x1#17ILt7ZczCQ=3 z{i>LS=qkmyz0PYM;&P3%iXj=zy`R_{Lr^jI--096Cbix0O z8?gl8U9MRsR+AUu~55%%3gbiE>>q zGtCg=BjCrxePHLFoV>6|fD5P-2bs8d$#EH!&}OZwy=@~*U$mLyI>lAcs-|Z8YYh4f z(Sxuk>!)B6zI-je;-(w^w9LD^meE3b>3AD(3?ko?-3)dGj!LG*W5ZS zyMfQyA43RA4P{q|GQ=xZqa&uA7e%`)_?5(>h;i_Tl&Kif#XQBuE`B`d9!S(%Tubzs zPdco^Zf!>xN$yWBQFiFRr7|%t`kKd%`T{SP{gu)8D#{)T&6pTr^BV)Py{dCmK~)x~gb*A1Ua0QI#G5tM6-6@zCwK+Z4k!|~ zA=#Wg^Yd2nu!`OiU~7b5&-&;k5eEZoq)XS_f>cM#l*`ouqa!_|p{ho_o&12`o=WoV z8j|{Qs3?2FYbqe@5gz}RR!#kvR!vozam)(&p~cMniq~8vd|lc>0cc=ak)a+hCukkB zwWJb2)wM5vvzyUy7XBwpREP#%)jy-lXjIy&09Z()!lYA^`vCpw5YPkI7=~YC2cwU# z!&o#nXr-g8r(n-k;{S68G@{7E>!c*#eQTEZbxZj-XyA$gDo}ytWPsJ@?})VTIs>x z;oZofrgr0yt?+}H#tG9u$un-yIU}X$kfa*5Rb!4W!fy}cU)-j z`<;6(a0k24Wiw2#xSH47(h?xIgo7b&;>-r*HAMYL*Ik9uS%5sx&s&YG?4V*njN%cYc##x8-$j(^8Af~n ztxb^fJVv-!?KvQ>#1<;)oWZ0Y|odO?BC`&TCI{EcuSsO zk2gk5lz8(qwo2Md*r$-Mh-5LaM-rG>k;$YUo0DwT?Nvxo>mq?vi`b;l zhzDCImktD*J;mqvidA%aG5Z4dp}AaFw3@Y?8@nFtS1p<8OC>WNSQ`#BUor848r7h)w=~;-0aLJx?#cV+(@<64Fr#LPj zgR-2e|9Us=|GRhlStcczl9m?Oza=CmhqAf3nFqt1L;c+c<--S3Zf?A$rs4Ig)76%c zxj8i}I$mCa5EP=#x~1vqfbw$Y`-ib~UPWzf>6hnW{b%&)>1peO*oDwhe}CxhogL6$ z*R3!%=&3%#ajiLiXvevYrRb>djj{0XclC9#&sFut7*HG?i~ZE(Bi8x<{tzV~8*esz zC3kovT;0EKtpPjRmbcToOIyKW}iV|4l|gUDT8Z$cC%@d~+!CF?b=G%{CPj5ZBv^V2!Bi_F%+8upO6=BOQGint+RK>VHR4nur(;ioSJFj-o!i315vvTFpz8@UFg#pb#sq@qvxGJmu}q-T6~=R@xcq%5o8%*1`^TkQCZ_x#o0 zWT+^R`CpYKBGF3}e%F9vY`K}<9a(8(%yr-=J(*^Pr z3=Bx){0~P;t4KJ^zs&_67Qq6(PxHRW0c4LE-2%^B0!B7A5ecg;Zl5xI?k(?cIv$5R zdRA6+M14^Rx%|d`pD!l%1Bv`7>A7H$K0|~34cL@ZQJ}aF|H{I>M*=DW0=<@%YK6>f zq)D@OzdSHOks^U{pg7H|er3Ohwi#1`Q8kPEXNEXYW&{Nf((>b zA}ULVF#0Te$)^4c`YwfaOe&LO->*3JHfJDhp;^SZ9LX{rHqC5S!L2n5Sju8@Fxb!g zYOc}>mp%JzGtdSWm37OEZ}^zoMyO+eUbZ z>MHP_N$r?gYox??Z^oaP4??EFO+WKK6YQrU0HI%B+UPS0gPN_w-ZmTbrA9YR*&xPo zjB}QjLJ$(m7G>w8D|o+~p4s<_B<%;Y+q=whfzaQCzvps4=2HOZV1$l z;P#h#>4~%!y&L8Ny9;0$!l2|P*5L_?eD3_dgit=Lswo44kW^%}0&gI@OYb;#q{M zQFXKbI6cLeWE^WllGMKchfFtQDIG^xRWi;RZ&=ndQ43Vp$23l)x4&$%f6U?uD>CxR z4lI;L`7^k5_M6R8ae%k~Wqi%^eSdtKdG0vr9>P0#zkzp9sPE8#2Jcv$26d06v>4!) z=UoR)r5zWGt+|&~6HFdzn2Ls6@22CKTKMPVUA(<*hwp2b;?>Zpj;)emlHQ>Lp!}iU z!2pfOS%3ldC7#ajsCiwllAxv$kk z)g&Gdq-uXi`Nj=J=Ov>6TW>9A!j9`;)Jg6+_OsZB0)-vNIv0^4zxLtJK4NhBBAT>P zPNkXUA9`_X5fiFCLDBteIAgiX6GR%*qVIdZ0eRaQ!;LqDP*H-L6rIh#AX0!l!JOz` zqiiYBXkxycbgAd3mX3#(fq{Xn7ivUF{l`t5{TB%(;KA{6ZwUV-*&@v5^V7rap6|1{ z7C$}|=QKJ&v5+|^@|jJuZ%M)+l{AI0I}oV0iVZqxFKMeN83 zq4>?u6ti)ly~d`H7H8^9oX0i+c{9XczIsHxlQ4Lo=xi3C42Gv6wSB3|`5stBO^N`8 zibc@IT!(ZAlfJ{TO z))}?8>fYqov97v7`Sf%wMoa&f>Poa3AVXesSY^Oaa8###;m&p-s4i5M1|P8j7|OnJUkrm6NlkcMCz^Jee?)(m9;AXj$p2j&&nnD5@6-8b zsd9NKf$G6Jc~%m)oW)XEqh^(sAJ*yX51DPZyDuDaSR^GW;S=5#Au3mmFLDS6H`t0( zMxwq2itz#}@g_4+)=odDiz%(r&?wf1z4t;zQB=1+R;22{7ph)|v#&csE8XH|NhuGf z7TR&Jq6O5c_2-=$s0MM72`3a-*GY4l@Lvrm14=9OMoGpZ!)0h+RQ(*rPK zYX8XE1yFRN{e};HRXaU^G6&@n$M+0J)KZ#V(q z3qLnE$oDSM7m5tudz*qpkz+d{A>sAH)$s7}OcW**2sIF1k@k}OKvGmpvXLAuhW~C* zKBuaRwe&>2<6iZv*R4XFyUGu;Ts9ig!FM1WNlm~^X}2;qJ8>f;VB2RIY#M>H3IF&3 zs;y(uDN7j#ir+lnZv7CCJG16e^h=%X1vf+8gMP)I_%Y2izdZG5`xZi|sCN>itf&U7 zBmN*IG(7|=-o-$J_T|q5UBs=N4!@6|E>{Er31a6M6 znRbQ4m?=hVqnjlOMLEGr{Y}=JqJ&DJ!YrP%pAXvdo|M-$mxadkBBlBHQNJ$N#tDXq z=~ozo6(?C8_4d=>8N$|^e2@m?0=Qb`htY%_0`Fv>3ww(de0J%xRD1y-!6nP8A(l>2 zZHSrdf$OAkvi&nb5G-D!`!sSH0^iLp$;Q+WtjcV8x7Nx54QVV!z>DYZ2bt*RzdurP zebnhzgxLc9ET_Txa(D`1=P{A+&Jc>#BKh@w5**&HhZGjMnMbeILD_%G z0mo*J^C&rN!r%0z<3|c-eV}!nkD?OZzB24KDig@;pX?(uzsi>*a~mhno?O}e-tM@Q zD}3IY{(gTyeBr0wr=BdyGPhd-&&FZ7SqYa1B^8?!*&@Zk z^Yb0gE)mhu#`ER6kOfL{!Q#@=O9nQyY85p#HH8-6hX!Ay>JVjR<$(SD{ZK@p5g_lI z@56GV*BzUx8abjg$jbp*iTnoThG`AHP&1@|*=^0oh=TNHSSBUa88#@j~CwUg^SSI(->kdJPv8ovJu|bR0z|8c-FWaTC&GzX`}w zArhkBjDmwIYF`b!en!XAlc*?mC6gcIkQQ_*Sd=gS-oDwz8})ghB%>P?=ADDG;v~=) zxxZ&|rB&77-q4Yj68I>1u9kxu^FBn^e%Ca+-wHuFDoZjU@mL69O3THS6tAR}nWU|s zAxZWy{x>t~sAGm_WydnEIy6|Yv&bU4yz(M09EEY+;rDiow@fKn%FtEyA zs9Y;RX$O<1k9qW0VXm#L}EU*}xqsni}wZ^Ir5z4r3h}OtEKd1tf^C&i;Qc$t* zZ~K zi9Mt+LZcftpvHI%ZyHoL*8e=N=5@hfOj~WTF#zXPoC5N(ynBpHct>JQIM6&FpBUs# zcBq%&7A5FtQJ4cP-P$)GWCFr4m$TQDn4DU^5dUSXb-h7b1rdnuDLEP(0yy-r|kZG5{^ z%qDkvs}1u!eLCVTBD`^?vd}dmjMxt@Z5v zSf+q{d?-CV{ol)dWlSur$$Lvn%j%G&eCfo$OV$;NQxh#~SIou5l;VQq0IG94=>a8@ zr#}*t)6-ku`uCkTrSVk~Ay>|dK@lFP zH1yGGGm?{K?S2=Ak*Rc&+!lt)!s0V)G)2noqcav(8TFC%v@0Q^Lr3j8p*r-`!Yb@n z9Wl|MV!=*}^JONuQd!ta+|S8XGBb$m&m4CJUe;J4S#uM58Icx)z3d2;ECk-(z184% zurE19MRcoyc_wwqRI&*4{^&EqaA9@+2}{}Azgog+7j0F<5|l*XXX#0Q_$f}6GA96^ z6&$Bkaj0-oE~Yj{hTzF(tkAlH_PQHW-LPOdW($Yb?`}|%|HlHLi3;9N#tD^aLLtyt&7qFBsa|skO`tD04Gn8C@8~u|@jbhnEm~XtLFiNY zB?W=BCj{PU8llDwneSMPQ57p5nKAIeGv zF7D&5<{CFG_hm4Qcr?zO+*5z-9In0R5bDI{Zy2dtLYJ(?w0#;cM`$H`-w!A)8$;uw z<_(K4&tp@@H1gwgS|0=Jh303KrNP#!!XxbhMiSnDATsQZorL^T;y%K~;>hjvt*IdH zBsud0gGYl~n#Ydia2OZ|ZyjnC&1SO0EE zo%VOfjb}&5)RdAGCb^YZ;NP0&=7ZA@N-s~Rz5@3T4^+INM-8a6b1626xbkRHrP zKNWp_c}a=&`?-dRi3vY>?*rv$PM`bf%+2k=xIf3oVuprf106RftKreUk6X1Pdjc=t z56rc-38*Av!&_+tJg+}|B>wtN^UKLf6GrCUhwmsD0}LK?(BQ${U4stp9vp(Z6WpC)aCavmc<|uv?(PsIxNe1fzFWV4cOSy7>hAOE z)8}0mf#&(9!}i@qz(MG{;YP;Q%#F}SBIxS7FCC{M+faj|{^Qy;hFc+c7#q$wM2;cPs$DVDw zJpXY7QsV61F=n%^CvZHab-^EsvI&0y1582F_$fVC6&%w3@(mbxHZI)Nn}l3iwko3N zU!zfSBxoGnhi49)s>O9!o0NCYuH?qhqo;+Z$elNa|4BLX)g!c!lvpjib%VC zh^!5GivAWXEe(SS>+6wBBaBDZ0HU;l%66nibtm9dpSwS7EZK1MDs$J9a?fp!7YtAx zp1y}M($QM^bx(%NB~VeyT5Mu&6k42GdzEJY-n^hnn6ER0iX)b1LO&ThiKTn0VXEdP zN&aW6zqu_;(V`{Iu)2``ZeP`mX0;cG^m8bY>wV~t=`NV#a7wn}3#n*<0#hKw(D&>f zDf1XE@oc1bO~X<&8`({u6YC4tSstpq1)B{9BkU_}wQUdT@o!Q22wR=9?E?vL;6>2z=o2p0S;kUkhPef2}&DNhX(M6>lRLuyr%Q3QzZbXny ztgl_v+YS``za6M?Ii};~xTDzrd5ZZN^XBA&h(U6V^7Y!_72EyyO5W?swZW?^I_1ZF zE^)Q60d;--SR#HmCA0kdd(VeP_m0O^9E#QOoe#_bfp`;^JGH3dX@6+oe) z_ZIN33%6b5^yNP1mA9tWCoKPYbo~isZ*TAXP|@!L5D3f%6k6N@$e7!1+s-8H>})y+ zeyo*b`u9ZQG3Utq1;i3e1py5=fL6P0weCKr3U+{&cdeqjjjEuXka^Jq!UVOikojQ{ zeIwF2Z&Vz#Ai5Htxg#`$xUJLnUyt{E`rG3p&I%$jnL_d(6pcTLG~bLd5U=Z=o2VF$ ziH;-h(r}mnQb4W0Sw>FR?#f61oC~ty+9@e$7vXDS{-II`4D8Rmb@cgznQrY|-LJ-c zbQ|c7xbEkGQslhq;lAtZ$6JJWuUIVb^IucFZt*c;>NBC?)g$|C+>rpAeO=UD` zk@z$6w}7`~B12D0F! zm|}~r8c%duD%#g8{b^ajg2Yy-GU%@a8aK3$80sp!g#v7FRj5lrGZtEiAo5sO0o~Or z^2{7NkuX~M1ov(aS6vIap19x1qKPR#{7iDK=au0rM~~EucFTVt9p{fM!V=c&xP*bP zS4}KEfoGpHgElt>25R}vjeYhJDu)q4&F-A`{(rX;M}QW0s!E8zcxbP6Ra>ZR3ezOU z)Y6hnQiPj|=@1Gc)3TR9Zfd%jG*-`$D(8 zJNr^XpHHvn4f;cnaRb#NchJEIoggKHhx0Ju_Z729Vch}De)q#_F%e*h?^OXw1SVJ^ zlP6$kNXAcqDFwN@0a*6PZk!lQddR?XC9kpZ%z_%`~KD>P@XpKdHu7Sk?LN#6%sf1v4iCj-pC2_YT=1* z>BFUCYX_daLCxlzAes*Hv{_ai6DRnTi5c#UA-8Tc`bEK{XG`2?dku^-x+gcIUZxm% zGxGIf`ZXJxjOclYd&4&ddtzE*dL zGB;AXJkJ*tp)%o_SdrA~%J029SGLtWl3B;8dW(g@nMap|Py4s#)jw+@x+&ob=@;g2UiL0ZX4BC-GNR|FuS2ZtE$>CK%Bn`hWV0UbJv>dY*L^Ng zHQZyjyX)Ik{pMS(T~uk=>4A+asz2H5gR`%mEttx$!ziUZWn}ae>7xPsYU;)d0p%m| zbzG4NaAM0v$HAA-gh#cxEW!;07TrK(k0)8+8<`I zv5TjH-qs!*{UxKUv7l2qoEQtS*_C#i9H?Rd6oObWw!B_eFsJ4hji;>SNx}^Z&DHcn zp&p}5`1=n9B~5H|)_|Vc3+DB?m8n^HVoybMftn{Q&B;d3i!HdwP?nB9K-|5#?m5_c zPs;`MQWRF+xu21}b+sG>S)-RZ`+@7wWK9)(nvTL4y77sLy+87T@1${KZ!1*wAYIwz zKlR-64I8yDS6L?J(8eD?eR(BY)$PuJr5yl8+1gfz^Ir{vaz*%I$5Mm|717Gwe!rK& zgh(fC+$Lg!zJ=k5^Kw-6LZ_pn(-o;8FTZJR@c2Q#;d!P+NFqXP z$Lo9pYRzLCB~^~wO+X(leMqErAHidD@|#Tv)){o8In^yGW|?4taUz_TA=I(rmnbR#*-H zGrI>Ubim?;l8%b+wGICG3lZckcM$SUF?#mRvFBjrs#o5g9RB1#uI;3>Wv2C)(&>#` zTR;D$bX;2fSlEA*UY$EK{7=Dm#NH@fR6#_hy*;j_-wOyXwrio;JSfVk>X!1Yg zcYL}NCdsYuz>7JZ9K@*H$nos&e&POLG23xh@^wH?wmV*>p{E?Q6Ef^vkUG#7 z9guFNwkxFw{aghvEb$@-FQoEyg#=n1knWJzn9WG$ciyjf?$Q^u{xBuvLQK<(E9?n{ z*0;*@)NX|*TSG3&vAfu_)5WL%184iWU-tZA+4=4;7o`PhN;#uS07}*3Wb%Yf(p*z{ z+EOwM6o@N-L|juKH14nWA#>?0UAHrh`-{@NO0e*~!6U2p3-8NjT-7HT6go^13f2+5 zM3jnpt=Yq;fQB<+ovyneiB%T!CfwkcG7EMi16`w;a-pthB8lJMf+dq1>gc|9SEDW; zQ3>5|%G90F{aSxH#`==YWRjbzS1)_KS^f zz^s#DjQCnP=x>}#vSf{;KG;<6i5-+-ez8^#b5|7VzWv&E3)6akE^tE-o3}Wz>z=Xl zx~;iCp_KT2@R=EJj;>k{(K67CFgz*dDtZW{*c}D4B!s+*Ou!?&BjT!!>U##P$IJTs z>-AwhPDwvAd)?)cUs&UX=ho#Ba zX)+*5`tJ@Dp8?FCP?)`jI~}lOvyP3>`s@S>%5yEtNjVu5 z|ANz%)A@D?;~0GvEu$#g&DwWML;2j6b*yC8vGw`tT1&0X9ek^LRyeE(XGBKYG|$Cq zp^K)A3!-(Pbm|E2RkIpWb14nfDF49#Fl#1mI}NT^7K+f6&Y9>Iqry>IV)FF>QM8z@ zHhA|3Y|j}6Vjc5K<=QHUs7wX5qP{69IPTpsoGKj#7=WdzsaZyc?ioj6^(iVU>TW8f zJs1MPe0n*1ZKqgx`=jFhy{Gq80f~fS+}T&qhU@MSw)e5_I;75o5E6leWJ6;+LxMZ$kv+ne+t z;9XAbl}OU^jx!Dkj2Bt1%NUZNjRN!QPrcZ8Z{HS<23`3mW~}c7t>XQ_T&6pl;m>jQ zxwp(-k({2I$n_hQ0G_k4t0&PL6+*F6qCc_D^AR)Kcd6{C!qv32k-l2j|DYw!65tMt z)+^5K*_u|YGHE{l5Igg`D|Y2zaI0!OQ(~!G&!hf{#%bDzf~*{Y!$wSuOjq>fV3&8L zSGB@j%j+BNZpB0@G%d;tdh4t|PORTj_MX<~%-^@0-p7zzIui}>yr0k*D6JyPY z_=wJdubndV%HEv1W+`)p=uZMBKW z#Gof4afliJB@YAO6?_)_-?oKxcZK^gdq!t83KIS z9S=wp=Q;c&ZSB36x_pasu`#GJ;Z5s$HqW{ONlnr#Z!lbM16>iS*~ip3O^Rr!TBFjK#?`l6weZ z@))sK*kQdrHJkXfR8z`d-ElvXlV2Jk8nar~7o!o<=(I`o+MZKdbnDPQD%WRzWfH~@ zrYv)Gh2i<*&1j>S8wSy+Z2rVh+#LD&#LiGri*menv%)RW)-JaoMDLSyc!orXdeya) z1qqGdlRsvm9iO2sErJS%na@7LRTvO#>>76N_E*c)B>Y{2Xw?xws9|saELT!f3)VF7 z;k59`8C1l=oi z=s^V0@_Ns}e&dFU@Zfgr4v4Vk>L`#=v)&Ou)L!l>qSm+hVoP~Zzw<#!9V@LAIJh@; z$v3v*K-SS4Y%<4~KN&}2&{eq$x2C=fW#V>KSV$t&96XyQ(^|2^BBw3n6g>qX7u{%n znAT?C(RlvNbw)4g?Cyd&6K+B@uFaH#w0VM4^vinx<)ZK_OVl+}gEaR1vCkYh0^XKqASe*kw@nRNTm)eciv{yB7<- ze%Hr9l)68w5;-#WeDf^4?1g=|y?J>ZYoa=5WXvTgZ}mTe*E= z#?NMs>oC(SAsVfrXpJpeM6y_DjQk{sx#xv00?Np<&VqKv@zSS}%A#a{ouMEAY}kh1P-20s|)nc@jHzj!J%r#myss+^iaK6z>|eR)=o%6&4E&y5W$-=*=Z^dQb_OXbmK=%So~@Vo zE!UdI9i0E=@R!4!7eq5Nv%9SIdm=wx!)TxUYo{289ntS)c!G9iSf)v1=D9eE&(1tfMnL@H0&I z`k&nPU%wLHDcZ_0ILRaudAUIKy}Y&A36{QCH3fRhZWRv-f`4XH(Qih9+c5hfjz7~V=+Owu_xYi7QE!z*iLPAmb z^miX}5sVSKGHl&2S88%=WC9QQ=9p8tcb%`Q41yUEa^7y4$`TCP<#D9ps)@LQTROu? zQbS8kbHHwrys7C2a1KygPb}he*ty_mf-`K}EOsd)LkSf$BB+AE+Qa9FO(w^6TQCX! zN&c?yJJGdge9o}b%yr@&y}A^sWPQq)ycz*M4F83Eij@;Nms8Fth(pnm+T&wiA60TP zcXdO1MC)gt{`kZyAgH+m zEg>x{^yx_sZ>lI~wg;`p+_#%!IEddxLDhS6#{Ht1BZB6!%W^4k^{@GODW> zKRYJ4{vl;4&a{E4fkBlIpW~z`rsvLbSj`EmCu0W1hz~OrQ5?o_;MGhiALxJblZsE? zQyoiA9`c>H8{HmE1)iF>6cw_j7(iT!$9Lljyr zdgYRCNGl_ylU{QVSuy#a0mq*RiBczvuk$>Dprks|+o{IpT&=$4S8%AHG1VQ2YeF#k zlUkh-e4U^nnZ(;>f4Aybf2aR>bm-6heosgwv7>^b-E zVY3ZI5kPUog89KjqI7H@Vn_iW^Xg86*i$|SSjkQzfO-t_e^7kxi8Ty*lEli+k1tG&6F9YUf`+(hIms@gL2(|R zpN7H3fn)(%9k!N>T#fZU7~!+rkEc9h^WdSq$EIM^?Gi|T?K23WUWxo` zUau>-#zBk?1P1^n{F}Qr&I?8B_`qQ)5P=Ovi{lS2G?e-R_dzEj^3w;qXs^_SaEtr} zJv15jj6ej?db$_EA9eD(`=tVwLJ7s4_B(H^+G$=Ma3cxlefy40I#}2u$jl5y@U&Wb z4+s&N&tZ(DQ=mCaX=GaRKl+%-gO{~&nGl7_pvdFU%IpYPws?(Y&UH~_>6Al6jXy$& zdY0{ua#(jQXc0m)>#gS3%gk)`*-R#YmG4B-pWG@yj442MnceA|nODl8VWk#Emj5Ox zw{|;WDnJ<#ADGn+Wdf9*$$&vk=g-_Htb3&b<0BWD z2U+G2Dp~`;_0I+c;1OLnwtwLf_0XBUa8saE@v%oM-!mX^K-=Tm<EoZ^se`8j?Gb zFm2iwPfY%O)yd>{EWv1RJT_titT}B6+Z+!<-rU!I#G(uqG-4*Bu1yIs&1xHLjfZyc z{s8i?@&iep0|?fiySO1^#E#cnAg*47N0~KVz+-De*XWx6nDHXcRUkFN=bE}yc|dgcP-m@$RjERBSLGwApboFp;n_aO^RzOP;2*+$#?$ZV^5MQY8Hq2l z5;>1eq}f~j-0e=>4r709>s`7RZrb>{QE{VlhN@EgvAW_%WOAJAR5^GjLs>T*WuI=S znvA|$hmGfxQOO`h8L4=Zt0d76E?f{5<*=n@6q_-CozVtJ&}IC3@y9hf<|n!g=43e$ zE58gTQ4s>W*CWG1Nl!z$C?OF|=Xo%JGmxn+#eBHk9hQH;ioaSbGpe09>SG95{RNU~ zXnFJil7iJNSD4vNO!@T>Wq&t3NGIAQXn!#$BaMk>Hgtn2wdYnfey?uY`dhs3&s}M~)vUb= zl3C>`*d5`K5x%ko8N028PWc07qUyB(f+&weZk6z*099zhSyo>}d2|e^x(?+Tp(sJ7 ze-9s>r{_OUBlLf64TZV6`Nhd1`@^%_{#X_bJv|V1@zia5FoF8qtF7*{qa&-j#8!$g zf&(!GpY|hk;?^n*8 z+-ixB?pJE%W_sDuyoKbh`;g*N$$w#h7~ev26Ptj-nGf9Q;w^dzAdXFQBbeE5R2=hP zRBZM#f1RViM-wwwW?ia<0r*G1Mpakzl_+g$>vrAdWQ$5(W3B07f4{+4!Y~=5UCGuL zDaj)_?Sp$@mv?Bl3Y#p`6ZNfwBBd}bIveTVyX4!U&=|&7Vn7mA)80=O!-x=%WtJH_ zh<_qH2>Y?HF3z`x?_zYCjVyI@=$`LN1IN*c4p--zVMbrs^D$4oyb9nH3Z7AfFocC= z4LCEgQ?ouo%wr-InNu#+k8UlFgmp^qM!wED-qaAK)pjDDS7v}k^F4f{yz3b-A8$#r z!oIm65a3tPc+7;}s<-*eiAka}1Q%Y+E%I(`3MjnClKn(=>~5q$Z^;T*Ha%EQr~*O@ zp`sOr&QZ2fM=xBO`r|G-;N!E0C7{lIana1^TA&0yrAUls>{txVj7t*0I$ZJ~(%&nQ zQCc4Q*;P<*>v2Qb3M z?ejn}mO(udzRa?GsFzC&PqqJ)n~xfmHY;gxwW_Ag`I_sdc!zhsts#F`dZ55C8~b}B zrXHt1{viy5k=V3ns*{=U$~5#N*sA!(*Md5pn+~C3&%JU-6)s~pW1>!`ZtHZxAKI z16@fVR|XQ<+NP?;*Z>sv{3iLW=Z&FMiyBw8-+C=BMVh?cfJub>JI4*7=OLrbE!$Z( zBKBQQEoNI7WLj9roYK65GHBj=OeR!cMu_As=bY&6Gb*_EHh&r3%!I`~00qvBr*`Bo zH!{+!4|UzT%Kq(bU$Ay6rx&KCY8@WRk%!$0c~)%2?G&0#tEBjv7TUM^6i-Ux4cNng z*pC#pD;a*#1ghhc4Rc|3vdD~zz^d^@fBeQTi1(9(h!iUFV+>tirTD6K*jW6tQw2HN z0K63bS`=!77rZ~Bld0pStoR+O{f>WQ636l?r zK)G+YCLR3KXfP&tOo%AJr}&)|5?X=4{1&s+0D-l;9?u%?cjzJwB02dHwd;)rRh4SR zGxP9tye;(FtFX_w>stK2JC%RdAf=6Vl`@)t(UPA6uQ(Et-JXo`76vHu$ZYIqs%5LfyZ zY`xkIvd`bD#hm*}Iob)Zd&qWEHIQIzYcVLRiAyyABwSc?abOi2Y1-Z`Y0wcz{VOe8~?3dsaOn{bO?L0Z09Xl(=hO>t8jcm==-u+6` zv(BFDoN?`lW$wX~v?<;wAQ;j#-*omCq89n^hTKt^{uD8s%ou^c+(=0$d&;GT2kdFO zSS#=YkniIoU-@wtlVX5O zESlBOL_*E{0#=~b67uI0W+oVO_)`{(QfTtssIx*}pgu2!fomv5T!*tGYMNpowrk)M|?$94J#pMbhDRV3I#ci3dSJ}v?h?S<+M+J#| zSq;9*`d}~OoU&MTLxnwm0wF3{F*mAod&lyN)1<39znf;5Gfe&Z{-A3ZemAby;#BHm zn9M!>4Zrl(^WY+HrJzH>Gjiz%22 zU2l}SM!l!)rzUYU!N#_wQqH%lc3MHSPPi%O44_L7flb3BtRtVV#!BJUR(Pcl z!~d4_3_YLXgb2C<$3g^L+|r-U8UXw`qNzmI?pZujCdsZ!Qu#(q=+?0$O2rO1AJE81 z<=^uwB{k6=w|uhjp`@!UBvCMEFml%E5R*w1`U*RhaogT3h6e4p1t=76iTWx0=0N=g z?g${bVHpAR;=uz&d;bWQ$|ZrWTz|R#6Rf*t_qTHA+`8lXf%tzbcmEm8hj7kI@A|-( z9Dm76pKMX0q3b;+^X(;8y-sGIK|v%^9qq#H-`w{8_kaWf1aD3INv|Hck&>ePFJ78P zr2)&d6Y*iNi5|6Fz@?D;vm;sEpWvOX_5jQdnckp~{-1T;Q2f^OMvQBWi|Y+$)N9%4 zA~7xSQo}b7!^lHu%p?<3WWwp>0o0t-kZzE+4G5lTh6?)0mYnEgzo_rbW1h%ear0q`a%R3TZ+Pm&ojTErKP2T zWM!l9h_l@7$D_(U?gtvj3Ny!dXcDV$czxX4{z`q4c1$?fb*=DpCnGuA=l+GX?m)sd;=+SQ_b z^-IccX9cSmATgtqKRMXzjReSg5J6?!Zfa7QCxF7DUDwR^-{N+)uu@*p10yT|3^0NS z2di6G$c>XFCW7>kJMQi;tNOcy%YHpHhb)TK`7Z_CE2I(kPe&hpSzKXuomV|Hcl|qB zMLsO7>j&otzL(~=LYkQVPLJeZlM8U0r&Iq(x4Z)WMnOL3Mp|9AfF}s&Wp%m8OB#wK zqLQlo8pC^Vyn19%#>dbR#&lDLH1i)rKa`6oyAqY)a@wBkWN5{Xf;=FFzGCtiqKYgf zrXh~h>7$eC(twQk#6+zJ#flo2F?{EIcg-K7aQJ>>tqfOMvt=dXHRH{Qw3$=B#v;T` zQHIVhi|D_14aEFhu?g2adbJRZ=yY`B)d~|IaJ~_HN@g`} ziYg>5zD7?KWN9t7S`l=6>|wjiCgxU`POaO}Kpnn30Y7JWMc&l=y6EaW?S?o1$|7)^ z*(LZ+rb;}ZK0i&ak?!I>8!M3Ub1Ce{8mZ6ymdMYe6k=b>DEVq%l&kgIXdN;6 z3~ANC(!XU}jg7^2WiE37Ph(84( z;p7TNnz&Ss&phEkW=sxJxr(7Tk{Nxe1$z`-V)YUgd`f1Ujb?C|NDZT{`I&t{CgZ*? zthJogtPy#9fz~=Nw9g)ZVvcxc_g}3N{8y`?%*@|}|JJH-Uu(#YgvcnLfM>y8c0Y80 zmfv!ugj{RP9Xa~3{mn&O>Q{7nz+EObeW7Xvk&tZ1$Sd+x$piM6vnYc{c2M*HTnSnbC4eI6jUFgX>;l zrFc*+#YP!eK^gR*4F#2B@+fOsCfuW|P0hjdscoz0(|sXw(*oEjFUm)>i_d2^WS4)5 zwln-*4Dvqb!_>r*SzsccdMOGYmo&uEgvBV7(yho0Hc-+x3bDVkQ~FsPdv^&8Oj8u( zv8o4g<<-l?ng)G@^+tl_;>ZY$P}RZMIEc6=N3BaSyHBdu;v!4R{_xtC#{MHIZeuoG zUqCyv`#c)u^!WLJ&7O7>0gMny(-!0Dn?zOQ0r65x%cEenu+y-Pqv5!2uqy+VRpXwv zXRf|0*KNpF_NoKYXO!gV_q%Lz5|&$vc&;U<8_+;mx=n`GPTwkbOauk-H$VNJ+;;?s zGN^yhX3zb$JR;y{iOuh$FVA-|)Cmcv+Wt0GsGjMykmr1@&L54uRgTfcUS2CjfXz;Z zT12v#xRonOCT5v2s1jHH#7I_dtR!HZ7kn4xR=MiDIUodda`ry{S|&@nlZl6}sT6a) z7x1GvrG*I+seC605yjWDj^;B>__f=RM7Mk8@kNPk)s^4~c}ht$jVQ@qy#JY!fQ=xA zXNms%k`yAn z!xw2*W%{WAXofSwJfB~PAQ?%@s_r*?cZd8}b7v1C=(2j3(j@2|HEA!L`I?N=$G-zM z6T`X6Bt)dL!?u@>X-&Z!BmA2C@lJABH;xk8dn}T2scaf2r>%7lnEr`9;e!>X?2 z-}`Ai5&@amcT%LT7=MXCED{J-aeq%6E0Bf=N?dX5MODMyGCadEqL~tXp~fZBN^>zb zRCKu}gV?0L-S!$V!SMT%tnvRlU8MA++ibktUeWHzpLI%E#XSxqmuTE_StNj&_dpa* z0bnhkd;_8jD)0gYV$b+YN%neO_foz+q=V1^gs<_syM#R?p>vV|7)x`+9h%P737|_C zPRv!#jA|!#bEPIR>WdBSs!OHkn+R^BrZ2UK^A6;dj{cnLGRPNTKp%)^-4T|It2%(L z7Bu8H_FC-WjD4qrN!b}T5K&wZ5qTci!&D9d!q&?0mc znIUO77gO~MsR@|e(6jUT-;3-=yQi!oy*xe%aG}-dOvCpPOH2IeETD`=;pJ3Tn$1T` z7=`os!tj;|`7-`~in`H`M>(lFpm-^>6hJZc(su8v#vx^Jteip4l!|k$X+2wmR0b8QdQ5erq5hL+9 zmlXIfFO1YfC>hGqr11!JB{^%qTsCJ}dc!QT?y?TqK{=Lvk92V#`5B{dX8FhrDt){n z@87N;Pd`DF8pHVD;02e9VuJWYtDYldX<0qaCP!iQ44TuwXrYjR&x{J7KOKlLP)Gws z`9M;A-fm3WpsG9C2d5J$`aj*y&I2pEs%^$?fG#=p;u~sv*?Un%7K0EA72%81F?s5d zHO{L#TnSEUbc8q(C8@fEOYI}~ayX}6)B>0?d zUc(}CCiINs2|JMkUbtXp1AV+XW1;6Y`+-(qmi*3R75UTmU`(*aTbe9oalW3maMCet8CBiOIY zmj#$$z*NahCm>Mgcq*7k>Sjn2A&Pqhnl-DEl8ya+dXw0En2EyGZ)4RE^@6S=RZDWZ zXeNs`s6vgj*vkF>s>MLmGDFXOgi|~Pktv%}C$WET=Rf`@{qQRJWWNwW5p(1#IpU&! zl|O!Kqn&~n`r@u3$%Doru1=Dac>Sb4Hegv+4se&5l==)g(ZArOU;N7A_`L6|v2`QQ z_O;k$Y|87EHjQm z-LcKyL6y_O)fUfNY|p=;Cv#cshI1)%IE z|5+hI8;DF}%MFh)H?#2m8-2q<$)F9;t}ewquSP&>n5vBN!!i+?%<|5yd@hh9?_%pS zx{;(awZwawEW_WjL$xNS-+@wIBSsOY0bdle8_5ck1v{l|Pq4--+;$clAZ|WBb^cRa z*V}Om9WF+w#l4Jyz+oziH2#zk-XA(qX4DaJ&A*L3{;;K2I8E4D_CVZW?d8z&ue7<> zR6R-Gv$0~+P%a>q+a+_=evzJlCacS%(QCZdI>9dj1c{f{Zd`A`kB|LQx_(!s0e|aB z0~JBR=Hq;Xg+%PO5j5Km{<0v08Y{jwp_`?E`ad&2d3L~53PNa8N-Nrm80%ylA(dv` zxOcIW45K%@8EjHNUTSec^E^-tS72dE&*_%X_I>7$z}khfMDL^B$zmFL6At-Kyf)s% z98p#&LEI<|2C|#msP1dDyMgOx1_5$2#BFNprKAr|D0)5kd#X$U%2}Z1T z5t<$;k`bDHi&7d&9oNH}F7Q78xJ%a#izCgnw;wZV3Pud%*Ai8eHa8dGJ9%%}74dvJ zIh(F+OlB5gFt#Fhb%jm;QE~eE2~2eDsr%os-TnW@tsdUXkrJOP;uzj zz+!ySI;xBD@Oatx#5th#7!bZNI6{6xE3%bX@hEC4Pg-@gb9stOR^K2%S^g)= z!m55Ii@{e$c3t#gI~8VGo^CLz_wx=vigB>-i+=41i`I zvpsuhG9bV1^3K%q zD}N$3B(b8V3%D>VRFJ<}a7CW+VWbQi1;0BQ3Eyf-F0?t(!DuKTaZ9Gvn9RC*lK>S@ zP+yC`fSyi8G?o(Ar!BcueAUB-c!KlUm7jrrY6$F9jiWkQXyP*iWnF9EzL(++xKg zPA2MI+c2n6=~PYg*J=AQEtscoejwG0^YGd0*Td6J*0eeY8}}oEoFswF|8O<&KU^KE z-s8Of| zH{53?HTzV#@BDY+s`^K(gv@VTK7C4qQnBarKoea2{#h7Gq>j z2)du`K*UH1F=4$<7YmlGlb`Ja(NFrYi|QqEmcpXJu9vRb3=h7nC^1-g<)p@-xk)xM z;dCI!B#kh#4-Dl?;h;stYz_2B0G+6lHXyxaWI>%gYee!yg)&vvnT5%Qwtm1?@z^Oo zF|W>!e91V6hKga`wX3;B=?{eh+2jxF97+&MG-bO-rW13Dhe-dVE4<)^;8Yv^ih&rr zY^eo%1=Zb;4JwV~n_D9ISY5_}5tfO^{Qz^I{3_1kZCt8t{=v;yFE1Xk9cARuYA{xK zaxi2wUKZQ4Qo{k9J$%)sD4{&yeq2aYKc&TSv;esI>_V}^sJ=b5$i8s^h<20C4- zIfwf|4s$)8yVugs$bVFHhPGg?o623mh= zYM(#ZPED5y;;bNPL8`E510f33ps-;TmNek*Zz=h)BK?_u=Iq6+*iDZWw}F()MquLZ zeWa5C&CWi!lLS}+NA->nNsZejbWe~Y%yt*VrDOw&HxUQT!X6kt`HW44i=@WO44GBa zswY#H<*c-1f3>UA+!L3Jo`GzT?>1(xms$N{q^^{|Pc;3MKsh~?8%lw*@EdJ>X(P); z)I&M31@V4k6O)Qif2M9&m~(Aguje)=tJ7!xmMn z`Mp}e9R&(#h)9p1iUS`1ADO3JvDp&iPpC;zM3ho7ypsg^HtcThP-ty%9PV}`qG_My zc9ILWUp}U#e17qiF0JTgml<@{{C-xsn@DH+qand&7gnNM{Ka2-z~oKViN4QJZZOi& z>A1-PUAOB!Mdod`V_9knA*?`K)H%^l>Jf^A`ch1t`qG&$KAy`FZS}k?ICxzMAQ!>b z9|7eWK)&?d4tu4d46^-k)R^$^=*2zujK^U2RZ3^3%DDq1Gnu8rvt!MZfm-H4s-vhf zn%cTERqpzNfp5O6gir0izI%Pp%Gq+9B`$=}-)51kJZ1X#u+e#F|0|=|cgJu*YSL5J>JVN07e(DC{{|55A$pM+AvN`$!Dq zDAS;sMfJlGVY-&d$>@Vi`W5@`3rCs=G97lg@wy&vxxE$?c;NO zgJy**TE0&lgX!rJAYeBd^fO~V6p0ha*Kh}I`%)9ZE#PcD&d8W?Mg6Mt>=Ze+^q3Sbrv8D@MJ_1 z%75zA1IkB+^Jn7g;CPZgK~>6iM9fQRCm=}(p(KsGJ*TA4Wth}*+V=*>3sFEkn~!dU z2X~&UE&FLg6MLS8BO+E~gp1KCgb*0hbiXxtmgrDyFg{)GsyzQt!m;(JneubA+uZ}M z>a}%T#9_Ci@Ldi{Y~zW_|Nr*2K`3!A7BXz$Ous}kp8ih>QqaZ90Te3uE2%vq#2Q;I zKq%<5xD@E#?Ub(6-?pkj5x@TpU$Jr;;@h5)H(Ys5$z1-DR=9powIrAEkA41G5$@k! zfyN;ysk_^~A`m1g2@oK=P%k;gTZcRm%{2JYv@y8zI>?7>`Kry%Cs9XDX?FQ*iGX%$YjGyh zvD@)N2(l`26$#r!2Ie#V1`V#A!eMkNMZPvyIX&m!=Kay))H1Zqg&*^Ku7dTgj{m7X z5HhCNAbDks-9Z8CQPV^Qmjxh8DIgW~_zoxuKv1&w!{ay~tIr?@Afq)h`3$%*?fl~g zcHL%w*NOAV^jb`(Z<=AXQL>QK`+Raj@b4FLvC+EOXDJ1d@)=gq&`Wq|6ai0n(AwU) zTU#;A@WoFD_**h$pwnhYY{LZ`r(6P0=_sERp`{;5rRS$;d@Ap)SNxQ9!fs!2rfftX zw=_(^4_ItR4=D5!R8`pu2B}g!u8$`)JjVz;A5pH*UrtvN0wXJ+ zcfGn{C6gCeJ!bQBk9F*QYRM+zG^$xHmG6Ky5lK}v3Z~8fD(hbj8j!n7sV@LuK%l=! zQl!u**ci$DYU)z%Q0!5vw3#Vr9LPVzQ%D8Tk5Hq z#?IaYTqZ*GA?50JWr3PVZxShd=05@7KSpUGdl4gQ6%Q;jp|oDK9{$87j4HpF`xXgNS5TLe4SCw>t!Yg)wFw?q zXZ{>y8<{O&RDvgSvP^4>)N?%Oj7lOyzbWoACy*qtX~T0AuW>zwgjN#NE*Lyif2-uR z5{u>0;zOr-?4r|jcu>DXdFwUS22^jg34j*%{btjCO*^^xRZvfx!J+M-K72ay%Stwa zCWsMdsWl*%Nn?SoO1`+!obyNwulCow_?Kb|vh$qyuO?ntK^kBNGSMvuet97?)5ZmQ$TyOu|hSL7LR%Xb%q#1}!b9=xv^n_6ln3 zkp9#~go7PEZzyU7SmX=N~t9QmleudA!6)Gc1+?w_$;s z$219XOB}v#Ht=a3(rzNdnmT7$LN%+4m8T%y@j~*svwncT{+$3J zq67L}BB;Yo6c3l9yhgTAg_z=6s-4{K`nm|qqDlTjr_`_Q`-+H{zC}3Y)u+9ptj{kG zLBX$G8xjY{X5?36oMcK$N;np0En?)xpusbecWLR%3JLx2(0W6YaE5p-xpd1q=Oh4R=fO}*@J8nh1vRX+7hFpMlqMd|Yn{dcu2YhfxQOxv6^vao z-#WT8Cx`3~k3U6AAH|`zx3v-gT2~B(daaJ*%xrsk#i{R6i~!(kE>W1|mE<@}sD?eU z`V{0dPm%`)r!*!%UjhxUX2Vcaeg&pRecf1LPH_)I1H+v{$E{EEgo023EgLSkeJCv2 zQ!!MXdK4Qs)rLzbytUWrknKL zF2t-Gin>k4GeQKxCN4bcgATF2z1;D%U3{7=G*w5IKR%HC|GhaiW2@ycGm!%kp4I(Z$p+8d-IwWne>bhTl_D(BJ|HkWm9z<{Pt0az6Cuz1!2*0>m2F25iuc@ zgu_x*aVbE>0sW4&&En;M>;7`qVPwpx#|H9vVW9854|0)?Nkw4;SCw?aOq8OmCe^-Y zHDstWE`OHJel|gNp{RmAMrC*Jg-L?s0hSy<;)#EWGzi6)(dncHn%lFI4&16u4t2-ocDc-esS>N3Spn}7m1txfd?u6}*Lutx%HgJP@g^n~0OIxK z&PtxIYEj&$jeQ+-^T~PNQD-vED#weUx~Hg7et_5)3peAyD;rzoH`Vd0GUeJ?c$vn4 zB^j^Pw_C3>N8CpoE9f>v`p@$SIBV0uuygPPWIc7c)#cMqW;5)lFR9T{ul5(&Jb|%H?RLj<~pBczo+)b-{BUM533=h`*2y*yz;Q;9Ce# z2|%z^)JX0(eoHfIsbnE)}R!a{y1vB*_ot$ctWzjS9e;-Nlo32xB6S8JNv z*+2N^!Tg=wYnF$6EeWlVHykwf@8oGb`;Mwi&$g9C*n6P5gt>Q#A36H!#MS@6=U{+8o zlI956?%0Q++%jCw%*|&dQodrAguWO4@LqJr7|2Me>mWy{Dt=?YAVG>1&-hT{Sxc`h^-L#zSdQg0-UmKKRChLbuETx zMn5GeYLb3*W}9a}=6z)m6*~Wzxa>n3&a=x=Nj9f?y-EqN+60)~FEdN3U%Ol;h%F}F zPv@!OYDNmQQKu)~FkSWD`h2d0dhDXnbUfJo$O5D|eL744x*pdk8BO=c8dM^ut8)uA zaKM;2n{7B1n%j^H5z%R2ht~5f`vG8y&6YjnuvQ7xb@UthnR;>D+(PFxOaM|$u~e{#w0txAl)ev&1vvDxuq-8 zYK7}l$2r-#H9exf<+5%r{$KBUR+_I7w;FCE%Vk|6f}Kxjod!%Gs_tX3`{?fr*f*cN zsIYY)BK+xDSwrVFJ<)S>3h8b#)gK>TUT+IIA+jYfToo5CT;EGiueLfi##PnS_6rC; zDHRp*fauq z6(tw?saNgb4yd4vR>MDp<-y|kOE6k~J{WQr;gm###}#-9OYbrH&`awIZ9XSa=Ne|MktX@%`gWdsN zwrthWe=^cz+Gq!Qr>`zsh8T@Uk3_>z(2C|uqm4q;L1E<`sgX*226Zy{j0E5UQpiQa zo%`8V-u*2(B-wH6`uFVwl2gKyRewLr<$ie$@-{gKqW}S@ZJjZR=ofAjkv(jiag@^W zGifUMRqtFL83^W>oXgQ?Ffw;U8Hj#eb2Dbq*l11687+9q&WXEdZJOY#u*g6|yQ&v%Z_q`Pw#=4~^TiM4hT%l{-wqeyTH!?8IL~Pn55{HKyv8ceBPL=` z543rXsW4IqEMD1^ore7OQ+-$$^o8yaFUxOO3UW# zR9j(#w?YI{p{_j9wKww-n^)WtoR7M<0_QdHq7!+;sRo-Ph9|8f{D?kyqsnWeIpXYv zGY1GyR=4YN1xZk(x1V>BPQSKR;597UZL#w-$j9e4;dvl`kw^NGK3N%GGJc=zyM(;? z>>Y#@w*nu+29ESYwIu1k0FZ%V0#PN4l5|_GO}J{^29w^K&;WZrPG?66evtGoSH2MJ zciqHRX?Xg-^_?VCX+Riex^772S)!8=UOtJ}eSP2h>AfQEeSVi`IERM?8as5@t@-;_ zvunprm@r0(W#-|5Ej%S&ro0!S_dz^AKOYcH?5^?d>ig`f%mL6A<^fP*#668BB_ssy zd~WRoD^m|GE~0incU`|WJ>vA-;*?faZhpL1X|>$s{C&-NnNR5!PD*^5Xwrie&jR_S zu5`fepd7XLF)N9!4dUM6h-a;1(yKo(<{{I&P`;CPJ{(yL5rd&3kWsqFT3I94GQg@4 zR#HDr{P;O&$%uRxh$RqTw0+4Sh#sKNk21~~xoFBeh#`qirLbS8 z*&Pn}xZ>*5HdFko8qm8&j`w!8sxPCGTf|zA(%rT?T>{G^(7giL;*M6o$C7EYY_EzB zy)q-}P>5803umC$8WSssY|wSHHw2KXJ%zZX5ivbwwm*KX&x4CURrI2K=Z;4~Zuyj6 z>F`03OhoRJ)I%svW;AfgtJU-h#$`lJ_kw@VR%m+EREYN-i27^u_v^|EqqwQdt?~xa zN#g5Pg#mcpv!SaNYyLL%2$m^+F~j5?`FN{Amh^yfZZ(r`9Ge`SjyI_(KpG5ID!X)& zug)r}$)&j*e;kF>$=b#Y^%x6nRE>8=hp}$2AeP9ar*0iRszKE+9NT&_7OG9(xoiP; zBo%E6txUdX^u{I>s-B6}G@ovT2LeOuB{|Rj?;~72X-?|)3IYL|4C7+*%Ug@ygc!5U z?eD#a8fX-r(OI&*^J)-@P!_k37ngiDQp|atzA&_+^3g?2lDglfI^EF5aSt-ezjX@G zu?<7pe~BxcQ&!1f1fz;bbb_ECxDl)6c$92G*60S0$eHrfc@_$eVWecubl7=D%U?1B zBkMhAxPM>F>_q_TCP>8u0uXdpIz1rigBG3`PI|2NKnf#=UhCDQ9d`Kl>UM9e!~In! z@C@wL?P}P;vDK*Q0Q}Hua6!2YT)@z3fS*>sZZ5H!TDKlV5cL&YskGbafCu-Ol=}Vx zV$Z)a0RR!=_t*`_u)9B!DHnb4?0NQ-r$i-0&=927)YcZZw*JZcSSAOS#VGuEBF6WI z^yy9W`(!$c>m}yz3&Pv;jPKVyB^})`-`75$qQk-n?-L`-uU`gkZmG!%Wy&vSYCVz@ z@hLsNuPMHOyE})E@tTkE?)0*Ee?MWlldC4eHo?$_sIyuq7B67;96<>i2Vj#*IwSn0 z{H7;`_y@~{mEV&W0}CQD;&Jy%v>v9-5KG122x_oj3C9f!;E$JOSYv^+wK^0&9SK`^60 zXDVik3XGFD{E{)b{ME-}9$LvCoJ^iY=-g$tD{L6pp-S4mva3k3E1pG8`^ur&d@! z<~*nLL~^U*TLYDT$Vy6u%m7h#a=`bNdBrHid%UU)xp8h^0&ToT#lDqJhn>flDtC|z zxe$vrl|+5A_+=kcgRk=2SweWjFdjs)+8HyCg-)!p6H|OkV-z#~c&i8}BEykrGn+)2 zAkvT22vi;KA1Ltt2MVs{%7ZJyUP$qdK<0B}Ut&ZF+-^P|6V+>UV9!q*%a#wL&kMT$ ziiVGCmr>Ux7_imUI?UpJk6g3K&|l2!q)@A=b((|y4!!TPG4$N2zx`d2fVy`=1BhJo zA;o>~D0~Ga_;TJikL48=>j5L5@6WgYRT1T)-He?Na%5y+nySv{ZBMuTD7MmhBn7E; z5AV-&y^-;8XfkA078bt;kx@~-*KxI95wGGBg$Qlh(dR2Q`xrehU_XV%uSzWW5M#v+ zW*(?>`6@+aL@dS=Orxh@SSkT7g8`5sM^Jsf4}!Bb?olkTOzW61?cz!bjuPMpst#c2DQjSo102nhh9_t!|BI9@j0LshJGJVAf_w=m$jgXWhJKyZ-}#==!W`Hc z1tlLxO6gLXPW^Rz{vWZ}$LWI<9*O}Q-Z*FBNtsWPzxx2WKUBUh7zFVJPuT*FKFi<2 zMt7eky5CC=TivKDAJ&*m`V6c34M{xw#7hA2`$O`>9-r$WGTO>&LQxWjKY&!NFi&$6Pykf5|TqndbiM zm*$`%*1A9N+%_c_Kd;o^t?p$^scXCci%?Y{#h(jayu(4aj{(vTSU>sT?DrkWs+q*WzTY%WQ(Pc_^1HqDx?NmT$9Ks zf$OM?P9dlNUG@jwhfI9lx%BtRFL*--!SLll6iSuDg?z_|ij&J0!L}pOfjm@F2@!1Z z9}lFCp%8~7^9rh|xQ)NNC7u&kS=u5u&t?aU<+Cr6>tzXXRJr+Qcqo#Qjm;`o2&GC8 z5gzb<-oiaWF{yZB6VSKR04t&03|*xIUI~`14=+6o%)QO8*dit z&pnFtVdO|4E@k(J$mH~I20)tC-l zsN-aHU_urdnh|SVXx}ueJgN~C%~ptz(v93|8OX>REF=F}Vw#9ZfzBAJAIB zOf$Xq5NqY!`xeQqUAHS$U)>CFjUn88#mdS#l7NzpDI$T;*L1IW6tu=BN~*O_;1WRfse`q|RxVu;>M zFn0lE+d(^$%|3J?6tYoDQ82d`@uoWHd)CG4^=3WM(s^IrhtUZ#S*-nP#~Xv5?oO|E z8sh8AJP4y`)@bFrk9rv5PV3-e!~-&+0?ySLX`=h&rGMwFwGsck`vZ_- zTXV<9FUWx-{TegO8oHlwfCcw%K95KmTx}6o&t0`V_gT+b*CB5{Rq?Go)!%Oee`q!A znbI1Lp){NPBM_^p@S595G~1wRjYvOK8j{fq{qGOV34F7IDlR1O{OT&E&&vP-F$oEX z?@OrfNoa5k!^3&c*Eze_i`^{JdqvM1jXEtlDH&N_bu~Qc3l1h`E)<%u3ZRrG?tF@E zXRzbC8>UDRke-eWi+~Uqo131Vesde+i`(;YNI$o{98%+bX(>(Hsf`;;+!5UNt9?b|2t^CFUm+TOlBV*fw~_tLl8(fzOBO+J5LKG`D6y?N z$f9bWAtv~CfOCNmL%-iQId7sy#pE{$kRRlY-xR-sD|wF#eoUf1FbdN3t@h9z@Q$=m zCBCl*uiDt$j6%5@;_mCL8Uf}Sv+?>nE}@qDWp^U{EZ~$ove2y|Ml-jYd64E8M5~tv z6}cCG++?kumBJfEoEVx(?mgf#iM8^vj85c8BagRpdLdIJ8AMDtC%goYVq|QgD;(Zp z+QCq9Ib;|tmMaA+9+TjnrsJN>@$)1*^5{vBUKf{2HTe_;weLmGy2tK2+atwsZDm z?vqaAq4IMDZL+7X^Lx`{58ZHw%sAdI%PSk5K?-l)f)IjD+N^dNblWkckyLK#moINhsA1CP@|rlK@#FU~-(CU1 ze-LNh*FZyiMPSVMiT`L2lc<-~n?ZH7hV6Pqou=@jk#8}9+<0Lg* zf#1K0e2!gxMi3%wecv|-321nq>SFTR+Bi;1XQrlhJ9a*8dUtvris*@GXd=EubuYSa z`e9Da&emzQbabNReC`qw8-*8Bv%Q}*GP&IyR!mm!?&{6Fk(?>=_kgV8Pp7}-IfnViM`OS^(Iv2b8(671UXsMFG%bO(~s zur#c%X3@SA>-}g!v%X3qhL6hvJolB&dmndRS5;n#KF&Q z4rRR*t9m;3epCO(TSK@NrX5)FcUAW~u*J zu-3DsSQ;xaQbd;9SK!V!mNIGgwi7*d<)XElA?%`w_(aVjpq)9<0Za<&m-eJ}zVUX} zWq@jYv?+HFcH{KmB(*4cN=s!5dS%;+eKQdpApAyHl5TaIxzeC2a#YUCqx-})ns5ExV`vTzHKoGJd5x2`SKU@ag#~K zjQ`b^-F+sEiPnU0JzY~q*Nu1(Pr=J72T@x@g&RyL>rkm`%AaOu+<{~WxAAwVLXr$Q zrGSa;CK>(S4Zyr0R{4S?NVCu$WPB%S%0!u9(KS<*hW!{rIItzjw9)b$A55ETF!oN! z3L_m>M4RWz@l3@$!N3KpO+(F~R)~_DV(EmZuC4wcz&#;ig;_FePIPiVB|hh63&->Z zG`urOF#SL$w6f3elN^=GUnp2|`*FXlUyE%rHl_4-@bt#snD+IP5`CjPTMd=GfRg@$ zH((~41l#96>eTxeZK^hArlyE!QM#ix|IvFF5HoZ_7t)k#e$c$logmRh^ea&jC>ZgM zXaPKZv05!wgw8qRK+_eH_x0JmL^k2jDfrLhF3U>30^m!XBpZZzp$nzSaA9_%dF#}P zKLQoM>OXC+V?mCDIV{eCuf@hb5FR$+P!|#~>nau^Sv+sL&hO4R*WWG^M_u#Mdg4uT zS&0yj(j0O%rx1EP6Qtb!+~gOkhK}#uT+8)W$?3G&K2N z%+Sy@3Pd2@opCUizH&Ty(A9KjehA)in+8^z@gD?#j@Hth{UG?lt6{!J58;9R=_cR( z0HfcJook^!XH$oC9BDW8;?#Q@-=ip`EYGoqjWxJ(QdmP;4BK1W{OU5TBbs z0(l1{iA1t-QBwPiQk>VXr}v(}@1v8Gn^wN&=1>t45woXG;xb#}>3^^Pe%VGwNAJ<- zy+W(1s^08H(CyI2Ck`i?W(~j zsHR33jXwTn)hA}=|`+tQ2!+am=>6ZHIsd;|_YPX$bRc6;T0*_j_D{P1zKX4Od154Y- zXds|u%%qqgltA0U<6i33y%gcj)*LYIO^tQ*+ z7eyr<`GXJSuc!oUOqDNYT6U+kj?-w{*X76$h$cVdgWGFH!ReH3GW^v}P+}8}F z`}Nxgl0l9MlDxgcAmK+g2h5-zy_SM zeJ{EH6iL)tS4FI8ugzczFKuAevF<*}5Ch+)3bZ)to}o{{4v=d#G(~#adqmu zf$&--9>p2(HBJ>gg2#wjoV{?AVQBCUiq<9Cxwn6;CpW5%(6btY_ejXN6IDI4k-#&q z|2ic4!uwNw{`Ny9_ie-t z`-$=Zb&S8cnTd;$^et7T5oWqsqpLLDT}}+P?V3%7J`gXZK!X3%2#xfi8CX-_jKfaS z`}{6n8-f4|R8~+Bi0u8~!P9*cO#kxxHp{5HGP>5X6G_`AdUzlS25 z%j{9taqOrI(AnOs>?++#nE zB=lTP^B10MQ;Dli%_0$n!n@6)S{f9wJ!~?%wC=x-;t=lD75FuE@Be7VzyTaio87Br zBos4C5q$2R7(C|4%!RtDfvMY&@giJno4Z3|JpNK7u6Faz zp;U)fv8!f6W~Jk3kZpQxymhEkq(XGK#w1h4Wgw;cw}5i##(r?2LP0m0DED1y3g(!D zo`x$Qke>#$GoGdPm5)R%Pr?Prj0|kd@`svsu4IQBZqtErR^EPh1>>ME*%Xkl{;8 zq3FutAEu)s)bU=8DQm>fq@xruG0@M~WdI|MSqa1_t|786hbNfk6VkzOxW4PN+W7F) z1EN~K(#eVHiT%)1*I#dL9*h8lR!q1FQj8jHMe zZN)`pOTmh7(Cqrs1;)tOLYA=<^AoTnTB~l=LrFNdnk*)LJrGr1T#jmHv24$)-CNRp zkXE}V7-3gLlcPC1{lbO~El%P>Z=#Cy*k#F((_i-dh8k<|h~?b11Alxs%_9a}KOdOm z^t-WD-?_cz_m$4`p3w~h*Tv<9gQs2FL`dQIXi^9;k89x2!|qdc0&@i>Yny_da^PA0 zO=w||b7CofPfcp)BNnwV5P%YsUL3{lLER`^fj6UtIyYER2kyWyHDg$VFtVPOgK z{rl`2s#rF-(*4wAtsaYDs`q)ORt5~EzyMv$`|w!fn?;Sz^SG$Q?s~P^{HwjA<2E7Z z1Jt4^of-$M!{=pyAOO+7`(=oJuP+ed<=FSj6cr6^*D>cES4G9+ILq~BS<7~JZz$rW z7lIeD;eMl}xKZVjDz&c5_44I8#iaQ&vnV!Kbb_ZWlLm1gp8krfg$5)}I5U%QFre!4 z4(b3;3jYCNLtoElQBAfT_%T!kvq>g@V=H<-A9T@TqAk5!W4irpFarf-l$Bs$zwKwM zse0c@p`#X85fv1r1e)yGEvt!RtNng6Ts!qoS$r5de&TXP5)hM{rI1GLq6YIb==TRuIg8?fIJD|4MgX!kK|xmTY&10UEeX0aP( zOPfS!<)c*DY+Nw&Tq^T#OT&?4A@f{Hfakd`Mcp2$Gx@Up4@hm!Wm4=RT@SO^RTHBW zRcz!Fbk1!$+2_D7t?+o2?UrjYXWw~eyKro>VfvCNw~>O$yK$}k9)E@`2P?SzrC|NTYKkl#Pn~+X`pr~%qv5me_sEwM#Ha>co z-%%fgKzphC0yzL+1+R68hUN58Q@Cq}HoMN5&3;^-JUUr5Tz5X0qx$7h0(nxMpYf5TvKW2kmwHrnjS6;Jqi-1!Q3zeU<$Zf)Se zVPFitF;mZOvu4WqX9J0hAtx3=<`vp(>t3l1Z}X<9BJMQsvt&hDEZqhh=qz26p? zi%UJ`FdL%Ca@%<*=++dR%^GO?Gt?+h5Jnh&Ts7o5_DUiUm~mwLJ2@ZRXH_!?nw%Kx zDkodvdLWw3AVCK5Gk!wI74MfZV;S%dum3aXVEupopP0ql;Qv$10ubz~bsJ21A41ss zti>S|MbwK1)NEoe5}vdl_(QAVC3k52PQb59!)w;SxQ&?5X=*P6VQ2|oHTr*g!T{uZ zY^LE&2r2H;fw%Lv+(HTN`yl2U^za~77*9v2rT0w6kk{XzI5BwXI#-+xK*eZ}~AvifBL5RC?K)T|#n6FlajU_x+|n#>;z&JZoV ztT2O*8y!knMTIWR=5m?b{#8)TfVD;>JADM_lnRY!D7$*dba0+DI;BXcg!8d@CH{_% zd@;kTJ#-h2!Gx77E&GRMh9G^VwsX&aWWUI{-f7p{qxS8`ifVOVl10$Cc0i1&7kh38 zLUD?HNeT`}6us`j!-p$pWNeCvtQm>7ZI^2TDsrjHUF-o#P8WTK50K?LyM@z`xSTQ( z4Tsm>%f&o#W;NPobCls$V)RHnU)V+AEMR$%H^Lgul1_e4&c?*7iLu*l{=Ibrw8$Q7 za$hnAOae`l+b7f0;6;lWFLmK@7eu5vNnSN}&^`NpD3&yZGh~Y0Q+j|V?X7Q-Ni++;)G>*2 zbgMSzoH@KEs)n``CgBNQ5tWISeoX$9+dnxHj2UCTd8IBtBVaHotaC|{I~#oyLGOL8+tvFMGZUuu z$O8vC3hexbzd1F6Vu2U3iI{~kl^(uBM|YH2GAxP>!*<_h9FCMqM_p4(ti1?(#w3J5 zkH{OWf+TT}vKY>D3q4BUnlsj28HbTWzsBo!$N-unS3=1yoGh%$>lt_MCdN|w`kV{7 zKb1bYW?DwrN7io7lbsLZnv;QE%8yh9KE@qwi39q;e)Blk()0M5e}ot} z+vvKzu@k;bIpBbls>FLSe@NsU(?m@_OGnT>9CgTJ7ZfkNY9R2=@H8LMyPBisw>BrJ zIQMJ^{CVQlyCZv&TBPJf2`H&E zvSzwdK4R<%r=ua#8Cm`d#>Z?R|2=@4q`gGdO!{x0BbNBexP7CQ?+C~470wgae=P^% zDh=q1kG=tDVHY;lvMmEBCJE`;Ci`$x1H5hBcWbN(TYrRy~!;$4;3b)_-SH3jHu zdQ*<5<=@ru<;qWH)%PjIW|PYnqz!_n@3zC-H~{+o6nMZU)lpSX~~$o5}3U#B_x z44CqYih^jNqlYdXWzchri>TN*IJW>fuYj*DGnN3vkofp`yN45nH#R|hVqX$!F}=6> zl-ShPI8<5Pz4+#ml9IW_#h@79kA0xJucwwCxG2%Uowur;{2n=J=|2#BFF?@H&^NC$ zzS-H}??)N7dt0tMLxwRtAr#qef+w3{9z5Nkq&Whva~jNEL=1@1BZU`*pOFz zlD9;bN)tBfF^rrh97LmhFnLbAnoySLV&Ov8({xR${n$LX#x@K7jQJo;$gjd_<^6$I z(>O{vId0fv-_{*#I*M)eR%ner(CqmfNKI~3pwlyLK51}Py3!d!8d!7sOdc=aYv!$? zsvy||BOqp37^Wkf8>cUc?kVA_kEB;!>2iU{^Jhh4--3Kt(p| zhu0f4u6xU^lPYs{8pNOMx&6)~Wp#(rRLrmkX1ixk?_f zLYG(`rPkE#m63-{Xq%ZT;ugt>5NfoVYIE8h+W=kvTIljVY;w<78Xab1#{33ygw3|6g+~L?x7>%^v#(|K^U_&=* zzLy3Un&N{k2o?OqcN&B{>_tj+az-<`9frz129zsGw9#$(6AL767QQcxx3j1S@ zd!?|}-oAY)eg_e!H07)>{Uy*Z{JrDfSpcArA9DX-O`83qVNXHK4=FYup7C6tfaE_d z;dW!N`JnFJg0|1Vc<)AxII%PC-rgTRf(dLj6-;#D(Q`^#6u+5dSxvU6CFa7K&Q4}mq4(e_3sVo)TCk@Lg#yUZc2Ofg$Z)JBB-69ldLta_(98m$uWIYs@W6tU=77;Rmgvk>7PzW^Q zEdA*bU%j?*%Qi`w&i@_DboHtPhU}PTF z?Nbr=uIT%9eeI?_yag3X82r84&f!{eo%HiyXC}ND%Nar*g|4bj#J#-h?xdvh+f{oX z(8b!}D@w#Gr+5BK1>&tRkTTjU3Ebk>Ln4c zjC~y+o3*fsW=nDU#(gIjyM7%?V8s%9OlA})_G~9)k+QZZ1qi!^6Mwn*%dAHAN!@|+0>oC}}pOZ+io!ef_f^l(h+ z;|$C)qqE2DeVv$8$wk|24xIaeP+kXn!8L=3t1yr8Gj!V2fiWlPUp4?1$p3%J0NCGT zDL>=~384s_=CU0wVK1b(Jwq7dnP6q-M!14oss=Dp*rDwqu#Ul!0Vq(j$cUy zRCohW6p`y{I+{=*l2|e1_b4Em9LO>F8_b~pz)Xmb35*P+@8pEa_cj+p`FqqANu*%L z=c!?I(kpS*?(@z0iVLLPXM%PQ^%G4chqdKMrtV zYT2r)_r+I}Ymxrhvg0Y`6!NM*hINzuFymz2YcD`l3n^=uCfBUls20b74rk<5ErFN& z0MB*TA`0R0OMOq>!^>7SE*+-~w$QMI(WXWdw}ZE6#g&crV!WRBdL%&SA-RU5KxViPEcaS34)T6sNpV9t zmZVv+aANWMF8K~F3{~nwcqz&AvP6vH~E;#AG#QV%`(U3>H)>Syr!y8*~exeHS1FV3v6ZF!_ClD(PwMsNGUZi&mB_KY&#P7*<16--I`}Tt{$`t>sYAGX0Jr4r3mi|?>0lQba~lV zB9&H)Wsm&`;TD6A$9#I8L@J)N14$%#h>^wY$S;G|Ei|kSXqRM^e=wzvBqlD}pOxE9 zMx18iM&m{_A4M$i7%3Pf5C;&?2?f)mF)_Vqeu0GpZ=Ok4cF}T5Q_6{5PGS-YlzwNY zgIMNQ1kLc1tBt~il2Dl@TVL;=xXlire*Q7b*gmVzVCRTaUONpzz$nL8X|n)WK&QWu ztx0gTig>Jd7D(+FDO@!A;+P{h(B9;lt+DZd01;^_Z2a9}iYda3`oRQ!i3?_n)i6w4 z1gc#Fc_bMbhwBK`9xSRnoN;O3$SD4EzZPEpDioQ*%*-KD@)nM>)hb)WLc*Q-kvGNI zqj@GOSq{lkoG^`xcB261``QZLJc0pF+seo|>;FyKe_OhGT?|`TR!Ft#SlC9IR8(U? zu?~LhQv;ROmi-V;F<|ZOim(>jvy8KNREp0 z@$ubnf3G<>FyH8KM_623OrFI=(Ut@h!_h1#{RtstbHeL7>m{TtuUvLf+Q0qHphfy; z;)FowZ)H0cm_P&Pa(0p7z=+3w({{<|78#GeIjE#VHRe}yj+yPC7)~FWWdo@Qd&Wf} zgRY+dgsrE;RheKg)bFT=9pn6?o(=sSMKt0idbS%VRL~bd>F-j}dFl>6;i>dZkR^={RMRK+eu6KF2`-#MPVXC1#fAT z6dG3S)FB?NgxUANyy0kNwYhh#AHGBPb?3%>_*K$1dT`xaJJMZ1p@* zr3PM_b(n$L88@6(bbeLs@)CH3z8V!kv2Tm@y)yIes1HM&b#PL8NSsNXkK<(1S23Ol z_2-gN`7r>Qc&rk?YCHySAst$$fZ>IGIfucfM)&m)F2{7ZRaSRAp*mCUsO`bxp%}ej zr`aIZx;yQy#r5}WY>=d%c-MK$#?XBepn2}lfFc~8Om}!)XDFxxY-mEiluM!Z`dl94 zfa(&_pU=98U1`N(3RjVjKS@$a%4;WMGeluJxPD<#9h2@{FXcBRk!ML z@PW~zKf^Tl^++}$^)H_KkjVjjRm>%7!p634AEFm=9?V3*22XVnU7tt*m1{aWs6$Z& zKkejg)#q2c`||h6B0be}c#j!{nOf8QZO9V$p_wqy<7xy{#^Uap^wpv&2Q#P5&hL)* z2g2{?1y{5#YQN^{(B>Oa^b=|xs)hfm1UB~5Hi|+_;Gl&@HCZn#u%4TIGFL}D5DjE% z&AB^~`k%`+Dra{z{r!cHAmcs$)0f7FKe)q%Fm_W>L#mM|Su2@XBzw5FhW{r&0$B@` zfAYimC%=FlSl}-5K%bo=EyM}Q$9&+8EKOGucV;j3gOt*%!5mdliR_2~gh93FN6FYk z-2u|hbD=tjMo`cq{Q+J_&B(Ij2`4v65dP7RU{wY=tgv z2XAeeg;t|FQA0)Y46EU{VDuDoHQgW{{0@BCSMzjO4Pkg-P&u>bP0H$C`Bfr z<0ViL3kB(6hr?D-LGw3f%j1|#*rD<;0xK7GZ}!&e4vI8)7Av@MU43o}g0v_nFrYo} zUff``EE}BU+#!9;Q+GVbf2_EU#H|WgESx6gYnpsvCmrfq4q6z{Go;DKxIGw%2@urO zKuIANT=iJs5B-qEIPLnV)Z_GS^iSZ>O{v^gtQGxIaF}g{2NxD1$hu}J?hMZpN?mzx z@|a&o-*KuyT#HkyWDrbeiK@K6?4S-NXvUuvX$(ZSgi0Ss~n#`>8k5V;u9*Xi*w7)(S>6N)J`xFTX*>K&w{!|iY zkv&<7RYcHdAG2Qet9}kbv76|~HBQK8aFq=~P0d8oSxdp|*mgH5)|RCo?Dj6jQO#pSmePSjT_PkylVwXyn^y zb6#(W{WQ32X0*{K!#BGO!)I)2NWNK03j8{4!f+aun2=MmW2-cJ`}d5>xuEVep^%vm zU~01x^(MJ9N)|xh`JJD_rhdLE@S`rX(PnQq3i>K@eP=4`+E<#$g?mrZ;>mI$fQ%Gv z6812R3_(th5TF5`m<`p;pL4b=@ve=+KPH9QCWQkCw7n5D@gh$HmXubsnhSUu(A zm;3B4Rn1oAYLWbop4`$AB2{0p2}Lr8W%*Vuzety~!S~+J2CrLirj!8$?~ThgyVHeB zIPG0Y`h}gO+$-yb|2Ek^sf(Jr8gKvQ!vNR}C{@Y-m=X38!cnjK>I8;R`tSo8@K;6U z|L;^JEsBn#yo8Se2tfyZ{H9UI&Cn?wV>PWRM!n-vI$GKpn|~WqGzHue*TS$U7zQ;O zqvkPo_d@-;kP?U;NY4O@+RnjYmL1xE0F!Pz6;v|clr;|5@yPJ>FB-{9Zhu+t>aTmf zXQI{A?}U(U)18XDo)n>7|m6mDPm`ISJX zr;O+zRE}^l*^agx_uh;Bj&N?DET!5 z%DKG*hU}%b6-h4kDq4uI22m95_*<1F z3BS7@n}=3hBMzk6(sS=6_JZ2EFqeeM_pdLu%knGJe7(`UTIgYOZRhMO*>9;J@9LLj zyw>=6E~ed^+%rA}^F~z@$R*Kd+srv@6_m`B7ZYn7*g8w9OB(2T{Mf~kfN^Vd&(2kS zjSQ4r9y8>iRDWZ`d1a0CwCrRpIUB|Zm7#+;S&Vcr6A}z7yHy5c>j^LBh#YcgAii>Je>=;7>@6?)mHFRt(Nr%3l~e$Nt;-Y>cKOy;zDEQWZ%+ z1zC{PnBLT2xrgrN>ex4Q%<}C9Ue-y2Aj5FKzumsj2e5hK5x?UKt2yaiN1$Y0?QIRx z$5AyEsu^_s$XS+BgDUijlHs`lv_bLBGcG5O+@9IxK@KgSJ{NHYHDb#MJ z^^j8g*r`Poshv^qIWp-x8T_x}6@q9LR~43{efI}B0V^zR(;Sft#W>P+~7eK3MO{SK;m*oxr(%s0l{-?z4 z%JtAR#N`Bj^-z?P8F4Z+nNa5Ox+}fA;8Zq5pH7u@7BTfG>Gs&tR9osZi0HYkVp0e4s7E>&j(bF2maBi?;Uf+0l)QP`4P@nZ6G5<7O zi&Zy9n8y*npv9E}`}GC6loXizL&$)7S}xM>x-hEaWX#HXqo!OQMH08MfS(8LnXg~A zD|wcy5#HV#|48U8$`Ywo$taZKiaVEq_uw%maXJ|+v3fKhT=ake5gCIwbbmya_QXJ}zL+Oq!I|c`&G0&E z-yGXfj&Yc#-PPtY4@@bW;Xdi#MP<_D--f`Vss!{1jZD9?>nO|!JKgB^>FECJJpAt- zN@TcN+U@WC?Cyl#_V#~L`XKJnX%SA{vL9ksn&b|E9XxGy2{5ditB?5frP0(`_E1aj27Aam)T%69rtU^@QZ-P%ynhyZ@6D7>;rb6Sq;xq}Nz7r4#yh zhg?r7oX3Bzgcro#wnp^;cc}lmspl}t9w)pZYW^Kvb4`s*(XMLV7QZjJf{XBm^Yb9v zE;28t=*Vd)TBbRU4MS239jWT1I>xWL%xONlx0>G&KFf}UO~5ccdpsC~Pi3~ywTf9GfPI{VLtJvC?E);=se3q}M@r(v~2qKijVwaw5TR|6Q^XoAs z8FzT8R;4N|34Lv(HgrP$IzxtyU0~{CL}GSTU#%$a>T33tD#Q&(LClGveYbw^EyYm+ z{OGg(8r4zO(kj1z0`oGZqNmM=5f1rV0#3;~vP*-&nz3UmQvWBx2#2R|(dRlVU?1P2 z?ml(+uxSq(sC?I~7B7+7q$>(4rT zPTo8Z?A0;79-I4ae9j{NFZHp!&Fg2xLW5ry!lLf4Pn-U~TRs_&jv$OBefZ~v@u=j) zIsoN18LYt97bjl`W{*1dzn6r8WT=GyyCp3Bf4n8Ezjt8h1_`Zf4W72%1`E;OfQ7y^ z?tUfwI)%_;F|-yj7%yZu6_r;XL#6z83Mnwgk~jW~1S8`Awu2ds0hBi*)R$jkLIRTu zlff3@Xf`lC7Z;^_9**6u< z|5`c*L1L6`utbOjeciJkZ42uvcRna*&yUyoU_8B0`XvQqF-M2~&<*Jx3tGCO2|$T8 zU*X{752PfF$pUTg#tkARjg-+UH7fTq&Wm#%tr%8ngt%~BEfY9RJqMWeqpuO#l2igR zjSQ`MQVViQ2@+ivRV%r&?`YxaU;Gfd1Stfs*4Vy!`g^yBnwiYL5_<;6@VaV1>SF5P zVOK56J7dJOe+ zk)gymWwzrbXDdp@;Sh||h3Sv1*Ir@rpHheox%GqHDiKM>h2kkIyvFJTe$bqL?#b@{ zJ`@9yy-Xsu6lb<8a0r8&+fcORODMzjOFa%gj9%5!$NdH0uD$izXWj}?~KhS zp!stzq)uAZXgt%Ef4&U|mAnq8fqZC@jqMLmEdovxhV26{c#)TlJ#D=r!BO;9g(-UpXB*)>KqJah8&l9>7d~ z#m&-}D!P{x?XQh@Q_pTNz)C&0?ef8zzMAU}+mQJA(_)mEIaCu9%jJ`p&h;o6+x!IX zX)Eb^XIzx&P>Tdg%hERfe4fpmSjz2jt_4Y38|l>lC4S)l3*-CiEx3w;KT(iM!Duhp z_>uO)0&m#j>W`%uf38PK`K2rNqecul9`p;EG@Bwp{8L=`e~OEDj*((n$;65-YWQQ1 z-eFOH#qs*>JOk#htVuEd`aj!fG|-CRUTmNWD8g9Yq~@H_d)mm6ytjcelteQ# zRr=YL>OKE)XWBwIvg?24B?;XEr=SHbBdc#0(JBJVvxMfF zEKMTJzb#U+ork=!@Ls60r)vr{M`5b+6!gE_lzyJU$wo=vVBU9oHGX&+CHPxF*$}x& zjwUfpUabI7NoQS6J@oPyN!zL+$Z0&Aa*kCYb-EHQJ7kh(HSb9poLaEw&#LcLbN~-O zvxpO#>@PA!^qoX2V zihL}Jq$v6R>@uQ($_(*PW9ToM@Q021uO6ejWuW?=SuBSO2bx`kR*knz({sMThNxkv zi{bozXSvb#v%t#;YEzeXWvsAhe1w~LdRXcS6-|OCC%DQ>m*uFAezRYu9xkB%^2OLh ze4@By`gddM%Idw=snLY~E7Z@-U&WCp)9*e}Ev^M#z}N&2?rYm$kmagIyKMt=Rm&PB zNCNA(VSxY?cE{4NAEU~EvS3=^Ial*%jfKcY94hz_3E3Pg`cbj5*BKDq5#$;Tjq0IY z|4p@Ck4e#BH!+5rtplf)h?+y8S+@&P?nXh)kohGnlWWC1;z$JaRJa7jAHOR#rPfkM zia)Ry%i4}-!U0DGFkjY@vHqrbagbFre}PJz;{QT)Jgoo65dA+7h|>VGo~84q6;LNb z8PH{EtMwLR&gk90RQ>lSp+9tQxN_@vV`sUd{qrJI(9AskmFkX3|9)VI0T+Ufe-C5% z2Rs$&`{UUiP+l>R1?^C>xo*A)>ietD`fHghg2FKx1&E{>Z}z}O#yJ5n;?}P`!&AF< z^Ds!XpLuren!@xaPX7KaHBL@nciOYx8~p(u-P zN)>9|wP4iNL{J$sYb-JsAhFnE-X0DiD}a2aSw4sDi0$v%0mY#1Ed~dX%*k##Je0aq zj8@~3q~7^TlbYbGk&Q9g{?OUHk?0FuJ8iU93ZN>^$#F-F^KMdBCLPfarn%J{vP$$M zs5Ro~=d$PvwOFKvh@}2A^@F@MO5m`{5GO#`9nbcK%&+>GkVU{S@3J?Oj6~TYS0Yo; z{EI;)vP(2ARq|5Xs#PJpAvFED;8>0fPj(dgobreZ z4Cga<_6#3(1F|f(&o3veh71?M4DU4*PbH!-T23px0j7;XusBwnRg^e4PF$dyeE=%8 z1pIX6v}B6H{Qq({^CE>GkBzGrx+BUoHR1y5@$s11v6$przm2lGl@>Fm54Fi<@btc$ zO>&2JpM=voFYRe)5nXlf{s@{n7(7F%?aSebIzpHhC0|tug_jg1|F*5@V#OL7<3$i` z{PDE#Ane7xm*3WPQikh`%qDgxG&9ayx_z*%W$<55t@?_xfW1g**8vV$bQ1ui57 zVyV3<(yBUWXG8+BF4wu!G1(Wmjv zZ#T8p^A+bTwULWqNyh5i8qGgwI`ZPE`WFRi|AQuG3Q}jO?38s$QZ-0)q2KRuc#C|I zqch-|R5UwSEAg3fs0>ZLCU}ieGz!q)Rf!`EGEQljViz)3PU=RL*KaYJIg%ytiQk`M z>P%W*i@v0?5E^^wOf$(bh}J2qniVBvQdy&xCQ42o1ocAru;}!0{=OH|Qx+bFb&y^` z-}B+7`UV>Qxs0o9N5^b9OeJ$R9d8p8_@}Ki?B`(25iA-g`bR((j=0_Lijjzl(xGMK zJai3ds?wb7w?~5V@_Cb^X6WRdz5aG@k%l{CH}~5vuKfRN`g}?CUx?tcEb8o`DXP!5MED zS%6IAskWu%n+7m`qD9=!N%p+TIC*@%S0<7i$gx9W2>$sn-oF_iBzl%&eb|3UwHCqZYYGP;EgDtwD}v>V>BXj&UxBaF&&VOi0~k-v z-3iwgi=kz&;V2%vsi>5M2oZsmOssET@ezpO{)OVWLKaYeL-7dWe-U2@8mN#*+Iiij z7(nTReiex4(~cv946Q`J2Sv=6jK1OkTm9^r+0_vXibe`{N|+`fL#Kf{^Ahkb;JP9&XE%xNXF(|DCIqWCklIh+M2? zbwOyI^92z_wRs60)J96(?z9JRh1S#K0M!JTNl*sd{5Vq&;#UJYN43+VF)^KFvyn8!6wR!Ezb!N)Tui=hsG8>u z$%q6HD)WaHE^OGl`@2@ukn-hc;wwfyTvN#3urn)wkwU34G8r@>;MDFZADbi>mR|Gr znM;XEH3_zKyW)Pou?cEBS$uJ^s|(1k!RoR(7G1ML%4On(!h=k52w8bvQlL3>^Y`j1 z$6tF)fedQKhzsO2%jmr>hH6gK(x{RTO~+_KR<-N6IFSzc4wxbv)#1T*FfpNrqe)UO zB1NpHw<{Bb*EhoL^>QJx`F%pGjpI})8&RmP-uo+rnoyHuSA&Kap}juN2)Cv`RUpC= zUN3?Co8&OOv}iwbq68G3+29^8;O->$Y&c?f_B|%$zY+D0f<2!keB7vz7L!WtjEsF< z!4l?cqKFCj>4T-j149G(>wVIlqAQ6T^>-J$W~~-LDZWB@+$w5q04IBj{mL3SgvGE` zuPi%d?pa73|itjc$ zql6jKg8RKo`5A0xLUyah4!sJly5Gh~E8x@sxA)%#jDaato&07)5*IG^Not7ZD2vcw z*sDSrq<=})Ibbv~^WazUEPU}BEG>p-A{Jq;37Y+UG9Ghydl4nC?|-Nkm)mlgm|vLM z`Trvw?c*z@M|Q)k9)N5gAa^luV=2aa@p~&Z49M1Q5W{;azyQ?+Y?TK$M3)!{=iq0D zeg|+Bes^HkAmHjR&SaJ60!1WKY87O1bFv@O| z6)lXyG`GndWk{3d&2aKBAbC{xajL9CZ5LerxnAnqW~(Fhul=+BLg9Mi5dSNF|M-h7 z(50bJBes$01gNxY!9Wwviw$2gi+M@u8E4=`ztrpnGjK~x$gFZh9%ztz7VNDTnp%vV zTzSj)d#GeKIw{R~=Jn62?|gYn1Bd-R8Z0U-2$cf}`4#cA9jgWB@UVGjrM|g#d!<^1 zn~gtD&g+5v98b>TrpTOsr?2@_VpegdcE|jQ;n+*Zm7;?~ts6~6abl(1RIov=J)#At z@#n9g!5C`J?|?ajSCs~|%xOOUz(D_{@hF6g_e)O^-#q^ZzE}UPvgPYp)+ciH1@LJnO&I*}!mSaMZ};bqhDIc;aF*b3%0cZ!M!D#YSKBl+h$ z)vHbwW-9&0@(UCa++Uy!a4_d#oV8YC(z&9L2n|-2hGZD|n^?A_^|}|8bC_r$;661n zE3VYfXvTIRQHJ|qvFBrj3D)O)o*+2S^;W5`kR$ySlz@6gDE>e-o4aNE&E1G}B;#-t zPI!=-j1%uN;|)_|`5~MV&?e9hJ0z^D11&}^)(3)Co5v?5=XLL z=C%^I*EL4JeYv@*K_jp4pap-|NdZ)BnY1 z@FJn0gzP#um)Pk>EN7_zRs}!{d5*T@(<=!F1lKp~{UEiZ0aU%c`B73j2~;`p5-PkW zCu5G9u@4RoK5_C33&*vza34DI@$p$XI3S-c^!9#wd3j0Sj*gCYKAx>~d0uzyL7JO> ziEfgzt6a39O&Pz=i48(e4#b2G7Bz^_1JFXy*@RoH3t-!Cx3mc5H$fpn{_@aL3O7F@ z61|k z@S2c7i?D1qy1hNO73gb?ipFo=ZpV)5TtguW3H@hs+2e z<%T|kNosFjj!3-c#iaMY*_nG(F@G-af&In3J=KkB57SW4Jhj{Lj^Cge&70`n+Zr(v zylqt@TFEeiP??0V+aY8CaTE%u$oFGr!w5d+@<4$xQh$cFzvc9$~p-R z5Dz+S(@P$OU+JI%@?8mOW)cU#5yG8E_fB;~(~i&ge}1cR52TGbcJ*=Y&L>897NpsZ zDAa1TAU>G*&09?SyMiEUQd;9G?4Ef)b4lH}e2i&) zGqy})W&hfqp6J)CVMSYp;^)uV(^YV~{!1o<=2NH(hxkqVPnD!j_G$Ld!gsVj+G`1A zZbi8iXop2(+$+@V&Xn!MHrB}N)Sepck2H=Z+&^$+QltWkuT=n);>iB;%TdW=QAjl5 zHQJ*qs!*tf90ct~8_2luH`8QhB2X76k?*m%G_~mRvU=C=f;iA(WGOt6;!{vnSt*6g zMThIQlE{L*I{1cDX{$J1ZB%@?tx5%p0R(e?LP`fqVT8AMoeHM)%p$Dd`wh&|FyZk%%z z%Kfa|AM3J|+f&_c;~K9))V=D)3x5EJ0mseU!EqFJ{fwGQ-FpQ0r z4=84W%;oN6Ld^#h+p{UG&y88Vwlp(|6)U}xq1sy>xJ7s%L%L0^@qNWp6e_UQ;*1@h zz74I>6|fa7D&g^4X7mxpV4?uN=l^|52!cN?-xU}eszA;S$IQgFjHdo7pFf1 z41~wO$n#dOzD;{J&J1(su?r2G+z&SG2Fk^~yENxTqR^}xFPrb(H0`NSR#zH%vlJ{$ zrMGi7hipXc^jZ16441?$nvV#$rlD04j;y-Nspy}F(96SOYr9hbm$i3J{EV9E3f5pP z!rROEf2&aW)M@7cHk+c!ewU+^f{kULjP*>@Xq&o(T%j4B2fUR0V;U#aTln;sW4`A7 zL`KSh@js1ML1!GU0UEKqND!i|S+VY1u8B1S30@7kDi@Io znf*^?Ff0&3p1W&=wuZ>UoW(A08H=>o#6XV6M)R3g0aXwRyxv}q({8UDVBB8Ox? zF-5ZThi_T5kpAP8RfViXAtkTuW|miQmCfGByeDhI zT&zzD{OSHVXjAt!#z$!pz3JS8nv^ZQ^%U%5j9j@u=f)oCN#kHD+=yYh@Byz8J)!g_ z=8Dl!vFP9T5}lEi^Aa94q|l#iN0&)3mq3msTp`x>Jbhl}s{j&6RnFd?EoNs+Px+K5>%up!lK zZ5a%GFPiIieBgll>z5*b?nJ%@1mt=zrKF|?0X{IG$z6!}TmVNic_=o@MZb2oKQ6Y@ z`OzZ*-rnA%-zZ*rT+qB$u)}{aioyZEL<-vrtfA!timgZrF3yZN1J>8N zt<+|I!b+~|@)2d^1b;GU^qAI>R#!gG#8ND(Z}cm$U7E(9u{uH8=8Ddpk(_{46QPB~ zgox@LChh(0N1Kk59N5IR*I4ueUQE=q0TLx$C4p$B-0}J+5cTV81QMQk0yG)9D~$V1h3qrUe?lAgE{LyTb0V-YZFM~R~%56avX-cH8=|4 zMPPfXJ71}q&BMDCBXhx{sazhEavU!eZi0#*3)AeZNUNm!($)viHOzx)!lvd0T@9JB zdO}iZCM4`XwJ4ujM~KJl(Kl$yTTSYh0k9&$T<)?v!|ND4;H3&@!5?URk?`Lc!+G|m zw(@WqgXV-}aoc)E&5n)|xdP^d<87DDRLZM2;8;J!$Yc9)2H?o4GZ9bRXy%idwJc@b zf!1@%tNbM6Odyx9bV2$J&yS~i8o>$VKQlHssRDwBtWhQ%NhkzgFf4F7#k@;604nN)K3m;|rY-bz zHfSR3(Xw_RMI_`%b417d-rsQ-J6n$`caj%bS5P34*ht0wL08|%N=p2Lb9$f0iCbbR zb-76!jYlB1G{Yo3|mYO##hBrXxQX=y!ED$-rnB86i z7HBvZAU0<+2Zf%j$lT)VLpIETer{#(&xX$bXPle9zygc&wz_Nbppuf3o^Im5O`?W& zKQz~p@$o&A(a{PE6My?S`WAP8zv#%hxw-kYSQ{|(_WHX0N4Q7_^VsJgMSFI2HS+!S zanCjHl~6sd=}*@7TiCOJcffz{z`U}Ch7>Ibl??tz53^BsjOVuhBRCHV4b=TK#A152 z^)tX-_KzDsk&UhG&2BV{^ly7nIH0PK;6gi-bRasY#p{!Y)7`Hpds~=+pSB&?_Lc{o zpPvk7RXZ#$g2c9hnCG}`5k$AC6z8~X(-7~eJ(I37rDiO-z4NVH|2|sANoYGh!kCjn za-wVd-`C-$;KW4XOC0*3DIABlgkZ3$As2&Iu}vxdoIXjdEPCEpyCYN?AF90D&7&B* z=*LLQV!$W5zDKc(RY6fNVAm#oYtt7u4=2WL-V>_@n^;&DL@0iL5r;%vU%Lky=-iS~ zIGuQwHz=^4$6&OZp9e#Q+GJf>7?nRPuif+p^E7E2kDm=kLywTg-OS7iIb=v@IY5@g zeO@q6er@kF`$fV{mY9ZCaA-w|`#U|%IgM6~?tm69AAl8k(d-_sfPa6AxYFnatEihI zo`GaLB7ZI0%v^9N%I@%}2L>kP*Dw>EuzLW;h41|Dy&Q@(sE}~?Nv7cvg+5|$)nw4z6fVJbjnDpTCcRjDOoOysyjkBu zmN_h~S3`L?c}R1rdpRndiv*hcKRW>^)jm?{r1 z-}Es{4sX~M7tSwjb5?rPVo&eiyX@>n z>}0y0pC(b+86A>|w{V-0goW)bh{(41LLPW#^*3mTu&;y@P#2e}RlSNy(}PmO5Gm#Q zX>_hD5!$6E(JlmjMs+04ab`Q1r9}j;mTj<+I#9D_j0;F3#_6gpEYs^;)m|RMuwt%9 z{;ULOl-B!7Z)Tni#BdYKpvQ|dAyuEYZo&a6$)se$(VXu*L?8(yEby8{Ra3)CPp?mP z!IuTAQWV16MxhGkgOS;%fkU-352i|4Ar>d9v`GzbkM%!%Myus{RT5(ua;Pb+N;|CGD%(UtCALeKxJOf$R0fUQ1UH-W#0HHXGdhkI%Fi{r_kI=} zGLbF+c!Qe+qUK1VPp}wJJVnxJzg>t5DAp8@gou=ukrWeG*pU+_tgM_TSG$XJqv$#I z*qw@;&{0JK^SSTKAyGPcx%okdeauIaT1XKx1I}Ul+i__gZu=G+0hb63~9u=*d8b)k=Y8`2A;b+RZguCWD_jqD)ny9WB$&|Y`;uA3dbBmf z=Pp$2e6E2jGs%B%^_%vKwWzxu9F7%lN^|?Um*opTc1rM5awVTt*uImreT`ICNjuW& z0z|etNign5$ea^*%idM+A)8zKT0)82E>O$(cZU;za_&m3@w2}k#RH=z7;sR>ZmB@KN@hq7sxnBhs6_xG^3$ZTu$lN~!1g1e z^mnzZpci9&T}V&JiE3Q^&bzvo;RXE{CQdKL2g*SO$>n*i!`Q63#XCxO^J)B zPc!rxqv@LrhC#W$`txxG8Z&#!>Ukz86=H#?XlujW&tj*$J5m0I&&3s=JfujC@$qr> zCzp(oi-%`#cPP3V4(QQIB=QDEF=^JrGp8!7!<@pQB9*#3R@rXBhmaFpJ4IV*zmVB$ z{gD&>aCxH3nUiuwyx=LLe3IELFznsvE4y4hCGGdvB(q$-$+48Rs@`pjEtI!9saj~S z3ZR9={5~ZUc=oKqib4lreK+E;-a48VxUggywsq{Y^5?PU1dJc4Ko>ejpYxx!f>tYj z3$~@$9IZv?sUbHk8OZSaruKPRjOKgo`yK*spifUAwP`fjA2<909hZVq@{}a+u#I|_ z+dy$gW6h1GlreF|2t{IZcqJL29sE*;G2T3%yD$(;kVDNohpwtUA}r93dVx;h$MY)Q z+_N;@<__PA?MNzfASq!XwL>jP+{GS%r)B`1t1j}H&D3w4?NmS5LZbo$>hssIJKw&J zm@Iz;m1KmZK0$ro?*WhWVt98Q*BL?BTYyh3_88_VaQ2M!LtNz`tok3=s(gnZKe za8z^?W2Rq`X~*}oVGAUgCbHLqap2=WYfPB#?VM#+MdYl6Te>KVqVExOb>_N_mRm4Z ziyDwAIMEUO2}*%0o|V+tDHS45)(D&4CzkCjuJQLqyHYX;=c*-{sfs5TPBrS~s^^kO zPHr0bkN@cki$kuXF#6ssfxZpM*^IPe9h80`Bm&5}&Jr%EB8TACQ|x8QE_Y4O*)p*6-wm2!OCYHZUR5_Rsie^f`2Tr&b+XX!(r_FwPM&l!h@hts(u(dV^$UKWx5P>*Hb9VnB_IWa% z=&RV@Ne)TzA7bOiB?n4c;#vYi$Vn4E;SLBT8GW{EK~6Z|!1;m%N-hPvecd5dZ)qXl z9Gzj#yskgNH?x6K+9xz!x0`j@OQmbFwNN>&mazB9FydqJCUvk$c^h~zg@lJ;Qb~rB zxO_TJMT-uW&bHH`B83yPgI`M1G$*1smGkE)ZM^U;cd3dJ*jO+Mu}WLn>0HIBd~fzh z@AbT~*QlIV&8|dT1CT-MxWi{B63Gnn7eZj*u2hT=6QAlAi%~;;+@mj~z>Be`-}Rj& zpeG|M(-AzU?`VwFwFSmEc_wgw`QA8gF&OcbB-+M#jugYFN@F@W8M`u2-ZW_#3Vi-_ zq@k#v`J3()yl>Cj)b1tt&O5iO?iX)&|Rnqy{-vebD zXF-DeK|4t2ik1L!?nirP`VwWKt`FvTadpJY>5sRMeWuB=*V$rv$z0B)W|0i+Au21S@_uTMk#OF7%r&}Bf@wrA|! z+p#qwouPQ|OXgZu2u(^SMlHhZuI^v^Di%cT_JL`mKNXGRRurXwavH{DzPK4m9z+nW zm_j9VyV@ncZVA2L;PX*iV6)jc7nQ4hZz!Y`%hIpSmy3}pB&7{W#4Y+n5jz6bgD&G6 zqm|lZH-7Gh8?l`O(Rw%Kg8chZ1f(M#$DJ!x`}CR<1dA-@FL%pbP>w7yWl>4<%KKeU zQv+wpb3{e;hV)UE{W{^ zyEC}EyTjm4fZ*=#?kv#|NN3US?6ba&u~ZXP+@(_Vw}Uqxy}Z z5dYb`z(qbKF$;)!)PQTq-w!_0FHy7rZroHIH`+^3)Be=?C-sQCVD09&QA?onZQr(3O)pT9%>xf0%<5|S?EqlKW<3bL_`u< z0$(QZ2nZ15L=k?Wk+I|n`Qk)JM_2zjQj02QfOkiSSpDw7kenRm?}$Dw(&{nhNA~nZ zPfu?#rDydqI(@?jstbxT2{=SsG#5(_z=D{2wU;k{R~7ggD$1Fc=79S*U;#ZHFa?Exg75sNev@XGN#g*j$sryR|9fK;8^r~y4G$!B`Jsu`Q66EX z?w}d(6-N;{Pq1gio#<+Ha$|Mwk|84XNv)AkyKl27MIy-)IAnkN@4FGG~dZAt{D$VKIq4& z50sV}SOt2+I{9IfpT?bvnAr!cdG%J`d$bCp<*7YeA0g9ReFeR~dLoZh3+HMP2ayl? zkGJL-H{l5J3n36|iWTte*)a{quZ*(vm!1w=B9J0}$$iN~2Cvv)4TB}%IUSOz=g}M< zcPJNkmACM#?uAx<_s{)80?nKJS2)vZxQLkrV9acC3?^8wR5TSpSRu!ubog9F=j1SW z&`;QLhNgHvTyZa5LUV4HmS@YMkEeVpmPSuO8J*4qZp|@Pcovf-bZjM43&Mh!~jp2XDGd z%&+nr)nRkMS5HWW4hX?KZ=#>hRXtuT)ZQaPn1YYyLr0W_rOf=m3|w7BCnS8Q!*6jf z5l%O);QQU|xqRaVVI-H^fgj_7xy2T_4yh839>uo*v3(C;A30HkNanwJ-Ou!?D^snEJACHdyaOC>>`p*w_fm29fY868hEWJqKCR{qJ!?C#d*c2}4 z7)f93X&1{Mo}NNiiHM2AGs-1^K*P876+H4QT?h;^JakR!qUrkzWq$;BcXt4S+{ZQQ zM;{0ojxM^HQ~~^Cu|j=pCa@%30Zx5kVZqAQ7LttF%+m6J<$a$;bPQ44V7rN`(9Xb$ z%Mnghj`m}9mCV=OB`}E%hrp5hVu4)%6P&$lY?ItIW|GNA6)H@;@0SZ(>DUwW=a(SA zCh|AbBESii0it=%`q~!UESIfk;)nD@{(snKY>{7K))d2{ap zL&0Sj`J4G1i|R$gY^2~fn4y?tLJU}}U_h4qaq4_r;1k}V*(lhQ4b#httiDF>#U=d2 z!#0;Cbq@(>EjfEiLKqq8#u7;EkBAa>2#b5bH208Tp;A|)vELybeo7x7nfI`~*Li__`cep45=k__C~fk(kIQlDIGLr*>u>^j$qR?CUGn)0ia z^e>4nXPiyCG>cQk3^z$&EO3MFYq>=-De+7BMp7Kz6Pay!(aK-<$T}$ga;*lSNX8c;? zQk62AD)*wcGD2UfOD>k<QM6%7=jK(M)_s}k))1iJWjzVeDtk;?z{j;FJCTV7Yh8Srow|Dsc&uJAs6~Z`FB?f%&R~H~Qr&KUJt%b|L80TNOpX z@}%P^;AK?W9F(O3cIcoekMs``zzr~RW`9za68q>i=!Gk^2c@%)k4RQHOXmbpM9UPW zA3evd^_3GB3&FH0%1;XW7C%MV(IDN}p4XzUHHZc%K@=zCdW(_)U6PH2y{=vskX_s! zH;mJxRJEuq)9gZK{HJgbbrU{cy9yLoEv!OkTG0Ig=?5Nv9*X63Zhtgp&v+yxB;@Bm zm|F1vT{8T;BypSM`SCF27?1*A`uE&YB(}1$Pj)0^YIto;=g)5$5tGxvOV14EEa0~;U=D*wjhVDXfXff~sz_&mawk03zj;>{1-1fv$Abh$Gvrfw>KLYSNuAF8uLXM zeP<<s3SKY+}q& zcMCmNHS6{b7}Kc>d!}&dw?XkxJLx8#vKc-&E{OI0P}*d??9yh|1qmev^^W{i0b@z{ z%$-(4i_?=!N}1O}Nvs|~ekt9ImioQsx6D7K4_o|n2Wc59b#?iU_1u}L9`gTLYM zZq~;tm(?=vukTTRbPU((n}ZVXdG>yi_IsOiSh|;fd&@D$-JabP9X|xm)#Rcu80y{$ z@o)=`V=Ea;Ln+rFS+qzEw+lxEw{|neAjafS(LpJqIg%~1|kfw=<O(_JpZg=VclU>2Hx^eP>_3YKwKC*`C)A z7jgtUUXmgAk=AS@a005HMlL9k0g@8XZ%f^W;vg#}+tP&;*rSUo-BPiodIG7h9)$9> zQfaBmRl=x6I3%s};ISDV%H{49#RovIK5^Pvo~%%vG>Mki**oH2$ggZNz8-_uK*K(M z|K>ZH5Z5?{{axba=O)EpX$>6eBFmu>Yh`74p!f`!P2wl!pUL|kf~P8V+x^`tmUHJ0=lr%0$A0I!J10cE$WMJVROfCV1S+oUBHQsqk7#Q7g@1IiRpHU`}Td2Xv>=cDEsP_M^R3OJ2VH$*re8-WCeUdpCf&n zka{F8XIqmWqVFPGxk&}YSVR!#73+cN6aWFohFlAVkTbDx!W~v;oQmitKbnIL%%8m7 z`@&LK?}$O(JO(>3r8hs3h++NJvh;m0RQFO9;toDv+$Mf_lwo4&3PzV?PL^x#`s9s+ zk&TWsR`Z=^=uE32U8~R@%!+7{O-68) zw5K5N26ceA%$6QO?tg5whIDLV`*hD1y^l;qS^ed!?zBP-5WUKC3_-B~oyvOiih>Nw zJ&O`PPkQWvc~P^psKzq5$%cZ=?1|A6@UeiQY)%=#OZ%?G}a=J^{U-8 z$j%u*ISh|FOVT_Z;$;m!_xSx4Va2lZ2GC9{qZvMyW)aamdamC5^o@OKcZffk{_fJp zmV|-B11QIxFgsc{xGm%{aEp+>KdeH!sZC`>eInM2PUkd89evPTRtBr*C!P8KIy##P z;en3b4>+~@oe}_;x9ul@?vv0FZtpYn>+9?6=4PDh@$?Hi2-qp|@iN24%R81z z)+0xW5g{tcEDS|iwG?v|@YJc`Uw4b~rqj|+MF(!}dQ)0s&jLjYZtWYt;&IEZ+iP!6 zgH%!X4ktOG!$+Kx7YU}{{Ec zbI2$*@|WizBdLUG6tQv?jUwizsXe<}8`TQesWK_g<>xPMNIkxvR<&OMQUnZ91qRrl z)pN>49s~(Hgu_f8R<)9*`b(A^6!zfyw?kgnRN@FbI~Te^&!(C0$lT@v4^OkCfrOD7 zI@Lh8jM7e{<#8u*527^;LujJpv`ua+@q=KE66&|)6!91KQdcA3)%rD{O+^?l567>( zcR&t42Dw&mTszmJtN0?wt`g#SaSBZ$)0Z<7b?^Ws&W$irG^$AMQRe`keDYi~N|QkF zyWQcuRBz*ghfuAxbi=4_Y_X1}aBm9Oul@w@HbtcFM|xf(>nwF@ z&mMcsqB9}4LQ&$-Q?PLuzYCu;f6g_S9A-ipHJifpBPVv5<;37N4~>e21|F^gO?_@C z%BqQA&k=qQhhaR;?aK_8c($*MCvn6*cyqb@bCrj;;B)*DLP>{9?iV2#wm$_^)%?A+ zXsVVzUwuC}KhjH4Lv3S_7I-HS2!d&WP~=V&nKvg37Rz(1rOpfUC>1U+ zWp}3o+*9E}l5y??5v;X3Vp-+u%6sH?rp5?f*zAv#AuZYFCH4;Pe`~fq?cF~p{Et_G zAKkvMcshb|l{`vIZkqP8iJ9K8=~CpB8Dq{x3BB3-t6`9kThwO0ZB-?;)Rw@$y=>0y zm=4L{W1CL=M>0q}%^_97WH~HeEe6x?>(AHtX>38G8gEHSvVt+;9cJW zCLL>bWT7ZSUeY`;i9%t3`=-0&$wlpK`khED(LrHskd(o)C*M$NTGc%~+;bA1%pYr6V z=jTHVbzK9X*q--?Iu3fFq2*9mRJ`QbU`W{d^z*x{89$h%r6tsjS(}!)BJ}ny$!|G4 zj{EUE+kN>$zSqB40<&J?X(`daQ(j4>rsn%U>Kuu*V}POpdtaC8L{kf*cEa@1K!9@| zgxWh!4R1M73=BmZ+cGjyc%Xp2WO13u+#h=eAC;nfCnK*IXtbyls;hG}kVPR6Hov}sE^`}N=Qy^ZV>*zR(o`w;?6$f7`qd7C3oNV!83 zrK}y)Shr&!F&48(4Gz@UW_tq_)&Q+sGKPHfsk-mY33ok`& zw9ny=ILJfz0HJZ%M^7!Wc+0D32QbN)K_MmDW>V#T!?c%3I)$q&iQ3MQ_tsjR@lw2i zNC;TT7TUfZkoJ8McJU=yrjgMp)^O@BfM8(%2RgKHuHCSP4~!M5JDUp(GdLPlwqsNBYZ!6 zGTvewV%o5zQFM;yDkRD}(Yz+=2(epY}#m-0vwPnb6`FthOSgRBW zB8g+&8*`QsgC`MV$R#CF&W9>qlRpIuZWa2#VJS`6lq^W4<@_+t-fLK_3>x?S6;WLt zxV-$3or5NegH;K0&FpnNB$6pn2y^Wsz<&sm_9JmDAZ@gS-&>pe5V z^A0<~d=H|SuJ^d|Q1$JMy)+gqhs~%r8oJ4#Q)Or>s z+$C!&lgLyj^6QKrRoUACytxLnMt1W( z{8$qthri@hbdo21kJz77JHcgPV2}R_sxD$zs5>{()VD?{) z70$jvTnV!K+>jg$NZBt=kFaZ-+E{?fm_tL=H%DZre5v8NP)-0xJfzeZhXt%epvh zWD&StKF4mmlfKS<#jCQpI(6vhDjdQ*83h=I@_Bm_&#mGSnl!*+`=%tNpl8nxSt`$r z{{#yc?y?TsXdjqdD+$xq$S5P{qvLGIp7A;9EPDbdVT7t97d|!EKHcA#h|*2<1@8Eg zc&iy>bYBn0Ef;^X7XfteT3Ch7_@F~4-s=m;z#RP7-uJWK2t5+7Kpp{sSkm|FNQL&v zNrlwZ)IO7jZ)IhXFB>V!!qKB7zHu*44`(YkM>&q{W+jdRcR7@__Cv}tmGP72=XBb+yBT5_*IU=cZ zFMH6ALBNZ71SR(W-{yXyZ#7S#_3Ii(PjJK66ApV{Ux4UJ^#z;K#*}=Ah5Zlo4dM5B zF59=bC6C+Gt86KF;D&W-McqH$K;Tn1Xc2`6ZZ_;ZaD`Cupsnk~UsB+IN=Xm=A&C!-P(F z5#y*_j5coaVA0NSKD&e{`JQBsZ+Lc4Oe=4=c zO_K0K7?*1eVWQXcd@EcrRC_W$GQ;jfR<8`G%55}pV$|-Qv-dQWZS(r$Ujmfw#v-7* zPT%>Cy@!sskvV4;4%D6b>mt4c%2FMVvm221q6{yR<*L`f_+Y5bglm0xYiK5iY)SD4@i9!|?QRTeXv_ilXVl?bsPi|CoJQyi;=XLWj8KMSqkS z(mHsIk6o>tRz#o?n;qIZY{|kM;oEi|urqUnSZNv+i(Jz+nik|{TnTw6Uo|9srI|p# zIGhW&UM6ZQ517Q?A0mcKzTb?-3{k?s87U z6%1rM3XH@GhL7k!@Zz{6js zK-`+K5mbfHQ0z7tz-%l;z8Rod1?n&}^zl@_!xmi5^Z&yKIU2A1#g#@*4F)&6$1%XRrH?w?<_)$a(^h_YpJ-CNJXA^A@#bv&?8YvN90+$hf-qWxM(h3R^IV`7H%_^;WX~F5%Wujhxq`|2`%xe|(Hf@v!HwgIp{iyWxgEajy zZn%E=C>B(!vte1?no{OAwXRg$((U)%cKMN@?qZ*5hbwj>>&&A+YNKXiyrI^BHT3*|on+l3O#8^A zdklQ|(+i5ixWS(*h7{xm>;Bwdtec^rtW>qb0v09m1$=XXRp|!-K$3seN z!JNxt6t;;H%yX)~S(7%96)Q~B7kl%Hbc;R5Eb{t2m}7Tb>Rd<4yN+oM6?ZVUg-nwQ z_8Ki>wHa*-*bNSyljjR1MN7P?UmqCS7;8Hf8lZ=!^1dULY>P3JnwqG%YX|>14|CE- zd3`gV$-%pe+y7NWGn?s*wsZ1=e}tB)P2-H5qAk>IV;69UqN4Q!(`prn=V z-p%~l`|$P0&=19_p5)u*W`gFzHKYus(F&^z(3(npxvAp>Q4j5FUyRU>hn;3*C_I;R zU^GI#uRXuSN#q286{lM(-HlOk4OGlJXUq6qZ5iGD(F?#VasG2v@MT0eLcGyTTekVx_`UkKc}X+` ztS(f}@f%`_N+xNp-%m>=C_m}pk-aW@-mFk%0m9W^I?VL8~4C(N)CS_52i^Mt}kf(paqHGp# z@~}wg)xV(5xhLm0Zi?qk1lXWCjz|%&fRjjXRXLQ?`H2C|pSxt@6?vT;Cog|| z5!B8lnltz#T?QZFOTCyz$q`d+R~vmIb+5=m_CpXka$>M55T*&gTDkBMx<4O0Nw}Cq zyL7fTPx?ho$Yxnc-U9Y?48Btn!jF`TSfK8p*9Rr#oV7bk1?bShcX;D{DTO1%$VR8Z*G`DK_j`3wQ?#F#<} zPaAKbKdm=w#r5bL<$4iB^(97@#6&4UY(APF4@g zIMe2b5Jw}s=7-Q%On=y=s9de zq;X>^=PA_QZulDy-3|`8DH`YZZ+7y34mStD_xkw~wBz5D(<74%;lkZXs$v*m__NV6 zK9Q`lai8=}Sh|8z@`FD7ToIb2X$Tff$&iz!vXMtJHjtdm<>xj*B%FA0@p-nFp3bBa z&nffAg$m;XiC5h*){*&&nz@rT!?;g*qaPf9V3?I!ie=p}-Xvjlmar>luS0M=(;dZY zAW#A^ct=Mb&$1b!@@V@x+GzmM(W7zO(bK*-oSHvx=Ckbn9ChPw{^kznqQU?tLG^iEr0dMjcJVxK~82|BC4gxOpd&z%wu zrfh)H>Lgs@|GSbt&?R}kgQig85`GL$1MLi6YbByi#UF8>W zmHTILI!RjQmya6~>lp%G}lI!R9pfKcM9SmC8 z>b<_JQz#WT*Jb;Uj$pW)W!h_jTEgQ^#V0AaFF@>PS6gLw1RxCQ=wt@)6VwhuCq@?d z#?~&ZI}s3^A^9(vA9315-1}ZFM9~-y^oDlM7)6`c0|=Zb%96fp5kZ_L5*Bdme)YZ? z_M~B}u?^O?499$gA8qIV!?ZR0$#Kt=W1V)l2vt!DMz@5P)vF?HQmksZnT!^3n`8Ji zow%$fLCn(mDb#?lc7gZ>Vu%nVxxaK)hMkw;LcE?o7s-t6wX-J;I_TMG`lzR!eF0u^ zoS3ufiJXQmPZ1jrhpFvbd#s-+@|}T9t5iortP>IJLZ#*9o)aKlDj+2X;J zbWp8MPWRSMmf>-7uV275VegqNJpzXcaB=B9 zRP`i|3DWhQ%sk^MbSOyG{HJMpWRWqY9Z2f$o*&u?EXQiOwK=|Eu?z?k#d>Ggz%zR5 zdC7aiGcTd#tCO1Qv*`7c9I#4{eo>)t80uNnG|zm+EmTpo2qV8H2zG&Wj@%yg!INKq0X{eD;=O|LF>F}tuy%atBVLv>*-x0bk4IkDbOV&-& z4SmTtU+#3(o{D;A(SnB%^UUKj9wJYo9>YW%t3Rwo##Wg@oA(gxo#lsUUQgbw9_bfqQSLD$?67+H^1Y0_1(>h~Md0 zVPE@d2KpJi0@SX+%*$kQ{D5CK%c1CNXa#q#_hPapK0Dac@}_>=#*yEo<~X7%^$uoh zryV>najb1hMZRfZUH|KDfq%&PFU3IQf&taSwYAVO#fw zN`dux5jB#pU<6|7&gn_I-f}VeoZbvp)f|aCabOBw`29wQh18_C3j!mG1t%7r0Y&+F zk7EY%fo}CZ`Aj%-h6t@FAz&_)x#{XIZ)lFkEK28U7>{dORe)X2oNS2~vgVkOEfHeM z^>$MzO+B;?5K}5%o3VE}D0)Y`*%Ng2u2$|Z*7j8Hoq~Abk0`9pPQ`}vkjB0oO$#w) zS){bOWh|Po5g+>fym5#lrh^W?yiQrBBW_1m$q#;!=JrYD&F~h3=~U!Npx5a$GXXAvf4xOP2^k>gD(I z#F`v>I!ZXy3u?On_TQlJ8{dhu3Br)+jY4?qyZdMQ6if;L1)+zUNedpWRAwddUkkOD zEEkyz1ET``yCq>|bpF5GYTv5WO~EUA_kYdQXVgN#S9+!TLeOXKLg4?_{r>=3OQH0) z^xrz=lcZ15Qvn(VbJBG~gJz*hf>i}b?g{E?_+W;idvx|7!9~Q_EtUVrO+sOR))O~R z$dj5dTHr;wi`iuyxScnRDVZtTHFlhPc|Nl5FY4w-iy|9$_dY2QAX(w4(AkKFGdgJ* zs~xN5ptp))5}=llbMbjy6TvrfPz@LF0i`9yJkI`}_c~fGCMIK;fGU7+vclx<8JkLf z0`@$eN~gsS6T~{yqnl)BB8h8HylFVqV_9|5_gXtam}k=A^lb!kyrBv>@5Y4e6Tiqp zjRx0l-rv98G1ODd0ED?=#!HY=zvDz`8qcm--1M=B|CE9>Nk0JfYDc70BsSQq)w_@? zY!0|d(@bL#iQD)+`_67S^*UpP>IzhvBzzNePjeDw*H5&vLt=wD8AUdnZOUXc`UItd65?(0yv`Iw(b&8t zi9S_G^$^);E2{E1De8vShd*KIaRw+8EwuXnI*b7O`vDAk3fltfUI@wjE~(L( zxF6IkNEzUF?7b?c^QG^^dC&9cOV$IsPHx|Bld5aVWN~mfo5K17XteAbFBPgBPFR7` zAQ~LLBxQ_PFlQ|GOO#s*6ZlE(iLmrYZaF$Byxa(KMAZm)JcAc5Lo`mwXc<66wtu}> z#nj!n5>m^aU+HHenZ$r$#l^HZ&+CEXAm){5y5uy0YwcZB>eICAMocJ~OGB27nGivf zlIcL9On?bLLW=9abacxdtxoO`f$RQGn>`LmVh&k%!$abkk8J&JWsv0Qb=Gl-vgtB@ zrXC6{&YiQtt4Uv>Y3f&>`0}v?nVvp+8^0sDa{i20Cha6yum(7iH}*w%lGMY7F9~}^ zBQFsbns}6$z*uF;V9uPSZo(5mny_yOI;yLGzfzw43bW4-<~1C55PEw2*!m9c% zrfEDt@KzEu+!|s_+0Yk<%;X-7jkL1ibG0tGA7jqDgqKys+|b#oZ1>bF34KEG=Bo|N z3?(OnKc#$}nZ2GVN6J+ah`8q(4;F|H8p6F(X{+g3FboFrMYz&C$fb}fY>pH$S{`@S-62n!CID9=0!>wHZBfsT;m>si|I z!}o5x_jamwc>JTRPfk5kv?GaTfCccCc&GNU=UG>_c9|SZ67=W|KF0v}ov(h7O(w`L zDTkB!yS>;2zZMjABmZZ58UXY?1Vv+jey7H8L(ziMtxJc!Vk*L^K&bsYngKI%S$z|i zzI}}x7mxE%K{^);rr%WLY1i6h={B`KU5vZcv%tmBF>2ZAGwL~21XXguzrX1CDTDN( zd}jEn)gUkgx~wa>;NTQRP1v->RVQfU6oKvF}j+< zm{z@8wdOwv>uhVuj7>zQ54p*th(}ev73fuX(c8Jot7YjlKk7fyzpJ471-bNU{7ZWT-s7~f9ayDw42okS| z!bUHsV@X;zU5tfcjDxV&Nx~xbjEh>>&`A*jzHN7Zk#*;fSt^W{cT9PssDhorT9zQ+ z?($bH;SI0qZEhRFk_AzQF%aBbNmk5%ODm*m!RHf8oglXlJI{-twAYSy1z5hL<)g9U zLw?!$6!?b1)RFh#r4X0RH_yL{y2u{Jbm;xn`})o`Wv+eeb8WKM@U5~!?*en+uq~qe z_bY~{Cjodg1M}W^%2PYxqwSa$(>@S~$9;zTuh4H!a?T;1LRu;jJ$13bKy_c}(sSWl zEzP}oH=3aiHNh-bs0!zEOv!5pK?SL|M#w7#gGjDkQZ;8HLCkP3_5(b#n?3B&wjNis zFQ105`QQ(~{g2IZX4TIB$$wx$XW*DrfH`YS`~Ps%91r(Ela039gqleGQNc173x*sQ zzumAloqvNIw>9lw+T-|ntcEDp^DBef)Ve)IkN4m2w#!Gx-8s7ZoffJP^A6cm&2?Dd zF?|k_pLU)&T5xNg>3q01Mo#ePpW6N#L2cFyRRHOtLsKPLQGfpqfMhl*%~!UX-{P** z!g_gE67yz!(?>iMZ0Y(&yCwc4U#eF?HLb2FS_oWN>W|)fq@<$;zKTF`EOn?(2!r*KsIx`C5rRo6Iu8@V`Hu>Q>FASJ9@wf7h=~f=qKVM)_F4@7gEADzxJiibHdAn=lXh-0u?~0Fz4t4u3<_S4_(Jw1S z!A`jer(pNzK=)`XIw$kX{a#xK-Wnm6;Petr;dm1jfNh919)>ExXVFrl-eLQ^aWC|Q zP+JxGK*v1AD0piKyv7}-Mwj?;?Q9nGlL@%C0bXN|!-EUw>`tJ3xYBfq%Y?@Vks~Wg zzTH#Njq>|(Ur$NCubWC@=!#Wz&rD`0kqA5hC(~cuj!}+&0q=J9mj`C`Q(QTde6Tpq z=s2x}Xrr%++IKivQC&BIo1-D@>T;NyT%WfqmgSJ9EGWt%4L;7EFo_1_RTc&_E@?f) zr0#wOq(hb-nv_0sfX@VT zo1ItSBmMp&ftaQn*E0U*^68)aoYWvJpHv@(!QbdD``>gE)UvV{Knc2~vlUtW0hYgq z$O_{UbZF*mY-K9vqefk-@PBnX#}k?tNtDZN5STBwygz13J9&P`v}u8L082S&uuA1D z1n}`NYU%CpMfI<=WHf*_LJjkuJ+$AN!T#qhzn1w2lAF=&pBA^C;D%02rgd9pxLK}PMBQe_uTa0UhjHk16Br=eruJj-m}X$W zdu*4rM$;Ql2$>}QCusfoya7>7B`3Ns0@K-AItxV!armhUaPFIhLO7eK0`0mb35o(R zYwg;^bYWDHUNTh!y}3Klx0c^B=cAkfm#p+=QhSvgy@|SRR_?7u-}>SQW7M?VSFzX` znRf@C!8DEta>w9ntA}VIww5INYp2w{XJwr(sel2`Sc7W1umeAF?6tzL$7_uX@t@R3b}J6ZSA|F3EFxb)qq;LNC_c zDGJxS_sDG;5?%&NNJ+H!fAkG^2;uCtTX)xo{7VSwuQlG$qxz;$Y_FHGi8vFBU4P*q zEH;#DIiWiE{=e5lFnS#9yoHLO9y%^DaMB>3n_qeRoQZyPK^E{DIj`U3mtt0MRN3gV z6=i;_b><7Blx&HO(DJ&yI_SDB|Mu(!X)aHUTs}d2j7%lL8_f#(vBMkT%TE}ipO!nu z+?9u->b!2;r#WaJrD4h|zZ_=IPZR2%!~`CF(d6VWpdTTI6xE?pf>A8jugFKY>7|>C z(pA>TqAK7Pt338a;9?qqPSNy4{LT&!S zr}*e>Zx2(#%m}kJdUICc)It=?(6;Fy>6e5=lcV*tV*ufoFcup6eGi*8iYG4Sq!Eq^ z_KU1SKePB{uT6V`TMP8m+PS7|_}R^f&bk6baz>wyS(TW2`ZceQCTGSXBrs7qT&h?! zwhLc}=DJ%W803yUkJFfUhcq+V3Pvc&g?`0p8l}(X4xWy~bS$MHZKbrQB5i6(7muqRFw> zxo>LXX}QQ(`NHNMM8}I$xykNuLY7-3Jll)S4fZVHHw?B+HbW$wc9SbKK;M1y^29$LJ*L&_=@1W&_lqXdybWKUtkq5md<*e<=CyCuuYgaOCs_9MdLN!m`?+p83FH2O?SikXIF# zFUi8;XIvukm!$IC;hX!=dSiH8PJhr$+5sbG7im7!eD5`wK0^&H9dHQzB_9s-P-ElH zf6a_3=rKm)W#O9Y=OHTQ8UJl^JQJp35md|iyAo^!vTss0<>fk)TSN5A+tbn`dSQl z($=^ETvsE9y&Ju9r?)`!mX=E>nV1DMTxgu>u|%Y-e_qp*L)oxFozTxY8SY|+mq|$w zr+PrGKC*L)rJv-DYioAG{wW7(Nmb6|!e`ZlTgq>=L^n%YgP4_;J3(f4wyD3FcqNrZ z4{r`p>so@@ghIh=8=+dS5_+(<)U|gHb9;o_p^{-RGLi6QiNX99Y`QWVoyDZ=w7;r> zHO*o2(MVxF6jF{)?(lqNH2&J0!mg1Du%;*PW!W{w0^(0q{=COv%X<8{m)n6e&%5_C zsh7AHDY_PEhW_jIN7GYjgT492(k_OS8YGo!iA8i*D(ug6GvsBfsahAs)~az$$MHxg zVn93?ct@xb=>472+ASy!?z%ALvV`#WpD|b{S;(J+mAPMPUApOeZvj8EkNeYUoM#!Q zOMpp5t8HJTbRZ*rSu9_!X9)eK*WRlAo3GlR&fT>LM%_(39SZNe@7tmsw3dfTyY%M%-^qSH`1$;Ln?CDS?dHT4*h6K{vK1{+I z(gw0NgVqC{rNW15Fk|zL*J|Cd(#C}Jt{Tq4S+Uu8-8f8q)>hWhaYf7p@XC0&4FEhb zVk*<^Sn|g^pBwcli6i`n=>5}Ra%?gHwDc+>ixsw_>l$Z3$!Ua2-^CV&0n59@9a>gg zSvETwnwZPC;2&d(fbbvcOslTqM9s4-V}YD2C4yfK)gS4VomXw zn!~QHEJvIGw_jDhMAi-aHnTMfA5n%UickGtp}zn*O@ZgLksVY%VQWz|02~?=+-DQ( zlY|5QX`mJ=4h16vNWp$#KRpo*IurimHkmz1jspi8Sk?aa=V)#BE8g1?nUuvOHh6MV z8@cp)lUUFpBR6dlw;vjSFBa9NM41-q`G`?m6d|1P#WMsMF{M2zdzlw{>UAm*; zUKNXp7CEX0a$AeGQ&RnoUz)I0nyl$mQA>**IX$mG{+KN4FZYE@osX5*u>_^(M|4g| zIGxDNk=ft)s{eH^<^(tAc8AK)^ybaLY##vpu*5B>cq7xV8D%n8o^9VIWgBR<68BX^ zacK;rS$}mZwlTy_h(IP81#k7td$wsIO=yJPRPzu|%|@uPCmzhk*5J+ItBRjwT>qxe zTBw~l@OtE5Fu_S?d*4p{qS>XfyfLi=HwM;(j626 z-+y)eg)gJXW9ij9v4o>1RlPtf%bz^kiz|ThU&8?XF4_+KvLlmFi&CKG*x>TFT{F^o z6weF+u_LxPMgFQzaiBV_h^LHj7~e%J;Dun$_5q&Sn_xA z$PGiOvwg8*`qU18<#|M7HiWk{CJwKg^Gha5;@&`k!*pnEa}gB7aX(}=AIZmnTw~ua zOPa_{U6>wMEbk68oYg>PHj419jRE@2$0nDyj`&>POo(4$jh=VZ6LW+%ofZqgG&fZ# zmKyfpSVyp-u!+1d(&~iuAB2fow)<@lpP%uB?e2Ob_T|s=O5GQkhFpPQ+e-Seg%`RG zn1K-)J#YE-_<{Ss@&a(+bk}n1o%YW@cYDEdEE`;&ZCgJWOzY1Ou3M`Kp{?IFqaou3 zI=B*t7wI%q@XOP>wTvw~%Z?9NGK6<(5{&sQ32Nk^%d5#*!x$bU%&cv%D^6=bU ze15`;__%B|cw*gh2_FyhAAQ4`^XY(pc;O}QdkBg~1MxyAWXoWKkJduQ+REb@u8IXn zqf5g5?RFv5(l(anE*X>j-9)7v1It~9&uOe5LX^&J#Q=lC?P0veWjuNyS<6a#5;B|d z`@9dFkP(d{uL1M)SavPke+I!b22p2Bj6l2q{Mjz5%LE9u27HKk=aw}+3rT4~#?`Cu zhbsIsv_5i%H=YzdsiGc9=&)*R{8+6+r&i)4VaVO*p7(4wJ1yy$=VTb0AS9sB2~&c| zPKFr~@bplVvW3Od2ts5VBDf3tLBTp|B)O!L%Dw36F`TdUnB74Wci09(ewGhWG$1cjTRtjuHW(RzO3w;&r_c%wwEVyv zmxu@0@+hQ=5}z4BBy_vP(pdiKl#dXY!qLSQX?ap?MN1b%UK~UQ=x(ky690h`UW3y; z98U%*p4gDd7RUV^LaqZq6Ve-K_=d zrh}5i+N_&40~Q)-kBXgfH!yJU-5tL;K^2H?agW2}bi1?i>_m2NfZ+6XBQfq5y&lVn zWGU-?Fa=BTj_3MK$4x;8tP?%XwW%gcUEy-;gI9?^daDmI%K`fNy_YKt3%iUV?y{8A zc_!+whyB)CR0w_O+Fypjf>VL23>zkWG)Ghl9V4nGZbjYKYC~lQk6zcVQxs!b1mej| zq4>Q&xFfJnyjH`z-eMGDL1$G?5_9;C%;z)!vf z^TpS)?vpJH| zZ&sKCiqiTOo_yivWpi0Ltlf;DpqyWc7@T7nic+^it?s9|vImVEJB7T{-9=ulirm-` z-?N%fMAwwh=5AYA;-Swr&0W@w$Jbp?NNN1X3gp{LJvTiR{aG~G4?oivEKf#rj_3H> ze8}M(;98NUg`w4!6^34a_|?zFuplhFEvgNKh}=X~h4$HW!$Ah5gNU+Ot1c@H7mdgN zkB@&0uKat0z2S*Dv2EM-PBKX*n%K5&+fF97jfrjBwrxN4%gq1ObE;0=@4jz$)$Vn5 zf39BZ{$eMp5{zxBWKgl;;3T=U{1^TWIREuf$%AM@*vO#pc%_+LaNB)As*eHRK2Oq^Et z#EkhY+pW&i+Y(&5Y6Ww4u|p zYJ#F6NDHhD?C614i^A#l%StG$3!N8dkUil$Yv%UHMlys7X=$YF>E0915mZK!BT~3) zfEu|0ZSAD00d2=bd(KU0=Nq0GEt%v*SU-=r7Hr$%R%+dlnnydl&g~nCJLiYHd>lH+ zrTa4v{{UA&sK2n9M?0D@uXED@fD1i+;W12BCAI-$!`*?xV^|ILvVAAI)C+_bEVc?c zeBhCYiR|Amt^Rt8DLWPlD3tdgfBz9u#NWpuMau46Vr#YOs0Sb^jisjMx0yb{rlL*D zKVbBMvO!tlOTwB#NH7h?)H!uWX!%TJh2ktg1nm{S(t8hOQad=E#}(ZZ@s3?ceBWA8 z@B{SlTG!TkN_{jr2{$E+MTqb&_e5g>>Q>(#4WmzJj(tQ<31xY8a(T>gvNf2y#R~)G z@QO|mLUqL)-@DSwhsBcBiqf4>0?IRfL)YD*`vUD}8dMX%!+QP9$Gam=nstdlH+IoDZ7O(1GSxDF@Z$QTD$+^Tve9@a@9Awl(VyIKK$G zjB0Hq1+vj9|G77bu4kuSa%v zh~Az~+!YmMuYEhC#w2=9N4!@MRe6mw3Ggsj0k&^JaQyl47!v_~$jpp2@k8ikf`Ss& zc-zdKk7?!|d9cwLx2f&}Qnsy2Y-GYjin3CFAk~M(TB8R!68GMZZBAU9x=aKZ)a}xM zB7GpZ)F_BW@bb97h03G+2%sk65#rF{?0;|@=VQ=8ngJ3n%3hrMMA?g_spL_24{16F zy+LmoDZ&vIkyB@#E}KsTn%~7BbCjhc$l|9~fP*SeTIEt)QHC*Hk*(JXW{Cr*X9752 zJmk1ZWOG2xSd$q`)!P1TgpJzj`*_!eW3(LFEy@sjn*ixpy9i+0eIb`E12d5{A6!1$ zqMEYU;Pkkda(|hed(>4N+Zimiddq&pP0EZj0tNaSU0o3W#pM8>J_y4ZaxBQV)Qof*SaK<`?* zcFQ*1v!H>kGuHUtY)3)7l`@1Y+^)~61lUwEU=yur?<-TGXxA)`XG1)G%h{jjwkz~C z8G77I(K>9v{Z}Is5HT+AS;LVboqhlvE~H*08P3x6b3}FW4+~KBaE}G3#RiNLN1=t> z&wJ?wqSrQz$p#FXESvFg4?DE1HjI*Vz|GDuip&C0qp?HVf*#Ywe%vwU&l{rGcRi*` zz>QY-M?2B)%xMGKIOnz9)>LucJbzD^YvWxDC&rJHn@^m`Np1tFfAc?t7+7O67`Ryi zQrs3+uQoLb94K^PXH}3mJzVsT<$#EI-5cm-y@NJn;&8{m@(QMBeM56?fzL;nGdeoF zl3_a=O8m~cry8=s2wsu$dvWsf=F-c~+D71-lIGBc<203bq(^8nyT#@M--%ft_?~{&YAb_6%r{d&dLL)T#5{AUvpPa zh}n2i12rd(bsaBjS@XgS17MoooTxdtPk_D_iwD>gTWq*sM(@M}Awc z>V?A3y@#8Jv{ekpm|SwQ1CHhN^&m^?O537>@UFj)_=vVJ@I?5UnO7r1Zo z+!5*X?~Z%XYlDRtHuE`y#JdP0(6p7*Z}=0UdU(#s5Zg0Uwt3l$*0x?0*aNsQ9n+75 z{%ZZLgLYEI9UmX>frgmBQfXzQ)ErQ+f3ffCCtu{PZgly$V(9f#@ln8dP$O?%BNyPK z1Iur|u-v6u+#NXNaS&fwmffudu^C^>vqXj`fGRehC5ATb^iVvR1`}#m3w9k=@a>1|@jC&>92wma<|b7>M*k%mB_4wq%b13Jnq{=*+ zx^JHq&)(ftO2Jo~S)M??)W}3-pO0rDo8dsm;ddgL-NTPm>al;X@!(S%u!J2B=2;@#7ZJ76=w!c(%tqUxwzI{t8>U4 zb8312w@H)cpbe#dFZxGt{=8u|spdeY2u5t7s7%&lgSFB)MrR>rA4+2GqRX=rAYXa%Iq*4?W31$`qTkhMe3Qrw|R%R z=VqCS*zMAK7y#j1;>E-9wwF~8geEzB8ph57CS|4L!80vhBtG#(G7Z{;B2ZM?%^u8TGD{27x~YVXkg)W4h%1XQAbd+Hp)@{! zH!A!?JHJgUyr`N*1w590P1r%y!m8EXZc9sk zrlc~P_I%{uJ@M>*L6#(4-|9;+0KosHyncpK1aYB9gD&|VQ@OC6R7rz*V>ecnJi}}$1Rt&5_Xb)gec(uQ&01<=P3ke#u8oat!4IOufR;p-C4$x&1IQdwe>)}=8>FR89DUZo;t2m_iG$ajX{FhC~ z5&9cQV)x@IAm0{aKaoeHXx|Q&A2E_YI+Hu~_SM96X)941w>DNF!P$&d?n473@k=-K z=>Fs-5||1(72|u#trwM+Wj`A5D|@4ta^7CX{>h0$!CA(}T3;o%NGLoMOmMUFKEDT6 z3&xX|JBW2PfSQd>KG25R=s4|Lh(aCIS4l|sflee7Xek?F3crjEe z0rLtN@E(QwNAoZiBXxaM)@ZML(_A9oV(OH4iVMnsc!?|LldP$#pH>`zREyR*8LqLI zD;^Uz^9?-+V3u*E8s5DS+If#>L3=Z-s5##O*vjJpQx7SgKt_;&cSOjP#5r^oJw;#Zt-)nx3E}FP+|vTyWviQ43>a z>BDduE}zWzRl15}Tb;#ju|17Cls>yTR%85Yk#vR3G$~X61@+_UTyr+CERE{jnT4G{ zyQd96O^M-83d@eU)n@%2p+J$~hkw$hv}6YjO$yI@MlET^vE&kn^{x;y!9*kI`P z(`eZYj0woGG~XJ3RC`gB z7B3ot6kvC`oM=`$mHd$Mq@DQC$n^E}E!|-}Q@2`Aw8p+&(P(c4AS`r5(9nrTTBpAom-U%HD741&U7MU+PAeCwwkjr-%5aA3| zdSx)Ho6eXIMB*<68zjV8PaS05MxiQ}(g@4t`jsG@eAheZ@00JGdS!l3lyD&0Iq9f2 zZ0Di^U*bqkU`n*mb%`7fdzECESEd+c@ng%lYb^JBsw;8=CS@@fdWyjPy$@cG{Y*9} zNoqjJFrHZB2~L<0MP@%%y!cW$D^TdeZ>7?^lZh=+U3QY(F>xu7j`mpq74Cd(-B?No z?>nYDF&9j994e7sLO%gq5&B;cwX=fy38o#ZFlV?Ow@FrywUO$9by;FY@G~6lIHqH$ zr#wEFJWVNogcvmcTQ^fn`IG1;f?mJG(n$QH(xC3_uq|s5_uf8XJ-2WgvkPISC@blA ziKhI-F+5Xkf=Ss(Y(rd+WZXk9?J8J3W@k9u5xWFDDh5OF8@Frx)ZiEsbDQuMXhLA* zMxl0l94Cvcbg|3hTTDAVIe{GNjTWn^TeX5gla0PrlrX&Be`=G*ucH5{BL1k#`M0>AQ!U#2 zhbBO;J-z|sDHpqvb5z@lpO%vv?Uukiw!D8glurKDhuxVT{oUB1xE*IWTwW?OBqF8MX|go;m5GkixG zkBQ|U5a|N}syr0-^&kPwcM+i049bHS?Lf_#8O-UBp&S2sZznDIwV~AaZAG zfF+apgkAzA|6d!4n z98T!ZzN?~gbxx5L_DLZL{%R5X!Q1cQXYHN_rPN@)J`E(5GE>=OehKpdV3I87Vp`C zLzf)eJkEyoDz#q}s~tic&I+tCfZ~|skD>cSH>8#i@=c4O1GwkC5ku6>nVZ* za&?}KH~}Db!?Ks5uw%RggtHCNi;Bu6M^Cmc^;(X5E}_~#g_e?=nYq*zqPrB@=4#ml z%H%3k6GUw=3` zqLkG_wdIut(a@$L#5~c7&P4x(e3uqH--LVPm;I`M8?`EQlVU1(T5>8T{e21A=(-7>APS6JejbAv<1_|--LE8T9j zNPDoExKC@4Yb@^A*TI#+f!Ot7a-=B^m}Vpx?FlF1zQi%qqK&&CFXpavfV;`aCaHE& z(FfH@H&p`uJO@l%YTOcKrT4Sa2gTRLdD8MRnx>3KhB4U*8YWhcsA}92sfM3rP1k6I zTV!Q^-fKmDQnYZ z-{&95VKvSoP$6VaKTUClItd~dFjM_-)e-)c9&iV6ji3w*Sau+dvTo}d7gg1$aVFcRD(wg9cZygEc7mc(M{a@fKb!{CVeMAhqEIwW ztGe7-Gsf=RkUb&610zMAuI~#r)l0NxZGJC#%HJ7Y_u^fflzPgh<|phCxNJRNHZAU? z5muEuGA3T%XfhG~sme7HHY+pME%ruH3?&s}tia5U2e8!6fb1IZ_Yt91oG7Dh3RnoC ze3^D9|8-4cRiYM4=h2?^p>YdYvI5igco!QoJynmHCL?7cYnZuo${f~0#$J3fL~(L+ zy;!Z^-54Y`q)@q?F@we@Tzyja86m$LQ4uPaPXtQxSv`FcATujEolT>o7=j7w5ow9r ztA;zVnr2hL&{TVw{!D7Lj!dD{GNmMo%v2ao_PwxyEPcI1SS+MQ7;Yf9d+LBjE5ul~ zU`$A{a>P3N$1Zc5+KO;pG3^l;umzO(o%@6F$)(P(4zfc;FcP$GqMu)eSpWmlhF6CO zG@qf1Of%2#o2T^s`~rd z1Y5!cc$W@HH!H-#v#?|DrI{}<@dbq}x72>vFL~kOcNM+J?ps0q z5SmVNX5=vwDD1Y~GjdhCK1{TPPfWgbq5inaSh6pJ+l^uzLP2vtUxdIZwD!bu`^n~J z*CHF&&D#;-w$Ox_TX7yU0`v%eFP>vJHJch7akpjm;{!*_{^)uNqnYSYAkDLNHI$wu zFQ#%~OSlw9NJI%tXW|Wbc0*S|_IFbPwhB|G<=G=l8LA6?CwB9W#h>+^4J-G>Q0~)u zq&dAM30d2$2z&^QOihnUJb?oVR6YdzIPyx=7>A!Yr^$hMq-IdZyw z)B{{>uYyd$-!)Ly5H1T3)>48Qe34v+coUMSi1(~hI^6Xu!3T`_W%o@5XHaIhqx(Qd z`?p6*nJ})aW>V?i{*hPjLuhmcz3R6r^C7mR?d$Y8v1C^m2azUK!-CRE9x%ct4Y`BN zMg|HawiUF=^K;3I&J3)&0evmI%G)7i1d)7=5Q+*jON$KEygo?ta4Q^qFe;qCzeVoY zx(HA!@+t5K&)8wM_ebjHRd+hOLCP#MdkEnw(x0nm`3j~5R+dXA7!3qVJ!wVAJq}@YI^b*GgZL2wW2psv;BI*8sVS{b1c8c=Zpvg*3!NmB~2k38F*hnkbYSv9Dr< zUii1g+Z=%nL|}P~T_>t?K)g>M#qt=Y+^;yNy$6TQisPH`X0LFpW?)HbQl9z;;^^A! zvSPZepTMty>b*m%72V$fDT*&-)PqHv7Zr5``QQc?6qsuvu!FV%%c%`XB{2XqJ%ZwgrvE z@6C56=^maq((rgcQwf`6!pmrxwCuSl?22w|_{iUg9(B^*A|E~>&rP^b}kb>C|y>H(nw*(S8^cmS|4hMpV85EnV(KBA_l%H=y-brR# zj6C7kfxq07F$6QpL^kK9aZ{h&EmL_@@~1vM9&~Lm;1p!_1NKKRNP>1;&I!$HTK?tt z-&-my+3iYhej@!8c4oK~B}q9oE8el63ATv#eu#7O&BZZP%PnaN=YJ*ip;rRGOx^Gl zZ~}nt85QhkkMDfMS8Kly4N|hU>@Qfew+;Pn&)8iIB;N`{>o`Nq$AiJxrAZ>Ftd3Vp zTH~&S z7!I;6+V#_)#1IaIETV9MwvJ^nCp3e45fPuga*+s$n^zG#rJF$pIb#7krCd?6=J%bn zx}j$&yTJ?>nJ)Tt{*vpl{tW0e$H&AgwXP_&7v5dCGuvqmX(GgB)`!91pCR&$$cjJw?L1Z{@& zHsKvWT;hU@D-UQdbCMK|thr^yzUWb7E5F%beB)BP`m4Gl#PWuC zmyEo%QAPcU?7wf&8fvExfOq}%Y1{gxxW_$KHgGnu;>TejnFrlU4;Luexwrb}d_U zL(M1ISlS<7ZruARg`;E)3tFr5kvE9D!AaJMq7(o(phsOSngS-0mEh@E4j>fv@`tNh z)@<7Vnj&5UayyX8oFsOuF1UCe1?~}=70{RHPQgD5*EhMRFXdE=M-*{=-7VFl`R=KU z&mxcL_8N=e*}dS3(BXscugqwgoc0@Psp|d&-@S&lWUQeo_uh{#ekxP@tBj`gIVytG z_Mbs{d7RBs)v2pN<%uiOBq0OOFd{Uj8+jPJ1vvC$ZO~fogItI5JuZ^zEF9#Lx5AMA z{#ab@y@xVkHlE6+>1xJ#NS2xkc(-n-i?N(z2(Z}9x`#_h(9dR7)T71%CGK`h7ZiLKv*HxBrZT?Pmq{d`8INNKFxA~% zYUB$oD7STxuYZyBk_AT66n_+d1$GTGTjNl|_?&ACxNav@DDIPM-d}Ytv#IF-x=hr9 z;?^U;VAx!T9Gej#j+!s`D(RCqcC;?<}cJF<);B!1tkIDnzIm}>SJadYk3S=1Tu1YAh$x zM;sJ_6+-`JR(q^r15Wz;xrPA~9osoMcxxsxS9k>&aL~~rovqge^^QyfNoJe*#cSC< z+}fX+a9POd2L(a6)Z>G=oTJ{0DlUC*t^FH8nw>f|HS>RY6Jb|j>w@y&T!Sfh=5 zD8C%0J6U>8Tp>L=FcNRc>WUYn!{L>#Ej^RG_9e(en|o8g4V+@-u@OhKTG`~fgg z-a}5^&WslIi2*8k%S%Yv#0>dUh*>ZPtCNTh-K|Uf%FX)_8k?v?rn*~5y5T1k3m;K~ z&>pW)5Bw_KAP~mPXJI(HY8sgr55@{`z0w`aC?QgZ(n=1LxTF(371rBj_fhWS|EYIe z{3@G5s_F$%<1_@&in@z(E2zE(zI%9gwEsePMC%`fM0+*++7DfC%--Ig+VE#FnK}F4 zZDsh#&3PIL3pT)74kpAB>Bf&^SY6Utnd9pOt98LAuFH|*%u?0W6De9sVADw`1o$}6 zh)>dBMYKQ&$_e}mfE;77eQzE>m0e!E*ceDQ2U((Y_rsUfOt)YE$m{?;=d1tZ=&(@%~l%jomG+M+RVipav}?#dtL^-SKi(eS8h2o=~!5$-iTR z_;00ENMAy&4-H62AdGgSPtA@{08)GywaVazO>6T{92D^mwKM3>!+2(ES-w~tp@5xI z92m`yHBwIMAHazLR&nWx0fLgi$zKAB2kj=M`x}ZFz7`ilD1-!ohym;k<}6U+5F~NQ zMjli5sjyu!CSfE;W~0J?_DE_1%xO&S(SKdj@X>bmpnyQE4$TIaIVa)wmeGnewxRZ8 z-hkNu8UTzziONduivs3-$PPRz@pLr%8rwSjj~PJ>F4jR%vs*pY5fu9#3ayhDBe_@j zR3wdU!%qZKWl@+!I(BZ-0P9027x6_+A4X`FQ)8I6Y~=G*ZUP);veQ&{@D0n4sBoF9 z6=LRI-<8GR{w)6I^4~F@!z>+8=S2;qUIb2yPJ)NjIs))ztqH-Z!lQ`w2qgSP)S##& ztb%yY{&6TU=omvl zIIT`)3`4lC7Q?thc@2skoDXc3`GL#^43NR%WYB;xl*fiy(xVq2uA)hIjWkF;9L(r%e;eIaDo^@ zBQ}B#GyDr>ri=VrkSZpaKq3Ik=K=zr;>G{_A_D9>JR?CLkEsU zefG*{aW`GYqxQ;O2)$p<(j!Qazpz1`rKNm$9PgZC;guV}8pVZ=NWyWl&)r&S zZ<9U>Qy}VkKY2LW^3u-g!D*uInTf=;mmqyU5mcG(k=Wm;bh)G zBSXxQx-fk{T($FE;}fwMy2Wke(nrW=yJ#|o(-#cKLg$2rn4(TH>Hal2y{m7&vXkp3 zLac?}z!_>jN%hnm?h#{0tG$LNxQy#{xS8}72+S=yfqO!9m4BX;Yas(CTQ&l(8Hq(+ zERE<-UIXQsJq~45P6OQzAp_|*y^Ry7=4Emi*mo*+$U1s`Hn=^TpCL=a zl$%P9uDIdai?kOFa+xD|d95KjFNY|?eqv@L>tAxA^d{H^u>D+;*3xtVM z`S;R;YfNU9toKnG6F{lk8qF~QXuiIVXTuvt+H<^1mYEMr_PmO& z&wexuNO5(CD5eKNAzaeKSddC_Kyrle*NA!hH)4h)Bv?Qpfhebmgx-FT{Pz``Yun-x zy4YAT8%Xqf+!l1_c|22O*MV5TZs9n}y3I(;PN^-1|J~`w1lK!b)FA9%gBERqnD*D8 zIsG+gn1lrVbVfx3^7T;SW0CW>qH`!kIprL<4vc$4%-GPSh9+h4L6Lb29lnDPKznjd z4rmwX!vQNpuL&Vc%B41W^~k?_JQZVtPvfTyqI1Hz!gt0N!KQV&T}^x@S)*f0EBeF? z+r`lXIzm6JI`J+J$u!JI{pUNvW6_;ZG{zz!oh%Oa1C!-$8TM$ilS@T(!CQeB$jMmI zSlBd#V9e|%>lpVNzYFWQTMdvJg4cO@@Z)1rm&IwzRa6bN1LU9;1FVJ$J@xCBFN=m% zR~$6Z*umRWQ(<)A7s#`RF@+m%G(;B9j~0OI)qqy|a5>U62l@+|>gSi(8LHQ#f%hK- z=|aMZ8JW1OT%aQd!o&SWO@=D2Bn4jF3=z_r?T-|a@O)uIL$J{rakZR5BG0!5RPMJLKSZkz`)F1qW zDwgkCNQTHGTgt?k)=2!`?4UgzC6|*BGVMl+?<&6?nnQLcQ%!&c;7ts+=M3!()(P*w zcFNh{e2T&@-RzLxC*Gr3%p{NuI&pv6^mH%M8}X$E`=G~k(VNi`)EA6wBqbxk_Woc_ zMuI&iY&gfE2xC0a>Q_B7OB554ONO!P_#>Rg?2^P8##R74LZP9xJz1n}_6oF)*+zXS z5Jd3(iy`<#zZR87%K&C8Q+ln7-FzW02)!!3zFkX@TA|(Jd9Y`9tJhZO4Dp501QODK zl|%LZDn91rJ(=zj22jcpe8t3^`QL3OBdtSJ8%~YL+NENIo5h1a`#<*S2E8pH#aRfw z=XgWvsDMuPs}xs;fY8erVnqKo1KIyI1KH>D^%D>XK=UbpB!hTSArXLQN+9)xq=~dP z{~#g3?kMyjgdDQJhWzw{O^AVvNl%Q?{oz(5J|XdfKz0TyJ|VF*Mbe<}VUNa{_2Z-( z`S9;7692k!gB61iBP8?_3rCD#1(f7q;KY;|g^1o>|K7d3Vj^uyp3t{@uSc>B!ua%t$PYKowZiK3dWZ!yRw(>5%!y4ih3#|| zoM)!Z=PzF^f5o+KYU}VXu?4ZiZ8a$w<$OBaXC*&aaFUg$71n2EM-4MUYpz>9v*w6! z$yOD~%mH5Anlfj#(<9BCdRz7k zhg|3N&u$isaSnkoGUGuA|7-izY57N^X!@Yrw61@x4k$qFZ<}->H)_$F0O$y!)d=z9 z4q_e3;HEN{0?bpH(FmbPW66!)#PhGhCOkB00NM$p0nPbX-; zwUTHxSymr+soBs>)A=k>sBrzD-t7b;Ej~tpLf=IMBVc4#fCA(Lv2?2cwJ8YL%tvQz=SDV~kDOsUIs}@_)w5<)4VS-E;K&9w$XK=rzoi+Pxh?NN$j%8<# z96I>FUt~gbs+X2IrA+phX^;dT4gFUiA!Mhrbg&{z%UYKx^>Hy=PA~O*o=|r7e#t zu7QLVEmJcs*tJf$8Ec=nU2?Fi|B)(a_>q`@{J$;$8a^Sxbf7nVA9GW2OtzX59#BB@ zcSdWEP;x8?EU@z?3Pa;fr2&$7@ zsB>1%rF$2~m$j(3(xs9fyhqQ$(*f@jysiS3E_l=a42*XZ;LElJztVLh1>;0y;F-rJ zepY%$s#Gc})MR+d3lSokyUd3YC+y@Yx9l@>2i5EI1N}3~%xyGJM1hq2+gEdB26ID` zM3&nRcRn8FzcT=Q*NRjPyYBf=BT>gi z2!1&|;Qu*2v;Vi#JN(b-k^COl1>JcW&kWd6_|NH;z*(=6iPsPc}R`G&D5EK13zIws+Y)bcsS(kI+Xc%<`(*qCXF-Z3 z{OEJhOgZ9zY|Du7s7A{0*AsoIRz74DT5M2wUDfB-0nGvn=24sj6Pxh62eg3QBHaUz zRtl+Jz1Hxf`>IEAP1DEgLnX3y#Y3;$A0PD*=@5<&&-H2EflQ^q(?H%Kq-*8YRMmRH zRvkYg-axtOT<;vK4S1GC6ZGb~^)r5EbH+SYf&Fq}V_n|GDV%!cRi*2tYYcz{`3emE zHQu1LSWC5BC!tE2vB|ZshJil^#vJU(4Yg)P&rTCq8T^cc zWHR($9sh2JTlxPbWnhQDWf@G>YVmL<#7FK7srg%$7 zfTHjvwlK{awrS3c!Tvy2&eCC`3LKBUdj5&$e{RpNhOw@W8>sm!#Qer;ui!^?O3ovF zDkm|OAyERgUS8CWz0a~W`j0oHfF~VBKI{GyKPY4SU$$DLx(^SzH#i!nBf;V>3Yx?J z`UbL0vrRg(Aw%zM}2%OCyaF-cgxhGH(AC>p33t z6pirBvIKR_M1tRt2njr+vtgyV!A4d>GA|XoL>mukQn&)4 zsX!WPJz4i{yn-L^K2YwPqTbg}Fp}&GyCI@gXQ^pQaf{LG@ro7j{@{oC>^)rU{CNPv z8F77k!r+X?v9XOLG5x#CX(Ifqqo!?1H8Ff3A%QTyfj*%dA^}M8VeD3sN1n{hKS;RP zJNVw9JMZI}orn3xxx@l?O1WYbobSY()SSCXuv+oyiLi1KeE5H%oJS2A9`b)v2#D_Q zlMD~o00A{k&HnXP=j*d&<|%ybV{KJcOs~^MFBrS#bkvXC-QB0R+sSRaX1JB`e!aH` z>rb|cEPn5+PfH7ntySwzu=gyM=A)DOGFd8_QtY?)%}?Ii+S;qu&ezuRGjgFk6@(aY zGARZcjA=VUY~ngJ$Vtg-LE|S9+BA1;ZA+d2f#!g;;5qFjt37QsWyTy${~o3As9dhK zg^gh0W}94DvN&6;MgBlFkou5STRwF}JCnb?IuUcWkN{wdL&NMcT6&_r3fY1GZCzG` zVWN8maw<5>OJ}DuZNW;*<75wjKe+w7Lx3o`sNGWcrE;i$JxNsMReDJ8zJ#q6K-(*X zfh}7-tmDC3nZL%?Xat^;W(=X+{Bq9;-!c9rX7l5Bcz81kIn5Hwhmj%ZY73FZ=((uZ z%XE(!+q?dJkdohv+bNIrc(fzrdS(co#nr6xXT3v^q?Vo-U4Lr}=;T4is(IZl59 zvNAN0l$1W_vLd%;d2_(+gOLVhIm|LOUSJzvZm5QKAa>Y9wF2(J7(L@To)~6B_`=&s z%q_3w_a>wmno7$xMVZ{WsSsxgwd?)#$AXBWkCQ1%6XZS;pM$;=5Zb=Zsadi&3Yxu?1&V4VKu z8M!}PSq0>Nhcq&7+XP znW%1iolw`(9bt~RrD8O*pS;EkHXrPrEXD?$2l(9a`qanOIA2|EzA#JM}LxfWxO$C(cXvFp=@5{e<2#<xdK70wl%z+di%iQ4c(HODW@l3<9xrU=Y7XMP6%0JbqbW33MBmAd2 z!lgci8A1U_@gL~5`L-OHn}6cKNp>iVzf@P(n=d>=AYi976F^mhL&`~A(vzq#5tp8* zuq}aQ{8x1>gk(`)-VaFYOLYc&k%R=z>sD{)n;*0mY}f%pgu>uzT3SXSBENtCe(L3a z6W-ecrC&+;{kyyKeYKNO1q~IIagQ{0OoW;c3KaP58vm2AwyrK`_V_CL^C_B~;WK0N z8CRp}N^M@($qDWArRp<`|0RzfS`rYt2o0V0iw07B?E4k7=pGbMyFL7~VzWsZOx9R+ z)dy3E-iU4fQ0BR4=7-5A%uoE8B>LQ7wO~#R6Ft^A zj+j|22NwLGSPhSdCXjZn)4^`cFuCXs?XZ$5?UE<*{N;04paB;eY_G&GU`H%MbI{l} zKSru-t~XXNl=63va;Rhzx}#i%!K!WFkxl9a;;%+Rd(7x|MOtYyV8An8C1kIO)?7!bB@*1q>jbyb?3Vu?1C z72B}ov34GabEiVGu;m7O7^DAWeG4CMe&J=Z^ySnHDSgpMNCrsb9(;r#{xLRUNsrgj z>jstsRBpn6nHa_tndX_~huM&&@dIU?w(U-5o^y*Sc;qEg&BMnQRCEuPmZc|Bc~Yeo zP$`S=oY{xN&6*LHKB(Dnj`8wp)0iNwT~*`BpTg0swq8-y+TKg>G0j9%*<9mhnRouZ zD7Fh-5Fmu4HlK9*)V(rGRfmTg*jS)UFc|}`SQVDPE`mE+lzXf|vo)w7qws*3WsXPa z_>5DD?xa7TGnitJ^DKeg5+)RXw!9-s4bMAkk*C*)H?AAAOnxU*O_0*(DiOe?3Z{Mw zaqi@#`J}-cvDP5jRB*;Q&5r_f9O?=cpGlZb&Hv-SNS59!$c6AF9_fE8Ug@j20Y(8I zgc!YVOpLMhkO;u?GeLCQxY4JL6#-(w97E{7F5Y#Ar|iecPmnR`iBF6YqVPW^BnFB} zgC|LhNyXCR#w9yA!_y~8)bm3-|I!rfuN#1o9|H(6Uf1E;Ixa3La>OtG{7)cLr2xEW z2=7N{@8F6G+PV4pZFcWlb`VkD50%$L?~g+pu8gCTlb&FFuc7+&^>xF6sndIx*Yn2f z4fo4!{EuyX47*u)?Cx3}|+x6wZt-%N$ zP-(w(S4sG*+1FV@7=85i`zp*RbRmm+@lAa#-PUcabsHW047GvFp~M{&7}hHmp1K&J zoW;$6{;2MNb83-nDz`#;Ri&dl!n?f_*# zn!i|c5fKCi!xhu_J;Feur14I>p)ea(7Ld)tmWUV!gN=9LJDX*g=Bwm9Vh$i-5vPZ{ zVnto8H>7J;Q{$i3_?5OU9WM zj>{$H2*&}u4Vv9b;hsV9+@@`5!Q8_emAlV|rWT5cO1@;%2=vO!#lO_Z`c?mBQ@Ly% zpC{=?za~v=!HEsD5Ay=MC2c91d0q0DFv~3PbxJ6d%5Azm3MAAFaeDiU!IbOJ=}-Y1 zbyu6)w_DrEsJPgBzs)9$R7ptg@*ZyBRmdeX+8CGC!5;EA%MtY0Y|w~`k3l3+8P_WL z2O~yb=r6u#4;roBuO={ATEJgLwWrnT!*#f%q9f$}jNNT#ZKf{kG3(*G1IIWJZy)ee z9b53BKU-`2v4%g__qH}h*_y8tGR~s}AnKaB6Vl;~j8>zIQR?3Q1XaP@R*0IXxfI62 zWn{w(W;UKP^jXG7HMIBh3Cq%yQ7%ax0jrs}3VSg9@s}``rTv)JFhWtb5XDUX9f9!pL)7G~he4(;lS4+E5KD8Xm823a#@2B(CS zDCl1S(Aw!D(*M6@`Os7m03E_P4F9(*_gRnPG5(Y#hMqJxh17&}D~K$zkJN-rt~mCW z(!a7)OAf93SC%Y)%M#bs07la1n!=|ST@Fzfy?*n|CtV4W zB<=0){?z%n6aIOgbbW3r*tbf*r4}$5)|9d)DDl)7zbLdGE;bf(h z0s>ybK+%sg5|m0$7|D9SzD)H%jA)$I0*AkEc85Eb60OQx>TghI;m)vi*I4uvuD&$I zf7cEISQ!L-T0FF7U3+dh0M4+gJ$_w=w+p)r39TZs?zx+ZKyJOx(|hhuhG(#x;_6UT z-?t|=tFyDt`lR1|4v!AN$j(;x7M`9vyW48K=l^4$zRr&tFXdbJ?PrkSp%ZZM27aRx z3~xp}tn-fxiCTR)%cv|V6`_83y1&(Il_}3Wnog$SJLnF84RRv^pk;6ATW*BDjt^`v z_h8dRZz=H)P+)Y)K=k&6D5cEf+36LbCf(3?UO|wiqOfig^twq$a4$dEW+N^=gi1xa zRX{@CODDIx!%(tWCpJi|B}V_Ai(lxM@w)%}3mc^&98GKZiQCI!7t`ksalguP`gmhP zFYiENz;tPLP_Nkvuo^QB|q@={Z&qLt;`#c0reTFjVPdy>@kQc@xfe8!# zE1IkK#spSDR0%F12xjw?i%S-d0ulUwl@wbSORX)nPdlP1g;|+zm-u(rRtjBzhw^W} zxfS?#*H(N320V7z(s(Y&G zPm8#Y>CqLmwx-W3bbNeB@_92P~Bh*8I^b+hD!cA)`hFjVhtM&?)QPXNRf{qfm zwVyvGH#`KJoW39R5=r_Zo??>1sTB_rhkehL#B{;bYTRdjGa`3lPVtGoi%l3Y6i+c6 zWQpUPFx=;2xe}Q8mA1*iFrR3Mxmru7sgE8mSrbl7hL)hq01!m`^wTFpCXQIlx4Yxh zF#Oh9Lp$wJX5Hk*CO@Z3)^$b)BqaD^iqJO?#dmQGizul28DOrq+P9(TsV`qV6w#*zr?FEaJke^7dYn;I(C_7neflDgJV?WIDL8 zOGi=o9Z)cHlDD}8Up*FqIF>jn2~=imYvrzTu|K%1ac~b5%mHx>W+x^tFva?ggx(4@ z&G=L$xoHw84+;VQdD8bT^VV*1PH4GJeyXtIKZfHhN>ATCCK}?PjOqZ=@bQ|JB;=6b&L-plD&rspD*iHW|56tz zD8K=$l@G>1iR8xmqqZl}#%LK01cUpq@c2F1Low0?F>aFwg6u1e z42BRr($6I^apJsrq>K@$U2qgEaM7S3U5ok?TJZ-2_T+MBgy=M22u5x@B^Z$1-LLoNC>LlBs&x72=d@V%oCM1ewE)>rU;4Ia4#^9D#O|g2Ujh(*pgZ)wt$SA z0ZOR}V=`~5@B^8YbFVfm19vJyg-TK3uLxz0g!H_DcDF05Op#I{sEDD0+v=X0v%Ii< z&A85Bpm?+>We(-5gmqcVehx}-)gUD)|z#f`!V(VjxD*Ky4?67H=a4k-sd^UhAYZ&o&wcR zW#z@ab5B~>R-KcRy{pr%Drk9e?SP@ylZYd{(rf}S4k4(RM{P0m2lAd|c2flN2-k{X zYmaATV_&0vSxs1W{qBQQ>ET_=g)5N)T&u)tlOL88y|I8l9}L85@`$cN(| zxAF8F?#B(=eDdFKx~qkJ&)z{S%R)ke$0sL!X*QjqdwYhSZznoB{sU-wzge=L5aI@g zr*9^BF0ylSegY91nwmuNrfIR`qzhb+3X(vHjmdZWzY=Jg-S4P#b8|sSNx?iW=f0rq zu<-D!UU-JBj)x5qIXT3MbgsIf_WnY2OLa|l2vTAG=Zfn%wNi2zG&|xwWK?qKVhIkn;w!}`h(I>%@{paiDDQ6{OLuDxuMObfM zEOCf1!D|1!#vZ6`hO@Txnf+AIXxOfZ_@d-+s*JhPod_K_?DNYG3fj)2;4wh8S)Zp( z`~V#|2_%3kvQk^7-{p7L=-9;X8pyL03b17>M$4hy`P3+CVjGCWo<^`Ym1DQjC@rq! zOskBR{y?I$RG*1z>E~5z=4e!ns)9939TNzAS>!VnN4jHMwXQ6UqmsXR{>d}yhq>qc z8hqz4AKlEk93xlhjX&}HG+pnRFJ7q-wwFtib;60K#rt;V-nS9$7|B>Nd+E9ZBn=qi z#*{+3R-c>$D0N;zyGaRrC~iXd8#yO~_CfN%QYRAraEf%BZDcd#i1lOh{vb6G)l7&d#L9_%XsO zB91(Y)S8VtLS@BZ;Lu#2;p{htjaUvZ17~K9Nj5YZg_u*LDe}t>MNS$X0O5rTR%jl( zUpXA5fzrJX23isEbzJb^H1x~ffv_)+BAe?fl0#TU_BNYLf&#`r?!1GABhKs(lfH3= zF?=8YzRpx`a80;!invq}BI?}B?o#Sn5s_yTPm|WHKOtsD&%~GHoW8sl{ zYepsT*q5c5Sp2^i)DR}>F+W6o(Lk@WHt*SY##L5NpT$)r?qM$V#xpw>>VpITfU!O0``UiLVgX3QEKOrMvaZcUuR8fM;w>80z{hs?MVhN`7pwj*71SXYA@M8L zw!s_W`$ObX2N_x|>me?a_E9b?Qtrr%FKY|#z*Sit8mL@#&y6!Jfh6TkoG+EaqlUqb zA~R8K%dZfxY3L%C*A97xN>r3mwz7K;L-#L(LXM{7)fSy7Pq1sqxv2-I#a0M?XNCeGB>NrF4gBp~k0uuo1-&X~^$AIk!lC*xc* z)J<`VVZQu@-8Z$YDL=01G3vBj;XYg0opoAC|GK;Jnpink!&j4XF7wZ|00Vj9g9^rWg0Zr z%);14{*IWHF0!;Hf{>?xsRe`hlZwn-uAC&bfmq*sqU4!nM5!8H#-f zHI*YuYJ63~IsDTqqos_;yA-{xB**Xg#DUaP4@0JbVxt0lz_H?mOM;-T~-ELmcThN1Kx7 z3pQxe3&Z)|CLX7R6yvK!&RaJg7QW)%k90mTayyTkHu8+4DS`$AffB0zQoqXR>&yz2 zAq+ZAZV2ebZWQP#(3<|=(dR94a7&J4O0W?*U9%cQ5nnVAJA(NNh=^DaR?_=7tAJ7p zVZu1Q+MLdy)F_d5>`=Zedokx`?y93coR1f-O3aOp5bPl6gXhV4z`; z$#A3>m}DyuFvsMD%(p#0EFY~U!VZAW8M(Rqi6a5G!Ge^#J{65#YyUdZXz(cTu-Qi@ zM+c|hM8aau1fSTH87{)1*RXmSH}f$P^6G>4!vIM?qtSE04E?O54kzPV_o0GJOdMw9 z;(HU?aSj*8MW}GZ(iQNcEvLd1sYJ^_C4>#(tF2#4H{SAWOUXvg`#TBBH3dl^oHH3GJf)94%q3N85lIEotxXS3P7r z(Szxtac3RTU?86s_UreXBua|}w?*1{-}Q_%7)5ZjO-+l@kh(!8Z zT}$1kIEDpVKAchPw-UlvG2bZ7*Skmo3-KXZpL@bCry>KauD9K)6+41DO0W?fKKZ+U zHy+P{-OfJ4DRbEX!2IGOizrcwY*3ZwK8;27;0N8oO@y&>p7&#}5 zSvhQmA`hejf`bGzQDNt|zKktEVw^^aOM|{QF{%wSl8I+z4v;a<2Fxc}x%j z@6TEJfjjEMsj4(1>ppA=*c_rXlVAMGXvjHJS3n!OXFE*nl+Sir21dWL7IZg^2R523 zB$0F?=YIvI4PNN4aKoFa!WGhqlef)ha&p=4VjKin8yq=hRD|CLWBdB2xl@YJWo;Hjau>T@OxX@-NL#pV5c`NV@lWvGTD2<^|9Wo zo107;94+wf#NFK&UpYH#EXSe|=_Kvf0n?MLyrK1SA$k|T+HWdjLdvr)_mC^UDZd4X z;;#vGoD~Vi4;{3f$h=INl>(J724`^-V9-Mtne~K5GjIc7MRFvgea)vJ>gFf<=}`5e zc0Z5$MV8#ymXk=q88Gv6dz|0mGg*BT)IZhN=Hs^#5{^J2YuU)~p&hu*okB6>4mlck zj%CV&tGlL8PtJGmLfMpu`p{gFHg>zMEiUPG2lTX-X2op|oL3-+pdz1~ zP zlSnQiMpW1#qu)tiuv>`c&1mB`w5{qBP%6`Mgi$hiJWDhIATs|7eQXF8B0fxxWXp)&w)n&$|P;!*q^Fu6a_7@QT5?KCk4D$C8Ug~smWjX%E;9?u)c}KcOv%gD5YcWQvOqscG_M~; zrfY9UW;JXKC$Htq*T!bUNc`HD;vjXF#7u&|e<^H$C_-|ZBedi6R7)4(? zT%{#?7jMuE0giW7J6v8n0RuG>i))qV64dp2+}rP`_^Q}R6KDC`IrL$$|wg~)zZ>`_OdTgK(DM&oa?RplJ80*AyCA_hV|X^)zrKu><@6` zm<5ZGyS2#p-523R2o3{cZG)ufpLAWL_yYTQcdC_)O!P5VXc|v;*j#V6Z^J>X8j`_O z`O=~gziF7$`F!SXo@j0i6G=@_dpN2Hs$b3F%o_+8?NdV;ez8+lKR1g@KW4bU@c=C6 zvwO7f8Gb^hMg>O$>V)-*T6B&?&1pTYI$_^Lvc~;hWUC08Z}i1cBE289xslSYj$wy1 z*Rt$t>+H>u-VC#I`hqm1E{N8We7BwHj`W!uomQQve;c?|W8^i%S|XyKu>po2aTAUk z4fABWd46Y5gd2xQ&;cboLHk1yg@{h{JPJot!j2@QJb2oj>1}Eafp%N6-xZHu)4($_b$s(1 zLZgXko+yB-3}ByF$kTF#zn>Z?ZwM`vVt!C>4#y&SBRu!e8Y~@i;K|02*l99_oJ+LSn!{_T8~mt zWU*3ITwJ(1AJ2;#+byDBi0wl?B@}#o1U6iE5nuOp-pNF`%`GkaS8ci?4>LWGjEszA zF=N4wpamYmuCK2zhkRa#+TS3n$pEM#vJ0B&W=}p$tgW9~sE~ta*4n;0Tn$NgqkwSdxaok*V*@pzd37C zHS`3Iknbg%;Z5tsgdp5_W!Vn317|r)RUfLI3UQ!SZV1$saPNxQ7Jy<*;r?lkAQven z`nTcL-2$HG>ly?t@K}muoA|fJKuDbOx)6gH0>eDVyfa=w-xHU`Rh&kJHHj*7q!-~) z5J6k&=9g7$V$y(KJ>IRmXi6c2P~Tg)?! zyXFb5cC-8*-tdR`aY@4QA-fU_;)|tM41U5Y;doDoXd{doDmR(FH}C!kiWZ=)1uZo@KXrczITZzbW(0OW7(8Q$*?eo@W(b%7ei~bMMtZU znX@Y?Spim_pZL3Xva$@}vVO`I1I`wmT6>%>Ryx!ge2(~~!_J0M154;_f%Cj!R$BS5 z;)9Te9RLh)bq9^u?=B16lkSB32;tkyu-Y1T!u)C>B(c!>d?pa2k!CmzEDe&0_)3|H zhl;f8TRSs1rUd`|JO6+F-OJK!B=S$Ou|t`xg!%mO@9#$(K2xd47FzGV=<_iIf6C6J zh>h+H8D@%Ul&F2rhkJ%;^uzOj0dJORREKw8$K9Tw?)Q6y&r^!I%-?RiMEqB&zh(mf zsJlMTvsuCw>INqZ6|#fC>#r5+~HA#7pEm50WU@-ZUe1dRj;3_3)%1=%H^>xV;j&wD zYu^vkk>xdj3*!Zah<9isoY>+Uo6lzv_9OyOfFWo&2FsT<+?6^4t9njb8}pi-@?}if z01AzkMYaG>-|LZ@)JT@h=!Na<8}ZrNHTL{k!+`pHmBS*!oDZim=jQ!vOD-Dk#)%{x z7RV)iF$~nb=go9K)C!!N5kI3^4JQm3n6&qn)%uI!5ODxU=*};wY)A~+QKAc~$imS! zX^Hm6BL>bnk3D?Os-A;Tv8e-n}sZx;`3R+R?HD~qbX6iM@l~9jf_0w1hJ&%Yl zhiVN7DenRG;4wLC!z+t-NOCDYEB_D`&(w3ki8wQKfzj1_G>GlSZ3(c)m0zUJ@=^S-@k5}*KI%i z!Vj4}A8-gG871c=0We|vWb1vmCtTmU9?BGS`r`;+VgHH6J%tTKr0-NlG=(j$5Wzajt*#KUOQTI-E{(=FSZGYG_=yFFX!+d-KAdt55Pe zHXY4TnvOn$U2pOY|N2rTif)_0p6rh)6p$)4=KHR|yMGUmi3xSJ(dzSvw`hpS^z^js zLGI<{fQT3y8(XvOHh6AsuI<5CiqYwY`w5++voo^~10|)Pp&@B&Yby?}o}S+0OV@|T z!3VNHMMcHqe3f?t^$Xf^wa44tV$QsI%Bf7iDJu(0-|Lgs<}+5mzVkA#wiAv`=b^OV z^Uwl^Zry6O@^XztHS!ZIPe;i@Yi;Ua>okeE=ucwI)h~t*SK)#i)xW^r1ZKNWuEYic8cgLUF=NzDLF554&{y$} zOe`r?M3p_ARd?4xo(EW#ci%~)&U@^ZgH*^srj@Dh->%QpaWSU4h z6s-%=^bN^L+M~Z{8X=-VJ#3q~6^IO1AvXvTIKT%py8xU%GfzRLZa(QpQ$XiD>3^Q@ z6F}V>by+mb7=kn+*|}@sBoo-n(seJs6BB-xw-~w_(+?4=WLb7y`od6pV>DrBRSh|N zO!_5?CYaRTOBn&Ue=E+K^OatReAEp*^hiLlL5R6A+Cg@cb0v^pkEU_7uZ9B%zw0pj zD7pSKVEaoth(I(1&`;CJwo2EWUl|0<`&@*v4}%?6E!mC=)KCpcZ?-C5t?7$$C_P~` ztlxd2!$b*co{$}FMdhGzy*eR(%sto!kcRCjn^rcE-1YqhXVKXp( z{bf(1vh?ML>ymWtPZpzFAjO6HE``DSJ12fVzBK^w#Uvc7V zgR0xsBMK|oc?X>^K?o)-s2`16fyxVWX?G^zI)!X0^Hkf2xkL$_<>aYZhs?kCc~hU; z7_u{(qfeOI*b3^nXPTU#&aZD0-->LJDg1oWvcAal-+feF1Ju9ZZOaA%P(QhQcwB|+ zy!vr{s=4hS7}$2mdikQPtep5!(b$M}(fM+Y2R_r=3r_!|J*2g@Rn4`qpkSLN>j?o3 z4Q*jd_PG7}7tQd*#2`FFd-d_#>nra>22b$)y|Xw)itM1F-nWv`L1&tWZ@bch&q)g$ zKx~=I&Qi!45iU-k01S}*0A&GlT@Hb)ai?ZXJ6O}|l?-%|+8oV;N79&fqm)>ioH06U zvZCJ){rqiA#^bU*7aR!O;Oak&`QgmtUDp1SQjR@S?MomEejYkd-%S6T66NR;BQe&Z z?k0&RNA>j%kd=#iS0;uq;WQzUhx{UEeZ>!<1=5I$>qiW3gz#f4>{HrL1;E1Ij@y$` z0E~Lv!lNUI1Lq}z!|HwyP|tCfUF(Mo#_#1Kg_X*<4g%2u`hq;z7J zA3+u&)s?`b$j=^4#gi>^*)emYA{GnB4r;He7;0xHfYuMoL6K>n@o_JNn$ouxueHR& zG;@m>6WbXl=#Mts4Jg-_)7~lFrn*6>j8GK;5Oqswwv_GgdtDs4B!wO|Fvkxi2x281 zV}9o;I?wByK?v>jt5skzJd!ggR(=4Q@j?&fL$}-i1Z#oVk1Y%uv42VCMGi&noU}i| z^nF!?8Bt{azk^*yEKU+YhMLz-Y`O$T^J_J_VgeO723VJ{?->+28Q>|w!(UiaS`ZG7 zLxqHkxO=g|C+c9zoLAVF!9t7IFQ9Y>65_Gm_yW?Q7={oiI7CaxMdGWPW1#+tE6${F ziYeR#2^PiaFS(Kna(`m;|2t{t{5NR__=ow53Igzr{QdoL@bL6&0jS_;t3!s&LV44^ zpm0*OP?4SK*s(~j9QzYQ{v9oA@PXJ3S>vwr{% zf1;$ahxDRXCQPJT1bRhk^&M?^Qj3nWs#NTM8dfvSE}Sm0X~@GCx+w<~oXu#4y?V?~ z^AS^tO74V5C{-+2i(SXZrQ#YI!bWk@WA-$NTGI^m!vA?=)bEeMnT-%)YQs(_dErg8 zu3NQ}QW^gO@KntV&ky+;Z3I>Jsnc5c$IM($;Y5FEJ&6URHa0v7MLO^%Xh4q~x{^0yHWiumq7j?pexG1h$YQh3)G8n@3-N zxHRQJ1_z`_I~)!*b4wPi9A2j?6e~yibfhE3iYbX*Yja+GfK)c_VT316Vk*Z1ztM+)E!hzHU8(ircoQMCgnI2E z^qok1V-%-4C&|fl9rC4S)jQ= zGR>-%{0e`$JV7H*+!>8WKa0G6WDXN+E7L@+%GPI(j!rYg71iD0#zbA6ot+gw5^yw@ z2f|8wsfj#%?e`6m;`cv{wfP?vdOnz59!bDT_8dBx*Sx@7I-PBL!JA5T5_cyx&~@&J z-0cK?%33&W(G;|}!UW?szM5xwufQg#dtLSMT*!>l^t_MyI3D~rdOmR|<@y^c*+PRg zzKBd1LJ@$C5ZIcf+@Wqs3qC(g=;&L>a>qmQ;jw+omowVEieS#_ zi69O>dr|@Du&hNX$&uc}!E0}PJ%`h#!Ln6Si!8a7|B{4FOdcUX+LCzHhNHNmL`&Tl z^)--2h1XjlTtXjEo!($^+in&K52JtweQU_o~Zf57S#w?h*;(wQ-d9j(<~y2 zR0F3tEG3~^OjR0a5h{(TLVj=;HW-A{nX1dqnAbPHoCcyisL3+!x*q;W`@THuKb2M? zV72Lkx;5+48XHVP!Q^UrIGWyPn$l-vgpL+; zZ5xXcp3d9nfZoim>2LZ(Nho(HehXykP&N|DsYc*2V9~rw99{VqLE*Ta?MX8;fXs{) zhjU=%#74~8cA205rG_{$C53QCA7r?mQZ5l98;DMNG69!6k9H+)JT{=0Xh^}_^&8Gg zIFp!=XJ@b6^1)e8p{p&N$&0PG!NXQt`Me;x6P38cSWb46r9imI9X!Rs!;bL|>?(qW zd{ooA;Ajb}Ejb~Wzf(vzqP(Nn9gsoUO>#6KOA-YmNu5X7P{=KbQMc43Z*0=qvyU&J zRPwLa{igy&Uy%Oa$ndfCev%@hn0^gqYjg#RYBI3Eh?fv z5!9I?Utxkfj$LEc_RuArB#S+m__b{+o=|~f{Op$aOH-nhU{secVT*Ko(t^*?l{zFO z+zBJXPU_zwW1J}nWw?9;s&T4Lnw0@9Tx}!D(Xx=~#*bG;fMnRc8;kfO;K#g@jF2h{xOY`808*isRs3#oq}L#A$G}ql0BZHX>BkgF<2l)cUY8 zOx_yl3jeG_;j(`mZbAqGqDzR;WIY<)g1eK9QxOneH{mkFBplQM?|gmFT;ERmQ-78Q|*RR1LfG zi1kJ7RD0sGPfbGM#BH~2m30L%Qrwr%&uds=Yk?^7w3%rRyrFqqPuAu~^-g&y)O4%m z7a4(OauRZUT6UUII(&l9CA29zukvo6nNqcRlicDp%WOpj%`=+ACqUv!d%UeZn35g- zE5fMRFqf$REsaSqKsCw7`(muU7cEppf6`feFWG!00^_f+dJ;&T^CSDy$rL)!zQRl~ z(Nw>VU|al79>7+B$RuFBQU)0iGr#z-Urvz>d1k z+x_EHCklJN3%}4+%{%%&pi%`TL!w`kKaBLjDKKS|~CcnIQvg zOAl0lA6WeS9Ffs%XCVZ?dS+|k0$_wW8>(G>tC4PIcsR)fV3bTLDY)uqh`~MA14uW6 zz30Kh0-&o&oShndqwkus!z~6$QrbWmHIIBb(LTgmk^WQfW?b{`b$=Kp=}WCZQMu5X zF2DQ;vK2ck{>r=C9inVO(>Csawd;QtCWrTu5RB4WSM47%F| zjw<~wuLfhX$yH}5t`x}==LB(K6~0+tM>YH2u)!B&FSca4=5lNCHC-fmP_rUnZ|_^2 z6Ve6Zf-ZR;{3I0;F|A`o`d|&uRB2C`t3fcqq3R+NnN^=mN-zpqFWvjTVZ6We#^bsC z*yI+8Q`rzx$FzR0kr&-T!8#{dl`YOJM})Ib8IqW_=}!r4ocf6Mo(z=OefGH{BhroD zsKvtj}IyfkP&>>1JBqkQ9QqbDgHod$&(mwg?S8u1+OR|7Y zt0Qb(U7f{ojBCQMDkTPJg)3z|G1$f+L~7ipYaTEnPhZVG$Y!PSI>06$NOUury4cWWcCDJw&%T=7@A?&Cir zA^L5tPudAzP#a01Z-;ol-V2fl+*n*N_>mU%HZ3+B;VcW`SYSQc|NVAJ3y=h_7+=4t zX7{`S`3H}u88g}6*?#hRESG*R^5hwo;Yl`uaoq*fo8V2Y^n`ud>}dbibo1W|W=MRLSR=>fk7QzguaKHTFu?+<~#chfx|5ZCg%14wvOSjpiS3Xqs(GLV&cxzVV29c30=l5?5;;hNAC4f z<^axHXrD{ykfQWkLAN`dN)BV5bAXFfvJ_JHxfU8`9Ss>8DfI~0oemlOr z*No^&YIo0A<^;T4ohCpSC>&Uc%SjEw4{<&{{nHaD)fV)m6%e@?F8Vc=qC|*4+GZe<#H0l!>NY1t z*8;U7GAyx1#$RN|oxc5GV+nwY#G{H^c4hYG8yPZg z+Kw%RLNCd16;1Tt8|EysqC>Tj&I_w%6F;5_dV!+DJG3GGt|w$>-#B{RNxxNbVcn&N z(!|RBp8#Gkk4w%3`4!G`UnTPr!ET2Kn-TC`m>ugbNZA1jao}nKoV3zX_7fXw!Bn?5 z>am*CNS2J~#qI3x@xW*D-JmqY%TUNQ+DH$l5i36(Cc`VX@+b8{H)cRC*l zS7~{&i30-z2sy=_orETnnNCNWcQBGHEGz&+;I+?8qBi}|<0B^wRVc5Wo!#RBN7qQZ zmXsjz#rq}l2g=jalf{ZoiGbTti0|#=ZZv}lH*reR;NYNOE%|zvPgcys@}xHwkMpUm z*{U&CHbnloXjbF6%U?z4vR3R}iMlnrl4xON2J0i_Yh!W$?uS1=%LeW^W*>=4*Fy-# zZCo=Hv0#e~#%jksW{hKAfBL4Lgr+E;hJ~zC`xBJq9&)+{VLxclI zu^5BL=08iO4-eXzwJ6Zyr>1pN#Ic1WM(<4D3Kv;D8UStf`{Z%H<+u+)n?tqk`t9x-I`a3}tC3Xk`;&Y+q9yFcd>M3f|< zXLQS_MfT}n4{G>p5t$f*w$4c_XC8X9Ql^xdz`pBs$w)_USTHV#m&!ssa4W1R@-qqP zW(V*Xk`6U-zGDPAn9-@7%Glm0^X=lGcYC|vv} znlVEJl|~Wf&S+o>Upkl>RiR68x&%ivc)5e3!yiuC0Cqe3QzgSldU<)d-i&hyg@`k> zU;3$RqRJ-Px;3MW7~ejhRFM!9gX?@eFDBLD@M&9zs$yVb23C2US%idYYO|aj9qH8) z#~j`s%~DcPX^IFELjZ*_+#g%K-?%qCE;{yooJ9qnUk?SM&sG1)a8N{!r^7%@0+Ehrd{T`8FHtDe(uZo5jD(BzC) zJ%~f#a4Cec^~fRA!ps>~aP%&oCHnkS(_*GQUr*vp39T?njY14#*QRkROEb;v0}nfc z`z7(zp>0DPTXhm4=SM}4vkEFwzUxPjCqK#`|AK!8Z&Sa>yWkJ@#|+%(0L(aOVu+59 znJ^YZ^;;0Ma+f!KC;kJeWS$XHQbH4m{hKd^x*?D zc0tIr3(}Xm)9epMc?|J}5S@tjR07kHmTd4qgsh$h#gL`R#;TN!LTCwlKS@8zel>9o zabc!}pLJi&g|XqPwH3akxTz)*kL_BP$Sfl^;lbN6I-Mb&(eRBJ4yT%nhNwoO&wNJV z9MNr44F+fBbM zBy37l70i~0Jvl=2{hp)=a@MaBwR-hRYaTIVo{O`9(+>q-x8^Gf9^Nm*x9_BfY*%o15#$Hb%PoR#w#s7aRI}ROg);11?Ynx9fGE zVR~aD3Y|heySCO|jf>ddker&Dx;LDmvsqR!R=Qxyyg_#P!t25V1|D8Z?V@4v$LHlf z;903Ebuca{9Tl|Uc1Xa=%F39MAQ?o)FA(qBZ*rly&W;b(S@~wePG9deiMqAAl6Z)v z1nVjI7pL6;$6Ew{;7RbMB!2#{e1*{g{*kXh{5AWQzj0vm3t~eiu^=jpC&bb@GM7jI z8VJ0r%5`115+Z*z6`ygnyzKTUwKHEzUFdK z@SRVNV2qpUUIH7);{Nton zW(in*a#{>2OD?n3TOVk{bTS5^vZu4^_NqYJe>q_En7seU!A@8mEM`kcy#8*5AS-Kd zD33!gW}^TarsFqY!&-Rd>@o5hz2EG9TXSIBC|m%~vRhY}#s=xyeHv4U>Q@?cjz5~9 zIjaf8Mymzrhe>pc|G^r{v6Rj~OSZMn!#fCFYVG+JI*osiG<{y`A zgQDBkgCPr%@3QHI-O$h=>zs3Y>xh7e2xMo+l9H0L9$++?%oOwT;`=o^dNsx}S$=Xu z^tuI&Lqy~vsp@`G(KNNZ+#(D3Ml5b*WTdC32ln>%hQJhx5}%kkG9vZ5+VzGnB2Bzk zQl?SWDksRCBKtTU?H!Pkf;;FOs~0+nOa{1G=22}L7x!(l_((%Uu-Y_$cx-IkuMtxH z#DMZgv@!_hNV`IUaT~iqic{|aA$})|wFOk6WE&(_fe@`*w1;S01<=>tg1#xBX2U@6 zgIhiXrvrsyC4X*ev|9r;z-ORWxX0+nDrZbK%zNC_=yDyGIjPD-MTd`9pLx~Zb6eri z&CWOzH3LkQ@>T5K@rF0k7IMYPg6FESCCHH3@fQ2!1bCuKub`F;AMB)^QEctXnv3`^ z>)%&@oxseV_KZYGiv|UGP+Pa~bA9sARPn#cKbIr>qXs&l`k~;TU8`}$t$5)`!ecN= z9Lnwnr{!;9wQA(B8m-A$ngXVUM`14A(Cv?0KGI()17HSz`L{FJaE-m#g*&q>!noc5 z>Q5F-VZ*vVLp(mNcjTA!`HBCeh@(Np#v+(H*Ow&fQ}Zn+QW!;ss;`KO*j-J}v(W#< zcZ|E2i{W;qS*FTg)%jCO3OZ9M9-zGEhHx$~Yg3_4Na#=7t@W25kq_Ygn0CeN-S>B8&YPoK z?xf#4yEt#?F_tykRm4yVAgGzJxz#b#nElG(E@ER4E*s$IREu6!Ug!E#h-C-L!B$zR zr$4Zgkl(PyslXt+%Z9M+bAhz4z7lSu#AqU{WKOSQy4nwap##D{L<;GykaMpDK?$A~ z`DqogP?z}sF!Pr|aYxU-FU-IMh6I=3FlcasI~g2;1r0923GU7iG`M>pz(8;f5}e>J z!9BPIcYSK$zw4ZOZq=!}ckf$u-=zX?R{y%c{r&Xn1-SWoGktq+&savttlDE%JrLrv zJHe2Un8@!!Q7F9|Kj`;(g!u?PvbU||>hqT1Ac{S2+{*NdvUK_i{pqr&5$t?+yZlH# zUu)Ar&~g-H>QkoI7>p@$h0xX275eon;Mz-66rk^WZJIxr%4trRUR7O9B!=$+O0{%% zCqzO*0?(#%aBv(YmV0-xR85*)7{7*qOsOKCnvu0#BL5=={-_4csJGGYFmg2_CvZ_uiFaA+8bs0JBIRBw_ZOO#aM#g` z1P!qYCDl@(8nLq;7n9j`K_moS<&0y$tt>94Ja=`)-B5#{s{0&J;7$62zFp?6pE(+hYPm z?8I8iOGC6+I*t>>LtlSo=iv>Cep7_aFuishfpdul%X5!})?tdB&S@5rmSe4~xm|9` zya}H8J44|BRhN>}2khl@Jk5-?VSQWnVD9N5ZGY7WJ12~0OSH+N+ZZK+l?s?Wkwv@< zMsl!iTgF(xAJ$Ff1J55;1^BqTnradh5>jea9ag2dZeupBk!Y#td3z>=p7kf+9e|T* zw=$&jNMdM?iL!&A>Q>_#kX3iS@v*W=$ZIAvnyujayrQeAq<`tA*tGLaBe%~Hmm_G% z#xZ{Wr9JcZzr(U_zKHZ)08DE49Cf zo^94zC}HU)D&qS9a)n({lcCqyGz?y;P_AafPm;sAB)XaI{!@9+8w=RaLQ4}T8ft<= z6)iy}YGuV3Z_{h2xiHV?x=)Bf;o7u(v|C*MB_>2>lR6IYb>Pp~m_OXeq7l)Hh>$N| zb@O5o6E}oG&r(Ock(aNB-3X7D?+@IPzbd}F`-{mgAP~mpdmLWxby=p0IPU3*eKP(P z_YD@&&Yc)9t81)4C!L)zE-r38mu`q=`i*~FGP*ldyT=Ig>R&DAA zG-KmRhw-LUHd{vKZw|;E9dLR_#m>vT&`1#GsUXVO%Z3g9d=ZGHuuA6Wf$Bq#xFiOR z(pnOW>(}~9yfq;Upfh_PF3o!ovTT4dTuH96019L^+rqU2bM;Kmf4 zl@fmJ`D?L2nIC;dG-1KD94KZatvr4Jah4vPUH=y_DvAQ;PT@rKzB{;3EF3FJgGAL3 zz5s}H$ChyFWh?Y*bQ-y3cxkEf38shOU-N8L%)LGuhH!s!_Hfs5a8IqzWk=6-&3}!` zfy79AtuI<-Tt(rQn6G4f^Y62Xb|o~t$cm6g&s{Akq%&0Wa=vEXL0=Wg-}M#a+CU6> z%|qS`A7u12b2~~#W4!1}8lGbFV0+bKiE($HC^<3;dK=PzzZZ|_@Oo7%S$H~p1idxK z_m=e<$+jlcL6c^G?Qy>D;7(1pxM>IJoYwJmodph#7fgapIp%3+zp`oB`fR^%#S*sR zS@khxQjt16Hu0S00LWSrO9bQrID#fw9LZ_H*FlYiad?0*CvWVob_lHfV7{nwbsjcz*QlBc_)iJmK{p%X>dvKDFmR>u2I5^Za$D)G$s5T$T z`SBwpHa#xx%ZSf`Q)qa&@k0v-5)LIHi>Z}>&kfi6_wOMf{^iGq%hW-Izy#-we*7Om zm^6hCo=Ty!)?;BI!}hsnw@8&)N>WmAx$k)~mb+!SSz&fwGp*gd^YC5~)*4byLfx5@ zGzO(ooh`#<%}d!rS4-^om{4+K^dm^J8=- zL0A>f!{)xJUXEFPZi^bUU+*dxUazgfZXrW9L4vkh|2B2uTs;d1vc|Sun~C+T3;$$W z2$m2yIxu&HtI-GA-~PP;A3|wY)4kzfCkBHnn1y3Z{TS*s(!<{)>B6#~#^TOV zgHxH)g_JOu0YIOjjh1lz;>Iz-+I{xkg!q+mY6DOHA+N=lVMEYS1f>uyi}AnPvaf)J zF-1}K^exBXBmV!Jm_m6Izvjj8ZTEb1=FL`Wh#iN%Klc!%MM63{r);=!By#r1~gwM^xF#&Q0@Q z=dmRB(j|*g%k<^qC4KFjRpJ#o)`NhYq`t@by2gga4GC|EFlE zw28vMk;l7{%Fokf>XHV2_bwJ(#6ss2s(g;?pyDWHb@d>*WL9>U-oH9=riD2GfrFb$oZz4_G?||t-7x_;#w_NL93aghK#tZwO6w=?6(T^u>>5#>F&+%* zVV=YE_D7gz-wXPubR|Z{82_~V@d4=m<>{irN)-`DiF8-V$~_$_Vcp7EDE7mZ^l8nY zG^?~%ucRo%))?GCbc_EoIV9uCop4l7Q1;hzqs)0*MX1Hj5u$DrxSjX33ymS?M$OXy z4#Ov{~L+z<30uClhG}M-P=4-yK0+NHa7y%p8w=lBPt33-d;=^Mw4xTze-~5brY`up5r1oP+9=NLFKrj)QfGO~)jpQOHpbyRN1 zfbcniu;Pw75!$VdUy{SQKp1%U?Sxtwf~27;*7HI~xUJ_#;zz@`g#UT7YccB<=q>@0 zS$9YvvlM>wc#_;I;pHW$8rUo3unNo}jj$hHPc|k>};*rH{W`v`pAnZRXXE)~xiyjq%1VZVaGc!JPpedHj1< z5sT@)cU51De^r3e66CF0jp;oR&><#Z_97&UckaD_nGM%!`yX<$>MuRhB$f=%Yjm(= z3!UfHg0<&0I`Q|AIrrsjpYRqiIF+D;ueeAmft93(b^|M1Xqijk8GjTR--BNVm4`RB zqMRUcdU9D#$fORo#}nO>%@uKA4F|nvioRE`^!np8&*(NeJngmh`xdT-Hz-XQn>7L#MiJM$%=z)go_B?<6GMy* zeq*o>849ls9WBt5DQJi@ll(R&qRm*p&50{-X`B?dA^amn#a4nfTN!11(-6zE@al61 zs}|P@pV+>|D)c>oJmaWfUald#EuN(rT_e>W-37Q1Ov zQf-Z)v-+J1OeRx7u#b3wGq!JEyaE)KmPS$@ST8oyJPlx4unpJhPhmeXII%qhQct?DAbRW0=lGuZ z0k0a&4j+3}Uj08LwiYlLdu>lzki7u4i@aTA-OuwXl8K&fkC_!+y)Yvm@pr!AP4{~{;4ehvFP9KmenGn(u)Ck z7{)CZwrwfMd~*QSFygzWysx0u4pYjv!eXK5&fV$q4dGOuVMlBc04W^jgX+bg<;#n~ zW2|UJf%K@$(Kd=zS`Af^hljW3&K4=f0TM=1T8}$r&%^Q^Tw=R%7XI5BYS{J;r*5suRnAE@?DwJ8XlI+U=m{g@W3_ z&qpa3iq&pK6+dg+PV2&rMnuL($rhlw&LvjNjw*(UQ9^N{c7st^_5Dxg32{n- z?{6)W1#@^{5#=q70o}@KpAXsD@7WpJyy5W5#t-BGnSNz z?(g6dtj5(TGhXd}N2XY9d&BtZ1=~>gT~(lq7!0}=jc zTl?dMJ~iPm1j)9;CuU;?!V*&>9yaYBkau>%wZ!_I9_~D_aIh$^W0<9BI+n*zcZS-}!nk`fh|mB{<&1qP>?>^6=o# z^w=cYEVo9Lk!Urz-~9+CjFAJhoPIk53whs%FY=s*Ku~4UzlzwTAHwA_>u^T-eo7h| z{aI(i{2>~_V0!hr57~0^S8Ct?v+9=9xnr|=uqzj;nUhg@hfc2l{WVDa0T-vD5ShUd7bD-37kMv@5EAW)%zuHi zf6sM`MfpN+YQpgSxc}P8r_Ml!kw7_&F8%Q-Bhfb<{wbg6JLA+Jc2kKV;lGHE$B9T| z_fLD1J^#=baW#ih^mU_Zb#WZ$`@+bYl@;idhdFs*iue}F{ zYx`(PY)$w$Yo^80(6Tr0d0cy%S@n_{{E6q4Uqy!Z({KB}q)ydq!) zKfk>NSnka)Kk)PtfBQi1oQC@I=TE#hN|`3TN`XMhDo&r{a08RMYVFbpW~u-oCQi;$ zX$VzqEKf2ymANdk$ECF2ne+e+L(4-FJ>YA3X13=s03cF+e+r-|LUIFM)z@|{5^Kk^ zfsR~;GTE*^2-j0XdYBJp#?pqdzZ<{)N7f<+jnZln9dRh>jn?N{RG)_W4ptKO!EB+L zx&c15wWpOr{DE_&>4BeI*%(zRND*sdJ95*kG0p@u%Cg>S%ZDzjr*!KXlM$!= z$S@27FgtS^f3FTzJQZi~I~0%m79{H`fQTTdxzBZM^Ew*AptUi)a{xo8`||H`1jhqX zpJ)fBOXTRArEcYGTN>$ZhnST|^(%obu+!UcDgT~$rtcgWIh-(Tul33q+^ik-(er$E zwc-O&Tl(LBe9JgN~5@D|a!d0&|uhF6y=q4)izJ#AZCM zH(UCAXJ^0GEqT5&GBUbax@_5+=&7lxalc%2OGcIH=;*i_i}qcwQo^djr4*i= zo?hFZt)8j1A!#`ZVq>1Bw!tM!3RRF}E7Se;rTAkxhY5p9mQY}c2~Rp%t!${ON+F(- z@Hw7}ii+-T&Fl+$fMvBXWPXbi(Ods^i_=z(cN%o$Vlz;)`4gChy|R}koW-8o@GAs? zta_p2Ytkq9KW6?)$~8vA|EDJ`$(iC=fE_4|wd0<+>Wcd5Vq#VXRpw#)USVoB8A#)J z>lLnn+2@QwF2}ZEy%U-Jy5Liqa`w#2KJip_QdIN=$V0;e51q?cF9H51w}sc;YD}-~ zMb#sB&J=}M7sES4HHYhMHM%^CUu>zngpv(*RG)NYOoDk2mr;MA7veQhesVy+;16ia z4eKm7pXA2ct8&m)!Kk!2?)IV!m~}=HgAr#WB%aEwwW$OhrpL4r)gxC5U@HFx>65Rc zmn>BrPhFjW&$@NQb+EG>gMP{!n#HoSX*wus1!ykn3l(cd?7SOY z?6em{>4&9$koe)T|9-q%%LPB@=d3%`KZMoaIYg;9v+N5g1tBcC6eEm`!nPrxdd@~)8yE^IODD<4o&w%i@05iq;!s7G4pVMNLHW8YiKm$Reiy7o7+ z`%HKGEQ}Gy@YfNbsGcU5uInV}7+j4~nEK|}wI>JwHeyXJvRXpM5;RB$oU@)DTa4{J zzVkXn+>mtHxIN6@K~A%UeD`ohVhm&JBp{4f?d*+-7&GY>U6XJ+e4q1Gv1~7@k7k-( zz|*IT?`xW=JYC;ght;7wy}mGFZ;38xIw~xQH6$!NM9?BS*U09W!aL}rz=ktQTG_#J zVbN*v>DAqoBkH31kBbLy-rEd;#*6X_B1A0vuTWcm1{g9-k<9Ji94!g2ZNkNcE0M70 z&j>3?? ze-_77i>WrbKg3ms^$5V2Xos{W%*DcRyn_&cVl>}%D8h^-kW@m);>XS7(PjSKUJlsp z>L>c6zv&;0-ReC8^re|*YCalNHJTOP4UGjgZ*(UIdEaMBY0Xq<1ltK~iEtkXF~s6% zRW~XoakWw+SrKoPTP@y8-TxwaEhBp`ajkZKt%q5&6If-{>FIf2JZ_>ztufx!5_QN! z(OBS+YF%{57JvJV;RhKv1IPJg`f@@;`(f{T+FwVN?&T&s&hSt3W?tAQyn9=6miIKV zNcSS%F>b#NLK713NN}e)CEC^lMuX+eG?hRzLWje}ehL?pk+G>ABgxoEcb?*-7gKsC zs~6WQB4zD6=N5B*$hAvOCALNJZamh>@$*0W8k*B#g%@PM_P0;-{94C&jyuT-GxbX!Tz*LVIbD_{*OSFYOEh#^lwH)KzYaq(?@gsv46}B3In}B19aZ74 z%vYhqe8-C0s>XS5$HN@D1SwA2adX>`Uq19yXY8>VS+`M4CA?k^NXc}YO!IXT_v0^I zPIc_Ac+~%6cauAz&YGxd6>NUNQ<`+4;Zb#fsWNLHrptBFRG{2^%2GE}!?Zqr%vs_- zV3RcWOK3_^P-9^C+{W?5pL1QwYcJ3Au2Fl)1Fv3JgJPZ%0YCuSew`v_4RI9hiLrqJ z7);KOo7oU+5AQEc-?i2yLrcAME^s=k#6UAm<_4knq{eIj$E4=DdTS#70n_vS+HV=A zbs}Zj$z0~jSq|zB`@sl6@CQP`;?0MJ0xmFqcX}=crC}97R&O)XhRM|D-Zyo^p+TO+ zBaG)(_@CFtZ1=UJ;ez({-tiW`bBod|kMmLA)?j1P?uuv`g)SKnhqcdDmc1PO#kEp& z7=;X>A(1F77P@pgJZN!FOd^c9$kAgw4nqf?9?csrL?5apMYQ7Y{%Ow<9IOSx!tYD| z^?q&|VwvAayus%%IW_s^eurjhYZtr4%MvHdJ+NWdGZF*1A2{I{y4{=85A?1y`pRWT zNR4v)FFAY7t@nlT@R@#m3@O(=*ja}8SUnm#bZYw(S>J%_PycYNta$exzuEOzvAVeT z{3jybZ1G`ohpLUKG|rJJuc&{wu6=TQA7#|nP{*fQwQeGB+h%m=A1h2#t+n5M7%t`e zNPNN5zY93*MO{O7;m$D^HMl+%yBFjzSz~bQyCNEIY1Q+cuYg=kv@m56Jt`M&zXOL4 zNEk~zOk5_%%MHf>?)x`}kitz@uO1w4jxf{ht*=uu-AHs?dk^=P6OGc}3`nk-_qJTT z_PA)BKC6CHkpF#u>a5&WpHYXn-}L>Cmg8>4T4#6N!d#BmlIz4jn}l~I25gD*QSnnJ ziyS6*8rN4d)h~I%5kIyU@L?fhK_OI#4KL`3V{nW%X##*25Drjs_O~~Nw@a<3P$bv3 zspe8B?eTAy^vnHb1kwuJ^%7_o@3sK{0C=G-gwFg0IYRJ)Qd)Jv2q8|O5hVfuq$vie z6Tvg*L6=Da?Zy%1lf*!8XitFCk64kw@BG>0Tk9WK(mN+;;sK4v)?Q~vQf zaOy|UU8CSsZ`h3H0l5Fl;p`R!)_zVVVz?E&U^twV%7 zg^+@)>waP)%2EP*4Vj~&i_ztJ&`o`zM|zXWVrTJS^8LTwX}KbSIk49qXm;i`-QR2!eq46)q$ekoSS9 z@n|^T0exWIVAo9OKd;AOB#aq=&SfoPQs=8_o2BYYMEf?ym}XN$A&*BNB2^NU1yI zicAa84slh#l_cVOEhi7rx;R?9>K zY#zy1sN~B-QDHkm=V7x(Of;oUZLaZ+YEAB?m%U|2`(%~JBb`=rvFHV+-On;?rkzjA zW~I(HI+H&|m*ytG;&W1R^AGpq958)WQm=*xQZ6+&`lxBJp%=E}!)Bf7=>-PA<{aIR zXyP|-&`$Skz{DyZ9v1B6ffqQWig|Q~r%m$}ZsCK=XPIcWWl7Z`nUvCUMs^>RKYv>s zr`h26fGn37!IB!2rmBR*)#p0vYG1t{Z&nzW{i3`}Bu4$@rmW6%7 zK4-zuC8?5)CitIVNUwj@>r_6gf(-6E32F`^N@^+cgy=|q>eJ7q zvy)&u>p3t!%VgDK8^E$~j)tO`U#nX!qW4Z)$xf60pP<^B+}EGzOLPPi8H~9o=RSvN zzbKp0G$TCRTvWd`{raU}bP<^p6>w{6w;`3P#o5)H=6ewQaic9N*Tk^Z(UQMj37ND; znw9)=>=V_7_6r>M{eWe;*8JFUcKhfIA*+N8f&Cf85xnd+^|y=|fe1iwOeoaW|0^;~ zB89&X3?Pm{`)z8mg*wx6c__33C9CkTV=~mra9i9I_S*W3e1O2ubcFDBU4(xCOEVbX z@wKSo7sz;qq)&GsaRe#=1Zg8jY&g&68?b~_NvoPOGiV@<*VYQ_$wx5~u~IPos-LEV zNRV~(ZB;to{d0%Zn#f&Mw3kxlo5%5akgJffydqd~ysL#9!^E(6ob2=ZVm>C$ z{ru3%Njrv-6ZQ$FPEsF=SDmvZC+rcD%D(Gd{O}K%gpY_{KLRD2lOxech}v+k>GrR- zc_CK~?+@+0f_S#=%fc_|$uAQ>a#P$ttZ-JXtz4*GptBUmoEH56rjOV(Z)sLKl{Qs7 zeLJqvRQh}qixk{HSZR(=9QJ~u&U#B*Yia0*lXNE48k01EkQ5~fW0wBXo%C#7YxABx z$yyWPscq%dnJ_zrrZycxlnB$zf{IMZri1(?cXL(ts4%e$^NTVewY4-XC`1P6{7Rk+ z9E3+^d-WbEjzqx7R0L?fbUP9P`ZyE@HwjwTJ$%<#6)qzp6vVpRa)|3C%$6J)Zvc+3 zD-FXC_y_Q2D|!^*@*haX>y8NkT`9rUUpf$(=Fyne2~&X=Y-2M^$!6m#r%3D?Ay4jE z!fdC_#N<{MZ+!WUVbbQ3-hYy==3! zDpUJQ^jlGBRMLqb`(BYG%gjHx{(@aBY)8tl`U+5l?H~Lh@_JC|$2?n*pO`AwS}O8Z z?w1=dnVP9?{IvShsHeA&c)7tk?c;b?i)CXN|AW(ccrHpA8>t{m!~Ot?LGqj^wMqB( zpD;@)`{}A0(672?^~^E@i~H8a6+}AYknm%$b2lAl#v7pZH@9~)&9V;_HeJ|z%kh_) zZ`5zSe2wK6w6{9rRM#`&v{D(TX1B|$U(f3`C}^PR+XpIbMeu1wl@Z4m`jnxW?FsiR zpr3B6w3}Qi3+%70dT(xXnyi1%bq?M=o%vMCw&q>MG91o+_`7MO0&N#s&+U`##r5*_ zi?Z)x$mWy?{-n=x+%HPQI?DtgjsanTI&mvp4k?Bf-WcvJCEc2IT(nII-&Uv}cX&A_ zQ3%X!zTh9=k-V!6$=HZa;_--sJGx3)No#+2eF{IR@e3}nX?f%&b($??*P18Q=d5R= zDwi$6!0)I^=%W1)X7D-a%&v4l_R#;qW?Z?F)3fck_D@-on_F3;;PQ291i5>H?%T}> z5$Fk(LO4@|m62E-`K+=YRWMtD$_y z<}>m%V(f__$svCj|6zC6udgZeQ#Vy9B6+B-p9UM>D&@xbZJEXD(A!@V5V!*YpczR> zU7G|_oZgL5BnVwb0sve^ooTp?HaozraIhQjDRMX5%M|XfSAu42v;^~bLWZl9@!wff znO|q;+UV23Da%?F#|w-A0GY_aOTx{CIHqcnHgrs$7i_a!r=ve}c7wf~B$Az@9h`K& z0EM-c&z$?8?R{kYBdwUU_;2WB>f+K=MLjZud$m)<1s>TRo5Q}MMRdpRBV1TfiP&p9 zpO14Fb$#YmBZ;C>Eda~&G64_c+ahXj0gr9>9kzR~i8^rs6Ujfw3~VgPJJd=$VP6Y7 z-t--dcb^mCb_sxYKDBCI;I9dMTTT*b_H=aq)uod(Fcwg}k+G{9?r?2bZuA+uDz8~R zGhzv9a@o3Qi1dcK2VM(O`5Y1E@LJ&ApJjek*W%TAb9q%%$x*NjDXkgqqg7p}rX?^d zT6piF`kKOB@-xenqhVIbQu8q=YnaRBUQf-$9`=(yXB~g+n8CG3Bn{%{Odrlj^TJH)o5FCR9SVY7{m*EfXr1heOAmIQI z{oN635AJhQZ-Lf}^Nv~8GvqT3<`lJzzV1rHC*socOfTVHnaz~Mz%w2C-r>8Y*8XR;UfUwpITa!pn8 z@6t^gh2|epekR@2y&k|*qX?Mw98oT*(H!Sf%2Cb~!FN1N>-@pBg=f4JJ%P8m0?%;m_g{^Q76z3f5oXnoagZ;fa=ze#Ll0DMk$> z6?Xrs7&bbaG8cM(Shx?p7?=eR7GsI(=u3>)<%uN_8JV&729UM2_&9f#&&93QzhkPp z0n6?&VO;T2py*Avv6E3BQcUG{)y_8#;Uc^wr7W~bE+1@k-NBCIwmjgcw-3T&xOxcy zt&2X1q6#^q!_X3F6e{5j0cS$eT=;Y;M@aw|wV{}}K<}k$-u7_zS8pK0j2ZaSuN9#g z>U>O56V#C5@wKk8AZ!`9Tfpm1&V_4Z{d>4JZoNU5DU*Ukx&DDBPr4hP!E(t}3wSbOq zV^CpQAt8h4%eQoGOB%}&d}3M95wD9IEK z8Ng^7yYuDIoGq}zP%yr3q!tb~W}@!K2tIumej2WPF$6?KoTv0!hYjkJC?Lg6pRDS> zN3@*!%fL3YlZk6+H{j&&yu6>!k;hZDY)1V0hld+hEf zLPL4-1e09g+3X*x8l%wl1YN?<{P0gQu=raD1@s}%8A21Sur6v5-Bq)|y}Y$(DmdNm zb*|tjKd|GtRPcvW+1O}Ju*!C2p2Jc%PoBtCm(Dm?0Q6$yL*mG?-R9yQH)!$;*Ci=l zy;vmiT`&SL?77*hR3`it2*UXeDEy#8Nksa89Gf|XSST}*CnB6puRQ8*n31|G@RsrlW z1c1%Ore3GTr;iaz0q1=))F*?OCz$W*Cz9nR4H!&hf{hua=!lE9iK6~%7a%15K_0pa82kV1u_goj zM<&?f?$K*b#)_&M zpN_y^Y$rvUtpv@;8;Rh2NevlhjKG!Nc~;?VhfNE3aLTaZ)p9M36!*Db$B+$O=5;6( zbqPzRVdfGUA!=O;N@ZfZ{i`DM2+U;^L*V~mb5UJ^Wc^>T6jAG~^Yu(hHO^mO)6?{- zmJ=3!mwg$2%bBsS-7ByT)DJ>nsuQZVrgQ?2vh>Z&07QagBsj=3KkKjAxuLTUA{Tgv zb1lLi1eafNRHb+=vR6yOp8;{5S=FS2oENTH zxULH;!a(rKJGf+#ViU*QMJEml!vG9UFf_uq{;=?SXzX84DImR=88FTW2YW?yTVjTf z0SPgCu+ipL(8P8Tk!Z#~$J=TGjYwA`Thh+XtNPCM529t69%XV=7Uf3Xea-OJN+$du z9RG6%v4l_|4`PGOQ;kVZdS$1zCd|d6h`mD)fMVdM8yPVq70_5*Wi%Jq6fNQJ7rGed zN(wHnjFCVD$zJ)l95P~vLZEM0q(AcLu*REi=ce59%JfaDGH8ELxO{ot=;m4yXL=Gm zF-4xRL;dFSw}JL!AU!!2nFqGv(one2w1U%!sDJnsoc|1yo>QsX^KF9&fH>wX)j^66 zu2mh`fj?wH6?KV$#9L>QV3_c2i{{a-HEK+C)kdEM1rFF88#NykQ!O8h?zQk#7Bdb3 zmsn8f<5O8kSU^tRX>eS|Aj1Y@ISkw2Wq~9Wyhnun9h8bK6D%tMFAJkJ7#b*$>(CaC zLj``S!L~x`tf}@bXUXGVK;(Sxkj$cVHo+d|fL8SkTjQiHngJ-G{8mepgp?J zM9js$_;ka}Lwt3Zf>6X>Z1wL^eoVGLEsqbEk7=?_ug{4djgc@Z5&SDqx2Hl@EykdD zuB5alnaD7S89r1*VH}x;8I(7`ah&g<)FklM56ZTHQOj)yTVllQp~jI(wj>{t;*E^3 z=w9|j?ibm&h9gp13r(8+-PTFr-9A6RJMk5~Ma08=xz?#Xi)*+vl*vH-S_(WQjPj!F zH=z?A5RBjtdp7K}v_l^Gpi!tv81vc<1Uw|Lfbw|UP6|H+(Vc~V*bG&jn ziw!n6?TL$hkcVbSa{bTrbga3iV#j-9lFfm(U|9~Q^s4IHbCKLq}x7yGxX?T6LWkm3F)TI%~$1paV~x028d(=h9qHM$|K3G?4k zBuya*z`G~Xq!vSpd#sH66~YBJjY ze}@BeHyZqvYs{$vtLypGLj#7b#4+mZ?g6=a}ThTCQBVZ1pHa}p(qQet?|H#Sq+doP+<%G-?{^i$L6 znLNj_`s%!*CMu*=GzWS>7)qzOJ}|}YlxoD~sR2^?!kHn3_PdT@4xq1uJfchqicI5U zmVu1{H;eZ4e=Ttk_ibpiyZL>vK@KA=Y;<=bB#7%J)_ffOe}TPP5`q6i?PIvHb^a=U ze@>IZJkd{r4xMP3x{teYZ==R1Jg>+sd63jg1NkRWjv)LD690`exQw*0vEGRY0~|Fx zgCp!|0FJMfjs8af1X6HnySOB!rPit;Ws^mfRl@&6I*yHtIY~jfnflM?=vdUmT+Z)9 zSc~x9NB7?-@B(=6`+K>A8dE*aX%a{c�IGGa2>en;Ry1!m@P=+dVN|e^AFrVk}Y! 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ðuzU9UrpL{2q=deESn`oZM zOz*dP4N|h839B%x{|e+lV3TD2IchLphKaivPYoTeqrhL4_!>U1s<1cNuebS0U0{P2 zKZu{%v#|o83bbN^i<9p$mOy*G68>$LFoh1@6>k?0C<3Ekoh$qfCZ!XQaRuFY;{5UA zy{chm@e>;b9GA>29x+Q8NZi6C5GN7rcshBj@W3Y@R&;4TKSg$<9K^tkrgYv?nIzSj zF9~Mw1uUg7H<~8y3&5=1xh8USp##!CKaSa zCqwO0)o?vRM^BF!$aEMe$-*qDxl-S$y6Nu{g=stZssq7ms*1{prpw@q7I?g?ZLI$# z>A?V@*q=X+0}ZPIr9K!9qZO@j&n#P))7pv0Qz+9h7R;v<3`x23kkfJ3o%?1Z)#`nU z6-G;2>?bh8ym(w=u5XG zq3;{A(0}i+92jhFzu#E=D+DLPgW7*d$wg%t$DYf zKbu`3Fn>kU(({$?ZT&g#C~_=Dy*2TX&+w7NqlapD=T{LThR_2d`>-ryYn1b!NHn?+ z*j2t?C14b`Yc{1Ksc^Za3~$jvjoVCls?4YZvv@j??79(iL#9-dihau-KTBJOfKYv9 z`XU#nn1=c+IN+AK!q30Z59QbqhCr;5IKSa(qoVT*uZw&Am8K%Wv*_22A38Om2*DL_ zzpGvQUTkhLPZQ{#lrnRO*p8OF8*|hDhNrKz2x&(YZe<_p{Rvn}x=niGGgb2a%`X#A zrO*%}hB@Kz7%$`6L@zk+fI>!gMQ<&&jw+c8a@w-!FMTWdCC784UZaV4%&eb4Yy}@T z=r6Su+rKv?Y<$0T33=9hXA^j;Mx7^n7z$=CCW-^t&t$*0v3>Do_jx;ii!NIgutvoXPc_Is$4nwE?+Oduup!zj8ON+uG4_h)MGKAeh0ybixM6fRqMX z>GDS9ae1MMA>!zac6 z*OM}mKsK2Gup-sgi#0F`R>5e~aOtJ27w30TbOVJUps)b0S_qM-rdKmv_{sY>QoM|j zgMxKTa~DzfVGiK%cL>u0csB;qbG9_E_d- zHrA#9ehchpxoD!LIy#{_&Ij-bIm#X71D@_BFU=wY!BcE51BaUmQp6-rT(JT-7(!C=S0ZLDEJ9O>jfY zb{w}{t+I}9cMdC3BfUXq(gT-V8cF=EU|3UCVQ;)&U!gp3NbW!9bd$`J#ZN$*xNq^X zg*(OMdF@$jL-n+mlphKdX86mHicI+li=A^naz%dNRLQXQ2+52p3{_xz214 zH~r<0xO{1m!zJ6R1iLlG6CLhA|MUlNcg5EdZ8mv9MOQMBgIOP6a{7L}ifSq<*z~jb zMs6dt%FCm7u`6rtCt}L@v?|Ob$6o6XVy;2-pAq{ANO?H$gCixzvn%r`ibSHyn*|O0 z<%>@09KX={`%!?@GVQP**P&c|=QOA!;g4CjOQ@b$HYOkv;L6I<&Qp;M9R3p}dF^{- zc%agh$k2`cxiKlfilF?ead_vk-42~0`b8i3fH!`p3`_M= z8mFxmQ^nz+Z(VB0O2~`Z7gmbz5`dOQn7Cgxga5=BLYAn(7GppsqF0+?<3D4yibxK_ zv3<=x%0fV7D&0qud9nlvKr@|E(z@H7L3hjWp2dlzHky+su>5SgN8C=2gSAF5!b9N;BXePYPRI~sgvXSi#e<^5Q#Cx;`(QYpzORbzeM4DKjCgGJ%Az?pX#p{Ue2QIjb~TY zV=O~oIzq>tE>f7OVbORk)kV(V2mU_|cnPCzEDDO*?=PCNjZH09ish4kr2dlBG}w;% z?vF|5NGvUH8nAJF%TU+q_-=j+b$vy7>wq@(~ijOiS)z2uSFY3r~5v^5R7+-3E$isi!`qgB=E%xOf z4I=ZQw_p2kspUMA@2i)+kH_g%iNS2ePhxeXR;sArBj~S~e~&6k%iThdZ$kuK#6~AV zhma!a^SE?gv(x3i&Gjzye`e>$*d)cJ7RJ|aMn#ksCcW>7HwSWC#0^aueB#K^VQ1@-BCN=> z#rnzPE4w`+MR{c zUyzUz5>yo8SZ5kGJNH(-5$c!u!zRX{uyn9Cs&8!iXJeUmve zG&NNpzASy)*`hA|IaT(PL$1lsGkBPp&x_sct?)9_0n*}DcgHmLmI-Q$36mo~| zx-5eR@6L6|)ez$30z4{I5}}(BBZ~n97Kv|u$;zeaz$p>D<;Z@t{b=0WlFAim;~&5~ z;fhyv7OU?tUPz)&>R=j7eY@GCzt%Lz${a|lYtEg%j7WjdlX4e}VZ0J-C3sB4ujn`R z4Glocd%|=anjA>-5^iqu^jh;*L|X&DP1{rePe8E0WK%xmj`RR_=xZ6&U<*Nu1?z*T zlQ1*&N>!x4;kY;3giPpzL!XO~8te?l&lVR-^vEs7ENqE)RYo@aT??EffCwspI z!cT^yR+V)wiwuEV5f;&{QsVvfj{0a0wb+U%*4M-Uh9O+nE9s)uz19zBE>5VK%0Owl znlm+`Pt2UdHP(QtY)qz{u%!1%3@ya?(T?XD6tfbG-AACp%lVDj zViZ0uKFt2QJ$q@e1vD9n5USmmCzf;;!Rwmp@*$8MS3=AYdeqGY{hL_5SFk{&69n_@YHP zPveN2PLTd32>L$mo9{|2SNhn;&50PR1_DHsnRiwcgCfZRKGi>mAISAZr!OMora?)$ zX2a44-IY`64jn)B5yTlx&Fun@02`B7v~;+cFN8+Z?F4}z_XFpuRU z+m2=kgt?&KUC5@Ex1R$9sp7XA2m%CwGd8^T43qqA;~sbR(qvJ*{&ycp%54PI&_^Fg zM&_olw;yyD?g1au6O{}`*KZ^g)Mk0dM#P;w_1&~5V`ka-w=Jx!J5q^9Li5jn1-Cnn zvTC1=@(E4mj^tq8uB6rC~%QeYx%=D>P zE{Kdb$R6*@C-Qi$({F1RtN(A=4!loL7!4;Q zBG(d^qYKB?b8RBElIg*TlKFej_Y?ZrLUnSeh5Q7#z^jY@E4Ll!+{!eS$#x&PNAf6H0ku^2c^Gt%&M}w(*aD8?65GG5%xQ)=7InWaL>NGzGw(w$v`8mrt#9R2Rt5 zCK_w_CIN@|yOUjP>ZF57xrYxmnKpxy4T7UfX z@<=;CD7y5zeLGf|&5wPJ!DxR9EPI!lP};B%{qwWzOLMscDYRunQeK?yj(>~>&$3Lg0u&P|@0 z&2p+!DZ86IGf~25We5!MOC|~8kN}>dO(&Wxr+k3!mUk z_f58-;-~BG6c#w@&$$#t7VGZuT!yFNfv0(;ob$H?)mA*B6H&EU!;EChQ5P274_0n> z^!M@Bq|L>FSY2y(td}b~fK_`rJyg3F6`YpR$VsOLL6+@I zc_}nq>k6JTeTK%<)T2ihucOjd&%CCqD#5do*C7ho6-9wYZ26z^fmwygYvDE4fHGDW zKWS^Bfus*VBYT9r^N%(lDO76Ac`RsD7wf}k2so-(3)gm?ytja;y4#mDMST#O?zyVd z*U2|wFP>d)CDKSlFnqkLAbW7b?QB)PDgn=FDpFeyGwygTLkjm0qzvOTdEfh>jDM#v zpVULW^=qu<3`xx&UPeJebSinV;D{-Yb|vPQrU}&LGc*$4`%7f)E;m8zrH6jviqzwF z%<#KCUJm0umy3-C!=+`IxP(Ntn|o$@;G8hXHIhI2<@%v3lp^ZNOyhs$H$q@4Vz=yVXwE542gGlPH%D1*6blsYm@+ zDMF)hhM*Cl3zn;v3!o?|12U+Pmq~T@xsAn%&2b(zeRKX8P1d$G@Eh1!?~Cs9{aW!o z{m9Fnu&xBL+I&u}dyh4G@NMAgJmWV##6C9P+icwC%P&s_I>2kNJ^k=^Y_rB8p=jduH=9R^X}Kw*=sVw^7j!5nl4w`BwV_?^{#3D=FSs9mxR z)u$@t6h#5@pDzXGTHHg6N*C>sxuwwk{ctBs+j^Ms+1*8l|NEDL{>GT`@R=gYbNk$R zWIVOwy-$=i6S3_3ViGzSbNoT}_Xnyd4QUu%xm>EH3v%fT{ z6qF1RjA)P|I}>RLP3}f!hT8n~H^z;xasdh%Ep5q-n_(HQF27SX5vpqJE^&6Utr%y@ zJN!n9KJ2pAyphLCvf`(bHldE9K^HJc!u^8(s0^l-41%;DRnz-5xHk@?(`A$QBi=mZ zbj$&5hcgtZ7%$VsP_;iiMFO>3?cuc+9IU>^+3%3Y{GS0q(9{?!!i4WjarV+fzE*?4 z|6()*VYwjh8*bvoXQYxYA(+6rP+6UMMmnzi;@q|Vi%NDMTyMMTNvu`Y5hmnT3)hcY;*_hcaUJ5=q< zqKL-y?l?DJEVQ|{u~FRP1;Frb6^vmPW-~T8eRIL?d(h(w>w`qd7ZE$67?-O=APnW} z^&FI)O;}K9dNY2f@nZTZ+$J^$6Boo{wX?H~f`&%-{%yPqwotBtzPhT@>U4 z#p@2bSfMo}e7=0J)Z_Gs7t$#t`qhH6{cyGlzO9w z?sBaOnf>SVG-Cy$2pU;seBtoUN3h)8y%sdGcs5^Ck+S9clpqhf2UAN!Jk;)F>@d+={zHaoXZq+}*vn6R1%ff?Lv}#oZ+p+)`WuNsAT@ z5Fms=c%$8C?=#*TVsyBsD=3U;0%vWt*oE*COtlANh$$A{c8fBYd$zT*gQT&)nx#dOaoYn4^@?+5sI;AsQGFP|et#{y zHCC5k`YqK3$CEOIHCtba-C3tV1W?jkt4T~p3FS_nQYT{?#&eJUG3#;{K+r+! zKZH=(yE3F-4(R%fF{sI6H4oyA!UIx+Ren^7HM9u{&=MzJLVIhkdVUz{MGn64f^57O zYyn3q_W(|Ar{1IzCto}5zoCH~z4Z9d43f}fd1jm!QC)X6YI>vMpLYRrh79T95f)Lh z&UPL%9!H0m7dbc7MFCdA(Ni7N20Co#hz{D=f6gfNo4;GS@?Li1HWsL*RupA)xT$tT zI#myNu9i0Nm4?P_p@V~yD5tkfbh%Q7`kBcO|48BJsdri{#AS2SaD``F?XIf2rO%C8 z3O3C=_i!D4(zNpvN_3P2B^)mHtGvVysWR_ay`pX*R9g~Ognp3^@pX)BT1X1>qngq` z9`Mm{a8+h-adOz|WX3#un?lv9LQv!Kq3Ghq*_A&r1Q7U9k#D)arn6Qs@8~_!#!iwv z{)(n7CARg+!G6W~WT)!Sqp6hi31-`Cxfze`S7H1CGM$wDXr?6F{v2v^L;+J9wITw; zx~xFz)5%)+=6LXi1`?nx6$$xCVRY~6Qxx%c^ccm_!GXf-^#oq)KeGi$C%&&DR@QOk zz`P07rFwEQvZIOcV&AKanq`H%!l^Iur!1dUH`v0*EX!F6?>|>pr@q*{#mzBgxwP+k zZNaKYwsD43c%wV0JyF9-@7b4`aq?X`eC{MJq|qd0S;Wk2@t49cqc`v1<5w0C7p(2- z8|XS&qQDe%a+4E|(FqcytGY-M5m zLbN8A#d?!9^ksEBC0xSRR7C(2cwZT~b~vRH^W?F-gtqkESx^0kNiaj>q@4yYyLP6m zH(!{$T(k>95@1h8G{Lk}R#}K`LZ;D4sq>kAzaa3>jrGtaKN| zK1{yxOpWag<6Eo8!xBHAnuEetlcpW0T3)+Ysiud36d2=_9dt)Ktw88!g!A2TyUJ-| zWgZ`Xeu+CoFbJ%0M9>;5eJ>>zQEvz}k$gh&*!os4eQbUH5#e0ze3iJJ%NvUX{SabF zgo>x5J4pOxt$pl7q#TKa-VC3(`bv*Y&08Gn4lR93P|Qq*Rs<>z5>P!1A#%S(`$pzf z`&PgBS!~d!={~Wi28X3jB96WYbK@I0T!+lnMQ<{Uhx>QxeLzvdQ7%G%9v~XiWTMvD zv$~pPr$6Vsxxu^e0jqdgkbg(hJh?sn4Y|zM^`Y`VFYw$2%)NKnd6SKP{{A^#v!8OI z^UnK{#EpWyytu+De;~9O3Vvj@tXG_z-Z0KBV3Xsj!kR;wM3TQu?-iEE@rKN&?0U6l z?HE2O-$rlcIl2F~NF6wHy2rb7Wk9W&Mh)4jvt{F?=1d-iq^?F4UjOvXy#Z1na-E$f zkZ8SFDG4Z4xSu@d3NL*b9G$<#_yfMLls@tBxn$9Uuvp9F%xB2$DkkaZU*yb%|1nJ8 zcSA7bWreJ{N7OwZ zC}}I%M#P(;VqmZoMO;64tM9v&%^~n!V#nE^Yf0A*NckUCpBjminV4@sxb*=4HpA1K z+w9EmnN2^xvM*ks40PhZ+nJ^O1^?^gi@|u32FVvn4fwADUW7eNgWqQV`1TDM^EI?* zFJZfGEY$A!I3Mbwa5q#Gy@COuH?--$}{^)XqPLglq`r3fm+s{NxZY6eiUl@z=LhFna&bOS`e_^>$xA1HaR zQ!KZrgb>5QgArT~kP8V-*38iH>b?Nv zO7MF(+hfmOF=mo5=TBOo<0`A9?Tb9YUYJoniEscJP)*?`<{C>MYGJfZSa?f3d{&3L|oEM|~Bok5NR&LKic=}iV- zZg9iU*=elPOmx3}9;?<-5qCVwv+VtOe;k#%X$ZW3FeZvmR{Lgd3c9p@+@N4hs#Yn) zS1LD1V{GJhB#}h=9My)+NkL>UhmP)w$RG%?!ZA7ZtGhtA_P)xbskJw#JUZN3vg*x@ z&%;8&CNneJqZ6yv`g!mgev;K0b&hXDT;ZbNLKg8EW4aW=Ctcs^>t3a4Z&Z-B@AfA= zO{e*+Z>whPT+~^hujh&;JwhZ89Bi&eYrg^`QS3yE4pfOAX%H~)bi|YEa)!C9xXJy} zpx51W4iYueTu=l$KQaMTR}Gr%{(%hNY=yKHZS+qEEpli#kiR!XI%4nLvhb=A8=uE&v7A5%Ux^lFXcmHt)6aGpkd)&$)iyRm=%JX zd4Pzxr{1BX*=rGTR_06Gx$;p7R_q6rT|2|G!655G!8Rf`n*+RvP^jYB5yeVAHv0=W zAXURiSJDyNSz{5Z2&ZYDk!Z<3&(8$BN^3jLOM#H65guI$SJ{k#s2AiuTfEL1P9_<~ zLlC&GKrqL0L;F~VRY!T^`O_LfE1!GSAIImRAQ#A3)x*LSK6BdEiOAFJ%YoA^M%&Rm zN17<4Y!{ikHTnkJuLH96YY{Myq{AVoIH%T!3fP{P^+*PM4DQ@v71>*^6Q{)lS;Waihd$}&zxK}A zeSqj`vyQrSeQl^9qhTI2f(`y|dxb0ZB|Y5y%nruN@2XQb{LgYu)s)te;USVyqy;#c=r)hdWv13)oZO(N z!J-1_4DxXjfn>z)-pR>~4%%O0RZU^cyhAynX=&*>P^pURPIvQL><&$^`dA*cpVyi; zoXsyRtPVWePuFMHRBv%NVwb%{mX&uWOCmFKGT4MEc{R4Ddh1-hYVU4Zj!Vsd(z7Zm z!uNPI;bpxU{GQ*Ub+Mt!q>f{9k}^W-N){cucl1=m;Y@ZrG%`5!vLV)Q1sP(Vw+HW0 zz0aW0I&NjOx>{mb@k1PsXy@S8GmP!DR*R&tp8I?yr5G=5YR2nB4whCUEj z!10qkK{Hq6r+)Pt@28#I1NqY4>HMvs=b3Z*<-TThBx(?C^;BK!^KTNON`qNIRHtG3 z+Mw=811slx3MTF>?!p9J!D)gqYhU9Bb+wfZH3d&lN^z3`d?~pZC^<@tzp^h6s&E=u zMzBeZ_i8Wt{cMcDSuZvSEaFzg5>C4zy%gw%AAm~>53e+kn`uXh>b~U~S#?oEcR_MV ziTch*a{aQ1_Kf%w>k_*GVcjn}>gr8Z+!=9qps3r+aQn60-CTzsx_fuN`ke*C)@@gX zJJyEFrf|pZ*1B%9UzKRCPW+_u{Ju&gHurRQQt)OS1mElKO?&SskcfGXZfJ!fIf|hAh zIl7y4H~_7a@+;R`)tgOEzDTmrZz!Ob!=cq03ye@c% zeM1jG0z%#*T!qM_kZQheAFpv5#aQ2D{N&4w04pL!v)8)C2XnDgs&%>ENT+V`eqt0F zteC&nh#+X*Hy_7=$cDuEQV~xJmkB~f6*fUb%XGQn(Jl(zimUFJR=;eFWV|G?Koi6x z2Rl5MZP-%v_|dvtz|-sBa#bdUrdiWoiyLCCYe~D{pBSsG?Tv6*B*v4xm4lF!zw#`w z8vb?A~_vm$2iY}J_S|@Jc-*SA&MMk2w z8J9&se80IWW4*P1a8MHpk`uMoP*Y1)Pv;o!4BQn-uCVUuT=pB~*Ka7oCXjcFGv|_9 zNr$(2c@NhK$v4gJlwuuEK9>T+&fh4h#iZqKJJF5>~@PH;qrcVasrCbBcAaDcMJ7pBomzZwYU z2QXw9K{%H<6Ts8mMJEhPmPI3~>*322+OZoQU7L#zOV-9#JSNb{(-_-FNuhEL4`3ge z`Q)lJW~AG?@6oRa=sq=2J6#*3+lWQaFBVlU(53~kmy?Z*$1HNzM>;g}MfH748pxHcr2O2pkJXndJn_n`vRcD4BdCPvY5_MAQ=6nrz5J6+T z&LWAsXLWYO1i(moeNu3S@bj$UN(9;d$i1!BHE~Dm$z5%w3;vQx)|;0|x}|44CTOore47Dix9;Zb z`{SnjH3Z2bJ=@}JoG#@b>v&)w58j30up z-}xPpz&C*cHa#82QCEIVk$3%TT;UBbR|w9509o{n&5tD4p(xq9f?SjN6WP?S)kF+C z`GWIfkVnY$(^2%|yR9!^%O9va-#&T|Vpvl1Kbx#UGO1L0ooza6!zDXV$@!)3vpjx3 zK0n1oetArTo|QZvteibNtw`_9Jl+_^Gkbs2Rgp*Oi+$zaLUwe*&3Gk(sV}dIoz4$` zX7z*|6;$17_Fgfsh2X-lo!mtRBuL3;pU;`I{zzQ%n^1LLvCOtb9cx;#!i;{B`wpaCb$?;jID&imXoG%Jdx@Lr zD!7y%-t|e<>$ZVqq|-ILxbda?D|!XLsoKrM&xauuE6hCeZn^K$e?|hDv>D2Bi)Z_d zjtiomijAM!Q{BN*yeZuV7aU_$EYvW4zfc?1{{B(DDWwIe!9;>>PFy5YvM%_G zOHJ{Nd|d<+p}eiT#*C@KMEsP~4}OI{j>P0ZAkbclACy_p@j3BW$NptGGV99rdzk8C z!|F@)^ci|zjz@Pz3^vf*|F%KD7!>7wRC=S%v~wsi&VoG@;VVpX_d2B0>=B$veu)bK zY14VE0q*U^bXHo}#iiAuPFh?;F$HpsUi&N+`d!tsC_Aj|-4gBMp-*_4Y}`N92FSO^ z<0X{sP_urho!7^M5y-bkQU`bwb)F_VclyVx9}BJR*7zMObuNq7=Qj6>&B=Q$FE?fJ z7)h@&eij22%+F%oL%)caH#vf&GATGoN&`?P(Qjw z8L24UI=6u=@l_0SuESaQ*?RpglkJ-7YTX#s(mH5n=P!%JZ6uS^OQjBQL{p~&O(JEO zRmh{IvP5U9K8+gLsO+;n`aJ|7!Yf%6eFJ&V+?&bV-q^u=fkS0SqVk8zMa0&+CT=)_ zG!;?Vz8Q9Qh27mKzpkkb<;d5ADltcNIOlasM_xKh`JKNB=vwpKjtcG(6*hvC$2?=P ztwpoqkVd(O<7mtT`bhOc9m+WWDBj;52)O$_y007$@8$!=8~@dZ`9aL%$>`>&t1uc- z=foV9Vn(^J^<6Q$uQ$!=ZDacS`qZv*S6;;l+=gM8jcj&dVZA(Y4-QF0gg^5fVNjwV ziJG$rY>olA(S%;d^zAyR>W+jzH+G~D$$M8g;APJyhm6%G-lrc=hiX6lLD@E&rs-Xs zSBmGh1}5Ivf2!&Avw%C*C(_rbf*Kv11~^kMeB!H7mV$UZsIRLL^;V`Aq_y*fT;y=m ztd&c|w2FjYTaE>y4QGi(moGj$g)#a(-tROX7w+Fic&0Z9Ub~??+Eu;cxH7}P)JX{~ zC_D6Cy!{$Q=!DsN#RhYn$BoeX4Mq=`{R;BYPSYdE8UgKd>wniRL2I%3>n*Rm&KnNx zh)^j{Lh!61E;V%u)!Ik`_XVoFO|FN#G5XOart*@xcf&0#sa;IG4?XMTdKV-Tln1ji z?$%b)WEdQm-hg%=eJODeL3i!@@yJ;*hSns_`1ppkK>FUW9*=qXd!`$XCRD1ON|&2d z@WkiWDUZ6jmG6XQ8xGzvA5DD@GBITlo zC5=3&#wx`^`}^iE*F3bwTLOOy-fr}ne+YAY83+#hQ$R2t1VY?wd@==XtoEnnn&-cW z>WqQBF?UMS6TRn_cl6%txC zL^xLM+dC351hCS|ci0;oiIDT<&@DEf2DBU}V_7Q0wy zB}Dg@{1$5A-;1VmBOhP&uBbY}Q(&c*T5s-MGFxk83%Hpm=1KYHCx&~q6liH?H%|U+ z&Ha-73T9JRV?=*= z;91*Yme-9JJZN9QBb{@t8fyGgmh?Gzp77o}H;;DVldJk>RQZVewL-^dYYP?mX0@nUI_JBPNCTi`MD4Z*0$G^H$s zNYZ-ysG`Kspxho}p(M*q>-G;OrNc=u@a39E`&fKr)gzGifP@9=euE$Sa~Tc#d2e!h zBxDTzU0ZM{oN`uiK(b15oEoA$7SDD~Kc{aVl$gmbiXM{DziNVTR+88ebC=^73TJsv-7*;E({W@JG;&hUzDji|)Y;lf6hf?jo({l| z3$~Ny2=`xh5v<8FLwIL4(Hf<4?044*89#truLqL~ZN)Mi_wxeYjmbqrF`Otl#nxDT zM{6sTmR#yr5(FNgHWx&^;#!-$Peia8ttdn|7VL>W=pi#JYgRJhir}3foGuee)+W%m zOQiKz`LB6_cXOg!G0j!+;-CxZ2=5N{L$3sD&Q=;Zp$}H{Yb~X^M$+84jy;J<88d!< zi-mzn=p?k_bK{4vy~<48eteEO^C6W#|1k4OZ*5FfFoouPI@&Q|mBX`z@B>5Vd`4Ij z?+~ufK?H+J@)O&5!|&+n?`Fi!WN@4at}|;HqJT*tP1VhV-lseHlY7OqEmjs98Jh>i zH|Z*&11*G{%J&vQdAsf+y~z!3vrj{Dy@)#jEqJJzHSvUWPZo!L|542?50BxW&j+23 z5?2~AP=eOfHiuwjRRx98WKLc3+epZ(W=kRVFSUL%^H1-=C zLk4OS!=rgxMl>#!aVrF_g`>H&F8?gx_GK&$v|DSX_$;oa+4Lw`OQu^|CT5!bx{-}$ z;f~mg=lWl&Pv&aM`ewOUN1c&b?4m)7k=ml}qshLtxpgoUw5X!XaenUGRK0d$GoN*eBr>%zu;jO6C@c(({bX3v zES8vZAQeEH?Jpq2hn&}ry~ILQjPugv1#AcM_SYnw`@bqgaf)|*z=gJu1E@Ia zd@}ub_niN%$;X&ljAU8ZNJHI#Dev%ABx7RA4g6aaZ*GvN5q=yC|4S`(1OFrE3pU!+ zfkYbC-TAug_wR2>MO}udP-quViqBiJdcj&-6hyH(k-SEgY$@^=uF0;X4AO@8ndJF` z;i2UP;RhYHS7N`(q+<`)m2pJWvPw-1YU`Hh%D=RX0(Vb8>UTm+crmb^<|$(tNKtH< zZ5yA=bhmQH&ldY7I%}6E_eO9;Wxsq63sHMKdPz$IYAXXc=oh5=H8Q$KCV6Oe`*!OK z4(#Tx<(*1bzVH5gT7#4&PS%Kd=_FpYwN^OT*!n^3u2%YTQ3<_ICW3rh6uGC1XZ^Gw zWgwhhOPa&K7v@YyESGO)HBs&O$cW|H8owXIH!!}e=;s|}^+vn??M!yre6xoYD;vt; zr>qV?eI}1LXNfmbFya1vrCbVW@Yg@;r_MIlVz1dGPmh_hZ42CefEQuap!98MUiflcp*MMV z5xPG6)_~maYURg2Dgj)QS21y2YX7uO-N>)Sh@RN{jm+AY-0WMe86Q=pdAb$mdDBNcoiIdu34!uyX4dj(s+7>ONYrd zyZDi;@{UNc_>unb!3mF-6O%W=38<+|WK+NHmUFhtoQIE}h@qW9v$MfqR+AMy$#!z5 zfSV5#KNI4MF?TTE()w%i&-Dghxd?9?vjxs3AilqFXjq}IZ13RUG+m|*EQkmbPv)&{ ze1c=`y$Dh&aQP88M}Nt5i};4^s<4@m_!oKcwzZbo(hy&S3B^<%z}pCCWM=jzO;J*Ae!XZ;NO=6fm;qedpV8t6KB3cgT<96{ zX^sD=`dTa8f$^N?B6yt%mF@^zdTwuQFO-xh3R&TBbK~47qI1_6o`Qov9r)mZ08KKY z;ah07|y!z=)BY7l3~n&tKx(f(g$~&&C_jAXXNAvw!R*B z!WTMP9Y1rix*!{?B^U9`S!?0ZpKQN5+#e=NP0>3U|u7}oRaLC(izMn`pVyA0X zZZ{E!%QO0hgbH)>iCy#l-SCTiK=*yqq2L@j-!6Lj)T}iuIY1qbV1jZ}%^($&HyA%7 zF4JLhii>xC`q`mr32{g=Z!GP3`1sgf5_iOAv+A83PdjE+SVtuyUr#ME9U$ z3q;QpO=T0I2Lu93T%aH_CZ@UzJmDnmJlMK!n_9(?THW&lgumsZt45f_ne4Ho+ zoLg?lXXOZocC8=c#5yj|mi*k1JM!Zph}z=guaTM?eMbRq;mQRWRi=j|vN{efy#$-v zpUXm|_{PEw-s=h}2b8~Ryf=qdl<`a`J4n0gN*Vq~cbjKq2$$gb&30G7myBWestcHv z*_MTxFanI?gzYXti1@Y!|Ovi>yeBg=Isx4A@r ztMh3e8GARCz04Kk8<9_tESDYZ+9vgr9%8Of{=A+I{{A>_&n(;~SWzK8bc5e!fcFyu zP%vz|+k-9kF3%T!w9at3TprcT(Qu18cv)}($6(fbf1;dS#=NhX&!-|y_oXNy^*iA`m@*dJO8r1s~+dgGr3QZ-l3s>0bQbj zce(|Cd(swPjG2;J+~>{T&QsoGD5iNUilos?c;>Kia>9&~9<#D;6sO2HUSFR~>$==- z4*iP!97EvMH1&;CfzQ|1xAuxTXEvh@kjq>;nsMZoeA`0b@u>MtV&tfb>cZpRPj}!Z zJV)Ck89^fbFd0e43F;d2mB!X16$h*X&U&%?;=_y&C2LCelr(|`04`ugl3K8^vuX}0 z%eiZsn))Vj-xM2Ia>6?8152Xqx43CVc|+^*^%XB^h$%~)&T>4WNDH_xBLj|O)>?fx z4smNV3W<=CO2e9cnD{UPU$!QcIK05t`rC0{S15ivcdK}ndTwTTx0jB?me=Li%T9>$ zXop!Iy#Yiyz|Q$aZWknLQybccR^4!X{Y1^K2jGuFf8NKG3oR3b$RGbE9)u?*inL() zIkAWd=Y0LEMm|3D4V_-%n02t?s+DQ-?GvoSL>)8W+V}X1o3G(e^7=`fm7VbI01(bv zw8KHx9W62cYiGyjy#qcq3*HUyS)E_b=TCyqgbhDKW3pr5ab8vZQnBW=RL` zsHHH*AT}zA)OLWg&jh4uZ|_igJ_jx`hVKc-#bLq;Kb-E)kLCzFcoq-%L*+R8 z<0(tiof0 zs>%J59SZu-=G};uu6TBb zt2r*dgxH&;Dm%o0EbOFeKk$?8$#H}Sm1t;La?|-sdb_!mvvL1?Pp>J*l3A&$k^AW- zxP03O4+JIXvQ>2eHe+35`X>(BXZmxDX&#FA7gEqnDh2K|K)2dZXvWb6(6kAjK>`o9KqM3w&L^j9noj!D#DZ9dt0#VTf9 zxGU`M(pr?BQ>TCnwFS-AFVz?}(3N9%X3vp?hdgiff;rP=U7YQEpv4LA`9Q8(a~f9H z*7n`iz2W$7ihd}JBgjH1VIas`o=-Dsh23f7?dbQ0LbgWFIC?%NNWI1;uHMStLun+` zs*3VatL2v2cV&mSw4XOSj!*TFLDMi1D4;E8!-a z#8}e+C$hr|raQNPCH?*f+x0IqARvIha2;HQl(h&JNqlz$|5m$YG!a`i@%!z+p6Uuv z-og--oSX!}qMIEC?{iysw~M(=DUD`7h5*!#XRX)T_lt5Uus+Wu_-%* z#eCL>P9-W4072#H__94_ZwAyT_;>psYRYLIr-0Zos`J3h;;p#S-+w}Zm&Lyq+!Ek7 zUV^7C`RKPB52!xi4POb{zx(TnARS@65&@7H_xS;w?I2LO~1Q#k9C8kcy z&j3&CC*a>mR1L(+s0jH^`Nq}6n72cvxj#?mE4wBtO*UH7|H~x-{KE=iAk&@y@J?9P zI+K+q=e!neYJkHR*IUd#qVQ-_mzh|d-~TNlw(EUR6KC!azVRi8oJ4KHs5}Mnm^*fg z4OhfNW>J-Rc{xcW<2vZ!u7Sw`P9Q!Lvc3>2qq_Nj$h2r8Hc6HKp9QXpez&+D?;7uA zizfgZ?-_pdQ{R3WsJ->N%kgIXzzKd#DX5etj)+Z8my<9gtm#%#8khN80&CXqAO7w2 z+TX4w{}%v$d);GuJx`qg=*>q>f_HOSP>}$Lb?CeI@NaQS^3M0@^?^@M3dl*+?&B#t zVwQUvy~dwPA*U+!d-c_GG5Zqg*#RAUo1GKH!Na#GlC}x)HRUu#$w<_~Kst90Pn;jp zvg$QgQ>pTu{%co`Q$U>mvhxo*r-sGTiP%<5g=q0_wcA7!v7raw(>(s0pmASAi%hO5B5}%?W4&QFWgLgpD+100dNtijz6k59(){ z#8@YzOSZO4Zs__v`Y24MJR0WPr~fZjuwDNO{ZB>shu~R?x+zX25f-yVM`Hz^iTyk`h8N}Ta|xc@(C&X4Q+y33(T`spc}OGgI!Wf5--D~wcJY_k)e z{SR4W`%tQ&NVrGQp~A&Yr3gU48#AHT6)(O``tOl0T6|y2E)Y zx`gho%JUm|=)2#e*KyRs&;JrN6h9~Z4lcqx_qUV?fX_ca_IvVM*9ZO=bbYCqeQ$|> zG`lXt3l^kiXlS;*Tv2RTLB{Lm#_5PXW6&?x@!D^5l)d@PI+~~?l~kDXuhMi=Ihv^C zLp^Bmshgs76YlNC3ODU^0!3C>mNOe|>WOS2#gFar$6_i)u4aPC|I)$E-!#|#7y17v zQ)#*f2Z>r|!*_bGrDhrt+wZA-&wDSXUb?MxW?Ig#Jz8wy)T`ZvYl9+IA9g`)Jm!XB z#fWUO{`k?MYr4%4p7e69bTFrG<^T!ZkitR7^ijyY7biEf_^bq&0Mf=IS^TWeiAhJu zZ8yiHj>m%)Ht()`-2();DITjPME+InZpz||F~9xc5<^t-;GX*fowy=lIm7=2-Tx?V zzLUl}wY}<1^DXdT!FoyultBezdW=QyXIItsO!gXA83$s*mO0O$cOMC45nsqTUw6O6 z)g_l7!?8@GFk}<}d_aT0SIwHmkVUbzpR9E~(USl!vtGxq@c#{YN2j6SYmp&Rv{&pemUqpd`3HD)bnOM~)pNz}f`RHs`; zfl*Dfx6rlZQa1*oc@0poyFS}iMXJ5N*m4X7`}AHteI#hbAy>OAz;7CScr>yj5bR*kpCz4El?49|jqC|wm)}@o1wymIzQ4Pdm_$vCIrJ*^W@xN-eydttK6X8X%7;X) zZ6&nsvc27>_%rGcoCJ3wcv}gG7ym+JZLqnb4=FPuSxJPF^(p zcXf0`?h!JgL)+L#>y-Ni$*zh9!dg6XX&$CSC*cVk&u<%g)vxLFRT2RsDk%p?%rF|W zbiV3qbGN(hw%_1c>~g6qhzw$o+O1wXbLkah_F8PzHpVq*ob4_0X7ZWO7O zrEAdeYg2d>`gs@6xJ9uwu&>bGccW$B;`fiB^25LB!xJCb_(H_!WXG&a8AO zLT9(Y$bweVjcbyUXI<0o%%&$SiH&U!SYIzxp;z45>;W^^$l}ZOT|QbHbUND$ZIl#N zSLr=|cZC5k?h8&*j%b>Ov9^h8~7~TiUj(%-evwDe|M|nwjYhqq1htj+BSKf z5l{lQ1gy;J7b(T@)$PODY^=ktyfD5~f>O!CyR@jgAk1 zzh&9h)J^fumk&fgGq`A{pZEWF10%Nwp9E6&aa}~W_=g*E0pa{oRp#5#$*1&U!3RDf z*KLIM#?Q=~13IpJk&N?8*C`1}nK19JN!%iWsD#QoLb*5Zuux7yq7_&Gu=Y@2ZnN2( zz^>r74QEXB6ZN{L?PufULDu9uuIlX7+G0L)Ts}>D4aSZ*;szBw2KRf%rm>C*hG`lY%G`*6>_Ls{Q)I zW$R1dfhd~@X_cKqE0g;S8d;ObC}!gO48UQ7sFu3mj`noJYHEH;9>dh|gWeTAz9$PE z(Sjsubdug#@U~?q#NKORpCK>+$4)2VneqPpEw^b7Yx7oD9z8w13C?u4o3yEhQZ)De zR@`!l{Bgynf0rxp&8~(-U(NBTId?Nf6|lXI?PZ>=GD-6p1c25E)^rJ`{&}@^kotIx z+^>JbN@T#ICoJg_^+naQIMpoeSKJ`eLuoxb|Ir z5|>m{jU{wwjwXz7Q_PdR4&J^-avn#fl!HPHJA)x2KSCW9Qi<5aHHe=5Ef0y$_#@oj z{~qC{O}I{mvxT2Aka8(DP_nKMhwt7D@H~4hMwjZ{x$kWTiArA%_F?L%f^Mr6j=^*l zw9{Nb;c(oqHYtc&92xr_SX7c(PV|>=M7fKD>F|?xL~NNUmM@5oO7XVyeE_M~$sycpSAtz9k1LF8DyyxVjH9rT zdIQi{5^pVXj(^?-pkcG>vaA--rA;-Yrn&i7^!oil@6f*sy|}Bdv{HdQ_2)VLVb)=n zCwHFeNY)UQu&O4HyrlwLOKrlA!0M+vM*dp-Qc`9D2Vr5SMPpb;Z^b+rf1r|*()yDi zoX_17#5aOHC;%)oTWfl9kVEQp63#UGPqEph9SZi;>vZg=5Fy<*I{P(<0dg_F&cd|ZkTi=Lhy4f#?}c*=4h@^zz& zZqe0ZodJh)sNDD5>1c{i^n-ux+9_N7&Vv#aeq(WlxqwXBA?(wi9-6D-)c@}unp2YU zCvoN)(+-V;UbM{_Ta`&2aElmPt>V}^Zyja*JAzy_mE%?D6q+AzY%y(yc|Q9pupM5~(S00PpC6$6Rf?S<~i-4WK3+GFLO|Du1-6 zL;yTEWz8wZOhvEnU$uEIa>#jivkq=e!+bG4Is`y+xn$+P67V0HQ~3X00yY~f=E*wc z-3xQhf%?-*IHm^d`!%c}rlV&{e4k@%$LKne(?Z{twjn~)S1npnz2{FxCdD%5Z)&}s zYFkri6J%0|vIH^8T9#c&iw+*NxEr-8z&Znod6_Zvk z(T?}e{}E~m))v5=SN10S@yP;$22mFSy|~Fi@aU(ufgyIPVBl7)+!_jdwFU5 z%xmO|qy>S;NYvU8Qx>?>AKRH3vKD^Fb{$7^U5-$Y(y;8=tG5XoF;OXtEAp5hUQ+1g z3$tVyP!WB$F}9`9ZQ39ls{Np$a1#;9L0e1kcg=^)7!H$;_n zkMwarC(^0A*9&{Uqj$^e49V1kE)#PPs6C)coWy^0*n+p+pKaZy?YTA>#kVn{>=X(C zM}Zzg?}fr~o_poU;YFAE+adBG0yjlJt)Ux#tHc%4C_dnE-~6USpnr=<{8qWrWDXK1}0iwV$2EE?e#Z3+8}Df@x0LEob-r zuv_!0J*-Rsi3uF$wXo0cQl`YT!M-sPd!Ocb`Bs-SaIsO6IafB=civ;~j+BXYP=)Nd zt<7y-y{{lvST5yZDV`hpK+bQrMRF+)1p5G5p6QAW*n8PqQbM0**0eR0Aehuxmka$y z>;TVL?N5-B=cY}iCl~o^`Tv5A&{grym-^{{Q~7`B#Ll*#nIhXX>8U8<5H^5H^r3xy zhE&MeSVx3KmNa{>h^)DQh)RAZQ}4#}{r8ZIzTe4HhQwF8oM?6re^OuuBd;8XWTN?`Q;Mf3VN4l z-cmU_za~F?#29%Hs)#dfF~3k)F!AmwZHtUN0y-T-iE&q;o)Wr~xbxq&oy|N$DP92$60WVqk^=lo)D; zW{8RN!5yD{-t&3b&%U3%?{nVs-v3;G&Ro}8-&kw?)^&A9nHri2MamJIu>9h6ZQ_Q3 z7zeq=#h;o`qB${v>pXSk=IXTiyODQTH}kn*8o0<)ps#eig0HJ;a%myArN|rZ24!sTs>((r zr=)~G3A^&{_})X0Wfou0Z)0HJ0b}{8swJMKW~@xo96kTg%_hwZBWMfS*BxtGS17`s z+U6j)!xy;m;Y@JG=>D2bDg0YzQ*kc5Gcxc(omEQ$-jhfm_g?z)K-UuQxbaX!QPO)O zVdWBCu2F5#b+*jfH}~sy#dvO_;kC+9Y|;s;p?78qDfZ{06YCf9y$z!TqZr?&F^-RoyJB3Hjy{_i=8|5uJ!?d9C9Ua|~@QF4X`D=xkc@7g1a{2%1^_n!5A z>iKaaa+QMV|Ao^$`q*}ErZFnv->oW*m9K=)U47k3Lal;{zIOIb#>{;=@;K(4pRYBA zImFNL-VW6f&S$Xy-P5_>f7olFKvQ6^E->=D8?1kANr8k~#U&!VU3@fn@oL3K7R}KV zv)_Jq4f}uW8QcFR#J(|2nVXPsLsdm3CMD%&SX7j^l`~l;Ewu{i7+oRxDcQvSAhJE@ zWR8K3jV7MdvirM`?=m_}D?df1)ueFzth(g8(l)3NDU+LTW(T;ZN{KPPPt$MQ5xPKpJzS(79 zI}k?6sUO-c5}#wQE^y-y;;me)lN`L!tGMZCIi0bxXZC-2Be?#Nt=TEM^>2G$tt<}6 z%ga*@yMC9Gm-jO5c`^fuZ~aTp|EnYqs+^{H=Sq?vnctn*e-yT((0^6V?`u=5~7ajtwQjY~u->{NmhKeF1(Y2zTq`GW3n3kABx(eBBiTB-I z?nMIU_;ic)5|I#~T7&x%=e>JM;S2(puA9rJp!{%K-7X;RM&#-Tl3xZ%G5?=7$oqoS zDxVkxlFD0-`$XyX*I`y*^Z(Ec1@+*fdeov>2T4h+4*u?Vq^*4-h-ZQ$e$jC&EbWv4z_bU7} zoxaJf3<)oHD_)^x1@gG!_Jy?G7sB}rm;N9(=2&EoQMVZA7ii_p=Pm$l&O)nf)R;q? zm}1O)m*`YgRb$PX{d&bwpRKSOT3X2$Y47!X|3HPF%ko>}=GMuNaFn8@rJd*!+RebN z(sR=>7K-K@Qwl0t-OIOCEV_R8S-p+X2Y0q*56f_ma5|oQ78VvCc35Tv9eBOm)# zp1*wM3XHY>LX>UG!t$;|%fd2bh`yfWi0d_EL;0^MI%_GD4aB^v88UjBgXB{;+#z`+ zeWn}ck=>dL76!nDkCu|nbG7rHx$h2&*}b<|9!RYUIC6KGEJ^jm%oz41@$oG6CH4!c z=Nt42v!yO4%Ycqm-ceG&ly_vx6&7QP5f+j6;0^EE`}vnfgzWWy+RxqxkV8>fLHs;= zC0mYjjb2WxqdCegC)CWM>T&V$d4GA~WYbGM$onCMlu^2&hQo34MQtPB#CxSj;*8xl zB2(X9uTDG9!yz7f1EFrmBpq>whr?o3T@Jfq)g3iWs+PoCDEayt%biS`JS~geoHH-dD@}7d>fX*i(Yd3t`!!TG#}GYtGM8b z8eBDRM6Pz8`@=d7ZXI%MKfgwR9K6yh^oD?$Nt&?3?WO)?hH4`y7=Uob`R%XWEj6nB zHw#e%6(<*0|Br;1g+_O2Zl4>fC!toclRBq<1}x59y`MlP%wgjwCwNWDeeq+!(Nc1i z-~JjeDK!;U{A{zo+E~7ZDZ4#Wj0yW~ef5~^N6imk{ZA_Ce(s9EcBO{ZN&gKh`ApxZ zW%W&J-_-9FNbekS_~Y8~m}GdZ6QvaWc}nwFz0jqd?EDya}boK$T`cFU}T4s)pj>Qte91n!0vSUF9-O2l`aEDJ1vbWA0J7Fph$KNWm~QEPhh~gKwTqY;3j$XWGRAUcbUll z!lu7(9|pW~_?c?`4YQa_k_^%3xwekZT|q%@Tg{VOb2>-fKd%UG93{IWyIF|v{$aIU zTaA~G?d7yBtgoIGh2MHEjs)L$d#iwy``kOG_d413>R0G~FGq55R+SbLq(>m_w=jUhMPewBB6kDv!TMeg1Umm1qVf7qLrH)$Sh%HD4exg1w!%75S=vOFg-%eouO zS&-Y4Q8&k{TikIPk>Ky+!F%n|@zz@-47q;$4|dRp!{jok@1C!W;1>-mE%SH{8=oq* zVqbKPH;ZuimJE%T^vN^(V)#j@k8V#TUTu<*%&l2p)`Kb@iTRlNLS%6{YZ; zS(~$+8aXXhZR$vHt`Z}Z{FIbtzZ(HNQJtte`u!1`;6>(=A*56PV6^Z!_1AtS4|s5{ zuY@p%gX3Cst-~1os+UI=3polFY>m-rG!Kg3n2x^>Gx2JWdNhBH`$e`w*G*fxLIN@H zI|2VA5ZgN_w(lwB_D9c|F_k{((axRj@69q4MXKq2&`sh`5FD1Aah*2a`e-NdIz1bI z27i;Bwzjs-QFvmN3zE`ds^X2X6I|h0;sb|J39kpHq5wE=zdr7kax`0_-~QUO^+P@F zCZ9^FxwUU^-c`N&VX3MzbvOUfVhOx9*RZ-vyJ~Uuku(A~N3Y`etmyL5CUKh1-Va-^ zX#}=+G^5(b2$QX0~a^hyj~@UQz-Ch!@HT4ha^8c!zz zs$5f1H|Xf@QZs$Nvp-Z8Z>2fS9Fr#Mz*$T*;&GZRNgPkOqh0E!D^A4ia#ne+1{8us zdZa!YB6olMDE`|nfL(8#O_f!*=5)|}uykt@U%FxI0AjW|tje;Jz3SDrcIwt3cJgqQ zi@g@o(b@Sd{$6Cj(ajruAa6AM&Xv6&g`pxtHF%xuaMy4NS)w^P^t1Tx(vNORIOrbn z(5uT%Qs`Uon|C(7P#b8GuaIxx;j3;@VGi+o)+A>#S>@6xlP&%|O#WQCWwVsCq3lrh z-a73a+X^-X(Bp$oyylK=CiXq*6_6#$Sz11LHg}#aZhu|O#cmK?Wk)G0OTXMqG1F&b4hjaWN5C3Q$NI~j#Un%mHS2&7aNAb@M&w>sl9vi_-Dx2;UiSg>`VZQAQ7R<-zDL~U$j zx@d2{hB3M<-{NaP!_E$BO~n1l30V7!iFm4vlZ(=>)+QUQFDH7hUohD`Uo)92%WsG< zAiQcaQWlBdotdMzWl3&$V!sDr@A)F%E9io&^OhZZJYH`>evSJcXcK+s#S5EiVUE;C z8oMu={k(F$OO4{<;%=8WOFfNZmCUpwk8{{yJluOO8R+bM*I}$E&(y+xx=)wUgMGh` ziZSvQ0ERo{JJHQOb$nT#@7E{HQRpss^GunvK6fgU&;LC# zIcadN>NwW!T&Zr1pcqH$a@r%;R{q2Xol|v3Ke|-~eO9O#3N+h<<*Ek`F_-DyHV%2&(we~JK31?H-VY5`PXFK5HOn|NOL=6UH19Oh-lI&(BwPX z$a!>~jV;N|8OBpy9Vz-(I~^iR@}=P1eQTKb)hhJB7ZcymwmK|JjFZH)%whcZ6O(&` ziBg{{!$&fu{qu%p*(!KwYNK3lxkmc+Vv-w3dvW;V^|GXH_EoOC&k`!iH#OAbBsW`z z+3c9oT9{5^6_WS?=2RWuOt9sfUd4czM+?oeehD3&o$&1er}Ab3I6&0934hXLs8dz% zYiVP7h&~+lYTf%_Eo{yd1OFU!EVMtlerG9Tbkok^_U`BWqkzjyhX!4CldG#^!HX|r z7S8I*-emt;a_!3aw=B6j&`wJ6)iJV4@UWVOlr{b6w*hLE@)ltec-EZg zf(`9D4+L97{lvEOi+O?ifPKp&N&I$q78J#P1&%Mk2|vls(JJrRTXS;lEiezbi-vdf z7neu$jP`63H;@-UBfY$cL=V(Z3s?O6_q;JNG3Ty7y>Nr>zFyEvUZV#Tl_N$sZWLcI zc<~}InEAHiCn{|QqaeLbJsv#d<(J?@Bw5(TE$a)@SepaTGJ!qI^|QsjYNWsHW@-Qi z+k#nWBTt#xO!de@&2AoPvY`fmWBGjE1PDRY4+CuVfbbc6&wRtG14&mwn|Nk_;>oPg z#{LyEZKkH+y~Og_YkZsa6d75B6KrS`4MT_c%t5VW$-~qd*T4lHy%#TJtVw(M&f#$w zc4|qNincmT{h+2%!}tDgOT@#?%!;Gk=&GFPG_l3~1_(>@dbvPki#Mz_u$!Jw!ghYx zP)?B9m9(&-VS0A20HtJ$2adQC19zE+D|U7SPqISU!jgJt7FdGrqG?;|Um-`!;_T~N|GVRNsBuE9qzC2=mkR+kT5Jth7Q7}xB$^Xem!P4GP zUzyh{X^%bQE?(J5l{o5aSy-J*T;W}nl~6m5o`j-4_mV+Ji~{C0utw&t4~og?IB5?C z=bG*oTb*YY_95-%yQ!f0g&UO zD>O&DNCo)j(b}{!+rgIA@z;xDXlGw_)+&6h(ODTOhD(7L$iLD-*qaL+4twpkS@}5 zJKDh%xi^zCC~|Mody$!4m$#C5$?KKGf1OH2LMw|@%9MWlW5-BUS(L%r-vSs%$l2}C zwo@gJ8bX6SllIt4^M=LaDRRHm)^Gn*cJ7``D!C-=q?rd=4!tALVSWAe7HiB6Diui} z23*&=FmD{^+>vr#JUm7*8_~LR#e1!gE81s9 z7PPB*lDvtu;VLt5nLAq6AMAd$zcz?>Ds)I4huzZ8+xdr(1#AmFD2ZA=84)gP?5J z?FOx&K1~z1?k0j34vKOQE&nycN)ir!)cn1+u18V3HYHt?&G$#2xBhz?(*oyo`lJCyODSU zxxSYXs5@sd^}^%Ra2?9LBIOQI%m_~I7)ha_Q_INv)IkXr`%z6v@tveo zObx{ma%yvlD^iu?f5p@<@~(OeS(7^0^O^a6X>&Q6->iBt!iDk4VD$(9{4HFTL5F?O zioms_4iWw7qaa@wCGlT~`aB!73PFRCO$B+mfI|Rh$M6<2Q(c>0Yxf@382-nb!{`Ne zh~N7K?SliLi9H0kS<75@lG2O^xJG8iN4CXll~rCb^VRUgMF+kv;FGd#i`fLu%e}*| zW@RvdA}MlzxE62I$IM&{0(QZ<=nL2F%9p-w-t)zN!YQxHXJ2e|ngK-0=ah#cA#+c@vSq zEpkA_cV7ve`OyO!W|j1YQ;W@7_v`ak13#aLrc2r#kf;;Mpvq-9Nyth$|4p*V(NPCG zTyGmi*5>RHwXrvDOHwZK;InJsy7@*HaqddCN#Ma4yAc2|7&A3TY-^o{wQQqToUY8A z2o;x=F;xXGwge6f5Zl+*@@d2|-Lee`7koD&ryM`;KUdY+%^yyXWPW#^-EX|?sAGS0 z8%uy`0oKO3 z@CuF2JN98&Vs zulFS>Ll9YpgBI0frVqv6vm|vu4IvLOSTmRNG{Q=1PhqAfFO2J7ziHTohfp)4kB4Wh z_xH<{R`K1fpy4P9M~qw%JLG`!1pO|03U{=-!QQgPSp2o5W_4^WTNZ052d@TZnc^`0 z*`JpO(*boed#U#ezz5#`xNR=VB<&&b6W)`($gGH#EdTOWLWC@9&mb#y$yml!nH`iM zA|{4tkCt)~3q1HVnw53XC|e~Ew3`2>Gt2pMT3Q-<&{f>0`|IxPw)e^WQnHbThF8J@ z9!s2*!G174?=J31>VWKDN0$>1c2?{TpgGI5)z$^bia#4TEqvJX^6gi1?#*Y9Ljp31A?%bC2_^ zRB^;4lkswNR&1PJzS3^R-DDd3Vp&-28EYU1^*z2kzgqQCnKLBG%j@s{RCCG-uD{cz zI+tkA2O3J{<%l%<v}YC4!lhpksk zf62S=X44cHfDnJZ(cmhHAZ&WE!!k+8qLPNlw23G4^7^Ji^L{I8?wg;22$QgE3X#rt z6r3M!KRQ!aaI~koBJ%Ihl?|h&ou}{co6?fb$TSexN!e*{@s6$T)X(^}jqz%`=||l# z$4?Hn#V{!V`{Br(vRhU_z~NgBB5N3bAneF{UzeR_2aiP~T$LU~0IsOst596Oti| z8<>E-N~f}L`dlSHYsdK^JP2Fj&UIS8w;=T&!ee=LaDf|I6o{C1u_prfqeAjJN~dTY>rmR0^LMsz>1eAc4% zaH5%f*rPjxa15LNz>sP8DcY3NKb4oG_x{B*zgxAK_)C$*{tb!*H(GpFLrzT%c7m~a zNLzMAtcsSp6y3cZ<~BCh>>qvi(j{mhp`P@-w8iEu2<%D>Ts&7Z0 zv=S2ab71a^C8?q|&-~OZQkm)x(?tPcm=R(BgII?k_GBw%P9ZM(7%9@- z#n&NSo*%lj?N)DB2IubXF@77fxfZQ*nQwjVW8U92YgJZ4>+fC7skRv%e-<*7gHFD+ zzrb;|g@j7w2khgShsSTOQW(fxs(g?sUKzZ2F@-BsNI0KI`1iF>abS7{d6G9$ zWPRp#!TbB)$h1G|ZV!Y}aB6*%694?=k?EJ;SvuF$axjrycrWmcO#4ve_L&E?915iL zF;7dv?KF8ge94x3e_W1Sy%d=@1XZ*oRYk1|1sC++W{bUPG&ynY?|)EaN=v1Z8SLx+Sl+7fsnzeZMhB-S!so7DFb}54 z-EvYmbGc9M<0;V$=!QQV$nBgPh;L_P8lz+Sle&LW_fP8nN!>rG`zLk(e@ z|F#S8e}lc889zs!HuuRftknfk=UOK;^tgRU9QFBDt=lJ6?2Jcrsd?+{%&SQMflO%x zf6Jj|x`dbGM=zE*S}K*cet*dWp)7ja%Oqu8cL5m_F!19dO-!FQPDl&X9 z=zsIsK<-kbR2ygaNJ`m_{}2@Zm-O>-G<@*}0&~D%(RA6MmgeKN;&x2%UZEDKZ|33P zQnERlbOEu_qMh>Opsp1_K|yiQFbo>{1>K0#*iJ#uCEk>`YIOf&Vp|)$hu;jEGxPaD zA-P^solS}jW%IM|A=9?9%0UL~4vxl+YKS4N!xSukvvo08ZCo$=L?DLqlvRj(EWbAx zzRyJ;^OjHJdDtW2e4g`vgwV!_QK=N`mxHr#i(H~klf00fJ{~lzm9Sqyk$ZgX2iYBx z1i)(?yaz>Kmy2O2S)#9#gF~ene?vzSui6}wcfQ6sj?HWlbWBFq+!OMY0)D5@b zmIRau?8L+FQZRTjaKG4`+E~tSZ&Vr0(0ce`FkNg|=CJJwO>y$4A4&d%9RVU#Q+(-$ zgEXYE(RzC(<1^b~9Y9a-#jQ__&p5<{mkFx(;zwnrsu)!Av?q~BR^)bZMa9DtITi;4 z$GLNORQu1LmVkMwh-J#HnPB@DFGgb^$4j?9VAb-8KD0FFzWoJBjVh-&!k<^m2}fKiplyw#Q?WSHWe+guAB8MZm`Lx;;;XvS88;ZudrY1s2+Phy`-kegi-LLfs6gX z#5mtzMew5jbur=P5RdC&=crTy6Gq9dCuM$oM+5xihWU|X>vMRq9-HSM)Oc4OYlw<% zCc$(0L*%17{^_&f`lHAGI4HIj`J(j2F^i3X>SZCok>`F^Z2WL-avGB@nHXgo0h*Rv^k3jzu z5D@T#M&-dsN|)Ow6TF%buiqgZqnd21eDpHS4GAqV^|{vIMS3w`Yk_a3v{iMIdn$in zRNf~A;;1h)sABx$%I(pAu!6CmS+{9RfS`gr3F$eqQ;cqr#j>4=(XVnF3^AC-b$ox+K^!%3WHG&Q96bb8%qFf#t;!m#o%4)c`G-1XRo1n2@#eq& zWRoR^R^?4QeGdtd%wq5s(24Wfc%f(z0k;yRL`BbAk?zvS?T6`>Ie1iDT+IBqtfgfZ z)3iHe|6;)->*Vv@>tS+gj$LHh6?qpQJPPUZT>5re$UY(|`;Qi~maW0UOvfNB((a1X zR&a(}7o+!(IO?(#ntARp1TbB7*XUUzZl^z|96}o68n~Md_FC67u60Z_eceWJYto(L zRGIm;9`>FpGsPdF%-_hMx2ROo#azLXnEE?Ki4e&+2u~d3{!8bg8->OD^d1T66@yArjG=_5Sibk!0%^)mfPDJeG81ZXiVP!u*WFTKFi_MZX zbg_d>d+Y9{+fPEeJZ--H5uM78H>pFDWv(_iqS7i94X@>Cq>3|^>q|UOrP82X*q+WM zZzU1*M^x2+HpG8K8SrOA{AWY_Cw2d%?w{2Cle&LW_fP8nN!>rG`zLk(r0$>8{gb-? zpQLW3Gg@_e5-j7ix>g;RYpD3*%V4>>{acj7jX=UE-Rv)fm(eIZC3!P*^%W_%*qTDp znL)5Wy=A>?Ph@yGE?(W`I49rVc>7oEZ+;v5r?GFfG4I<5!%I)Xg@h;HhI6W^ur=Xu z3vYluUw&cU(~ILe*@eXr5-OF37hF|mhlTbPDR)iyg&hl0)!>x#w{99u(lP$Z21({W z%?6Io*#CF~cye4)#OttmT%8KGu?t1+uEx zXj+GzDNgskk!jo0U0ZA?iz9h-<>|wk5+1={nn)`3Pc`w-*n2-!x~YKcl5lldhY`ZB zq@fwMoOsvyg$R|(^rhWhEwFog^zJVODJGA-D#syq&Ooj&QX=;5nf{PQLZ$LWS0UyK zl?qvh)P=T@sDE{ zOj$p^Cn0ON^^Hv1Wju`cOxqYax8p)uSXkK0#Kh#>m%y#3t4n7j&3RN2%xMt;x*C$? zb@!KfJqj-Pr{)#ZuYr)*$YW*ItNpDniABd{u#~$vsG;|gckOg)fqLy*GU8@z^tHny zWqq$-w%RCh^&;sxcllt7+?lVmhG#18my3&oWYG32vd&l}Fw4u!i+cRGrly%8X{?EH zrDf+gn08@;DG=$kOevx4S7KD#$6r7Hc4X}_C;Q*#$u%W^ohScyl5gnky+7Svd?jVD zuu4aN(n!%T>u$WN|JnyVMBSI(WxX3yP>RIBIZmzUWfZ&V57563%@_tMm1wD*kNBPB z)`*P)%?u{wk^NY{26=7$9#jo5nyolW6cZJN4~osP;DK!yT3fJ-@mk>BAxVK637Xze zirnA&Y1Q2?^Q}L7^UL^1wEn5_1tvL}Iah(g$kMCpyNDQ}!@unUB=PaqVK5kb(!y#< zhv>3dJ7l>iVqNPixG4N-t7}52^6qYQ*~;%whMrFpxx+z(-AO3a($yb<*w`D>iguh2 zv1!3A2^h=EzvDA&nws6s#44DVmzUQ`ZZ?h0WRD)9ve=E9p?#qgxiu*}1l7xY>$7D4 zU6RB%FU^Ly7&n(qKZ`D`71AoJwSMCGinOqzV#I8A++|-t)Id=!x!J-7a4>gYD|+#F z=I`nW1!tYlB7MvZGQy>C^`08%b#f6O+;%tGPWHsmQ$II42)8f_J82d5G32hvj!eEn zrLu5w8>Jci#Rhpo^550Rs_Kn(A^(*^{G?>gOcGylrMQq{2)DBRAAstE1H#{m1fep3Mj%i#9Rq{0zCP^R z50|5r8IR#w9W7~*8YY^4u04ue6wMwSQ#LL)OZUOH-zm<4dUNUfh{2X?j4Wr*NL88k zDHU>inZ8NxnJl){Nit}3#eC6o-m{k>_lZxmDhpsgjxN*wV%)g&7RBTr+B8o=r6ls?I_$QWHL#y%?7y*XmtJBYn3w@B z8hX%2bMSric({7q$QjY7lB)i1<0lO#2wVD&^3v*lT%QD)1>Hh z$@S_^-5-36);t^Z4myPibaZq}1E#ntP$?~l1+UD-(zw*PoPb^tmUM8aop?z=b*?&+8!-ns2%)PTWtTcof0xLRhJOL@L+$sj$Oh64XXGqQ z1t~$i9~X_^^L+9sDk*e5D3iLl{HG zS1AY0Iit&kr^2ZE0Y-q)AF49_n-WkFIeo4242g-75{_oGxWT%7qIHhw&LbJrKx_S; zf$439rzE83+~tBPa#`+Q=RQ*xNG~lS$)NIAq^;Ls<7Mw&th9#mmC{|>r5v+dJD@ns53sXrFIAJ1EOcaxY3Rr#YP~hqxl6YM~r% zMPx+7zcl_ftob#wo}%-y5nCBh0M8|K1b{RG@R@AIX3qfyyaIJ?Ct_CnS!f6ZotJFH z*8rI?13t~8yJ39*x`L{{0uv#@|Ei3ZkCNF7)ZVL{GKA(rMQ{SS;%&tAu-g;uNDc0B zNsdzFqy^;Jvk)X{VRl}>W}3cpuUla8>y_48Bi;7ikL{+ko_&9jn?ve(W30DfGo7L8 zi#Hkd^?hjwzl~1nQoSjtO~DX1IQzQ~@A@H*@-;x$LzW4ztlu8PCkZ*;=mj7rb#$G( z`My>Z?L75g&ZA#<-UR0CU8bP-I~vEj-xu+k|GCG13R9}mY5*G;t? z-%Hm?t>{z^#eRCBqza4NqmL*z;^VsfWKvM)m2`?{rJdQ%MGkE~xe$uD}(tU#tZ;s?}`H{GuI$~2!d)#gj?+YCKVV)$vy;xdcFEH}b9g*&X2!0_o+rhMcp}CGL=1}>J1&`^waaw{CMK;w2;+^ZoCg~# z;yJ`BQU<&1lW4mJkF~A({j9li02oQ#9u(yUqd^)QmCPJ(EH2gR>1A)$x>ZYkc3pga zGW;f=&3M<+%9BQIJdx&>JE~$9%?Gx3Y2Zr{^Zg{{WabRUCso{G&_{&J@_Nx|IyVu< z;F(p*S#Vb*bNa?U*GpsF&JMoK`?ES2rdRt^k&`;&I3|vXX(wspG(cOdjrRsFtby`3 z;{76@hatn_yXa(=oPUvmQvw`#SP(v08n@Lh8bkU|D zS_^-QK#TxtCq69ODr5x~PD=o53@n`LGCTunC-fo%Lf7HTbSaS>q zj78BPY6?4#!FBNQ@TbPU0Tb_$Xii#(h zxvN0brg|^T?0c=B)ZivtnkV8gQDxl|QwfgfY(*1Zc^}u%sUT6;&5GJ`utI;lNOd2e zGtSWoAUhQ_BktTjDT)B+4IX>f!1vO!?HTQ}fqlr~)nb^4@#>>m@8#awJF|?!8H8#V zD+s`+vaQb;vO&$`B=18NkVO!FOi zx_b9pj33~Yu?JiK`bgCQo_;CpvSg%--kc1sL`xr};D0i- zek2e>m|ZIHCs+i!ZjKF4)YUh&skR+t`U)EkJP`87ZFiT})Qp$468t=Xkr(%`LCLg< zuDP4V55PNjc$}Bw9E%H?TwtTA;eqQO?L*${2&8R4gWhzk@@0116*qg{acrB9Z=R5_ zsM%!#?l+PoIPkl|<@tsuLj{>mRYTdii34RdOP_eq9~*yKgkkp@A+;iiOf-5DQa!Oe z{Ge7*S>NDiZ93S&eB<0N1kI1T^Go5C^{Zldksx<7zr0S-&9$1vl1q}7U}l1Mzhb+2 zIrH;C7t?Al0HCt!Wmc(?p4C!bDAw;`)`^yR-$rUO;kAC+9Uj2JjJq-Tt9!@NZ6FL% zyKY?K?_aD-pR3fou&l7hj^yI1yWRPPC@c&_tTCjO)KyLO+3KblOQaY{e;#9R=yqme!YoQc^n9e|!~rQXU4- z+!|{xBzMO86$@X6fmfJxTOFZMR#+h@Gn_0?5m2d~R;lBolSp)!mB5*VpBd5{gDn7=NSXEKmuVm6`ZtHGh;}Bqri9 zj&ABB;Te|4vqe3?Zo?f6>={T#>u*5|Z%gguk7JOe;n)IJ*+JUb^R zC%vPHzs-AsDi$lSeEjLA>r^8k8MgL=k`RZhSJ_f0hBCF#N;7+TrcFmQ^ad69;doO9 zN}InFCmKGq*ou$1bUUTzARO+W(|0?2;#H=?2x%G5@diU~2?@^D>7J)TM>mGD&>F@~ zJIGGe8Rf|dTfnp)qS@{rRs2hfK>Fj1O1dlUiwJDoGH$d9yL9<*O*AMpBW_K9Lm%R5 zl)0c20oUD(<7bt_;#>t)GO+G=EU1|7YG3+*B7$4{l6Yi<*GY>4GKH$v#z_xEqW0xH zlq~t^8&O6&wER>l5hOm&WsROuY~$t%^J;6~vm~hxltLa*v_hSMMRY^sgO)YA%Mbc@ z#4TU9ZaCE;mxlyYzXVa(15ZFi+Bob-KBlRYO%FyK{KW2Z0RZdlm5fE$$rB5_^U<2| zbRuXqbuzPkQqN1tDm?2-X)S|>`vl|2ioOCnyR5l{t!PYszAb8F2p&Vv;or>YwXsK; zO2uZ-g_uRvLu4A>*Qx{~;sI88e0U<~)9E^N{y(_@9;^GXd+4ZzQ^@o&b-81oD(3{Fm{Z!AC zknRW?`IhBeie4Np4J|PgHUL+NZ-R8!z{e&37h@;MRAs2#O$6!9-AK-&;z$qkqH_bN zpT|JKc&|})D`xhZb4*Ta1+25nY}ZKD+<_m;TXV1> z-BYUBJ8XK+N-kYf-{W|Z0mB4FLSN90tj`qUr$=z(ZahGbA!8`vV*#S|@4hW6;ma!php+mcfQ}ZA6cJF0dYHT>A?It{Y(An3mQ2@|oo`g|Tmq#~PGrTao^Vz6Z zy1?eQx38QzK>PiNBhjnVF1TtQ=M3I5r1@W?e_TyDrG4s&Em#whpf>foevf}C(_3qM zOAX>RK$YVcp3AL`*ej%Z%6drL-E(GCOL`7<3qJc%h$%EB=Gk(w~Jb$Gn-JT z-VZl1UwoZS10JR&d)sM%PC;KNYW|o<*r^E_%wMb5zM&R|#RPHHc>C-cI3dV}`UqGC zX)&+G4kbbwjb9RHKwGg&2{+Pb=TLXD@fZz|%4@eRw}{Q;<79tQo=Hhvp%U1)=T-A9 z^cb`UvKuRlcE+i>{F`=y9S96S1Mam|&3Oi_ZVKky!ww0zK=6I+gDg_I^I{Nr0r@nO zb(z4;@_4o7w#xAQ^Y6@^sHm_;C||V96(DxF;c1DjaK+I(UV%h-6cL8lKonp-;;lSW zJi6cyDW5m4&sk277q$BIQDd_4b9(^o?^qUOpu5=4K+F=Hkob zn)p(T_JE$Chr|7iP~#s;^jru0%-8in)Kr$a^EOg28Qa=X?Nq<$Mv3yZ%k4qT8o)*Z zPsZJDsjpvNLLqJzQBZdDGj%&WbQNtv8YGdf8!2}fs!H1e;_Q`q3-M%edtSYjUcs~o zUKMlH-rI;XpU`@a!d+e(Yv=KJM*}G;c40Ym&Sr&(wDfusQO480EA{RyPq!n4o`R5% zi2{7%CFESx^}r*@2*#)R=SHA4H_lbPMwYVaaDiJ*;hA?i_Iu3&XNHPP49%#q>0g5k zC;45N^Ok-b3CN6;u}9Vqu}x~rU{{uNiH1b1(?+`0`Mp*rB7zm66&5Q^aefd5F!r7^ zou~BuzEJ3^t2go170L3)^VN5DmlxxzePB325~+=o{1{1_*|itPw7@e|jkM|U6C;}W8W)&GhRNLyZAFdc}(aSu|SA4yXR18ueOv9CpDo1qHbB`NzcF%iq=vkkc| zWUw9=AakiK=*?~*VaD))t!D}{ebBfWS9D+8q5Cg{KL;G~KVYq4^<~OLMS;fxlr&2s-c(IUEDXflGQ>YvL``qeehyI{GHQj3jGlz<1w>p36)DIj20qc+%RUn{A=?Gr8M_E%H-%btXbzuagpi4W{g8 z`YRmMH7OJY6cFufJBLe?Rj7L?%zz_pUh<*~G+6n^^TNZxYcVT5TibM3YbFhub!kz} zILz6%2UfSZ%P)=gjM|Tbua==N2aiByo&^z-C{v*w$nA3$6|j|mt;NP?Cj1@v2R@S9#6EWfAd|LlUf^W*JwE!5Z&iVY6(i@F->@!L}sa-YJQ;r$O~B)a_+7 z2v8%UjuUxL7Ee;NQ*cOEvihZiOudpGuV6SHF@q|_sbl@ZGd95RWHXoDxip_1e3OZr zAZ63L#X5YGS+E4vc_VE{fOd_lV0g<*O_8!83t!T(YE##WtkZxb=I^r!4kPfQp@zf6qxb_jywzVQZ1$vLpJ1=bVI&T9Y;n?}|AOq*5 z2Te2-40Tn}>89ZM&SAEMi(EOAlNu?Fvz1w9&1~60WALn0?l?>Toc5V1KJ0VDa4&B_ z7&Q>H8gS|PE_mrnmLGu#7daf_bi|fraxt*k@rJe)V%zm*-!$IOQ>N4P)nzV16R%jB&5*6J9P9+% zHq^#l3M&I}q&iP4T#P)EnXf&~NMGx~!Wix_KvQpFeShmEr~>Mq8Aeks6(;^QB;A3{23L_-PA0Y` zFLKgm#Y58B#au{PKGhAPi=$*hHX{i-HS}7t?$?)NEh4O}1W4|2S!;~5(5H!R0V;g; zLwqhbCA0(u4xTRO8cxka7FMq9;H1~2Z+(@lz;Lp(;t`ge;1eH1=^_IAfSI`>xnD3BUH5 zhXOfsreMwFCF)W9Z^(M0w{|G&t8z(mXzrqcckUeK4>%FH(%pbzGy5GL!ymyLT%8uY zPGgphK?=>y<tfWhf+0+#Bcq>q4G9hpTTB37wD zqjHHYN@W~1Zg*|){Ef(V%)B<*+cXi06UsfkS!$Mng&j^6KjXF34?30w!d#2p6SGE6 zL~nw^(z>NM{*hwZE~?BcNT-BRF3Xmgvki>>RZ;vr8?XV>xKwA-(HN)JY`zu(9_hGq zV|@`(1cPWC!vo97ihogX0A!A54UR)bPRVfE{$YMoC{~qwQx~YMa2Dw25Rf86Y`=|Qfg9s zD7LmP^re=#P&!p?{E z6aRct zK|o8CiaOD~e0%7S{KmEm93W^$imbkN2z+5UV}spy`4{0 zw}=WlOmg-xTK+hv{HH#2nFxiPKm_!)V2EqP{4;J4pmxvrgYNNzyKLOf@_qm!uPi!S z$3R7DgefY5DI!n^(o&FHiYXvc$m#3LOo>EL$liIbPCx-fL`o%7_<|&^j55eiL;!+B zU`UWx2tWvV)&o7e_Hf;h_V4&*Ym)ba=WT?Vch5cBX(y*?x$D}j%1O*-YAu!BpR@?> zV9x%nPMDD=Yrc477t4vk_YC_cxF{{Ha0$k%@=M~B$vgjrA+-p7TGmTcIB80QODuy| z6%D2dPRjcmso9AQ>q@TERY`5uvZI3Q>vil;unW&xg#T+V#T`A^sA=&1blWxRRZF?y z=9E(h4*C5gq0XgKH;#e*sT8g6I3%yok01X1^24`uPn3z1oyW=m1;hp(;NO1p)rYz1 zCbs?7K_1B3q&pDZa&<=GHT>g&SHLSa2SI9YBdSD}v#v4ZMNg9>__)Fsxl9#qkyzm5 z!WYqlku+mZ96ukvY}Sr439T!*)oZWM(FMLqgzrLY0Br|V;1kFc*;Yf4qCe~yvbyI7 z?m8n7{gbkB3Nh(3I1GQ-pt~5}>^S5SJSoT5T3cy4Vp9>*TD%Ite&x{^I%Xf8wKVST zTJv4(S~ooCn7|^u(HmEH-=)gOqF2xuKRQQf9hBHSdDAMV7(OW3(=wqG!T#BLveDSj z!o4x!jdHHlG)znD*XTawwDvtRbUc8?203)s6g&%E8<00K{SQJ18hu?BQ5FKjQ)|zu zXqWRXpWP}jL~{v;-KhAckmpx$G{^xJ;x_?xQuvHvyX9Yh&(I{e%u)_-#*Z|zmUqI~ zfG7`^zJYBoLuixPtT-qO#$P6qqrF4v9z1B`jDs{UEZbL<-7)TJoFKpUybujT5c`2O%;m#!}1Kc+J|Y|gQ{{>u^@adUdX z=y`!S5#O=0iD3l$9FBnZ>r0_(3tG7~g)~;h0P%2ZygXZ|Y&cnVmk8W&xtXGe39)1A zR|FEn5OKX1m~&ZcNJff`9+RNL!sI=v#p52Bm4odvOD2Yw;T@KIC{J%l*9rRC`pVkA z=&TNb-=dY_t&&LJVHq4$-e234rP_as{utiZli~p55ul_|0v^9%g;ja`iph**AAl4z zfbRLrx@)WcUaKMsy(Dh)B=r743O-6sYwIpjC2f|5RcM=OullBt9zn>nV^8k;4Qs5q z(bg(Lb{AMJ{WqYQvGu5xTt5BVSkoKVk#To{#mbuuKtH)Tz~KY>rQd5|~J{I0=(Qlu1GEcI0sP?zTl^r1+(Jyz4Z{hs}Jo zzpD4~2FDRcQzytYZ{9XywNVyye&Xxu-(A^6XI zINWj`pH1+kX~w*^#RNG2lmHE3V3QBXqG&l<4`+IAic6N2aQ!0R zEEyPu@5(aH7CS~_?SPIM=~0w-+rLu4s%f+A?qafKiQ?w|zva2FfE zRYXA^z~Dl*4`+5=g2t@}qSdirnBcxG=X%0_V(onluM)8wh_OZ^)#HMzkHYe&7x)1{H*OB^Iodk_nyD`4W?kO_a=>Z z?99if3mVcDB{Cs5`3)Q|UyuuG%NlRb;9W0#Gm_2d4Co8?r|eDZ)Z&THh0;_1P^zA# zi~lZQr1`&pes9VI|7)Le!ms;Da16fTHW0bWsOS7?MU`f0_6lB<3sUuaRe4^0Q%N6R z?K6c6d$S0}s~a6gBS5^4nK452*M-=PK%7Xp+8!qPhHkhK+Gk=*tZFf0cU-rM7$##P7 z0`*f2nuW@?HyS15$3s?XnVC4$ZYAtWf%;-Zutf3dNJb4j{`^FY z3VK)^gfjv|&Y{z8LG6Tpb<#^{njbfr6^OuAEBa}#d>uAhSR5<;GPK0@q<{FBOGZTW zS#l;;_@4PF?{Cp|_P8gFA}9!*s|;G}9(HSY+KT*?n;Mz`gRS~6AJY_2+Z}r%2>EC? zFkoQ#21jhBbD6xMybKuRpDi`tNFm`(f}by2VImvuoo!A_jo(=KkP|c?gi8G`B0lrM z3~I;ojcw|6Y5V3A4jSizPSjO@czZbHEiNw389<55FeOVZM2q{2y!`P_WHam zp-108k8=FUWR@T{nDMF5b{LaXg&=rh z1Eh33O)>eIZp}-xUsBP}5Z0X}I7ER>{(EeukeuPF(*gRXY-B5@X!B}(iaAHm$hhl} z@S4h;xouOs!Pg*Ob!o|3eTI%u#D$jyxC1ZTO-O`B5urTq0(zf`0Yw1Ylj8$!gO9@o zdo*9tjXcijicajx+?P#F6V5WA;uxQr>spMmah-~-^YBZY+Up7i1i4YxKc`%&rNH|( z`^Q3Q?Pzl(kCz0Jaiwj$NS0EQnipqbam4{I38_P_E|LYS=?(9bORZUwN{We{(>Kf9 zr30)&$z}2+xUC?u4{PVfdAar5FpMrJq1VGKhqq7wLUeg%M5d_E!Tr%BG~|8VbcPkC?oGI#rx$ z+Yda7D~V{GCeUr@N0S?czfB<;(1Uldu7`Vn7s*cfxaEry(FhZ z->rq2b#a6P>x3w=I~U0CZ9}s|=N{1I5g{npk}TYs+QXQ zxsh!|w(DoHI<2qTLy-8vHR*)aZfL6MrQpdw>K)k;r|@J*fr{qT&VwyDFSPST8z#0| zG5y~+ef{3WE&oKzJr}r=c3@<9m8Lxv&deO|L|2q1I`O7HN$)0V%s4tuGjUKMqR%mz zoJ-{Nfh}#}Nru>tBV7-s)mgbWiRjxPZh@?HV3Vhv583l4%pBI>2MDL-PLO>WWN9(S z3y(*&C3kk(*=9&Mam*nlz+r}JpXg{+)|e)2S?3s8UMP697cRy5XcP027)7`XUtMP| z(BcyM*@NXtD7|lQAe#IRku$}2Z~bV~kSrOxBW7Z8stmsAurpj2w}Q^TjhqfuBJiVJ znPL8ac+^3dWYecx&>RR6X>~Hn$a5^<2vFM+OBN&A!-4HR`7-NVJ(c9W${ZEtc*kg1 zAqjj&Q#&to2rq+pq`w z^81%57YaJg*iU2U#e@z`?1XedMs&Bu^Sn_8${1xE44zWFS)7sp_tn+~r+a7ij%0T3)`E7ui#34=2RZ~BUCsZl=P5RFvLtJ=}kjpJ5C{Evx!s(?N#{t=aU z=&|?=LF=fFDuZDf$Q$-zy*A3)W5}B+pRsCZE_XGDFanUAN7B6}HEz13U=vcKk_HVj zi0ZK(LJ>`=K-9KgSDi`}!$;E6RKX@@CJZGu2jm0^W8_O?>zW5&SAO{;zxq-KzxrQq z^19_c|3chp2y!VCE*sRH9<|;~`2<~7TeO!62z^(YfnPRiMSm+2s)zvLbenU0)*0SH zB*<87>z)O~iSv~z_Jb(hRU&r&gngHtWAIRm*U*KrSJHGWw^8xn=H>_LJ$ z6F$Rfh~cF9NvfkMQeJXnRuqJE50^M{8j<7BA?y8#TOzcN?kfAn~G@CCjzIWrex&a7D)g#!;u3<;##p=lrh z)<+t?wJB(uD2>5cG}0;%jxycix7bv!rZh@`<{YbV7dB=YXa-B;{kR$B_tAlUU8QjQ z@BBXW!zm~Oo1hDnf*AJ#?@tru6TId+0@(sMJgrWI9$L<(S8pv;8tTAwH5hZdNS~%U zZj$RuwqnVFQo>Sh?(r$^sDO#(tZAn`%bE9p1H+e;4a1nzmutji{Y50gLIcW%cRGd; zC#aWaAUPs=@73u{I7`y4Bbm*73D7dr2M5QsV>g{vQpFyNY)uTV?c z|B-bGly`pZbgiU^=A(0}G`#o%s6iF;YFr8iVz|w`p>|&US)1ik!ZVCL%<^*EXebab zvdT$h+5c;`&W{duudIQ4zXsYbYNKIqdKpqDR3$pdjLVZe6oHxOiKGmA#LWMC`nX#R zdt{q6=Dpe$57r8x6dgMO!k#I6d$Dx&@_GslPm;e#VA%sE&bYUB?^INJ(5VGCvMx^C zeP#~cFT;@O%=(jAwlqB17)*P@!aAWlSICD#=$eMT$(>jPMBmo9QVKB#YsCaYbhA;e#W)2O{{X9G-m)^mPO%1dW zL4or;nC{v!Vg<#87>pAk)<^6S$&86Hot)WldGqBycqmrZEc zHKfYGSA+c_Z~A%-6bc{H83d8wh36XJL|@C%uX7Sbqohrkr6SQC?pRBI6vE0D0Pqu< z*Q?%o!-^~!an&{>@@uEs#mim;>Ouw%VdqzU1O>Es4rNCe3!aN|&Iw%58oUvYCiZhstn1*zs?G{hZep7yZ0bv%`5efX^ z4pwL_?nE|Te_dnKNTX3?%Cxe!c(l8mLuma}T|O+K0oYkr?GQtg=7rUl|uw_hW2n4cWfx|q@)=TZLd_OF)v}(4{(mN;jv1f=@u@riWkFu2Zj^0zK0xv4t zvly82NPIZ&&}g+Fc~pG#n4pW}-yF7n!1<+Ip*Y*?m$Xn%@SDx4ikwh} z_repN3#<7d=1)6lHeX$@R|<~YXUZLKqZO-iP2#N$aoP@!4AcC6Bp4_?mh$h0S-iux zeIWV%)4KaQI|FuVq%pGw$Db9`q)|(DOQ>mhYbohHY=U#!ye&=WP44EhyD}yk&J9^2 z6iOf)awny$&QoumtZC?}AD+|~ZXNkej3qWE<1ita&34ou8FDxh-C$IAjBZQiy9?J2 z5QK0wz<-AM9Q3!Cg>u6@8`mdelqq3^a$2$GsvsNyc;BCV@i4-5#kTW*I z1`(9rtMy_{1KGZ!s`W6%m=HqYOxD}SZns}52@BbTD9CmC{&G@l(^SgFqnuA5^)4hD zN$IqYZ)wl-FyRAJv;jO)Q+|(wxaD-Lvl~OO|D$LJT_oW)ApIHuf8W!RY>W89tc4}C z_N48f!-j>1mrP2#Mt7JdUx$JFI;lVLWs~BzR-}FmUZsGmZ*85t%~~9^gdq!O#pHvIa(l@&?%C5ce>0UT5ypc{a}k)X=)brS}avXSe5Bq>-wgtM1&?Gh#B!hQek{$ z4{+79IzA_;_l{297!ZdqKf4oOWZwaS=HG4SPg$TsHs6nGAY$~XNkqfY8SEj$^nPH; zas4mn>|GNC7-(imK%6W_J%Rp{&d>de_Y*vwmqE2XJ4^}<_>#b2bcK-IcmK>UbvY>` zlE-XGKGNM%kuAV`6)>Ttn}~`TEk+GUE87lfg)#1PJurCwZ=`P=fz3O8lUH0~Gax(vo1EO}k<2X9a?xw2flgnF8- zWjFWnPriDw?oc)DRY{=QV?%Y2kL$I7MO~FX(g)X?pS%O{#Y)3+aGX>H_3#+%Z25Tu zpxV^9W9yH|=c;4FD!L)!l|I^h6DPorxlFwe32}g6^JvXFC~Qdn)Hx7cz*i^iXR_g_ zqNnK3Moqrp9px7}%TY7Rcc3i)!Gq}d*{3l=aonad>e><@I3(DqqC|y4WaV;M5Ja-o zi%K|T7fvELrGAL|DzzyWVye@?leuG|3#1K#ke|Ss_moJo%9)cwf%zm4(Vsx~KT7J^ z&3m@YnR4XEjx1`<*}!2b#J0_(zPWkXO_}k+Kn30!AvobdgLnE2Bt*A1cR@pwMBQeSKh+^@Xy5W%nP zWkEy~A4iRy|5B7xcH*tL+JP<$$X*;@{_F zH==eBMZ?ZFsRCEwr4Xpp>#{We)fO-7{tPn8&Cy1Ycb!Klf2hQC3$C}i+AW$CWPvvCUHVzbaY6+vKxb>=6 z|CK49ALA1A3!F5&{hVek-0ul&zLoE}8;(oG94jK|@{wp~zTdOsWHXaiZ&?sR{YJUF z(1Fn{As1mA{FYoYMysa6(zCt6s`fcsq#**fZi750!i4?g1w`N4w->{75=QVgmwf=cs8j_lp+BiCU(dw+mfyLFMham2=45?kW32ANJT>Lj41CT0smy)(u8or?pI4<1bet0&80yKe;#XMQ z4JV~`qD7u#Fpn%4sDAC)o`aS{Jl5(Xane8ya~aMG0(@fLP?u9^ujLOW7$1euBUL8l zI7tVn1Tbaii}g2oDbBI-l??FcUSTdKJ6SHDY9=8XVqI3d0 zt|4d%!tDvelxtYz5wBV1TsrAJ0hACO2ca*~m&x%3;qy3t zjwT!SNoCJ3XlK9Mk1s6v;Nu6cKcq-}IO!2w@3Jv|gaO#}+wCSdp4r)~%Tzz74pWJO zB_FPLLfvVPHr+v>rJAWM!^oEAB4Tauc?stH%n4PQK)m`MDnydwWmvZU(~`KUTxwxw zNA9K<1<5Z$Sc!@}qP=6y4+nwG7Zs9~HWAC8WcNOGQ`P4HB=Gm&-2`dq_^vfeYg_{MR2Q zb`2OduS=BWF;Y2PIRVrMcU_zRjAIF(@aTCwF z>GzWcs}suL;NQGV{xEuF@h@yP4)ihW^oXvDN7KxL}3~^n7Q$(l^caJ$U>5j z)l!x5F?cpWTJ}_UC>f^yl33}QE5LS#w_^oUX*tvfu33Pl6WhJ86457ZS4BAx)}m0= z*Am?RILAF|R%zk0dz0B4w#J-bQ-oWcrJC)G+z1po;PJ_yFMolTfK0&4lWknG&$n)H z?aE5R>7P)TENLbf!b{S-o6&Ij zuXgPuq8PKSraL_NA{-m*V(#?vVMoD0Cpp(iUFOvE7lybjC!x`ckV`ykHw)l*d5sKN zt2!?Jv-TwV+cZzCIlD;d$(OkMucLQj=stks&|uDt2(5{)IvmQIbP#Zy7!KJV(5ULt?vSrPl^RfG z!~E*sQ=p4@MqRhdALfydSi$-EV^EEBr#?R8j_07Km!ZjIca;dLz0;{HCinPc|0S9 z0V7zBlFriwE6-b^1wBS+y4v*I1OXJB~|CyIL~r%8z| zlXxtrtCNSZD9RuZiP9a|Ks*tlTn(De7q#Py(2x&zlnJK^dw{AG^(r~HbjNM`M}zn^ z+erp0MZPe#D_~+@i&`b85-^T~`M}<^hQtTZr9f2UZ$?NYo{E|rESd%~h!?5X)YSI^ z)U6;5;*vcxbXt{Bxtt9mq&3eaGKk>+!FFLKh@Zz0o=xr%i%Y<8laCbT1$UfnpQa&;4lJm=oQIH$D7}7z2pb~TT$dRvf}kc zgQ4JSuI%>D#488n5s0PmOBJLH@V|&@_V#XrYEu9GJ zC<>1I6{x%h%tXH6&haVFAM{+NJPqu4vIon1-6y@TF5jmjle5MEwtQMU#XjX1mh7VU zzuV|Uzw235rf`6zE6X4@NF&BP&f>&TDs!bY#gI%t7)7|LTG|V*szey_aXQ;5u&5MQ zS`&W_C}`?&bujY+58uFMr(w_p+5M{FsXP2#%*;xM@nfcAE-m=*U;7A{%Ral~ar3y1 zRbyC5EN3p_YCK1MgXl(+r>I;Tc9`(2Rp&ZRDL;?WR8~dzwr@a}5gu@0x zAy3x&BbfR*6>t;@C|9a(++Ju|nM=s}VYkMdk#7zHMQ5i6KaT=>`VTqi7tygNRrBO{ zv2L~Duv>R4(dIk5%%3GcyMeyaK)CUyQ7``xRjk;(KhIF{RyB=VUcx7|fvcfhipu&# z&P5*dvd=1yG+vFK!9VY+GdV|rs{t6iK;D!v+bwXcyT`{^ng&wJ)z-@x{4*6qz`q0+Vi_{a4_q!nrTxyUZ%Azn?@JKuD>Xx}7L|B6&kJWt96? zc(g)&1{#6NdC!bW8h|@IHRdz34X>@cAA-kU@A6}^M?FHM7XUBAS_QrE12r^ob;%Gp zfcnQm;$>#q&B=^3La$hh|LXE%m{?FI9UaRFYcYNdAC?mqdTmZ56i&j|V*ul=bx}_T5 z3PU_3fK_q(E=mn`&xqir=++alQusSx&mMmuvj^c+S7XQ&KJhB{wz z(3j$190q%s8h*5e7z`nVy`9sD@HKfL@<1t;4WP%Of?&Jk{|CTfrI~kf zIO%hiR6QxL`|(_AiVh#PW^ji~mE(nC)ug>Sk|$(5AC4iE3Gj~PWzj~nD;~R@2r@~^ z#cUiv?`$q@d0oqb`90!hG0|}!+oDZ>f+0_Ho(8ve;Hhq7v9Zr*r@cdi^%GXQbg5H5 zMkkNWBgnu!s;~{)y0~E#`=Dqqb5@kQj-Y8sk+^klU%fogAtg&yxd^m$vw81O(xDO_En-V zcQqo_z;kyjmj0QB=0LCj4Z6Y1T1M(!!a?#{~6gtt<*F60A~G;TR# zgN7FbFcihVK-up`&og41i(}v_%BpYc@2KCQgv$vXsNdpML!M7cvRPlOr$N(&y8`s3 z@i4*8tfeirP<8R&cuu&EMmJa$YYw$=zX!f_r^~CtAUhYn;B4)ycHWNI0OoX)ri?)q z*cN+9t5J8h1{9{rHvJ23tZ^agE*e3(=(nukZW&u0V0CCGCCQh#z&{YameHt93})rJ zB};Z1mBp=9)M-CMv0WSE7j|4}K9bnXgd?N3Ta&!agU6=#%1kfq5@Jo~n)Xt*-R&@= z!^J@kkRxZ%OPF+d=!4?Z&1X}@{LWu?u#Dwp#Gl-RM-#cGhOIe64Kpv{9EFt?=YT+< z^9w*`6he?A%M1&gGg*M?f2$sbP(1jG<^2Nvw0$M8=++{R8N+(w>2POZGX-?+XOEOJ}cT-)7uQ+Q zbta1z7c?(m)Y^{%7e@&4X2Jm)xyW+`CMKzmZcaJ2+ikE>$qXGliNDX+3|TcWAD7bB zL;nbGI*tE%cjs=KkDW-~|NJ^~fYI=Vo#~x$?t=48!H5jL4LVwdryNm;2G0KUn6s1E z$ufmC6oac12adRRMuHo7BloP|Lk=!y@^Wv5U@6yto{Jmj#;={uk-bNspH^`i&SJ`DEdOy>)9?87b%%K!gb?+)N6IVEQ{ zFtIQrQ(MU#_Zlo+;=ds$>KV!-1@FlH1y301Ml_et>o8v$7;xyM+X{Qm|0o(fO9IMT z@5(XYRA{uA^Cdb;3tz!n4v^OlO&2t@N^+cv12hBpB+__w>Ts2dTwZ2nvX^!X5k2fK z=&U^Rc$4BGAe!D6QdACkQAg+(`7|QL;DW*1%aPn&3x}{sFJLX!QgBk(wqx>9J-*{S zm{@E+t^AjRip5GA5d(;(>e3C zrGMT3Qah!Nq>0W*<0PODsC$>)T^0CNZbp_){Bi<0@z}1x_6t81V~$%v45?q`x9s8* z{s1LE%+a~nf!>}M6ez1*t?o%hMO0?~&^D!1x=RV2?DE3uJOEeE{{crqBs{<>j>WOd zuTHotz;oZvhUi@27qb(!47TLvpgXA)(^i78iCa=+$(~_kk`bLCh0$aZXT_Z3yS6kO zn*e5WZC5l)myQHyVm2TSv7pPO2&si3635eFn1uw>7!|)?Cpd{6BQA>3R&6v%hVq(W z=iqRAjhiM_L%dBcAsMKF7nX^cUD@r|09Mm6(QD&wPmKS5#{)j<@z=S4t4>#s+bLGW zhpY^MS}nqZX?ujR&DsJEEMb2U7EYW0jGaeHJ8jgqIMDri^_tjipgrdEIi4a45m=mmqjjv#m%!7c!QHZ9+qsHoY2zi@)eF93GWQ?5PgUW z?G+PXtQ@Ob|8EGoc1hrs%WKy`p9p6Milhv<8Bfsb7j|7gu9reI%38KZ;=t0FtAywF zNUjqrhZ|j=W%Ej^ntVcpJCl3#$G|H79{{;PM!!u>_q=XR3^nq>O_SGm{4W`~`C%qX zL;De8bnVeIo2`&9B7s0;nC@4{?ktSy#yloAPA;32au5jTu=XP~yqj$5PSbwPnxNX@ zq?7MIhN8uNHJ@(p+!)8jU3i4fnGOO=LYzY;l~rt-3#$(0m+U}?cJPc%$MBnGW;y)w9@_tnmVaOOzq$@da zOWO0U4U|kCHU-aF*<52rFX->}62x~hA&DflEn1zpY!&c|?y_aTbhX1Bn-^M3tsXy_ zPw9DQL|*EHi&?3AV1w#z-#`Uy3)8a0H#K5o)HDNsF|6(nr}UJ1ST_dC9Bh?s0<1fq z@3EdgMTT%(V`A}qz^UcHHbDPXk_&C{rk*azIkc^2vT2ivQ7XEI+s}bR%%|RNnYE8u zJNawZApjt&Q`tt-V*33I0fH@0>GDc;F&>z>VRBbEY7Mp&4n+*_bgLD5W~uM4dHiq8 zHG1yWG@p1;BW7co&7VgOj(6A^>X`IhX{?b<;m!WykZ3P5%sA#i@Tb=i%+ls28VZCJ zuFcwDb z0-yq*0-yq*0-yq*0-yq*0-yrm|7d^*19s@2O8cg|F9iQkZNImOj6=u|T={6#?3lqk zrj*BvAn#**>8Mytu%i`u=DZK~v^X<%k7SIHZsxYP9D?Ph(_-`_?*9g1wEu5v;6o~P z_}bTUu;Qi$!GPI-TqZyX>KPU~-uyC)<-i7mdqJzLZp(D9Ahm|Wlyrv*v_CGPod0pV zHNJMwm#(MT>H6=l%I79VZ2f1o1te-mH5tMu?@YFU;UUhE!-=%XW<9-R=a7~j4208D z8|vM>0h^@{$m0HdLO$`GPVDf}xi_k&O2oy~Vl_=&?VB1p8=-vW2J1L&Qz68AW<*7A z=0$`6L+uZaGaNgnlqdc5!oCq71CynHfd)mh{MFUgyGA5jLFv#*vF@H@EwUZAf zBzy zTTAGWa7*eh(A^WuZO-<3Sfc{?-Cu>WdbT6aOqvJE&&;?^8{oegF2RQ`-1EnMNs^=d zjh?RtT0O2sD%o-W=m(?UpRrOJ4f>{)RZX?LRKxh3D@8OWAgDpitND0cth<@0@h50va~g{+xycQi8RjWXmC3Ej}JX5ts;_QZ3K)FOWJ3Tyr1N3RD@yIX~i;82nnr* zOE5FR@khakC}$Y2>!kI;8%lPR_KM4`?dJov=bFM)CKhk~x6he+y9ISO2qC7Vy44El zsm+NFu8~umf&U8{{qoWd1pmCoDr&mjx|xt});w#J!K2y9aa6fXKpVWNHxSL>k=#H7 zlW~y0xSU2c{#5F_P@;tid?H5gu9$<9A3=DNid<-oda{WK3T2@CFZamBCx%CJ(Yh!L ze$RoZ>5-aGw|6!TG(b(zx5F%>mjlx^?M2OkSy5CLTNFhQ`!8Pp6}u1xKm|YrKm|Yr zKm|Yrz<(RS`W3g-zSIIJVE%{0Q~*=}Q~*=}Q~><902Cok49`r`JZ?np#!05;4#b3e zGmj~a)^F$nRh+i=FoiER)6uW&BblYmO~?U)p#=M*^!vIrVx+6;SjXMHv%AhG znqQ9ANp=o7_HW3W^@S2GXbw10R}TilsS(msn=>q+O_Q|dW)qySZSwUR@ZD;hlttU3 zC$#xDh!;J1$4#62klwT@NSovw+SY;-e`!zjU=Y%2Rg}O@PEJlbjM~v-N_i}w3;XFl z1|}MdF4=>>XFvbz@2znN2z*7yuIj!r;dp9boiCG8T}(4Ku~-hQ)H#{oq#Zllw8%%V zE(50TP5j&d6E{nh#zo5|wsc-sG5o5wWpqR|(?f4lP$b^zAR)9f;U8bjFWPBsNTrVL z_Cg^MVF{Pe^iZS*_EnlaTJ*t|&WjC-_E^IfzQ1X?Z-7?>xthkv(FbHzW%_nK%q;CY zu;}eD_Bm7KXsLgzykRmnNZX|EN~0~E$16s_B!ilWZ`3rjzYz;KC_?Cs8}msqeSBr! ze$DhaJ&^>az-O zF6ay86KmIGL{D9p8VP3l7+8XfyG)pYATZDzA*0XXfia@2wEluSx`KLREmV&=!^hvnGeIV`{TlpwjcFX3F zy9`Q{2+%^`Y%UcM-K9#$B@+=KwA_`Qkl~k<@tu{sP+8dqk1j|IK9l$C9ApAl$9 zlpq|8yVGsvl~&V00~9Rl|I*l|VIG8G8Cy?MCNYx+msbGOmvlJ7?Ut-BT3#OuScF*`}7d zS=q+a7LfJ1jcoR@D}ciWOX5S4lx;qH>@V{C;}_$38v)Ar^{cEd@S~++3n`(}HP+Xw ztPY;!Ke?&9kt!rWjB!!DUdgd0^@A%t;G%Z(Pw>C@x4C2JPuTcn%Yei1JIg*lZq5hV z|88Dp<(P9ox&JU>U%n{Fy{x*-z{yI_?t88cEld|91+Gb570U`K(V_UV~ z`mv1bNTm)(VESOLSOWlLaXo(`FZ_Dp%o5f3=f7m= zFZc%q_Et*1>7fGqH48mv=h{_P7Y5%;-!3q9NTq8?q>`P|>E#PeF7kyC2to^EvnEO)(c^YyAjhgRQus(gQKeAf4mhYSuCAzvM_TCz@c^<5k1wOei0#@8E( zE#w#SM@Ly1MPuv@-_NwD`xA1HnHVUrOBN)%0NRRkMq|fw&!^ z=wJ6tw&cm(73;`d(S;qPwu8Z-85{V5g{X?FWAF@0p`5l&2ch4%AF{px7p zaB?{@H5e5a+;Dn(lwnW>>@>ayd!qlE=+ZsoIrU(8OoOfw}@BrrWJM$BS_pNzNfHbtnA9B=tA4d0x ztD#ZOgFL69p0QaoD^XRAUuxS8U-;#C=4^Bk=0=S}_ZL7BsZbOIj7q7pg$|g~Wtj<$rg%`^+g9>Xt-B!sscVbG?0*2pzN*r!hZ#-$z zzpsH|!5OU%NU1ww;IX&o;!T|-7jaNDZIh9I$0^)9$hi-D$C`)gN1EG^TjC(^w&!}HO+nL7G_z4KrpLHKgk*M_+16N5d$$?lQeVPEl8o@?w-NvdNGsS-Y<@YJ{^u6~N zQ}$$^=-`%zuL?Qnb|2DKc52Uqg)|C zziZnR`Eg>{y;&G9& zY#IRUk*g7K0+%?nHueyfQ#WoClC3OFY8>}VKZJl2d18coFdpy6+>yD<9eeZ&HBR-o zlc^2)x}S*8?;S5|xeGCQ6USnDtwl5_G%6f;lu~?Mv z%IF01VO}+^3P*m=a<7eQ=u^bpSiyGelKjV(Kijw_%CcNAf4#doKD0+)*>kgYv99`~ z`i_qN*!6qIs1H)qefdBacfKCf`H*BSA8m!spHky#BcQ#c@zl>v*^YEK0E&UC3%)i+ zwtFHTJD#JpeUYNn>-FMLp$|0cc17JCdR0gph}1@z+E=v$b2E{)Y~sq$qm6*OWx|jj z?j=o&tn};gI@Bu$chck8F8m~Lo*Kcp)#7HMel)>sBR!w;*32FqdVF)sGTc-Qb#gEN zC^y(ESl)ja7H5avgcErda{6)CHni-%*<6*pB!=IkQ|gEf0MwSxowXiGm^QwfkZohC zvUiQETodg+7y~ty`-^9HvTYj~*gkXj;A)ooiRZ9`DeAWn=NM$(^cY@O)5=AFO(w<2 zVqU4LHz`uyDh9>d9B*1Jo+Ka@wSUc}?F5^RJNpuKa_{^HoWJcn43qU&rYAfkAVsGb zRQ}un06+!r_k}PG{ikzSSq)s*n={oHZC2+8^hNsVbA^s93xme;rXl#qkjA^8%rr=8 zre_m+YBL>zZ8s_G9D+f^SC1t}jyiss%ak<8VZoZGJXQLXKB8TLgZP*S4j6Vgp^ho5O8a~^B zyrCvh@ll-9&)LySwU~2b`0BPzTp&iS=>|c7;LzBq<`6ibH`WmU6}mx@;>?dVY~Y+% z-}rR7t|Prv!(8K?g2X2@!u3ywv@ifFm}(uhqnOb&8EoH7EGw_2bMMMfVQD(_)#Qag zjnDN&RXOlIr)tjPbP>svn`|9WJI}(UIh#|m&}*?LQ}YOU;mb+3?OQYPV>C&Lfh#v< z0XS*BmZ zeaH@5iYsPEHw^Xay^|ye7f+?bp zIgkP~^t^)yJJ!;xtyn9_Nk1P zP>DJNQ^80??^ar=MhbjjwYbl{({1I!owl*9q2+bR&yZnebDX@TWPwD)ZHNUiM7lHp zfHE`0{nxzc*N5vqhuDFMm5Y;uW9V;qT#o>m)qwL(tf6?#+T{vpS|-sSsWtOhtXAP- z+G2Hw_7RPWW@6cxj6A1e+{>#Ke{z?L&xuQji9~HpkFjkFg-o26>)2TmS#Pd&fUrtH82+dmo+2^eIr;4 zT>sFaqWvscbM3?M(2!->GB|J5ly?4BMf30xVEO`#Of_OlcDe2O?DEE{O$LD`I5Fh?dT+Q(=qnNELa`S}Ja|J!6-D zSCQ(T)x57k>;%ASw3HVtGhXe5mA~W(mvv3g+S=T;nUjKQl(kFhMoYa@;@pU%+pXmN zi5$IjL@uo|59*MQ)JI@p7l~=`DF0G&)iGc?iDBAUxL=$0kM|;Uh27~Bh!0e}`eKD; zsYN(M+SRtmPjWd6F1JWdSER(A7IAs@I6X=9tc^oEom}niYJJ~MY{G6O&t)gnd#4Bg zXjSccd1WJ!BCPW*<#O%Kh2t7aDO0p5%IAgzouu!p#m)XI0!Yk8`4lY$h-I%bc3siciYkcnYjj$hY54y7h z^-9zwUL%%VMKI6GjqlTE)tu9@%n#8kh`M90SgQg!IH*W`cqY#EAMfXQ3DV*!p@8L`qQ5GdVZq5-&G+Q2R%W z?8bU07X+0Y@l7n<+9`jHksG;Kgw&sD%!=F`GagBdoCsU2lx~jFA(v8>or7Tv9G7-4aMsZ86cdZR(OAxi<0R8yJ)wJFiNom2G?(GnC z+-+V+K67n&>fu^3wK^-Z_lMT@w^Svz6fZfaJJSy~`u(Ho{J@f|l1{rsSlwlP7O{46 zyT>F$2ZKLup?7T_NEuZe4IDC6g>%J8gnDa80V>DvDKa;$NTiY0dxR*=m^}uFg!PiXUs*bJcE-Zk84)zHsp>Xq zEA?QbHn|j1NNFW#?KWQ)wzEO(lIxydZ=)rfwowaI~G>m%O#4D?p!wza)iq<^8YULyl$k0w;xRLWi&;LO%u?^AMT z2X?t*Y+{s7Kw!wrQF5Z1BA`=O_>Rv)1{U$LtCEz*Z-UrP%p75vQF3OZ6nq1qpm_~m za+nFp-eFRw%~b3<$jf$e%56DxvSxF~(rqWUnWVYbsiZ$}zAzR0r(QQQ7%9Fux&Ak` zuJMW1TEdtDWSr)wb%+M`&)f*QXE21U4q#r)0RX6)fJ%+qMefMR z;O0F#&7B=Mvb?iRKw>2X(5jo=x_j*WdM~BubK+27+^N(H<34ru6SpzsalQLzTrSy| z%qPXZIR922YKZf$Zgcx1Su|)iXB0slLKZz$<^!aASGQdlU&;2a$`a~m*3Fp_cvYbL z_${%nIraAnNL6Q;$4JC&t5XDQHPjp#90@j69r(U z*$A#5jAW~R6)jMl3ekS;$5Q%Pv7MwX@$AZD=e=DDa=QM#0xO@!N^3ylpw&P#=3I-9 z(!1Wp4m!Eo^7QZ#p!EtWz1?E`F*{tZWd6k?VWSS}NOf(d*vnJp5WSv`bPb6VG-|a~ zm&J43x2YfZH1i8~p%|IB%O9x$UF+FrKMfs6o@?6}45UnkxbI$oo|Lj{YD_-CmILXm z_{IAtZhWKheNe2j-WXsPM4xT5;RG&=UCsAhZL*P;i}DME^w4f@wBhL7Nz;707og?* zM=>5S?I)ENqOBU8RO)1JV=J}YS|!B~2UJCwml+iRH}&m!x>2bvS1ZlxiEm*ITn&7DmGuuM`D zUb}52a;1DnS~VfoiMHJ0&qMU!2A64N;&;BQ+Wv92eOJ4Evc0kM+u&1F^IV3#Tg>39RlX zsds^7Bl2Mx&YLB2&b(7Kwbu8y*G8b(Ba?nDq{H?+xyn$KlZwVXID<1g-thVeoW4!K zQq7k;(EQ%0epP(ywDa1b_hhKUWABrcm{;1IK!Kwe51Ro)%syM?fP_)ZR6unzu`F=h zw+a5Xg55&}q$hVmYvWU|nrc9DGu&t(+^r=;Z<&kpc3k+4wv&`kv0RcDG*xD?_OpmnEO>&VTq;wpm8X+&HSmZ7P!GH^8V^f&`;ORJJ6T6Nvkf4tdO zH?pw?zCt=|&>&Pb-=^6Ja#gc&4INl59;wmP26Yo!wrXR32}kJ@sE+mAmA<=e`_kF_ z^b!qjJHKW5P06J#+-cxv);O&|=WdA5KqH@Q?O1-dHFRKQW3LwlMi0kj`!drE09H1( zl#Lh*Rz1mRd;nH!%uB{+Lv?h1Xe4_ zBZVfD5iRT&I@yq0-?yIz+Br-`toH|gIP>TRBF;ac{p;N$hevY*KB^rFKb{UZSxy*1 z&P0eHc2<{iz8Cm3j6gj{tYQ7{1iOX9eKwnRH^=4sHC9^3uzLFpRHyE^#vxXHNiC$t z@uLJ}^-az*xm%5!`9We|EbF=d0^2x8xwF=fH~SW*ABj}mk7MLo8?lfG(Ia+UO?%x$ z{g&ls@5UKunvKxhuqC7)dXOE@K05;1+v?UC^eoQJc#t_Gu;PswfjQ;+wUIy9&%}X> z*zw$z0wDQQa(a@9DvL0^B-Ir7gpSMY+i4GY9skgK?3EY#y(emK8;i)RG~p4KUDvh` z?_=k_N_`%zZgp9rX>!YckF&81Xo~W zmj}IN<<;r+>KTO8SL;}vTdkr1l#QwMiN?+gw~z_gq*c1VRd0ecoS4CfI1nJ4yh__y z$FA^p%A5qtC@m8RcHgznpF|>hZ8A!|clfrpU;e~d2ConzJMv1!D6IFVc0KxNwfJY) z79(#L_t_Ml1F*8$adLpY^!hI_m8$?&Rs$+nIwqg%O?e1EzEi+C<7q_QkeNo|T!wws z@Ojs+)RhQ=hAl_wSe&HZA{y1qh<%=IGzaNJG&%t=43>NjyTXm-3t?B%J#sj@2ryt6q?qjuhvOKs-$%Mv+0 z7GG-TQ8h%N&x^1JC${i$4H=x;3DM?hHl?B`M7mbaJIg__v9nQYsYnx0#mh^R?<02? zogme1n|3(YWUaxOc=@Snv(|$%IV-M(4`0b2dk7bNIggqnq8aI*S?idV>N|VRnQUcG z3tS{+@`yuOegC$kd?PPH5Wl%<)P__%dMcgNm2sUZ=F+chBw4>+AGNsG!*>`9bUcm#Vd{xBqEk@<(OfV}9~l ztVPYt;8lI0bkm{)YxlTexqE6h83Pa5c{_V8MRvX(bhi{g<;F(2k>z2Ms}sTzK(34tp1Uf2g=6UNYmO# zdl_i1T&hbYF?Mjf%ssb0VOAx({u(;pvBQg;Cy?q}fJGxhzBoVHn4+{dnU6|&Z7)C& z>PG^)*gm)|Uu`n+48;13)-FYgBCw;2;haxj@2p|!D1IA-VTFB9EsFdkW$j6@hLy_v zSx6M}ag8WzHK%gYOJ|eg*nOD{4Q&@Z24BpZ@(@9+vG~_{3(N*293w?QrIqNNWWI!& z2!(EBtBy)tf4F^Norg15Z9Aq2_rqwi zjD%&pVt1ta#Ah4F-NJ+Yxb-Y-gv1fPMry?=n*3k?CNciK4&lSt@F{8Q^GL65-)tOn z%Xv|@>aN}cc4FhG<_)Fu9nVNaBWsbIi{w(pS%_v`!}^YrAR75r5M$4Wn8{A~MnH;E zq<=1WB}KDXXoNK~-_Vobz(|6^N%rdNS5nc!cfQ61eztXopNX+iDY*bnL(B%7l$AE| z8~gkF^H{~6#BT_dFIZ*nq*d6;G*ELrYnTq48*TP8+3mNu) zh71*rgJ(L_`lFMr{TQfJXP`3GOkKL`8!|a+qrh`AXp}TsLG-_pamoXc9 zCMVZ*?&(twVdtX#yw`3%46E_dTaxSr92EQ{|6}9py%R-BSWP9pr=WIE%_PfuzdHZU zYCnSl7K^N?k&^1pCUSSv=A+9MC`SY@$`p6%yeJ2ka|`iyw@}E9a)_Q& zJlM40WVwIW*=Pp70M`2tIPCGnT6^y*ci)98UFMwlcKHX~h0mMZ%nDyzHNq zGN%eJM01R)NZh~jl4OabTJan&hq*i`cv{l9vxX@a3Yn;JN`E>*`IZWC14Zb0+*XjC zjZT!1%dD}v-6QV)M;mnIHDxlyNuBU4pq6suzJS*~heWC&Bdd?!#FUKA=Z#gt$7s5( zCuVm~bIt2)yf{JDcwoaP4K;|X>D?NN*ol2(azDy7!ZvU~50o*&rMLKibv>>ia_9AO z^Wx!TY|R?91!)~ObuGAdY zlc8*(_;J~kG zMeS@=c-}g9{-Rp@MJ>npH|7OvlPgiGyA1YsuJx#d`|P!?M9SyrItmTOy5>ev7sj+_ z#+RF>!WNgz;Y1#?4>vfDg!#FEb=PLKfA{>f67<&LS*aQqeUrS7@7dn9_yQe0^K(!_ zwri4_#r^v(e+Dl{^-34tc=1y63lAbWif84X)Op*GiC4E4&;tH_^e&ZnbH|M_sn8Fi zo4Jq3y~A=|YM)RwKNqt^pIZ+rvLZMg<9qrz-^3bXLZ#$Rgm$XL8ou3@Iov==v*A1o zO^mB0W?~APNjIaH{n)r%Jd*NI)w9d~$y%E>WsZ7XTSIqtVn^~_ z{){9YzNb1FXxTjdP{8eUF&ejJ=@xO0W?MM9>aKuZdn<@=iKv9-BlQsR3eNWr3#7XN zP`GfTtOlST`>(wK=L=0H6)AmJeEmXX{crF&S8Yx3f^5))!q#t;z7vS8_nxzfs(xXI z-{0C<7`Acr-|=Mov$`*UVc6e->6e@PZyYo)p{Ks{;Iq|FUKqniH?RSHCXHm=}7JBVyoaa5*chL1ph) z5;If-6&m-mrJy&-@{yZ~5{X?&Ylp;F10q_sCjziP%fGV2T;fm_oOgAb%$d6pical= z7$^E#X5jP#Ubi4Txhe$i9Mdg=&^+=|H`d=OIi15T$G6d{$j?XM;*+O$6rJDQ=LUV& z?YRtE4G;ves-1tLB{9(zCsR{vZ@IwJbI06~ zT3t=j`q7}fyyp$IdzV{Q@*Z^Xr(Xe}!ZMOI*9_Fj!Qb+wRvlYU41Tf z1H(X?IZNqe`^k$1{*jCJ3$F=zm`esV*=8GE?6*GAMVEMj zR$deGd6X6 z(E{!l%}$+0KH{%z<^^eg2ceF4uNGUnhPJI152#e~-j~)`9<7u8SxWZ63-%F^iW%@l zene6HhyX%;^%q<_n87tkXM`k2-5L5=_wBmY9(NEdnW1+NvjZDs+%=f$-8Wx&IKcel zqa7P#$bgS(3+=RJV*$Tc&UWs(K~!Inx4G=woxK_j;!s^&;E*W@l-{{m<6^?5QYQJX z`>-O+A;?<%Z0d^p+x@&IHNE-~I-@!DPJ!4wyr?It?3NfpY0^KF`}9q}kL z&T7`XuHhLv6-t1o;>CW{?rx5|KT3|BT%|m*_>G(&5}{orwe0KEF<)X5|BUl8|hKub*sgb?me}$kpC=xIjdRCLZ&_|Vs%K` z#>dg?5YB-AGi`g2)aQCBI3oULMHCk(PuD{V`c~RbG;M<+(#qTW6fv^4cf_HRWw731 z-@u)xeY{-Gj*;XMS&!7}Vaw{MtY$rI$n!9g9s2B3_II7AvZ|`8K1DitVRB1`9 zeL-8|c^5fZ!Ti1-f4X9j#=w_gno+$fH0coL3#?*;J5uBBMY7RwJc9E^e9xNScIzOPE6 z@!i7VvR&cw&?LKv)h^?X?w{LQ8pq{bX^OjLT-}ShPSRl_f?k;5Zlu{(#-#pL%oqQx zX88D3d&F703n9gSy>Il7Q;N{m^O0#6+1idSSIL&5Yvo4<|2dQZd`Bq z&04$#0D!t0=A6sJ+*&A@#SqENA^*7-S7n^3)7Y*&k7gNUZ}rG#zFGeC0ajLn_g_Ul zSef@&ij6Jh;ia+j%!j7{0%q~taIkb|zWKid1dK-gW_R-cV3AqO9L(a$=BR8c!L*U1 z`v3rx^G#0W7-n_=6}VYh4KBY}Vtx)GW48Q*Vs&%+QEMGK{U&txs=8MX2S=*zHx{h znAq-3Oki$p(0;a*K;|A{iGi}QrPy7qJI4GjY=_x_iErYIdYCuj3I#nR_G}3}Pe+C1Ven--UHQTgsKMdP6su zHuC@05s;X)K`qKes$)2*q0i;@T!t~1gvseob3Kws6U!nK!`bd+h_QTIV0OSqHMQfl zZ_;6oS$UD0V@pz8l4d43{_Wd9k%8rZU<%A)D8kg^|ArTjddFlshDlepEH|fLaJ)19 zz;g_qSvme4xx3`PP*RX&RNcB})G;b)nw^%UwfUufYbO50Vt`Oj;<#ImZ|x^o+AHl_ zx!nKk<~0BS^_JWa!rYx6r#Qg;m9WpDzh)h}$B0raq#IQh5vZ%F`5ym zPq)sSF+T(J2><|~jstP~|Kt1X%7;zzG}W{y69HqTq{eYS+mg9gvq_5~Wi>9Jp6Cl_ z?KdyO)O!vMs*GMsWk8J2?$<{C?1N-rlR77l$a>(CzcYOT@!_MI{6XP6*LgBLq51vYB8Uj; z?OI4s`e-1Dj95ELcr_V3Uf8yY109LC&SaO4+{QR9H}Ooan%+B?%HieZkS;u=Hj z3Ey-^HOT89HRRO}H zYvEYcL8k`JrNf|6)lIB}XaWCcE-g~!m5p{h4||L&IO?au7OkW3!Q;L|blQr}*X^A} zr#&Nk|2A^8SVi+FRFgL8A@_HKEt)MCd;rdA{Ax+n02zTu4t! z`b4^ldKUX#y%Jfc%7tM|h^ad=GPp2|ZGfLtu&J*1#{2nKn;?O*eFl|wNij`@mVZBP z3m#`>HSp!aG55@M6GqtU!7QVG@lOB#vV8{qUfo6pguHOS#=GWipL#AGkxOG_LVR~Y zoEF)C+?qKGK;dRpjsQnKS37W)IrP8n?ga6kk5BhQj-mIpMG0J2t4=vE2{g z^STV zt}qLvk(yvQPC(%)*tPRrWd@Xq07yqb`EkRM11W29po*85f*l*)*8fqwI@?`5H8oY= z#bdu=zb)11%k5Tv9N6G8R*@W*`;QJ69bpG9Fh3#qUqsKF(;OwofQ&G*@Mhl$ll6X8 zC!VOW0IU{GTGxDTpU4&%=a%C;m?mv0QysZS!$Zm|YK^khgS^xU&jKuV@-ibg$0SKF z-yaX!XTVt!8)=%YEG^gg#bpc;pWy~TvG;!~m+#VEth}ily7tZJx>sR3)X4qWEp+sw zYR9Y6tT32Ekac0y{miJ10uk$|j^*aX!JTz1{?8Gikck1TcG9V;=^)BvNHN2!yO%C@ z?2`P496}~X{Bzi85d;lWP zic%xhV$SVWQRXt8@_3vgR=Ei_Ld3YQBOx8M$@({}M^GI*bMgx>-yb(l)?71~dpZI@ zL1p7NkCFfGJ%!Kv*;3G9CvMW2dN<}XLxKg=o%)5m;UiWDQ(Q)}k@SsX&m^_)CC@_G zY(DDj?ewm2n&EDwno{?NyNF2U-Ek@Wh@h_{>p!Y5T16!*VBnb!7cR3%Cx!HgXQJ5O z)mvomPss}-mU5rTZ1w5b-CQtsqFQuZwtjSdE%^9w2JQ{?e${7t|F#V}r9;R5&_ctg zW4Vv^O6$5?2kg=FIJ?}S&$bKoLuTbmi>OpHBN6JSM=~AVUJwSk$#jSW^qpUb169q3 zRJzbcp!Svcg{3BZ)WY{1|Ee9i#@MegUzUY$sSq>o$_8km;}Qs$mMOCH^`PfmI?QbQ z)_O!+7yL4(n9`hKQtA-;;=m)Jnox$VKQ)NqX!aI>(s{1Wu0jgS<*ZaO2}1W zOA!^c6snaDkImkn;xd=lFzVRiG|mW`QIDisSO*yl?e}W>;X~8Jo1b~?eV*+9Ghg$^ zn|*S&LQz}O3)$XPrGf-vd9~S*bFaQe>(&eoS0i>8jdI8RJGAU4OPY1RN?p1X8vE5| zBL>G}L0XO4nH4E6NK!AWbr1$q-|@Dm__dH4d-3bm$g*VH$?md!25>pd<_YrOb&o;@ z15RrrADxHwmafwkcTvFam2-!= z1?O{(=yMzQB?X?Q81&tOi&885Fj3d%a&3@<{NuLC0mQ4q*_* z>QMl(K^$rwcL5*1(zfpcW4=LFt1rB<{Dae-60_;AV>)eIW!2UgmiZ}#1JyHAktj|0@5uAl8SV9 zkA$>zcX!S={_f|!*ZX;0_x}Fte`YOU@h+ad&w0=$%uNXYFRPUmda^E=_7aN~?KSHMuGg)2@ zX#e(uX)GEavDD%axQvGgRV}}@=Y$fD%uilCopwEqSuA^;j75*(&Mb?Hq)3UZBO21z zuvEbR64*#lA+KM+_JHtc!9cLyEv?D2!l>OT!C$Y_!n;8fXXjj5^7@1})#NBiip$=? zE4Yz1(D2KJ3^RXF+d&&L)xCIQrsT?xO6OJ#S?(fyuj}Q#B(?~_l;dRedJQMhDyzcm zO3`k9E~MFyf@$!+?FHt)5C7mCfkO%roY&a2_q9tcKQR5AV%hI2aCU_= z{t5}nzj@h^b+$I21=UQj>MjFv+p`MHDjJCo4+4%6r|e3#t@YtrAC;a|9^+fGflYZT zM>pi3K8Pvu@fzqh*pJa`NX6A)w_rmF9}J<>p$%(}vphU|{+9L=$(*Ecb4JexOfK|c zM5^;>4#C}fwh}agv6h@T{(86D`4$ zH_FV5_-uf^s=4=SylrLJtFNSSc|T- zLVb!JEmQ5C-eUU>Ha)wCpBdJ&3gny;txFXRR!^wT+Xd|vRabjQ;}4ael$a^bRFRoh zx#UXdmffL>y#L{JP|h8RzUDDQtY*#giq{k!xwv1P3t6@(q&nQ?;oAWeoKH*bZPk5= z4*VGVZ@^R%6YFwMsAtkfjG=&ZrvM3En-8VRygUJF4<>?^rnh6LT3okO^`I2q0v2V3 zZ&68Obv0s>?u-euzq%OW36`>fwf2xjicV+>`Fqxr_Os_(P?D2a&K^z1k6`Cbe@uHr zC+U9kCTD9Wk3P086YLI1Jw@&&-qmr|$>i7E4kw<#nrK3y66|+vE~c{kaituep1Vs; zNQnhR_8>_w;C)@h8jgEb{d#n-H=zqqFj6!g0`SOmtK3M+M(!`AwtR=#Uc+^s_hFMuJFV79& zQ3~}A5d3jqFM5{Wk!&DKmud0q#nZ!$Nv3rls7x?)t(bi26JCH;vi!)vh*qSJX7ysN z93AEBIpI6huaWyc79P<)V(CeA!pAtxqO(w431nn+m|&>Yk`V!ou&>s?G3KeX9G$(H zJZ5=}@A?iOiR_p=g%PenO@)3waxDEqL3H-2GmrB|^V&? zZjT%peoVVJ`mlnU_Wh$yaX~0*1JQBe*9!lkQ`MVT^e?zBZ!K7#^+Zq!(|35k=MOW=h6ZT=_3h4bP(quaKILgYou}eXWES&#nc+dJdcUGK-z&GD<(UdyriT> zIFF`6HD*w=4?OuRTSM@tMO&ZGS}i^VLkf3rJaX~!MMRmy7m)97_J(Y_6Tm8+YF1Ph z9iGXlhK45|&$u3cWJ@&Nh13XcW0fQ{+Eu5-49|+7t~4QN=y@cf-i(b`LUww5WO(lk zu0Gu!8wFH4XJ>h?`6*Ky4Od6cwjH)b1R3MW-`-1O!8ODyMvf@EwPJX=a@6OJ1W;R` zAsUSJ!Xm<%I>x2qIt`_%FUgj92>Yn>=2^e)qwKuw2tOa_$jw0bQ3d{OgcxF2{%n7P zo3A7iyu6&=!On0dBgmsjn}A1>V04Pk!06x%gfE$KDlQ@dW!Z3NAB=1=rx$VFlVKrO z7uNJroAg%UDB;4javxgv%KE9b^IgFoszPhgp9Y5jX7=Qztcj1nD(=$|t z<%Gygi&(SK1-KdrMFF-Wb8LeQ*C)zS@ZJw_YS*Cwc&sM;dd{;aAAVHLcc4dQ_I8jp z`4jhhwLDahO80x(T=>s;hPhxmfVFG+furu5wgj>kF9x_Ch4bn*2eod#7o{v$B!-Fh zh`?YCv*sLOF~eSTUK1UMQ5)5pn~kj0^dd3O z9xvb_cO@nHpEqMb-+d$ry@%O!x7p_50^k`_PxE4AL=_nPIhKZo<}r8R7kisLv;Jg- zX1A$b%IrEwFsD$I(;eyUuM;ZAW%tAe^-f5`K^)+o0 zeT4TF$|E2!u($=S01b7*lp+t-F_7{(2x!WXsM;o-=<%_jZmOg-_lbw|ltmwmE15S4 zs|ixQ6ky;`;oHOg9Lr06btpyP)4EckM`{Lt!dy%ZH>*T?Ivk$~A^0 zHH+Gd=wi4iBAr+A%2((UbH4Y_0xd_-c#r!jw^1t1_vn3YalZp1XH6Ioqz+68q5gV(9rMQRgPKr%l={J$(D?Cbv6WI6$el#WNzBzg+a9(U z94yTHdIkpDF%WcyX?AvblkIJWs}(-2tg~TS#f&kDPDp4w6bi+@%A0#6GZt>9+Gm>p zCELCE+~3kKXZ|WgndlU!dzmNx!Qc}5VGrL?>LcH!YliIot=k4kl!Mi7d9gHz@0d3- zbHQLRDS;M7-#e=g2zh_P;}z^Sh#Z9xip{PA3+bACZ=LIig{m$AV>$8qQ-vf`%8psW zvvM4%$CNv$*?8d|nYQ~Dt31+L6?ZkaBD^(Sv`Go1g9a8&?q?Y57U(T%iMwTh96s>N zx>vW-UfE@T5%iZK38U&|<&s^zb!WN}sDlSQPl_*>z|)@PtMzCJvf&SR?A04cblknH z&r^FLjhPgn0E^t#q~hAEMavDU6ldcfWIGjVdeEp-**B}PQ2wfkxxQ{HpbkX$st(l3 zlC-|u*NHztdrvn1YAZdjRBmQa0W~x4%qHd_zFGwwSU4UPpTg-I6h`?Z-VO`Xo6xv0 zy15xm9@2s)U;3~@hR((DWpFjmkT*4O+zIA;ZXv2sg?yj8TVnsZTj!+eBqVQ#MKi!J zB{p0}5{G2%$cE-}iE7GLQr`1{20X~(-n)WFMb)nM$zSbULnU4D9Ox;I^XZq`+D;AJ z;pk5!GDl#N0ef?+QT(WF1EQO+c zW}Dx(A%opDcU`DXTH)SXyR5=Dj$rk++4kLG91->dNcj-U^*)ldTv)#ui{SB>ZOhI( zHNH8NebkcgD5OqjQ{T_goHdpZwkU>IN^^Crx}Yh`|!Rs8JWKJ-PhyX>EtKB4LtYZCKl#LRKTIoU$ za|!IRE}?ii;dr{+xtk=ZU2TV9xac?^GO<-h8hww`x%Jt*!RuwMNa-yDu``=~xS>zJ zrrFoL!MMXpj$7GN3-8@;6zZ1US40Ttz|SqCv)k@y_fT*PQMTF0uTBbSshZ`a215(q z3tDKIY7Bjxy%^AQf{c1+&bSG>4TZK1B7fm&gjK?~Tio11p%TSZ!Dl_&o)>drLr?HH z8mM-Z*5HR^a921yaHpY6vxYB2-uWQc6u}VAA@0G#YR9W>I6D9UhbzgVW4I;1IifvB z2RM&n0+eKtQHTK;h)+3_vKrt|jSYYaFtq|ZI9eDRg3U~=9f6!|9Bdry7Em*GD;qN# z!yhiPIXIcAtDypraz}BEtTcpds5=OE5YGpI50QVqAdF{o6l*{jrB4_XXaBpdEd->(<2z}8r*AZt}Lwhd3WRF z-Mc|i_#_`+P2C|L2&7>uwt>u=2)?@e&?sKa|C9smNzZk@_IMvRhZ7GIGo{W``f`i3 zB1i+%-1Nu_F-jz}dtPbKwlPtathYrM;#u+|@>pYI=kW`gW*f7>35m zJm+~grbu#<-CGNc=}7itm8yA)*S9JVD^-B5Vr7*RxEeoNzEmu{n_et@3ta~kEA`xa zt&APJ!<)yZXWr4yj-jz@SO!D1vfwJv?|e)1-d$+1z*FgM$;Pe`BV+pUf{x_iN8tlR zhM4qT!TTC%m`)>O4vIa8_H5E!6lTr}LFD2NCrwCgy%!)Q?NK758q`w|2-$VTLd=9E z!uz46me?0HiNQ%l^@8H}lLweMY*EGNFd2V(*}-P%q1yGhF8ScytwLZEb5rhAuS# zZY;=1;@5KYxDjj5Be7l>$%3~9#J%Y^+3pt`d8E^ZNlcTU-_wh?T&vL33Qe>%$e{}f zLybie>CY*u>@z3uAF6&NlXmO%y29|w#CSiKGS9-y=o=szXIg?+!W>6o7)(n($rwsJ z>@pY`FBhL^Zz3@b6j@0M@C9PM;%l!%E?9D0r2+Kl;nyur7tO^QitV!s#os1!4l7ip z7m~uF)#y$ZPtd;9NE2t)>?fM@vn?V+O&xbSBts^Qe&%YIK3gxzrCx&*{&mHo%=D&8 z^=B|$wZd^R+L^uaYM;|ZI;o7Gy7o*7 zT_eMN&r)A15z4sp)iN)E@j((cS=c-BEo?mQ=N2;6Z#vhxw3gjFO==B^e=o)Xg ze<4pScP0%;U@D^;_GYSl1|`xk8uHGwW>G$T=*|$HmJAb~_vISb)H~}k57adpesbC^ zD6qtl*^gJed;Q1??&L9b-PYQCb-aD)w$-Pyb}{F>U$=^$?V3?BN;m_*s=I`5z#c6c zEcwog9H2*vy4Q(Dd7iB`Abk(jB>U9$lBfWHA2#5BL-n@^{hsB=P<{JvLiIBXBd|4? z{XcOTIE8EUTd@Bb0{yQMOu!E2MmAu3lfPp9Y~j%Rr&vEMAV3I+55mcBYz!1I<}(3; zxcK;iMqH*~Aeh(0)Rdo-*MwVuht1N##`^bVrdCbfW|Ehn?n0Bm!GI#`anS>7N!@fH zflwz}UA!a*T_Dlz!jYIt>o0BBCl9~kcbJzy_rA*)%zd!@`5xj`%D0f^EP|Yp%>5GO z8DDwl4B+l@w#no3_@)WoQFYwR&UjGF^NyxE(&dhBO;c0LywY$x2pqJq(_voRLGmE7 zp`;;N)`n@W3f-842(L&VTJD=^sOemxnxEoLQ1jT=`}`UVP7jlxXv>!8(>F_3Xo)37 zyB_HD2QqiV3 zXWLzlG7N3qYl^>YI{XkVkl}cNd?RR|e<@9T+ZoLq+T~hGdG&Gakrm#nT$^I&((DKF zw`#6hKajtL6W*j!(LpZLW5a26LBSDUJmXr?_}UnwiTYt*?qD)7{mro2s(tFYBJ%TW zQnUx;@7tOi>Ad52&FmWvQy*N3wpMLZ`s?aZ)1~4+2ogAD&GX*Z(ZjBO3s*8GeNU3D&4R%qas>_fY9|CIA#g1pNgp-}_wei#;jt-&uBvLx95kH~) zjD64yp)#ocjJYy~Ysv5-`~rJGamn%hwU;V6ejdgr$8gP}T|HBYE~sRu-CD3r)uGEf zGdZmeNTbD-r_iG`yog|ul&KyHvoWBv|myD{;x^pWa01}Y-RBh>}X+Q{ZB~x^xxq9NK_D? z2|phX4;PRh#Kj2&8AFVLM#ek{%7Xd0ICvmDMjRY`KN9toT9@?%2SMEm3(B#EmXFDp z#=I&Su{m~@z^zq!9KT}zsBxt?GU3T>yA5P?^z0IehYa=O)3xNEw`oIe5s+7HV*+(0 z@q%d?`eP-X=yX5F5*kMXW_ozcwVFuVKA)4tI)VS2q^_rm*1Pi!vXPf1V~wg=JDVv znFn)E@jW{cATQ8=_D;3;Hi?EKXq-sRT%(4#TNg#6pM^P#^i<37fgOhR>sPGM%WGJK ziEqqf`r1D9lTsA(GHuL*TA79Md6`!202dr}!7wsS{vOr$``WSSaJ~>3dGqq{ z+_Zp4o6lL4+y`})>UB`N=l!@tCEt=kPojtMbCp)s}6mAI5odN zxB@ydr;o``WjN^SVz}zt$GFSHO76#CH$!?~M>5$V0Q?-wHa|MKE?HpSYA59C8El2t z%qFDZX_$D^AU!TaZt;uPKD^1mk}mOU@%Dw}t!R3ysNPa~og_6{3!x$Q{)GA`E9q{? z5y@LuAr&gB;3aN65G&%OJnQ7$luNvgH(AY!x#l{Y7&|sTeYZE!u`?_lM#rYtc4S2C zxpKWA?x5=H;3|EoFm7}4(LA+ksuW)WT8lP*s-cxhMM!3^Lbv!#SK^aU)Dbv+h-KJ~ znc{k8w5ZRJHUjx55SGTt;4j2&w$)yur?-4?2C7e%FL|M%VOqdWW1uk~2Z)1*mjePZG5sr# zWNjAsaq3SrZ+)Gh<=y0!*GW4@yaD9K6x9vbJ7%2rx0DJ?9ny|pL7kq|(x0Ls+2$({ zcQ^M-X$Mb2i5u~_h3Jwj`<*n(bi`l3DD@4M(MI^iqn-wj^fzObzuz7;EM62c;g^(% z{D_e~Sy0{d=5%KL+LNp{?k(+S^Q=y4Dl-+g+x?qaohK^h<{L}Ga>UN~b z*S{+GxpMT6HQqAlBvm(~nC*`u-s&%yTCplUPNC09=Cdp~HTgup+HbX?Vs4|X)s$Y9 zt}!P&aM4OrDbB0*_4I^WG#icOVPS0_^|l3h;XMj|vl+kt((}SD z^uQEr*gh5L3ulzbH3jK*3@NtI92cp+heIpU-OI2_+Y*RLaWlxE@KmCJb@|tCC%xu; zoZVkPR1HPiaU`R=g4!L7&RDDuggCxWWf;9lkOhxHRcTbx;>D1kuLs({ky4TI2D@X~ zZv2NyQS-AQDPb?`j7R4b1ALT+P*T?CI00bdib7!Q0@mn+sG2rBIZe zx6xn8q%Iq=z>8DA^MPPUm$0Thx@%*|Y2XpIRYl`dS8`k&ooveIi&FH0LM7tY zt~6Z=BU4h#43WfVdpD_b_+HuF<;uH-0i5Ax1iy+if2S;xTeRfbenuOVriKKZY$5D9 zX%l5yqa@NZ;A{u_Lfa7ZbY>ziTxP$o-gz;u6MkaC3df#*y2J(#KL@b zP(88s`&d!PF5Q-=FI-y1LO_BI_ze~xv*<3~wZ~G8Pc%IEh)-&n+>f`O>Q%(w8$BP? z9sv9DAdCT#l{5P-WM4QGLhgN(zKX?XUsV$K9f=6 z=0?ut(pG(b1a}@yEzYhpq)sI#VtP0=L1rd1BNgEEJ!|r@JjAz{9O(tMB3=@z^oiz0 z;rZ+gw)tO1wr;Rbkjaj<)~(U$-0txR%DvaWM|kLE*z{(q)p4%D+bnK}bvnQ9m9nO` z|Hq;zbM5B#aWcY!I4+qy$KZUF^f9&-Wm(WVMpih|RX=m$*D3LYOY405lx^z^+!kiH zH#V9b%G&})qQ%N@6o+ABcV3|Y(Qz|0$b6`qn3zBwXM`UV9A(nSvbiRv%WX2qi{&a& zMMYDuF4xp#tJKqM3y4D5XqqRVCv4y{Zj`;9tWcVETpA%A6 zhGicZm3Dqe=yQb>vcv#rGPk;Jpc0$%rRQWxY9ni( zx_bDD=5!#F%q6qRP1JA6XNWPGG-YZ>S2nwfbivD6E0h&v>Yu7NE)jI*iqQc#QF!S) z(1ScSyQUQr<|BZbW7Q>X1T30c|@dz(tM>}^3)0`?aTGWSx-u1j(IHQDCh{|Him%SSLlg_AC>Y4LtCk| zzPPKCQ7geTkwT?t4@BtvZRly@kSXX8ISM1>uvKe<7~^Y5>29QGawd znemq{{jD_hW0(J2ZhtGPzqc*#&3}XcW4HgkRQ0{v-zVpv3zr|=0ein#upiy>X8W(*`u8=|U)}n1cJfE2@QuofTt9c~Zz3=%Vi^ShND!ZK!~)aJjraoi EAAp@}`2YX_ literal 0 HcmV?d00001 diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/bundled_packages/elastic_agent-1.2.0.zip b/x-pack/test/fleet_api_integration/apis/fixtures/bundled_packages/elastic_agent-1.2.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..a41061b7212ae3351919d41b2dab4e061e6be2b4 GIT binary patch literal 867428 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