{"version":3,"file":"AlertSilences.0dfd49f78dc93c695e30.js","mappings":"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","sources":["webpack://grafana/./public/app/core/hooks/useCleanup.ts","webpack://grafana/./public/app/features/alerting/unified/components/silences/MatchedSilencedRules.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/MatchersField.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilencePeriod.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilencesEditor.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/ActionButton.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/NoSilencesCTA.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilencedAlertsTableRow.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilencedAlertsTable.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilenceDetails.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilenceStateTag.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilencesFilter.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/SilencesTable.tsx","webpack://grafana/./public/app/features/alerting/unified/Silences.tsx","webpack://grafana/./public/app/features/alerting/unified/components/AlertingPageWrapper.tsx","webpack://grafana/./public/app/features/alerting/unified/components/Authorize.tsx","webpack://grafana/./public/app/features/alerting/unified/components/NoAlertManagerWarning.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/ActionIcon.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/AmAlertStateTag.tsx","webpack://grafana/./public/app/features/alerting/unified/components/silences/Matchers.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useAlertManagerSourceName.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useAlertManagerSources.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useCombinedRuleNamespaces.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useURLSearchParams.ts","webpack://grafana/./public/app/features/alerting/unified/styles/table.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { cleanUpAction, StateSelector } from '../actions/cleanUp';\n\nexport function useCleanup<T>(stateSelector: StateSelector<T>) {\n  const dispatch = useDispatch();\n  //bit of a hack to unburden user from having to wrap stateSelcetor in a useCallback. Otherwise cleanup would happen on every render\n  const selectorRef = useRef(stateSelector);\n  selectorRef.current = stateSelector;\n  useEffect(() => {\n    return () => {\n      dispatch(cleanUpAction({ stateSelector: selectorRef.current }));\n    };\n  }, [dispatch]);\n}\n","import { css } from '@emotion/css';\nimport React, { useEffect, useState } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { useDispatch } from 'react-redux';\nimport { useDebounce } from 'react-use';\n\nimport { dateTime, GrafanaTheme2 } from '@grafana/data';\nimport { Badge, useStyles2 } from '@grafana/ui';\nimport { Alert, AlertingRule } from 'app/types/unified-alerting';\n\nimport { useCombinedRuleNamespaces } from '../../hooks/useCombinedRuleNamespaces';\nimport { fetchAllPromAndRulerRulesAction } from '../../state/actions';\nimport { MatcherFieldValue, SilenceFormFields } from '../../types/silence-form';\nimport { findAlertInstancesWithMatchers } from '../../utils/matchers';\nimport { isAlertingRule } from '../../utils/rules';\nimport { AlertLabels } from '../AlertLabels';\nimport { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\nimport { AlertStateTag } from '../rules/AlertStateTag';\n\ntype MatchedRulesTableItemProps = DynamicTableItemProps<{\n  matchedInstance: Alert;\n}>;\ntype MatchedRulesTableColumnProps = DynamicTableColumnProps<{ matchedInstance: Alert }>;\n\nexport const MatchedSilencedRules = () => {\n  const [matchedAlertRules, setMatchedAlertRules] = useState<MatchedRulesTableItemProps[]>([]);\n  const formApi = useFormContext<SilenceFormFields>();\n  const dispatch = useDispatch();\n  const { watch } = formApi;\n  const matchers: MatcherFieldValue[] = watch('matchers');\n  const styles = useStyles2(getStyles);\n  const columns = useColumns();\n\n  useEffect(() => {\n    dispatch(fetchAllPromAndRulerRulesAction());\n  }, [dispatch]);\n\n  const combinedNamespaces = useCombinedRuleNamespaces();\n  useDebounce(\n    () => {\n      const matchedInstances = combinedNamespaces.flatMap((namespace) => {\n        return namespace.groups.flatMap((group) => {\n          return group.rules\n            .map((combinedRule) => combinedRule.promRule)\n            .filter((rule): rule is AlertingRule => isAlertingRule(rule))\n            .flatMap((rule) => findAlertInstancesWithMatchers(rule.alerts ?? [], matchers));\n        });\n      });\n      setMatchedAlertRules(matchedInstances);\n    },\n    500,\n    [combinedNamespaces, matchers]\n  );\n\n  return (\n    <div>\n      <h4 className={styles.title}>\n        Affected alert instances\n        {matchedAlertRules.length > 0 ? (\n          <Badge className={styles.badge} color=\"blue\" text={matchedAlertRules.length} />\n        ) : null}\n      </h4>\n      <div className={styles.table}>\n        {matchers.every((matcher) => !matcher.value && !matcher.name) ? (\n          <span>Add a valid matcher to see affected alerts</span>\n        ) : (\n          <>\n            <DynamicTable items={matchedAlertRules.slice(0, 5) ?? []} isExpandable={false} cols={columns} />\n            {matchedAlertRules.length > 5 && (\n              <div className={styles.moreMatches}>and {matchedAlertRules.length - 5} more</div>\n            )}\n          </>\n        )}\n      </div>\n    </div>\n  );\n};\n\nfunction useColumns(): MatchedRulesTableColumnProps[] {\n  return [\n    {\n      id: 'state',\n      label: 'State',\n      renderCell: function renderStateTag({ data: { matchedInstance } }) {\n        return <AlertStateTag state={matchedInstance.state} />;\n      },\n      size: '160px',\n    },\n    {\n      id: 'labels',\n      label: 'Labels',\n      renderCell: function renderName({ data: { matchedInstance } }) {\n        return <AlertLabels labels={matchedInstance.labels} />;\n      },\n      size: '250px',\n    },\n    {\n      id: 'created',\n      label: 'Created',\n      renderCell: function renderSummary({ data: { matchedInstance } }) {\n        return (\n          <>\n            {matchedInstance.activeAt.startsWith('0001')\n              ? '-'\n              : dateTime(matchedInstance.activeAt).format('YYYY-MM-DD HH:mm:ss')}\n          </>\n        );\n      },\n      size: '400px',\n    },\n  ];\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  table: css`\n    max-width: ${theme.breakpoints.values.lg}px;\n  `,\n  moreMatches: css`\n    margin-top: ${theme.spacing(1)};\n  `,\n  title: css`\n    display: flex;\n    align-items: center;\n  `,\n  badge: css`\n    margin-left: ${theme.spacing(1)};\n  `,\n});\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\nimport { useFormContext, useFieldArray } from 'react-hook-form';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, Field, Input, IconButton, InputControl, useStyles2, Select } from '@grafana/ui';\nimport { MatcherOperator } from 'app/plugins/datasource/alertmanager/types';\n\nimport { SilenceFormFields } from '../../types/silence-form';\nimport { matcherFieldOptions } from '../../utils/alertmanager';\n\ninterface Props {\n  className?: string;\n}\n\nconst MatchersField: FC<Props> = ({ className }) => {\n  const styles = useStyles2(getStyles);\n  const formApi = useFormContext<SilenceFormFields>();\n  const {\n    control,\n    register,\n    formState: { errors },\n  } = formApi;\n\n  const { fields: matchers = [], append, remove } = useFieldArray<SilenceFormFields>({ name: 'matchers' });\n\n  return (\n    <div className={cx(className, styles.wrapper)}>\n      <Field label=\"Matching labels\" required>\n        <div>\n          <div className={styles.matchers}>\n            {matchers.map((matcher, index) => {\n              return (\n                <div className={styles.row} key={`${matcher.id}`} data-testid=\"matcher\">\n                  <Field\n                    label=\"Label\"\n                    invalid={!!errors?.matchers?.[index]?.name}\n                    error={errors?.matchers?.[index]?.name?.message}\n                  >\n                    <Input\n                      {...register(`matchers.${index}.name` as const, {\n                        required: { value: true, message: 'Required.' },\n                      })}\n                      defaultValue={matcher.name}\n                      placeholder=\"label\"\n                    />\n                  </Field>\n                  <Field label={'Operator'}>\n                    <InputControl\n                      control={control}\n                      render={({ field: { onChange, ref, ...field } }) => (\n                        <Select\n                          {...field}\n                          menuShouldPortal\n                          onChange={(value) => onChange(value.value)}\n                          className={styles.matcherOptions}\n                          options={matcherFieldOptions}\n                          aria-label=\"operator\"\n                        />\n                      )}\n                      defaultValue={matcher.operator || matcherFieldOptions[0].value}\n                      name={`matchers.${index}.operator` as const}\n                      rules={{ required: { value: true, message: 'Required.' } }}\n                    />\n                  </Field>\n                  <Field\n                    label=\"Value\"\n                    invalid={!!errors?.matchers?.[index]?.value}\n                    error={errors?.matchers?.[index]?.value?.message}\n                  >\n                    <Input\n                      {...register(`matchers.${index}.value` as const, {\n                        required: { value: true, message: 'Required.' },\n                      })}\n                      defaultValue={matcher.value}\n                      placeholder=\"value\"\n                    />\n                  </Field>\n                  {matchers.length > 1 && (\n                    <IconButton\n                      className={styles.removeButton}\n                      tooltip=\"Remove matcher\"\n                      name={'trash-alt'}\n                      onClick={() => remove(index)}\n                    >\n                      Remove\n                    </IconButton>\n                  )}\n                </div>\n              );\n            })}\n          </div>\n          <Button\n            type=\"button\"\n            icon=\"plus\"\n            variant=\"secondary\"\n            onClick={() => {\n              const newMatcher = { name: '', value: '', operator: MatcherOperator.equal };\n              append(newMatcher);\n            }}\n          >\n            Add matcher\n          </Button>\n        </div>\n      </Field>\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    wrapper: css`\n      margin-top: ${theme.spacing(2)};\n    `,\n    row: css`\n      display: flex;\n      align-items: flex-start;\n      flex-direction: row;\n      background-color: ${theme.colors.background.secondary};\n      padding: ${theme.spacing(1)} ${theme.spacing(1)} 0 ${theme.spacing(1)};\n      & > * + * {\n        margin-left: ${theme.spacing(2)};\n      }\n    `,\n    removeButton: css`\n      margin-left: ${theme.spacing(1)};\n      margin-top: ${theme.spacing(2.5)};\n    `,\n    matcherOptions: css`\n      min-width: 140px;\n    `,\n    matchers: css`\n      max-width: ${theme.breakpoints.values.sm}px;\n      margin: ${theme.spacing(1)} 0;\n      padding-top: ${theme.spacing(0.5)};\n    `,\n  };\n};\n\nexport default MatchersField;\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { useController, useFormContext } from 'react-hook-form';\n\nimport { dateTime, GrafanaTheme } from '@grafana/data';\nimport { Field, TimeRangeInput, useStyles } from '@grafana/ui';\n\nimport { SilenceFormFields } from '../../types/silence-form';\n\nexport const SilencePeriod = () => {\n  const { control, getValues } = useFormContext<SilenceFormFields>();\n  const styles = useStyles(getStyles);\n  const {\n    field: { onChange: onChangeStartsAt, value: startsAt },\n    fieldState: { invalid: startsAtInvalid },\n  } = useController({\n    name: 'startsAt',\n    control,\n    rules: {\n      validate: (value) => getValues().endsAt > value,\n    },\n  });\n\n  const {\n    field: { onChange: onChangeEndsAt, value: endsAt },\n    fieldState: { invalid: endsAtInvalid },\n  } = useController({\n    name: 'endsAt',\n    control,\n    rules: {\n      validate: (value) => getValues().startsAt < value,\n    },\n  });\n\n  const {\n    field: { onChange: onChangeTimeZone, value: timeZone },\n  } = useController({\n    name: 'timeZone',\n    control,\n  });\n\n  const invalid = startsAtInvalid || endsAtInvalid;\n\n  const from = dateTime(startsAt);\n  const to = dateTime(endsAt);\n\n  return (\n    <Field\n      className={styles.timeRange}\n      label=\"Silence start and end\"\n      error={invalid ? 'To is before or the same as from' : ''}\n      invalid={invalid}\n    >\n      <TimeRangeInput\n        value={{\n          from,\n          to,\n          raw: {\n            from,\n            to,\n          },\n        }}\n        timeZone={timeZone}\n        onChange={(newValue) => {\n          onChangeStartsAt(dateTime(newValue.from));\n          onChangeEndsAt(dateTime(newValue.to));\n        }}\n        onChangeTimeZone={(newValue) => onChangeTimeZone(newValue)}\n        hideTimeZone={false}\n        hideQuickRanges={true}\n        placeholder={'Select time range'}\n      />\n    </Field>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme) => ({\n  timeRange: css`\n    width: 400px;\n  `,\n});\n","import { css, cx } from '@emotion/css';\nimport { pickBy } from 'lodash';\nimport React, { FC, useMemo, useState } from 'react';\nimport { useForm, FormProvider } from 'react-hook-form';\nimport { useDispatch } from 'react-redux';\nimport { useDebounce } from 'react-use';\n\nimport {\n  DefaultTimeZone,\n  parseDuration,\n  intervalToAbbreviatedDurationString,\n  addDurationToDate,\n  dateTime,\n  isValidDate,\n  GrafanaTheme2,\n} from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Button, Field, FieldSet, Input, LinkButton, TextArea, useStyles2 } from '@grafana/ui';\nimport { useCleanup } from 'app/core/hooks/useCleanup';\nimport { MatcherOperator, Silence, SilenceCreatePayload } from 'app/plugins/datasource/alertmanager/types';\n\nimport { useURLSearchParams } from '../../hooks/useURLSearchParams';\nimport { useUnifiedAlertingSelector } from '../../hooks/useUnifiedAlertingSelector';\nimport { createOrUpdateSilenceAction } from '../../state/actions';\nimport { SilenceFormFields } from '../../types/silence-form';\nimport { matcherToMatcherField, matcherFieldToMatcher } from '../../utils/alertmanager';\nimport { parseQueryParamMatchers } from '../../utils/matchers';\nimport { makeAMLink } from '../../utils/misc';\n\nimport { MatchedSilencedRules } from './MatchedSilencedRules';\nimport MatchersField from './MatchersField';\nimport { SilencePeriod } from './SilencePeriod';\n\ninterface Props {\n  silence?: Silence;\n  alertManagerSourceName: string;\n}\n\nconst defaultsFromQuery = (searchParams: URLSearchParams): Partial<SilenceFormFields> => {\n  const defaults: Partial<SilenceFormFields> = {};\n\n  const comment = searchParams.get('comment');\n  const matchers = searchParams.getAll('matcher');\n\n  const formMatchers = parseQueryParamMatchers(matchers);\n  if (formMatchers.length) {\n    defaults.matchers = formMatchers.map(matcherToMatcherField);\n  }\n\n  if (comment) {\n    defaults.comment = comment;\n  }\n\n  return defaults;\n};\n\nconst getDefaultFormValues = (searchParams: URLSearchParams, silence?: Silence): SilenceFormFields => {\n  const now = new Date();\n  if (silence) {\n    const isExpired = Date.parse(silence.endsAt) < Date.now();\n    const interval = isExpired\n      ? {\n          start: now,\n          end: addDurationToDate(now, { hours: 2 }),\n        }\n      : { start: new Date(silence.startsAt), end: new Date(silence.endsAt) };\n    return {\n      id: silence.id,\n      startsAt: interval.start.toISOString(),\n      endsAt: interval.end.toISOString(),\n      comment: silence.comment,\n      createdBy: silence.createdBy,\n      duration: intervalToAbbreviatedDurationString(interval),\n      isRegex: false,\n      matchers: silence.matchers?.map(matcherToMatcherField) || [],\n      matcherName: '',\n      matcherValue: '',\n      timeZone: DefaultTimeZone,\n    };\n  } else {\n    const endsAt = addDurationToDate(now, { hours: 2 }); // Default time period is now + 2h\n    return {\n      id: '',\n      startsAt: now.toISOString(),\n      endsAt: endsAt.toISOString(),\n      comment: `created ${dateTime().format('YYYY-MM-DD HH:mm')}`,\n      createdBy: config.bootData.user.name,\n      duration: '2h',\n      isRegex: false,\n      matchers: [{ name: '', value: '', operator: MatcherOperator.equal }],\n      matcherName: '',\n      matcherValue: '',\n      timeZone: DefaultTimeZone,\n      ...defaultsFromQuery(searchParams),\n    };\n  }\n};\n\nexport const SilencesEditor: FC<Props> = ({ silence, alertManagerSourceName }) => {\n  const [urlSearchParams] = useURLSearchParams();\n\n  const defaultValues = useMemo(() => getDefaultFormValues(urlSearchParams, silence), [silence, urlSearchParams]);\n  const formAPI = useForm({ defaultValues });\n  const dispatch = useDispatch();\n  const styles = useStyles2(getStyles);\n\n  const { loading } = useUnifiedAlertingSelector((state) => state.updateSilence);\n\n  useCleanup((state) => state.unifiedAlerting.updateSilence);\n\n  const { register, handleSubmit, formState, watch, setValue, clearErrors } = formAPI;\n\n  const onSubmit = (data: SilenceFormFields) => {\n    const { id, startsAt, endsAt, comment, createdBy, matchers: matchersFields } = data;\n    const matchers = matchersFields.map(matcherFieldToMatcher);\n    const payload = pickBy(\n      {\n        id,\n        startsAt,\n        endsAt,\n        comment,\n        createdBy,\n        matchers,\n      },\n      (value) => !!value\n    ) as SilenceCreatePayload;\n    dispatch(\n      createOrUpdateSilenceAction({\n        alertManagerSourceName,\n        payload,\n        exitOnSave: true,\n        successMessage: `Silence ${payload.id ? 'updated' : 'created'}`,\n      })\n    );\n  };\n\n  const duration = watch('duration');\n  const startsAt = watch('startsAt');\n  const endsAt = watch('endsAt');\n\n  // Keep duration and endsAt in sync\n  const [prevDuration, setPrevDuration] = useState(duration);\n  useDebounce(\n    () => {\n      if (isValidDate(startsAt) && isValidDate(endsAt)) {\n        if (duration !== prevDuration) {\n          setValue('endsAt', dateTime(addDurationToDate(new Date(startsAt), parseDuration(duration))).toISOString());\n          setPrevDuration(duration);\n        } else {\n          const startValue = new Date(startsAt).valueOf();\n          const endValue = new Date(endsAt).valueOf();\n          if (endValue > startValue) {\n            const nextDuration = intervalToAbbreviatedDurationString({\n              start: new Date(startsAt),\n              end: new Date(endsAt),\n            });\n            setValue('duration', nextDuration);\n            setPrevDuration(nextDuration);\n          }\n        }\n      }\n    },\n    700,\n    [clearErrors, duration, endsAt, prevDuration, setValue, startsAt]\n  );\n\n  return (\n    <FormProvider {...formAPI}>\n      <form onSubmit={handleSubmit(onSubmit)}>\n        <FieldSet label={`${silence ? 'Recreate silence' : 'Create silence'}`}>\n          <div className={cx(styles.flexRow, styles.silencePeriod)}>\n            <SilencePeriod />\n            <Field\n              label=\"Duration\"\n              invalid={!!formState.errors.duration}\n              error={\n                formState.errors.duration &&\n                (formState.errors.duration.type === 'required' ? 'Required field' : formState.errors.duration.message)\n              }\n            >\n              <Input\n                className={styles.createdBy}\n                {...register('duration', {\n                  validate: (value) =>\n                    Object.keys(parseDuration(value)).length === 0\n                      ? 'Invalid duration. Valid example: 1d 4h (Available units: y, M, w, d, h, m, s)'\n                      : undefined,\n                })}\n                id=\"duration\"\n              />\n            </Field>\n          </div>\n\n          <MatchersField />\n          <Field\n            className={cx(styles.field, styles.textArea)}\n            label=\"Comment\"\n            required\n            error={formState.errors.comment?.message}\n            invalid={!!formState.errors.comment}\n          >\n            <TextArea\n              {...register('comment', { required: { value: true, message: 'Required.' } })}\n              rows={5}\n              placeholder=\"Details about the silence\"\n            />\n          </Field>\n          <MatchedSilencedRules />\n        </FieldSet>\n        <div className={styles.flexRow}>\n          {loading && (\n            <Button disabled={true} icon=\"fa fa-spinner\" variant=\"primary\">\n              Saving...\n            </Button>\n          )}\n          {!loading && <Button type=\"submit\">Submit</Button>}\n          <LinkButton\n            href={makeAMLink('alerting/silences', alertManagerSourceName)}\n            variant={'secondary'}\n            fill=\"outline\"\n          >\n            Cancel\n          </LinkButton>\n        </div>\n      </form>\n    </FormProvider>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  field: css`\n    margin: ${theme.spacing(1, 0)};\n  `,\n  textArea: css`\n    max-width: ${theme.breakpoints.values.sm}px;\n  `,\n  createdBy: css`\n    width: 200px;\n  `,\n  flexRow: css`\n    display: flex;\n    flex-direction: row;\n    justify-content: flex-start;\n\n    & > * {\n      margin-right: ${theme.spacing(1)};\n    }\n  `,\n  silencePeriod: css`\n    max-width: ${theme.breakpoints.values.sm}px;\n  `,\n});\n\nexport default SilencesEditor;\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { useStyles } from '@grafana/ui';\nimport { Button, ButtonProps } from '@grafana/ui/src/components/Button';\n\ntype Props = Omit<ButtonProps, 'variant' | 'size'>;\n\nexport const ActionButton: FC<Props> = ({ className, ...restProps }) => (\n  <Button variant=\"secondary\" size=\"xs\" className={cx(useStyles(getStyle), className)} {...restProps} />\n);\n\nexport const getStyle = (theme: GrafanaTheme) => css`\n  height: 24px;\n  font-size: ${theme.typography.size.sm};\n`;\n","import React, { FC } from 'react';\n\nimport { CallToActionCard } from '@grafana/ui';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\nimport { contextSrv } from 'app/core/services/context_srv';\n\nimport { getInstancesPermissions } from '../../utils/access-control';\nimport { makeAMLink } from '../../utils/misc';\n\ntype Props = {\n  alertManagerSourceName: string;\n};\n\nexport const NoSilencesSplash: FC<Props> = ({ alertManagerSourceName }) => {\n  const permissions = getInstancesPermissions(alertManagerSourceName);\n\n  if (contextSrv.hasAccess(permissions.create, contextSrv.isEditor)) {\n    return (\n      <EmptyListCTA\n        title=\"You haven't created any silences yet\"\n        buttonIcon=\"bell-slash\"\n        buttonLink={makeAMLink('alerting/silence/new', alertManagerSourceName)}\n        buttonTitle=\"New silence\"\n      />\n    );\n  }\n  return <CallToActionCard callToActionElement={<div />} message=\"No silences found.\" />;\n};\n","import React, { FC, useState } from 'react';\n\nimport { intervalToAbbreviatedDurationString } from '@grafana/data';\nimport { AlertmanagerAlert } from 'app/plugins/datasource/alertmanager/types';\n\nimport { AlertLabels } from '../AlertLabels';\nimport { CollapseToggle } from '../CollapseToggle';\n\nimport { AmAlertStateTag } from './AmAlertStateTag';\n\ninterface Props {\n  alert: AlertmanagerAlert;\n  className?: string;\n}\n\nexport const SilencedAlertsTableRow: FC<Props> = ({ alert, className }) => {\n  const [isCollapsed, setIsCollapsed] = useState(true);\n\n  const duration = intervalToAbbreviatedDurationString({\n    start: new Date(alert.startsAt),\n    end: new Date(alert.endsAt),\n  });\n  const alertName = Object.entries(alert.labels).reduce((name, [labelKey, labelValue]) => {\n    if (labelKey === 'alertname' || labelKey === '__alert_rule_title__') {\n      name = labelValue;\n    }\n    return name;\n  }, '');\n  return (\n    <>\n      <tr className={className}>\n        <td>\n          <CollapseToggle isCollapsed={isCollapsed} onToggle={(collapsed) => setIsCollapsed(collapsed)} />\n        </td>\n        <td>\n          <AmAlertStateTag state={alert.status.state} />\n        </td>\n        <td>for {duration} seconds</td>\n        <td>{alertName}</td>\n      </tr>\n      {!isCollapsed && (\n        <tr className={className}>\n          <td></td>\n          <td colSpan={5}>\n            <AlertLabels labels={alert.labels} />\n          </td>\n        </tr>\n      )}\n    </>\n  );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { AlertmanagerAlert } from 'app/plugins/datasource/alertmanager/types';\n\nimport { getAlertTableStyles } from '../../styles/table';\n\nimport { SilencedAlertsTableRow } from './SilencedAlertsTableRow';\n\ninterface Props {\n  silencedAlerts: AlertmanagerAlert[];\n}\n\nconst SilencedAlertsTable: FC<Props> = ({ silencedAlerts }) => {\n  const tableStyles = useStyles2(getAlertTableStyles);\n  const styles = useStyles2(getStyles);\n\n  if (!!silencedAlerts.length) {\n    return (\n      <table className={cx(tableStyles.table, styles.tableMargin)}>\n        <colgroup>\n          <col className={tableStyles.colExpand} />\n          <col className={styles.colState} />\n          <col />\n          <col className={styles.colName} />\n        </colgroup>\n        <thead>\n          <tr>\n            <th></th>\n            <th>State</th>\n            <th></th>\n            <th>Alert name</th>\n          </tr>\n        </thead>\n        <tbody>\n          {silencedAlerts.map((alert, index) => {\n            return (\n              <SilencedAlertsTableRow\n                key={alert.fingerprint}\n                alert={alert}\n                className={index % 2 === 0 ? tableStyles.evenRow : ''}\n              />\n            );\n          })}\n        </tbody>\n      </table>\n    );\n  } else {\n    return null;\n  }\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  tableMargin: css`\n    margin-bottom: ${theme.spacing(1)};\n  `,\n  colState: css`\n    width: 110px;\n  `,\n  colName: css`\n    width: 65%;\n  `,\n});\n\nexport default SilencedAlertsTable;\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { dateMath, GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport SilencedAlertsTable from './SilencedAlertsTable';\nimport { SilenceTableItem } from './SilencesTable';\n\ninterface Props {\n  silence: SilenceTableItem;\n}\n\nexport const SilenceDetails = ({ silence }: Props) => {\n  const { startsAt, endsAt, comment, createdBy, silencedAlerts } = silence;\n  const styles = useStyles2(getStyles);\n\n  const dateDisplayFormat = 'YYYY-MM-DD HH:mm';\n  const startsAtDate = dateMath.parse(startsAt);\n  const endsAtDate = dateMath.parse(endsAt);\n  const duration = intervalToAbbreviatedDurationString({ start: new Date(startsAt), end: new Date(endsAt) });\n  return (\n    <div className={styles.container}>\n      <div className={styles.title}>Comment</div>\n      <div>{comment}</div>\n      <div className={styles.title}>Schedule</div>\n      <div>{`${startsAtDate?.format(dateDisplayFormat)} - ${endsAtDate?.format(dateDisplayFormat)}`}</div>\n      <div className={styles.title}>Duration</div>\n      <div> {duration}</div>\n      <div className={styles.title}>Created by</div>\n      <div> {createdBy}</div>\n      <div className={styles.title}>Affected alerts</div>\n      <SilencedAlertsTable silencedAlerts={silencedAlerts} />\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  container: css`\n    display: grid;\n    grid-template-columns: 1fr 9fr;\n    grid-row-gap: 1rem;\n  `,\n  title: css`\n    color: ${theme.colors.text.primary};\n  `,\n  row: css`\n    margin: ${theme.spacing(1, 0)};\n  `,\n});\n","import React, { FC } from 'react';\n\nimport { SilenceState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { State, StateTag } from '../StateTag';\n\nconst silenceStateToState: Record<SilenceState, State> = {\n  [SilenceState.Active]: 'good',\n  [SilenceState.Expired]: 'neutral',\n  [SilenceState.Pending]: 'neutral',\n};\n\ninterface Props {\n  state: SilenceState;\n}\n\nexport const SilenceStateTag: FC<Props> = ({ state }) => (\n  <StateTag state={silenceStateToState[state]}>{state}</StateTag>\n);\n","import { css } from '@emotion/css';\nimport { debounce, uniqueId } from 'lodash';\nimport React, { FormEvent, useState } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { Label, Icon, Input, Tooltip, RadioButtonGroup, useStyles2, Button, Field } from '@grafana/ui';\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport { SilenceState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { parseMatchers } from '../../utils/alertmanager';\nimport { getSilenceFiltersFromUrlParams } from '../../utils/misc';\n\nconst stateOptions: SelectableValue[] = Object.entries(SilenceState).map(([key, value]) => ({\n  label: key,\n  value,\n}));\n\nconst getQueryStringKey = () => uniqueId('query-string-');\n\nexport const SilencesFilter = () => {\n  const [queryStringKey, setQueryStringKey] = useState(getQueryStringKey());\n  const [queryParams, setQueryParams] = useQueryParams();\n  const { queryString, silenceState } = getSilenceFiltersFromUrlParams(queryParams);\n  const styles = useStyles2(getStyles);\n\n  const handleQueryStringChange = debounce((e: FormEvent<HTMLInputElement>) => {\n    const target = e.target as HTMLInputElement;\n    setQueryParams({ queryString: target.value || null });\n  }, 400);\n\n  const handleSilenceStateChange = (state: string) => {\n    setQueryParams({ silenceState: state });\n  };\n\n  const clearFilters = () => {\n    setQueryParams({\n      queryString: null,\n      silenceState: null,\n    });\n    setTimeout(() => setQueryStringKey(getQueryStringKey()));\n  };\n\n  const inputInvalid = queryString && queryString.length > 3 ? parseMatchers(queryString).length === 0 : false;\n\n  return (\n    <div className={styles.flexRow}>\n      <Field\n        className={styles.rowChild}\n        label={\n          <Label>\n            <Stack gap={0.5}>\n              <span>Search by matchers</span>\n              <Tooltip\n                content={\n                  <div>\n                    Filter silences by matchers using a comma separated list of matchers, ie:\n                    <pre>{`severity=critical, instance=~cluster-us-.+`}</pre>\n                  </div>\n                }\n              >\n                <Icon name=\"info-circle\" size=\"sm\" />\n              </Tooltip>\n            </Stack>\n          </Label>\n        }\n        invalid={inputInvalid}\n        error={inputInvalid ? 'Query must use valid matcher syntax' : null}\n      >\n        <Input\n          key={queryStringKey}\n          className={styles.searchInput}\n          prefix={<Icon name=\"search\" />}\n          onChange={handleQueryStringChange}\n          defaultValue={queryString ?? ''}\n          placeholder=\"Search\"\n          data-testid=\"search-query-input\"\n        />\n      </Field>\n      <Field className={styles.rowChild} label=\"State\">\n        <RadioButtonGroup options={stateOptions} value={silenceState} onChange={handleSilenceStateChange} />\n      </Field>\n      {(queryString || silenceState) && (\n        <div className={styles.rowChild}>\n          <Button variant=\"secondary\" icon=\"times\" onClick={clearFilters}>\n            Clear filters\n          </Button>\n        </div>\n      )}\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  searchInput: css`\n    width: 360px;\n  `,\n  flexRow: css`\n    display: flex;\n    flex-direction: row;\n    align-items: flex-end;\n    padding-bottom: ${theme.spacing(2)};\n    border-bottom: 1px solid ${theme.colors.border.strong};\n  `,\n  rowChild: css`\n    margin-right: ${theme.spacing(1)};\n    margin-bottom: 0;\n    max-height: 52px;\n  `,\n  fieldLabel: css`\n    font-size: 12px;\n    font-weight: 500;\n  `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { GrafanaTheme2, dateMath } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { Icon, useStyles2, Link, Button } from '@grafana/ui';\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AlertmanagerAlert, Silence, SilenceState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { expireSilenceAction } from '../../state/actions';\nimport { getInstancesPermissions } from '../../utils/access-control';\nimport { parseMatchers } from '../../utils/alertmanager';\nimport { getSilenceFiltersFromUrlParams, makeAMLink } from '../../utils/misc';\nimport { Authorize } from '../Authorize';\nimport { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\nimport { ActionButton } from '../rules/ActionButton';\nimport { ActionIcon } from '../rules/ActionIcon';\n\nimport { Matchers } from './Matchers';\nimport { NoSilencesSplash } from './NoSilencesCTA';\nimport { SilenceDetails } from './SilenceDetails';\nimport { SilenceStateTag } from './SilenceStateTag';\nimport { SilencesFilter } from './SilencesFilter';\n\nexport interface SilenceTableItem extends Silence {\n  silencedAlerts: AlertmanagerAlert[];\n}\n\ntype SilenceTableColumnProps = DynamicTableColumnProps<SilenceTableItem>;\ntype SilenceTableItemProps = DynamicTableItemProps<SilenceTableItem>;\ninterface Props {\n  silences: Silence[];\n  alertManagerAlerts: AlertmanagerAlert[];\n  alertManagerSourceName: string;\n}\n\nconst SilencesTable: FC<Props> = ({ silences, alertManagerAlerts, alertManagerSourceName }) => {\n  const styles = useStyles2(getStyles);\n  const [queryParams] = useQueryParams();\n  const filteredSilences = useFilteredSilences(silences);\n  const permissions = getInstancesPermissions(alertManagerSourceName);\n\n  const { silenceState } = getSilenceFiltersFromUrlParams(queryParams);\n\n  const showExpiredSilencesBanner =\n    !!filteredSilences.length && (silenceState === undefined || silenceState === SilenceState.Expired);\n\n  const columns = useColumns(alertManagerSourceName);\n\n  const items = useMemo((): SilenceTableItemProps[] => {\n    const findSilencedAlerts = (id: string) => {\n      return alertManagerAlerts.filter((alert) => alert.status.silencedBy.includes(id));\n    };\n    return filteredSilences.map((silence) => {\n      const silencedAlerts = findSilencedAlerts(silence.id);\n      return {\n        id: silence.id,\n        data: { ...silence, silencedAlerts },\n      };\n    });\n  }, [filteredSilences, alertManagerAlerts]);\n\n  return (\n    <div data-testid=\"silences-table\">\n      {!!silences.length && (\n        <>\n          <SilencesFilter />\n          <Authorize actions={[permissions.create]} fallback={contextSrv.isEditor}>\n            <div className={styles.topButtonContainer}>\n              <Link href={makeAMLink('/alerting/silence/new', alertManagerSourceName)}>\n                <Button className={styles.addNewSilence} icon=\"plus\">\n                  New Silence\n                </Button>\n              </Link>\n            </div>\n          </Authorize>\n          {!!items.length ? (\n            <>\n              <DynamicTable\n                items={items}\n                cols={columns}\n                isExpandable\n                renderExpandedContent={({ data }) => <SilenceDetails silence={data} />}\n              />\n              {showExpiredSilencesBanner && (\n                <div className={styles.callout}>\n                  <Icon className={styles.calloutIcon} name=\"info-circle\" />\n                  <span>Expired silences are automatically deleted after 5 days.</span>\n                </div>\n              )}\n            </>\n          ) : (\n            'No matching silences found'\n          )}\n        </>\n      )}\n      {!silences.length && <NoSilencesSplash alertManagerSourceName={alertManagerSourceName} />}\n    </div>\n  );\n};\n\nconst useFilteredSilences = (silences: Silence[]) => {\n  const [queryParams] = useQueryParams();\n  return useMemo(() => {\n    const { queryString, silenceState } = getSilenceFiltersFromUrlParams(queryParams);\n    const silenceIdsString = queryParams?.silenceIds;\n    return silences.filter((silence) => {\n      if (typeof silenceIdsString === 'string') {\n        const idsIncluded = silenceIdsString.split(',').includes(silence.id);\n        if (!idsIncluded) {\n          return false;\n        }\n      }\n      if (queryString) {\n        const matchers = parseMatchers(queryString);\n        const matchersMatch = matchers.every((matcher) =>\n          silence.matchers?.some(\n            ({ name, value, isEqual, isRegex }) =>\n              matcher.name === name &&\n              matcher.value === value &&\n              matcher.isEqual === isEqual &&\n              matcher.isRegex === isRegex\n          )\n        );\n        if (!matchersMatch) {\n          return false;\n        }\n      }\n      if (silenceState) {\n        const stateMatches = silence.status.state === silenceState;\n        if (!stateMatches) {\n          return false;\n        }\n      }\n      return true;\n    });\n  }, [queryParams, silences]);\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  topButtonContainer: css`\n    display: flex;\n    flex-direction: row;\n    justify-content: flex-end;\n  `,\n  addNewSilence: css`\n    margin: ${theme.spacing(2, 0)};\n  `,\n  callout: css`\n    background-color: ${theme.colors.background.secondary};\n    border-top: 3px solid ${theme.colors.info.border};\n    border-radius: 2px;\n    height: 62px;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    margin-top: ${theme.spacing(2)};\n\n    & > * {\n      margin-left: ${theme.spacing(1)};\n    }\n  `,\n  calloutIcon: css`\n    color: ${theme.colors.info.text};\n  `,\n  editButton: css`\n    margin-left: ${theme.spacing(0.5)};\n  `,\n});\n\nfunction useColumns(alertManagerSourceName: string) {\n  const dispatch = useDispatch();\n  const styles = useStyles2(getStyles);\n  const permissions = getInstancesPermissions(alertManagerSourceName);\n  return useMemo((): SilenceTableColumnProps[] => {\n    const handleExpireSilenceClick = (id: string) => {\n      dispatch(expireSilenceAction(alertManagerSourceName, id));\n    };\n    const showActions = contextSrv.hasAccess(permissions.update, contextSrv.isEditor);\n    const columns: SilenceTableColumnProps[] = [\n      {\n        id: 'state',\n        label: 'State',\n        renderCell: function renderStateTag({ data: { status } }) {\n          return <SilenceStateTag state={status.state} />;\n        },\n        size: '88px',\n      },\n      {\n        id: 'matchers',\n        label: 'Matching labels',\n        renderCell: function renderMatchers({ data: { matchers } }) {\n          return <Matchers matchers={matchers || []} />;\n        },\n        size: 9,\n      },\n      {\n        id: 'alerts',\n        label: 'Alerts',\n        renderCell: function renderSilencedAlerts({ data: { silencedAlerts } }) {\n          return <span data-testid=\"alerts\">{silencedAlerts.length}</span>;\n        },\n        size: 1,\n      },\n      {\n        id: 'schedule',\n        label: 'Schedule',\n        renderCell: function renderSchedule({ data: { startsAt, endsAt } }) {\n          const startsAtDate = dateMath.parse(startsAt);\n          const endsAtDate = dateMath.parse(endsAt);\n          const dateDisplayFormat = 'YYYY-MM-DD HH:mm';\n          return (\n            <>\n              {' '}\n              {startsAtDate?.format(dateDisplayFormat)} {'-'}\n              <br />\n              {endsAtDate?.format(dateDisplayFormat)}\n            </>\n          );\n        },\n        size: '150px',\n      },\n    ];\n    if (showActions) {\n      columns.push({\n        id: 'actions',\n        label: 'Actions',\n        renderCell: function renderActions({ data: silence }) {\n          return (\n            <Stack gap={0.5}>\n              {silence.status.state === 'expired' ? (\n                <Link href={makeAMLink(`/alerting/silence/${silence.id}/edit`, alertManagerSourceName)}>\n                  <ActionButton icon=\"sync\">Recreate</ActionButton>\n                </Link>\n              ) : (\n                <ActionButton icon=\"bell\" onClick={() => handleExpireSilenceClick(silence.id)}>\n                  Unsilence\n                </ActionButton>\n              )}\n              {silence.status.state !== 'expired' && (\n                <ActionIcon\n                  className={styles.editButton}\n                  to={makeAMLink(`/alerting/silence/${silence.id}/edit`, alertManagerSourceName)}\n                  icon=\"pen\"\n                  tooltip=\"edit\"\n                />\n              )}\n            </Stack>\n          );\n        },\n        size: '147px',\n      });\n    }\n    return columns;\n  }, [alertManagerSourceName, dispatch, styles, permissions]);\n}\n\nexport default SilencesTable;\n","import React, { FC, useCallback, useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { Redirect, Route, RouteChildrenProps, Switch, useLocation } from 'react-router-dom';\n\nimport { Alert, LoadingPlaceholder, withErrorBoundary } from '@grafana/ui';\nimport { Silence } from 'app/plugins/datasource/alertmanager/types';\n\nimport { AlertManagerPicker } from './components/AlertManagerPicker';\nimport { AlertingPageWrapper } from './components/AlertingPageWrapper';\nimport { NoAlertManagerWarning } from './components/NoAlertManagerWarning';\nimport SilencesEditor from './components/silences/SilencesEditor';\nimport SilencesTable from './components/silences/SilencesTable';\nimport { useAlertManagerSourceName } from './hooks/useAlertManagerSourceName';\nimport { useAlertManagersByPermission } from './hooks/useAlertManagerSources';\nimport { useUnifiedAlertingSelector } from './hooks/useUnifiedAlertingSelector';\nimport { fetchAmAlertsAction, fetchSilencesAction } from './state/actions';\nimport { SILENCES_POLL_INTERVAL_MS } from './utils/constants';\nimport { AsyncRequestState, initialAsyncRequestState } from './utils/redux';\n\nconst Silences: FC = () => {\n  const alertManagers = useAlertManagersByPermission('instance');\n  const [alertManagerSourceName, setAlertManagerSourceName] = useAlertManagerSourceName(alertManagers);\n\n  const dispatch = useDispatch();\n  const silences = useUnifiedAlertingSelector((state) => state.silences);\n  const alertsRequests = useUnifiedAlertingSelector((state) => state.amAlerts);\n  const alertsRequest = alertManagerSourceName\n    ? alertsRequests[alertManagerSourceName] || initialAsyncRequestState\n    : undefined;\n\n  const location = useLocation();\n  const isRoot = location.pathname.endsWith('/alerting/silences');\n\n  useEffect(() => {\n    function fetchAll() {\n      if (alertManagerSourceName) {\n        dispatch(fetchSilencesAction(alertManagerSourceName));\n        dispatch(fetchAmAlertsAction(alertManagerSourceName));\n      }\n    }\n    fetchAll();\n    const interval = setInterval(() => fetchAll, SILENCES_POLL_INTERVAL_MS);\n    return () => {\n      clearInterval(interval);\n    };\n  }, [alertManagerSourceName, dispatch]);\n\n  const { result, loading, error }: AsyncRequestState<Silence[]> =\n    (alertManagerSourceName && silences[alertManagerSourceName]) || initialAsyncRequestState;\n\n  const getSilenceById = useCallback((id: string) => result && result.find((silence) => silence.id === id), [result]);\n\n  if (!alertManagerSourceName) {\n    return isRoot ? (\n      <AlertingPageWrapper pageId=\"silences\">\n        <NoAlertManagerWarning availableAlertManagers={alertManagers} />\n      </AlertingPageWrapper>\n    ) : (\n      <Redirect to=\"/alerting/silences\" />\n    );\n  }\n\n  return (\n    <AlertingPageWrapper pageId=\"silences\">\n      <AlertManagerPicker\n        disabled={!isRoot}\n        current={alertManagerSourceName}\n        onChange={setAlertManagerSourceName}\n        dataSources={alertManagers}\n      />\n      {error && !loading && (\n        <Alert severity=\"error\" title=\"Error loading silences\">\n          {error.message || 'Unknown error.'}\n        </Alert>\n      )}\n      {alertsRequest?.error && !alertsRequest?.loading && (\n        <Alert severity=\"error\" title=\"Error loading Alertmanager alerts\">\n          {alertsRequest.error?.message || 'Unknown error.'}\n        </Alert>\n      )}\n      {loading && <LoadingPlaceholder text=\"loading silences...\" />}\n      {result && !error && (\n        <Switch>\n          <Route exact path=\"/alerting/silences\">\n            <SilencesTable\n              silences={result}\n              alertManagerAlerts={alertsRequest?.result ?? []}\n              alertManagerSourceName={alertManagerSourceName}\n            />\n          </Route>\n          <Route exact path=\"/alerting/silence/new\">\n            <SilencesEditor alertManagerSourceName={alertManagerSourceName} />\n          </Route>\n          <Route exact path=\"/alerting/silence/:id/edit\">\n            {({ match }: RouteChildrenProps<{ id: string }>) => {\n              return (\n                match?.params.id && (\n                  <SilencesEditor\n                    silence={getSilenceById(match.params.id)}\n                    alertManagerSourceName={alertManagerSourceName}\n                  />\n                )\n              );\n            }}\n          </Route>\n        </Switch>\n      )}\n    </AlertingPageWrapper>\n  );\n};\n\nexport default withErrorBoundary(Silences, { style: 'page' });\n","import React, { FC } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport Page from 'app/core/components/Page/Page';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { StoreState } from 'app/types/store';\n\ninterface Props {\n  pageId: string;\n  isLoading?: boolean;\n}\n\nexport const AlertingPageWrapper: FC<Props> = ({ children, pageId, isLoading }) => {\n  const navModel = getNavModel(\n    useSelector((state: StoreState) => state.navIndex),\n    pageId\n  );\n\n  return (\n    <Page navModel={navModel}>\n      <Page.Contents isLoading={isLoading}>{children}</Page.Contents>\n    </Page>\n  );\n};\n","import React, { FC } from 'react';\n\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction } from 'app/types';\n\ntype Props = {\n  actions: AccessControlAction[];\n  fallback?: boolean;\n};\n\nexport const Authorize: FC<Props> = ({ actions, children, fallback = true }) => {\n  if (actions.some((action) => contextSrv.hasAccess(action, fallback))) {\n    return <>{children}</>;\n  } else {\n    return null;\n  }\n};\n","import React from 'react';\n\nimport { Alert } from '@grafana/ui';\n\nimport { useAlertManagerSourceName } from '../hooks/useAlertManagerSourceName';\nimport { AlertManagerDataSource } from '../utils/datasource';\n\nimport { AlertManagerPicker } from './AlertManagerPicker';\n\ninterface Props {\n  availableAlertManagers: AlertManagerDataSource[];\n}\n\nconst NoAlertManagersAvailable = () => (\n  <Alert title=\"No Alertmanager found\" severity=\"warning\">\n    We could not find any external Alertmanagers and you may not have access to the built-in Grafana Alertmanager.\n  </Alert>\n);\n\nconst OtherAlertManagersAvailable = () => (\n  <Alert title=\"Selected Alertmanager not found. Select a different Alertmanager.\" severity=\"warning\">\n    Selected Alertmanager no longer exists or you may not have permission to access it.\n  </Alert>\n);\n\nexport const NoAlertManagerWarning = ({ availableAlertManagers }: Props) => {\n  const [_, setAlertManagerSourceName] = useAlertManagerSourceName(availableAlertManagers);\n  const hasOtherAMs = availableAlertManagers.length > 0;\n\n  return (\n    <div>\n      {hasOtherAMs ? (\n        <>\n          <AlertManagerPicker onChange={setAlertManagerSourceName} dataSources={availableAlertManagers} />\n          <OtherAlertManagersAvailable />\n        </>\n      ) : (\n        <NoAlertManagersAvailable />\n      )}\n    </div>\n  );\n};\n","import React, { FC } from 'react';\n\nimport { IconName, Tooltip, LinkButton, Button } from '@grafana/ui';\nimport { PopoverContent, TooltipPlacement } from '@grafana/ui/src/components/Tooltip';\n\ninterface Props {\n  tooltip: PopoverContent;\n  icon: IconName;\n  className?: string;\n  tooltipPlacement?: TooltipPlacement;\n  to?: string;\n  target?: string;\n  onClick?: () => void;\n  'data-testid'?: string;\n}\n\nexport const ActionIcon: FC<Props> = ({\n  tooltip,\n  icon,\n  to,\n  target,\n  onClick,\n  className,\n  tooltipPlacement = 'top',\n  ...rest\n}) => {\n  const ariaLabel = typeof tooltip === 'string' ? tooltip : undefined;\n\n  return (\n    <Tooltip content={tooltip} placement={tooltipPlacement}>\n      {to ? (\n        <LinkButton\n          variant=\"secondary\"\n          fill=\"text\"\n          icon={icon}\n          href={to}\n          size=\"sm\"\n          target={target}\n          {...rest}\n          aria-label={ariaLabel}\n        />\n      ) : (\n        <Button\n          className={className}\n          variant=\"secondary\"\n          fill=\"text\"\n          size=\"sm\"\n          icon={icon}\n          type=\"button\"\n          onClick={onClick}\n          {...rest}\n          aria-label={ariaLabel}\n        />\n      )}\n    </Tooltip>\n  );\n};\n","import React, { FC } from 'react';\n\nimport { AlertState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { State, StateTag } from '../StateTag';\n\nconst alertStateToState: Record<AlertState, State> = {\n  [AlertState.Active]: 'bad',\n  [AlertState.Unprocessed]: 'neutral',\n  [AlertState.Suppressed]: 'info',\n};\n\ninterface Props {\n  state: AlertState;\n}\n\nexport const AmAlertStateTag: FC<Props> = ({ state }) => <StateTag state={alertStateToState[state]}>{state}</StateTag>;\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { TagList, useStyles2 } from '@grafana/ui';\nimport { Matcher } from 'app/plugins/datasource/alertmanager/types';\n\nimport { matcherToOperator } from '../../utils/alertmanager';\n\ntype MatchersProps = { matchers: Matcher[] };\n\nexport const Matchers: FC<MatchersProps> = ({ matchers }) => {\n  const styles = useStyles2(getStyles);\n  return (\n    <div>\n      <TagList\n        className={styles.tags}\n        tags={matchers.map((matcher) => `${matcher.name}${matcherToOperator(matcher)}${matcher.value}`)}\n      />\n    </div>\n  );\n};\n\nconst getStyles = () => ({\n  tags: css`\n    justify-content: flex-start;\n  `,\n});\n","import { useCallback } from 'react';\n\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport store from 'app/core/store';\n\nimport { ALERTMANAGER_NAME_LOCAL_STORAGE_KEY, ALERTMANAGER_NAME_QUERY_KEY } from '../utils/constants';\nimport { AlertManagerDataSource, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\n\nfunction useIsAlertManagerAvailable(availableAlertManagers: AlertManagerDataSource[]) {\n  return useCallback(\n    (alertManagerName: string) => {\n      const availableAlertManagersNames = availableAlertManagers.map((am) => am.name);\n      return availableAlertManagersNames.includes(alertManagerName);\n    },\n    [availableAlertManagers]\n  );\n}\n\n/* This will return am name either from query params or from local storage or a default (grafana).\n * Due to RBAC permissions Grafana Managed Alert manager or external alert managers may not be available\n * In the worst case neihter GMA nor external alert manager is available\n */\nexport function useAlertManagerSourceName(\n  availableAlertManagers: AlertManagerDataSource[]\n): [string | undefined, (alertManagerSourceName: string) => void] {\n  const [queryParams, updateQueryParams] = useQueryParams();\n  const isAlertManagerAvailable = useIsAlertManagerAvailable(availableAlertManagers);\n\n  const update = useCallback(\n    (alertManagerSourceName: string) => {\n      if (!isAlertManagerAvailable(alertManagerSourceName)) {\n        return;\n      }\n      if (alertManagerSourceName === GRAFANA_RULES_SOURCE_NAME) {\n        store.delete(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY);\n        updateQueryParams({ [ALERTMANAGER_NAME_QUERY_KEY]: null });\n      } else {\n        store.set(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY, alertManagerSourceName);\n        updateQueryParams({ [ALERTMANAGER_NAME_QUERY_KEY]: alertManagerSourceName });\n      }\n    },\n    [updateQueryParams, isAlertManagerAvailable]\n  );\n\n  const querySource = queryParams[ALERTMANAGER_NAME_QUERY_KEY];\n\n  if (querySource && typeof querySource === 'string') {\n    if (isAlertManagerAvailable(querySource)) {\n      return [querySource, update];\n    } else {\n      // non existing alertmanager\n      return [undefined, update];\n    }\n  }\n\n  const storeSource = store.get(ALERTMANAGER_NAME_LOCAL_STORAGE_KEY);\n  if (storeSource && typeof storeSource === 'string' && isAlertManagerAvailable(storeSource)) {\n    update(storeSource);\n    return [storeSource, update];\n  }\n\n  if (isAlertManagerAvailable(GRAFANA_RULES_SOURCE_NAME)) {\n    return [GRAFANA_RULES_SOURCE_NAME, update];\n  }\n\n  return [undefined, update];\n}\n","import { useMemo } from 'react';\n\nimport { getAlertManagerDataSourcesByPermission } from '../utils/datasource';\n\nexport function useAlertManagersByPermission(accessType: 'instance' | 'notification') {\n  return useMemo(() => getAlertManagerDataSourcesByPermission(accessType), [accessType]);\n}\n","import { useMemo, useRef } from 'react';\n\nimport {\n  CombinedRule,\n  CombinedRuleGroup,\n  CombinedRuleNamespace,\n  Rule,\n  RuleGroup,\n  RuleNamespace,\n  RulesSource,\n} from 'app/types/unified-alerting';\nimport { RulerRuleDTO, RulerRuleGroupDTO, RulerRulesConfigDTO } from 'app/types/unified-alerting-dto';\n\nimport {\n  getAllRulesSources,\n  getRulesSourceByName,\n  isCloudRulesSource,\n  isGrafanaRulesSource,\n} from '../utils/datasource';\nimport { isAlertingRule, isAlertingRulerRule, isRecordingRulerRule } from '../utils/rules';\n\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\ninterface CacheValue {\n  promRules?: RuleNamespace[];\n  rulerRules?: RulerRulesConfigDTO | null;\n  result: CombinedRuleNamespace[];\n}\n\n// this little monster combines prometheus rules and ruler rules to produce a unified data structure\n// can limit to a single rules source\nexport function useCombinedRuleNamespaces(rulesSourceName?: string): CombinedRuleNamespace[] {\n  const promRulesResponses = useUnifiedAlertingSelector((state) => state.promRules);\n  const rulerRulesResponses = useUnifiedAlertingSelector((state) => state.rulerRules);\n\n  // cache results per rules source, so we only recalculate those for which results have actually changed\n  const cache = useRef<Record<string, CacheValue>>({});\n\n  const rulesSources = useMemo((): RulesSource[] => {\n    if (rulesSourceName) {\n      const rulesSource = getRulesSourceByName(rulesSourceName);\n      if (!rulesSource) {\n        throw new Error(`Unknown rules source: ${rulesSourceName}`);\n      }\n      return [rulesSource];\n    }\n    return getAllRulesSources();\n  }, [rulesSourceName]);\n\n  return useMemo(\n    () =>\n      rulesSources\n        .map((rulesSource): CombinedRuleNamespace[] => {\n          const rulesSourceName = isCloudRulesSource(rulesSource) ? rulesSource.name : rulesSource;\n          const promRules = promRulesResponses[rulesSourceName]?.result;\n          const rulerRules = rulerRulesResponses[rulesSourceName]?.result;\n\n          const cached = cache.current[rulesSourceName];\n          if (cached && cached.promRules === promRules && cached.rulerRules === rulerRules) {\n            return cached.result;\n          }\n          const namespaces: Record<string, CombinedRuleNamespace> = {};\n\n          // first get all the ruler rules in\n          Object.entries(rulerRules || {}).forEach(([namespaceName, groups]) => {\n            const namespace: CombinedRuleNamespace = {\n              rulesSource,\n              name: namespaceName,\n              groups: [],\n            };\n            namespaces[namespaceName] = namespace;\n            addRulerGroupsToCombinedNamespace(namespace, groups);\n          });\n\n          // then correlate with prometheus rules\n          promRules?.forEach(({ name: namespaceName, groups }) => {\n            const ns = (namespaces[namespaceName] = namespaces[namespaceName] || {\n              rulesSource,\n              name: namespaceName,\n              groups: [],\n            });\n\n            addPromGroupsToCombinedNamespace(ns, groups);\n          });\n\n          const result = Object.values(namespaces);\n\n          cache.current[rulesSourceName] = { promRules, rulerRules, result };\n          return result;\n        })\n        .flat(),\n    [promRulesResponses, rulerRulesResponses, rulesSources]\n  );\n}\n\n// merge all groups in case of grafana managed, essentially treating namespaces (folders) as groups\nexport function flattenGrafanaManagedRules(namespaces: CombinedRuleNamespace[]) {\n  return namespaces.map((namespace) => {\n    const newNamespace: CombinedRuleNamespace = {\n      ...namespace,\n      groups: [],\n    };\n\n    // add default group with ungrouped rules\n    newNamespace.groups.push({\n      name: 'default',\n      rules: sortRulesByName(namespace.groups.flatMap((group) => group.rules)),\n    });\n\n    return newNamespace;\n  });\n}\n\nexport function sortRulesByName(rules: CombinedRule[]) {\n  return rules.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction addRulerGroupsToCombinedNamespace(namespace: CombinedRuleNamespace, groups: RulerRuleGroupDTO[]): void {\n  namespace.groups = groups.map((group) => {\n    const combinedGroup: CombinedRuleGroup = {\n      name: group.name,\n      interval: group.interval,\n      source_tenants: group.source_tenants,\n      rules: [],\n    };\n    combinedGroup.rules = group.rules.map((rule) => rulerRuleToCombinedRule(rule, namespace, combinedGroup));\n    return combinedGroup;\n  });\n}\n\nfunction addPromGroupsToCombinedNamespace(namespace: CombinedRuleNamespace, groups: RuleGroup[]): void {\n  groups.forEach((group) => {\n    let combinedGroup = namespace.groups.find((g) => g.name === group.name);\n    if (!combinedGroup) {\n      combinedGroup = {\n        name: group.name,\n        rules: [],\n      };\n      namespace.groups.push(combinedGroup);\n    }\n\n    (group.rules ?? []).forEach((rule) => {\n      const existingRule = getExistingRuleInGroup(rule, combinedGroup!, namespace.rulesSource);\n      if (existingRule) {\n        existingRule.promRule = rule;\n      } else {\n        combinedGroup!.rules.push(promRuleToCombinedRule(rule, namespace, combinedGroup!));\n      }\n    });\n  });\n}\n\nfunction promRuleToCombinedRule(rule: Rule, namespace: CombinedRuleNamespace, group: CombinedRuleGroup): CombinedRule {\n  return {\n    name: rule.name,\n    query: rule.query,\n    labels: rule.labels || {},\n    annotations: isAlertingRule(rule) ? rule.annotations || {} : {},\n    promRule: rule,\n    namespace: namespace,\n    group,\n  };\n}\n\nfunction rulerRuleToCombinedRule(\n  rule: RulerRuleDTO,\n  namespace: CombinedRuleNamespace,\n  group: CombinedRuleGroup\n): CombinedRule {\n  return isAlertingRulerRule(rule)\n    ? {\n        name: rule.alert,\n        query: rule.expr,\n        labels: rule.labels || {},\n        annotations: rule.annotations || {},\n        rulerRule: rule,\n        namespace,\n        group,\n      }\n    : isRecordingRulerRule(rule)\n    ? {\n        name: rule.record,\n        query: rule.expr,\n        labels: rule.labels || {},\n        annotations: {},\n        rulerRule: rule,\n        namespace,\n        group,\n      }\n    : {\n        name: rule.grafana_alert.title,\n        query: '',\n        labels: rule.labels || {},\n        annotations: rule.annotations || {},\n        rulerRule: rule,\n        namespace,\n        group,\n      };\n}\n\n// find existing rule in group that matches the given prom rule\nfunction getExistingRuleInGroup(\n  rule: Rule,\n  group: CombinedRuleGroup,\n  rulesSource: RulesSource\n): CombinedRule | undefined {\n  if (isGrafanaRulesSource(rulesSource)) {\n    // assume grafana groups have only the one rule. check name anyway because paranoid\n    return group!.rules.find((existingRule) => existingRule.name === rule.name);\n  }\n  return (\n    // try finding a rule that matches name, labels, annotations and query\n    group!.rules.find(\n      (existingRule) => !existingRule.promRule && isCombinedRuleEqualToPromRule(existingRule, rule, true)\n    ) ??\n    // if that fails, try finding a rule that only matches name, labels and annotations.\n    // loki & prom can sometimes modify the query so it doesnt match, eg `2 > 1` becomes `1`\n    group!.rules.find(\n      (existingRule) => !existingRule.promRule && isCombinedRuleEqualToPromRule(existingRule, rule, false)\n    )\n  );\n}\n\nfunction isCombinedRuleEqualToPromRule(combinedRule: CombinedRule, rule: Rule, checkQuery = true): boolean {\n  if (combinedRule.name === rule.name) {\n    return (\n      JSON.stringify([\n        checkQuery ? hashQuery(combinedRule.query) : '',\n        combinedRule.labels,\n        combinedRule.annotations,\n      ]) ===\n      JSON.stringify([\n        checkQuery ? hashQuery(rule.query) : '',\n        rule.labels || {},\n        isAlertingRule(rule) ? rule.annotations || {} : {},\n      ])\n    );\n  }\n  return false;\n}\n\n// there can be slight differences in how prom & ruler render a query, this will hash them accounting for the differences\nfunction hashQuery(query: string) {\n  // one of them might be wrapped in parens\n  if (query.length > 1 && query[0] === '(' && query[query.length - 1] === ')') {\n    query = query.slice(1, -1);\n  }\n  // whitespace could be added or removed\n  query = query.replace(/\\s|\\n/g, '');\n  // labels matchers can be reordered, so sort the enitre string, esentially comparing just the character counts\n  return query.split('').sort().join('');\n}\n","import { useCallback, useMemo } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport { locationService } from '@grafana/runtime';\n\nexport function useURLSearchParams(): [\n  URLSearchParams,\n  (searchValues: Record<string, string | string[] | undefined>, replace?: boolean) => void\n] {\n  const { search } = useLocation();\n  const queryParams = useMemo(() => new URLSearchParams(search), [search]);\n\n  const update = useCallback((searchValues: Record<string, string | string[] | undefined>, replace?: boolean) => {\n    locationService.partial(searchValues, replace);\n  }, []);\n\n  return [queryParams, update];\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport const getAlertTableStyles = (theme: GrafanaTheme2) => ({\n  table: css`\n    width: 100%;\n    border-radius: ${theme.shape.borderRadius()};\n    border: solid 1px ${theme.colors.border.weak};\n    background-color: ${theme.colors.background.secondary};\n\n    th {\n      padding: ${theme.spacing(1)};\n    }\n\n    td {\n      padding: 0 ${theme.spacing(1)};\n    }\n\n    tr {\n      height: 38px;\n    }\n  `,\n  evenRow: css`\n    background-color: ${theme.colors.background.primary};\n  `,\n  colExpand: css`\n    width: 36px;\n  `,\n  actionsCell: css`\n    text-align: right;\n    width: 1%;\n    white-space: nowrap;\n\n    & > * + * {\n      margin-left: ${theme.spacing(0.5)};\n    }\n  `,\n});\n"],"names":["useCleanup","stateSelector","dispatch","useDispatch","selectorRef","useRef","current","useEffect","cleanUpAction","MatchedSilencedRules","matchedAlertRules","setMatchedAlertRules","useState","formApi","useFormContext","watch","matchers","styles","useStyles2","getStyles","columns","id","label","renderCell","data","matchedInstance","AlertStateTag","state","size","AlertLabels","labels","activeAt","startsWith","dateTime","format","fetchAllPromAndRulerRulesAction","combinedNamespaces","useCombinedRuleNamespaces","useDebounce","matchedInstances","flatMap","namespace","groups","group","rules","map","combinedRule","promRule","filter","rule","isAlertingRule","findAlertInstancesWithMatchers","alerts","className","title","length","Badge","badge","color","text","table","every","matcher","value","name","DynamicTable","items","slice","isExpandable","cols","moreMatches","theme","css","breakpoints","values","lg","spacing","wrapper","row","colors","background","secondary","removeButton","matcherOptions","sm","control","register","formState","errors","fields","append","remove","useFieldArray","cx","Field","required","index","invalid","error","message","Input","defaultValue","placeholder","InputControl","render","field","onChange","Select","menuShouldPortal","options","matcherFieldOptions","operator","IconButton","tooltip","onClick","Button","type","icon","variant","newMatcher","MatcherOperator","SilencePeriod","getValues","useStyles","onChangeStartsAt","startsAt","fieldState","startsAtInvalid","useController","validate","endsAt","onChangeEndsAt","endsAtInvalid","onChangeTimeZone","timeZone","from","to","timeRange","TimeRangeInput","raw","newValue","hideTimeZone","hideQuickRanges","getDefaultFormValues","searchParams","silence","now","Date","interval","parse","start","end","addDurationToDate","hours","toISOString","comment","createdBy","duration","intervalToAbbreviatedDurationString","isRegex","matcherToMatcherField","matcherName","matcherValue","DefaultTimeZone","config","defaults","get","getAll","formMatchers","parseQueryParamMatchers","defaultsFromQuery","textArea","flexRow","silencePeriod","alertManagerSourceName","urlSearchParams","useURLSearchParams","defaultValues","useMemo","formAPI","useForm","loading","useUnifiedAlertingSelector","updateSilence","unifiedAlerting","handleSubmit","setValue","clearErrors","prevDuration","setPrevDuration","isValidDate","parseDuration","startValue","valueOf","nextDuration","onSubmit","matchersFields","matcherFieldToMatcher","payload","pickBy","createOrUpdateSilenceAction","exitOnSave","successMessage","FieldSet","Object","keys","undefined","TextArea","rows","disabled","LinkButton","href","makeAMLink","fill","ActionButton","restProps","getStyle","typography","NoSilencesSplash","permissions","getInstancesPermissions","contextSrv","create","EmptyListCTA","buttonIcon","buttonLink","buttonTitle","CallToActionCard","callToActionElement","SilencedAlertsTableRow","alert","isCollapsed","setIsCollapsed","alertName","entries","reduce","labelKey","labelValue","CollapseToggle","onToggle","collapsed","AmAlertStateTag","status","colSpan","tableMargin","colState","colName","silencedAlerts","tableStyles","getAlertTableStyles","colExpand","evenRow","fingerprint","SilenceDetails","dateDisplayFormat","startsAtDate","dateMath","endsAtDate","container","primary","silenceStateToState","SilenceState","SilenceStateTag","StateTag","stateOptions","key","getQueryStringKey","uniqueId","SilencesFilter","queryStringKey","setQueryStringKey","queryParams","setQueryParams","useQueryParams","queryString","silenceState","getSilenceFiltersFromUrlParams","handleQueryStringChange","debounce","e","target","inputInvalid","parseMatchers","rowChild","Label","Stack","gap","Tooltip","content","Icon","searchInput","prefix","RadioButtonGroup","setTimeout","border","strong","fieldLabel","useFilteredSilences","silences","silenceIdsString","silenceIds","split","includes","some","isEqual","topButtonContainer","addNewSilence","callout","info","calloutIcon","editButton","alertManagerAlerts","filteredSilences","showExpiredSilencesBanner","handleExpireSilenceClick","expireSilenceAction","Matchers","update","push","Link","ActionIcon","A","useColumns","silencedBy","Authorize","actions","fallback","renderExpandedContent","withErrorBoundary","alertManagers","useAlertManagersByPermission","setAlertManagerSourceName","useAlertManagerSourceName","alertsRequests","amAlerts","alertsRequest","initialAsyncRequestState","isRoot","useLocation","pathname","endsWith","fetchAll","fetchSilencesAction","fetchAmAlertsAction","setInterval","SILENCES_POLL_INTERVAL_MS","clearInterval","result","getSilenceById","useCallback","find","AlertingPageWrapper","pageId","AlertManagerPicker","dataSources","Alert","severity","LoadingPlaceholder","exact","path","match","params","NoAlertManagerWarning","availableAlertManagers","style","children","isLoading","navModel","getNavModel","useSelector","navIndex","action","NoAlertManagersAvailable","OtherAlertManagersAvailable","_","hasOtherAMs","tooltipPlacement","rest","ariaLabel","placement","alertStateToState","AlertState","TagList","tags","matcherToOperator","updateQueryParams","isAlertManagerAvailable","alertManagerName","am","useIsAlertManagerAvailable","GRAFANA_RULES_SOURCE_NAME","store","ALERTMANAGER_NAME_LOCAL_STORAGE_KEY","ALERTMANAGER_NAME_QUERY_KEY","querySource","storeSource","accessType","getAlertManagerDataSourcesByPermission","rulesSourceName","promRulesResponses","promRules","rulerRulesResponses","rulerRules","cache","rulesSources","rulesSource","getRulesSourceByName","Error","getAllRulesSources","isCloudRulesSource","cached","namespaces","forEach","namespaceName","combinedGroup","source_tenants","isAlertingRulerRule","query","expr","annotations","rulerRule","isRecordingRulerRule","record","grafana_alert","rulerRuleToCombinedRule","addRulerGroupsToCombinedNamespace","g","existingRule","isGrafanaRulesSource","isCombinedRuleEqualToPromRule","getExistingRuleInGroup","promRuleToCombinedRule","addPromGroupsToCombinedNamespace","flat","flattenGrafanaManagedRules","newNamespace","sort","a","b","localeCompare","checkQuery","JSON","stringify","hashQuery","replace","join","search","URLSearchParams","searchValues","locationService","shape","borderRadius","weak","actionsCell"],"sourceRoot":""}