1{"version":3,"file":"cloudwatchPlugin.0e38943fa459e872fe93.js","mappings":"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","sources":["webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/XrayLinkConfig.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ThrottlingErrorMessage.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/memoizedDebounce.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language_provider.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/rxjs/increasingInterval.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/datalinks.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/logsRetry.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/types.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/LinkedToken.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/tokenUtils.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/CompletionItemProvider.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/linkedTokenBuilder.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/statementPosition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/suggestionKind.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/datasource.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/annotations_query_ctrl.ts","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/TemplateTag/TemplateTag.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/inlineArrayTransformer/inlineArrayTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/stripIndentTransformer/stripIndentTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/trimResultTransformer/trimResultTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/commaLists/commaLists.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/commaListsAnd/commaListsAnd.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/commaListsOr/commaListsOr.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/splitStringTransformer/splitStringTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/removeNonPrintingValuesTransformer/removeNonPrintingValuesTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/html/html.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/replaceSubstitutionTransformer/replaceSubstitutionTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/safeHtml/safeHtml.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/replaceResultTransformer/replaceResultTransformer.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/oneLine/oneLine.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/oneLineTrim/oneLineTrim.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/oneLineCommaLists/oneLineCommaLists.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/oneLineCommaListsOr/oneLineCommaListsOr.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/oneLineCommaListsAnd/oneLineCommaListsAnd.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/inlineLists/inlineLists.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/oneLineInlineLists/oneLineInlineLists.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/stripIndent/stripIndent.js","webpack://grafana/../../opt/drone/yarncache/common-tags-npm-1.8.0-7a31956e16-fb0cc9420d.zip/node_modules/common-tags/es/stripIndents/stripIndents.js","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/LogsCheatSheet.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/module.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ConfigEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MetaInspector.tsx"],"sourcesContent":["import React from 'react';\nimport { css } from '@emotion/css';\nimport { Alert, InlineField, useStyles2 } from '@grafana/ui';\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { DataSourcePicker } from '@grafana/runtime';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  infoText: css`\n    padding-bottom: ${theme.spacing(2)};\n    color: ${theme.colors.text.secondary};\n  `,\n});\n\ninterface Props {\n  datasourceUid?: string;\n  onChange: (uid: string) => void;\n}\n\nconst xRayDsId = 'grafana-x-ray-datasource';\n\nexport function XrayLinkConfig({ datasourceUid, onChange }: Props) {\n  const hasXrayDatasource = Boolean(getDatasourceSrv().getList({ pluginId: xRayDsId }).length);\n\n  const styles = useStyles2(getStyles);\n\n  return (\n    <>\n      <h3 className=\"page-heading\">X-ray trace link</h3>\n\n      <div className={styles.infoText}>\n        Grafana will automatically create a link to a trace in X-ray data source if logs contain @xrayTraceId field\n      </div>\n\n      {!hasXrayDatasource && (\n        <Alert\n          title={\n            'There is no X-ray datasource to link to. First add an X-ray data source and then link it to Cloud Watch. '\n          }\n          severity=\"info\"\n        />\n      )}\n\n      <div className=\"gf-form-group\">\n        <InlineField\n          htmlFor=\"data-source-picker\"\n          label=\"Data source\"\n          labelWidth={28}\n          tooltip=\"X-ray data source containing traces\"\n        >\n          <DataSourcePicker\n            pluginId={xRayDsId}\n            onChange={(ds) => onChange(ds.uid)}\n            current={datasourceUid}\n            noDefault={true}\n          />\n        </InlineField>\n      </div>\n    </>\n  );\n}\n","import React, { FunctionComponent } from 'react';\n\nexport interface Props {\n  region: string;\n}\n\nexport const ThrottlingErrorMessage: FunctionComponent<Props> = ({ region }) => (\n  <p>\n    Please visit the&nbsp;\n    <a\n      target=\"_blank\"\n      rel=\"noreferrer\"\n      className=\"text-link\"\n      href={`https://${region}.console.aws.amazon.com/servicequotas/home?region=${region}#!/services/monitoring/quotas/L-5E141212`}\n    >\n      AWS Service Quotas console\n    </a>\n    &nbsp;to request a quota increase or see our&nbsp;\n    <a\n      target=\"_blank\"\n      rel=\"noreferrer\"\n      className=\"text-link\"\n      href=\"https://grafana.com/docs/grafana/latest/datasources/cloudwatch/#service-quotas\"\n    >\n      documentation\n    </a>\n    &nbsp;to learn more.\n  </p>\n);\n","import { debounce, memoize } from 'lodash';\n\nexport default (func: (...args: any[]) => void, wait = 7000) => {\n  const mem = memoize(\n    (...args) =>\n      debounce(func, wait, {\n        leading: true,\n      }),\n    (...args) => JSON.stringify(args)\n  );\n\n  return (...args: any[]) => mem(...args)(...args);\n};\n","import { sortedUniq } from 'lodash';\nimport { lastValueFrom } from 'rxjs';\nimport Prism, { Grammar } from 'prismjs';\nimport { AbsoluteTimeRange, HistoryItem, LanguageProvider } from '@grafana/data';\nimport { CompletionItemGroup, SearchFunctionType, Token, TypeaheadInput, TypeaheadOutput } from '@grafana/ui';\n\nimport syntax, {\n  AGGREGATION_FUNCTIONS_STATS,\n  BOOLEAN_FUNCTIONS,\n  DATETIME_FUNCTIONS,\n  FIELD_AND_FILTER_FUNCTIONS,\n  IP_FUNCTIONS,\n  NUMERIC_OPERATORS,\n  QUERY_COMMANDS,\n  STRING_FUNCTIONS,\n} from './syntax';\nimport { CloudWatchQuery, TSDBResponse } from './types';\nimport { CloudWatchDatasource } from './datasource';\n\nexport type CloudWatchHistoryItem = HistoryItem<CloudWatchQuery>;\n\ntype TypeaheadContext = {\n  history?: CloudWatchHistoryItem[];\n  absoluteRange?: AbsoluteTimeRange;\n  logGroupNames?: string[];\n  region: string;\n};\n\nexport class CloudWatchLanguageProvider extends LanguageProvider {\n  started = false;\n  declare initialRange: AbsoluteTimeRange;\n  datasource: CloudWatchDatasource;\n\n  constructor(datasource: CloudWatchDatasource, initialValues?: any) {\n    super();\n\n    this.datasource = datasource;\n\n    Object.assign(this, initialValues);\n  }\n\n  // Strip syntax chars\n  cleanText = (s: string) => s.replace(/[()]/g, '').trim();\n\n  getSyntax(): Grammar {\n    return syntax;\n  }\n\n  request = (url: string, params?: any): Promise<TSDBResponse> => {\n    return lastValueFrom(this.datasource.awsRequest(url, params));\n  };\n\n  start = () => {\n    if (!this.startTask) {\n      this.startTask = Promise.resolve().then(() => {\n        this.started = true;\n        return [];\n      });\n    }\n\n    return this.startTask;\n  };\n\n  isStatsQuery(query: string): boolean {\n    const grammar = this.getSyntax();\n    const tokens = Prism.tokenize(query, grammar) ?? [];\n\n    return !!tokens.find(\n      (token) =>\n        typeof token !== 'string' &&\n        token.content.toString().toLowerCase() === 'stats' &&\n        token.type === 'query-command'\n    );\n  }\n\n  /**\n   * Return suggestions based on input that can be then plugged into a typeahead dropdown.\n   * Keep this DOM-free for testing\n   * @param input\n   * @param context Is optional in types but is required in case we are doing getLabelCompletionItems\n   * @param context.absoluteRange Required in case we are doing getLabelCompletionItems\n   * @param context.history Optional used only in getEmptyCompletionItems\n   */\n  async provideCompletionItems(input: TypeaheadInput, context?: TypeaheadContext): Promise<TypeaheadOutput> {\n    const { value } = input;\n\n    // Get tokens\n    const tokens = value?.data.get('tokens');\n\n    if (!tokens || !tokens.length) {\n      return { suggestions: [] };\n    }\n\n    const curToken: Token = tokens.filter(\n      (token: any) =>\n        token.offsets.start <= value!.selection?.start?.offset && token.offsets.end >= value!.selection?.start?.offset\n    )[0];\n\n    const isFirstToken = !curToken.prev;\n    const prevToken = prevNonWhitespaceToken(curToken);\n\n    const isCommandStart = isFirstToken || (!isFirstToken && prevToken?.types.includes('command-separator'));\n    if (isCommandStart) {\n      return this.getCommandCompletionItems();\n    }\n\n    if (isInsideFunctionParenthesis(curToken)) {\n      return await this.getFieldCompletionItems(context?.logGroupNames ?? [], context?.region || 'default');\n    }\n\n    if (isAfterKeyword('by', curToken)) {\n      return this.handleKeyword(context);\n    }\n\n    if (prevToken?.types.includes('comparison-operator')) {\n      return this.handleComparison(context);\n    }\n\n    const commandToken = previousCommandToken(curToken);\n    if (commandToken) {\n      return await this.handleCommand(commandToken, curToken, context);\n    }\n\n    return {\n      suggestions: [],\n    };\n  }\n\n  private fetchedFieldsCache:\n    | {\n        time: number;\n        logGroups: string[];\n        fields: string[];\n      }\n    | undefined;\n\n  private fetchFields = async (logGroups: string[], region: string): Promise<string[]> => {\n    if (\n      this.fetchedFieldsCache &&\n      Date.now() - this.fetchedFieldsCache.time < 30 * 1000 &&\n      sortedUniq(this.fetchedFieldsCache.logGroups).join('|') === sortedUniq(logGroups).join('|')\n    ) {\n      return this.fetchedFieldsCache.fields;\n    }\n\n    const results = await Promise.all(\n      logGroups.map((logGroup) => this.datasource.getLogGroupFields({ logGroupName: logGroup, region }))\n    );\n\n    const fields = [\n      ...new Set<string>(\n        results.reduce((acc: string[], cur) => acc.concat(cur.logGroupFields?.map((f) => f.name) as string[]), [])\n      ).values(),\n    ];\n\n    this.fetchedFieldsCache = {\n      time: Date.now(),\n      logGroups,\n      fields,\n    };\n\n    return fields;\n  };\n\n  private handleKeyword = async (context?: TypeaheadContext): Promise<TypeaheadOutput> => {\n    const suggs = await this.getFieldCompletionItems(context?.logGroupNames ?? [], context?.region || 'default');\n    const functionSuggestions: CompletionItemGroup[] = [\n      {\n        searchFunctionType: SearchFunctionType.Prefix,\n        label: 'Functions',\n        items: STRING_FUNCTIONS.concat(DATETIME_FUNCTIONS, IP_FUNCTIONS),\n      },\n    ];\n    suggs.suggestions.push(...functionSuggestions);\n\n    return suggs;\n  };\n\n  private handleCommand = async (\n    commandToken: Token,\n    curToken: Token,\n    context?: TypeaheadContext\n  ): Promise<TypeaheadOutput> => {\n    const queryCommand = commandToken.content.toLowerCase();\n    const prevToken = prevNonWhitespaceToken(curToken);\n    const currentTokenIsFirstArg = prevToken === commandToken;\n\n    if (queryCommand === 'sort') {\n      return this.handleSortCommand(currentTokenIsFirstArg, curToken, context);\n    }\n\n    if (queryCommand === 'parse') {\n      if (currentTokenIsFirstArg) {\n        return await this.getFieldCompletionItems(context?.logGroupNames ?? [], context?.region || 'default');\n      }\n    }\n\n    const currentTokenIsAfterCommandAndEmpty = isTokenType(commandToken.next, 'whitespace') && !commandToken.next?.next;\n    const currentTokenIsAfterCommand =\n      currentTokenIsAfterCommandAndEmpty || nextNonWhitespaceToken(commandToken) === curToken;\n\n    const currentTokenIsComma = isTokenType(curToken, 'punctuation', ',');\n    const currentTokenIsCommaOrAfterComma = currentTokenIsComma || isTokenType(prevToken, 'punctuation', ',');\n\n    // We only show suggestions if we are after a command or after a comma which is a field separator\n    if (!(currentTokenIsAfterCommand || currentTokenIsCommaOrAfterComma)) {\n      return { suggestions: [] };\n    }\n\n    if (['display', 'fields'].includes(queryCommand)) {\n      const typeaheadOutput = await this.getFieldCompletionItems(\n        context?.logGroupNames ?? [],\n        context?.region || 'default'\n      );\n      typeaheadOutput.suggestions.push(...this.getFieldAndFilterFunctionCompletionItems().suggestions);\n\n      return typeaheadOutput;\n    }\n\n    if (queryCommand === 'stats') {\n      const typeaheadOutput = this.getStatsAggCompletionItems();\n      if (currentTokenIsComma || currentTokenIsAfterCommandAndEmpty) {\n        typeaheadOutput?.suggestions.forEach((group) => {\n          group.skipFilter = true;\n        });\n      }\n      return typeaheadOutput;\n    }\n\n    if (queryCommand === 'filter' && currentTokenIsFirstArg) {\n      const sugg = await this.getFieldCompletionItems(context?.logGroupNames ?? [], context?.region || 'default');\n      const boolFuncs = this.getBoolFuncCompletionItems();\n      sugg.suggestions.push(...boolFuncs.suggestions);\n      return sugg;\n    }\n    return { suggestions: [] };\n  };\n\n  private async handleSortCommand(\n    isFirstArgument: boolean,\n    curToken: Token,\n    context?: TypeaheadContext\n  ): Promise<TypeaheadOutput> {\n    if (isFirstArgument) {\n      return await this.getFieldCompletionItems(context?.logGroupNames ?? [], context?.region || 'default');\n    } else if (isTokenType(prevNonWhitespaceToken(curToken), 'field-name')) {\n      // suggest sort options\n      return {\n        suggestions: [\n          {\n            searchFunctionType: SearchFunctionType.Prefix,\n            label: 'Sort Order',\n            items: [\n              {\n                label: 'asc',\n              },\n              { label: 'desc' },\n            ],\n          },\n        ],\n      };\n    }\n\n    return { suggestions: [] };\n  }\n\n  private handleComparison = async (context?: TypeaheadContext) => {\n    const fieldsSuggestions = await this.getFieldCompletionItems(\n      context?.logGroupNames ?? [],\n      context?.region || 'default'\n    );\n    const comparisonSuggestions = this.getComparisonCompletionItems();\n    fieldsSuggestions.suggestions.push(...comparisonSuggestions.suggestions);\n    return fieldsSuggestions;\n  };\n\n  private getCommandCompletionItems = (): TypeaheadOutput => {\n    return {\n      suggestions: [{ searchFunctionType: SearchFunctionType.Prefix, label: 'Commands', items: QUERY_COMMANDS }],\n    };\n  };\n\n  private getFieldAndFilterFunctionCompletionItems = (): TypeaheadOutput => {\n    return {\n      suggestions: [\n        { searchFunctionType: SearchFunctionType.Prefix, label: 'Functions', items: FIELD_AND_FILTER_FUNCTIONS },\n      ],\n    };\n  };\n\n  private getStatsAggCompletionItems = (): TypeaheadOutput => {\n    return {\n      suggestions: [\n        { searchFunctionType: SearchFunctionType.Prefix, label: 'Functions', items: AGGREGATION_FUNCTIONS_STATS },\n      ],\n    };\n  };\n\n  private getBoolFuncCompletionItems = (): TypeaheadOutput => {\n    return {\n      suggestions: [\n        {\n          searchFunctionType: SearchFunctionType.Prefix,\n          label: 'Functions',\n          items: BOOLEAN_FUNCTIONS,\n        },\n      ],\n    };\n  };\n\n  private getComparisonCompletionItems = (): TypeaheadOutput => {\n    return {\n      suggestions: [\n        {\n          searchFunctionType: SearchFunctionType.Prefix,\n          label: 'Functions',\n          items: NUMERIC_OPERATORS.concat(BOOLEAN_FUNCTIONS),\n        },\n      ],\n    };\n  };\n\n  private getFieldCompletionItems = async (logGroups: string[], region: string): Promise<TypeaheadOutput> => {\n    const fields = await this.fetchFields(logGroups, region);\n\n    return {\n      suggestions: [\n        {\n          label: 'Fields',\n          items: fields.map((field) => ({\n            label: field,\n            insertText: field.match(/@?[_a-zA-Z]+[_.0-9a-zA-Z]*/) ? undefined : `\\`${field}\\``,\n          })),\n        },\n      ],\n    };\n  };\n}\n\nfunction nextNonWhitespaceToken(token: Token): Token | null {\n  let curToken = token;\n\n  while (curToken.next) {\n    if (curToken.next.types.includes('whitespace')) {\n      curToken = curToken.next;\n    } else {\n      return curToken.next;\n    }\n  }\n\n  return null;\n}\n\nfunction prevNonWhitespaceToken(token: Token): Token | null {\n  let curToken = token;\n\n  while (curToken.prev) {\n    if (isTokenType(curToken.prev, 'whitespace')) {\n      curToken = curToken.prev;\n    } else {\n      return curToken.prev;\n    }\n  }\n\n  return null;\n}\n\nfunction previousCommandToken(startToken: Token): Token | null {\n  let thisToken = startToken;\n  while (!!thisToken.prev) {\n    thisToken = thisToken.prev;\n    if (\n      thisToken.types.includes('query-command') &&\n      (!thisToken.prev || isTokenType(prevNonWhitespaceToken(thisToken), 'command-separator'))\n    ) {\n      return thisToken;\n    }\n  }\n  return null;\n}\n\nconst funcsWithFieldArgs = [\n  'avg',\n  'count',\n  'count_distinct',\n  'earliest',\n  'latest',\n  'sortsFirst',\n  'sortsLast',\n  'max',\n  'min',\n  'pct',\n  'stddev',\n  'ispresent',\n  'fromMillis',\n  'toMillis',\n  'isempty',\n  'isblank',\n  'isValidIp',\n  'isValidIpV4',\n  'isValidIpV6',\n  'isIpInSubnet',\n  'isIpv4InSubnet',\n  'isIpv6InSubnet',\n].map((funcName) => funcName.toLowerCase());\n\n/**\n * Returns true if cursor is currently inside a function parenthesis for example `count(|)` or `count(@mess|)` should\n * return true.\n */\nfunction isInsideFunctionParenthesis(curToken: Token): boolean {\n  const prevToken = prevNonWhitespaceToken(curToken);\n\n  if (!prevToken) {\n    return false;\n  }\n\n  const parenthesisToken = curToken.content === '(' ? curToken : prevToken.content === '(' ? prevToken : undefined;\n  if (parenthesisToken) {\n    const maybeFunctionToken = prevNonWhitespaceToken(parenthesisToken);\n    if (maybeFunctionToken) {\n      return (\n        funcsWithFieldArgs.includes(maybeFunctionToken.content.toLowerCase()) &&\n        maybeFunctionToken.types.includes('function')\n      );\n    }\n  }\n  return false;\n}\n\nfunction isAfterKeyword(keyword: string, token: Token): boolean {\n  const maybeKeyword = getPreviousTokenExcluding(token, [\n    'whitespace',\n    'function',\n    'punctuation',\n    'field-name',\n    'number',\n  ]);\n  if (isTokenType(maybeKeyword, 'keyword', 'by')) {\n    const prev = getPreviousTokenExcluding(token, ['whitespace']);\n    if (prev === maybeKeyword || isTokenType(prev, 'punctuation', ',')) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction isTokenType(token: Token | undefined | null, type: string, content?: string): boolean {\n  if (!token?.types.includes(type)) {\n    return false;\n  }\n  if (content) {\n    if (token?.content.toLowerCase() !== content) {\n      return false;\n    }\n  }\n  return true;\n}\n\ntype TokenDef = string | { type: string; value: string };\nfunction getPreviousTokenExcluding(token: Token, exclude: TokenDef[]): Token | undefined | null {\n  let curToken = token.prev;\n  main: while (curToken) {\n    for (const item of exclude) {\n      if (typeof item === 'string') {\n        if (curToken.types.includes(item)) {\n          curToken = curToken.prev;\n          continue main;\n        }\n      } else {\n        if (curToken.types.includes(item.type) && curToken.content.toLowerCase() === item.value) {\n          curToken = curToken.prev;\n          continue main;\n        }\n      }\n    }\n    break;\n  }\n  return curToken;\n}\n","import { SchedulerLike, Observable, SchedulerAction, Subscriber, asyncScheduler } from 'rxjs';\n\n/**\n * Creates an Observable that emits sequential numbers after increasing intervals of time\n * starting with `startPeriod`, ending with `endPeriod` and incrementing by `step`.\n */\nexport const increasingInterval = (\n  { startPeriod = 0, endPeriod = 5000, step = 1000 },\n  scheduler: SchedulerLike = asyncScheduler\n): Observable<number> => {\n  return new Observable<number>((subscriber) => {\n    const state: IntervalState = {\n      subscriber,\n      counter: 0,\n      period: startPeriod,\n      step,\n      endPeriod,\n    };\n\n    subscriber.add(scheduler.schedule(dispatch, startPeriod, state));\n    return subscriber;\n  });\n};\n\nfunction dispatch(this: SchedulerAction<IntervalState>, state?: IntervalState) {\n  if (!state) {\n    return;\n  }\n  const { subscriber, counter, period, step, endPeriod } = state;\n  subscriber.next(counter);\n  const newPeriod = Math.min(period + step, endPeriod);\n  this.schedule({ subscriber, counter: counter + 1, period: newPeriod, step, endPeriod }, newPeriod);\n}\n\ninterface IntervalState {\n  subscriber: Subscriber<number>;\n  counter: number;\n  period: number;\n  endPeriod: number;\n  step: number;\n}\n","import { DataFrame, DataLink, DataQueryRequest, DataQueryResponse, ScopedVars, TimeRange } from '@grafana/data';\nimport { CloudWatchLogsQuery, CloudWatchQuery } from '../types';\nimport { AwsUrl, encodeUrl } from '../aws_url';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\ntype ReplaceFn = (\n  target?: string,\n  scopedVars?: ScopedVars,\n  displayErrorIfIsMultiTemplateVariable?: boolean,\n  fieldName?: string\n) => string;\n\nexport async function addDataLinksToLogsResponse(\n  response: DataQueryResponse,\n  request: DataQueryRequest<CloudWatchQuery>,\n  range: TimeRange,\n  replaceFn: ReplaceFn,\n  getRegion: (region: string) => string,\n  tracingDatasourceUid?: string\n): Promise<void> {\n  const replace = (target: string, fieldName?: string) => replaceFn(target, request.scopedVars, true, fieldName);\n\n  for (const dataFrame of response.data as DataFrame[]) {\n    const curTarget = request.targets.find((target) => target.refId === dataFrame.refId) as CloudWatchLogsQuery;\n    const interpolatedRegion = getRegion(replace(curTarget.region ?? '', 'region'));\n\n    for (const field of dataFrame.fields) {\n      if (field.name === '@xrayTraceId' && tracingDatasourceUid) {\n        getRegion(replace(curTarget.region ?? '', 'region'));\n        const xrayLink = await createInternalXrayLink(tracingDatasourceUid, interpolatedRegion);\n        if (xrayLink) {\n          field.config.links = [xrayLink];\n        }\n      } else {\n        // Right now we add generic link to open the query in xray console to every field so it shows in the logs row\n        // details. Unfortunately this also creates link for all values inside table which look weird.\n        field.config.links = [createAwsConsoleLink(curTarget, range, interpolatedRegion, replace)];\n      }\n    }\n  }\n}\n\nasync function createInternalXrayLink(datasourceUid: string, region: string) {\n  let ds;\n  try {\n    ds = await getDataSourceSrv().get(datasourceUid);\n  } catch (e) {\n    console.error('Could not load linked xray data source, it was probably deleted after it was linked', e);\n    return undefined;\n  }\n\n  return {\n    title: ds.name,\n    url: '',\n    internal: {\n      query: { query: '${__value.raw}', queryType: 'getTrace', region: region },\n      datasourceUid: datasourceUid,\n      datasourceName: ds.name,\n    },\n  } as DataLink;\n}\n\nfunction createAwsConsoleLink(\n  target: CloudWatchLogsQuery,\n  range: TimeRange,\n  region: string,\n  replace: (target: string, fieldName?: string) => string\n) {\n  const interpolatedExpression = target.expression ? replace(target.expression) : '';\n  const interpolatedGroups = target.logGroupNames?.map((logGroup: string) => replace(logGroup, 'log groups')) ?? [];\n\n  const urlProps: AwsUrl = {\n    end: range.to.toISOString(),\n    start: range.from.toISOString(),\n    timeType: 'ABSOLUTE',\n    tz: 'UTC',\n    editorString: interpolatedExpression,\n    isLiveTail: false,\n    source: interpolatedGroups,\n  };\n\n  const encodedUrl = encodeUrl(urlProps, region);\n  return {\n    url: encodedUrl,\n    title: 'View in CloudWatch console',\n    targetBlank: true,\n  };\n}\n","import { Observable, Subscription } from 'rxjs';\nimport { FetchError, toDataQueryResponse } from '@grafana/runtime';\nimport { StartQueryRequest } from '../types';\nimport { DataFrame, DataFrameJSON, DataQueryError } from '@grafana/data';\n\ntype Result = { frames: DataFrameJSON[]; error?: string };\n\nconst defaultTimeout = 30_000;\n\n/**\n * A retry strategy specifically for cloud watch logs query. Cloud watch logs queries need first starting the query\n * and the polling for the results. The start query can fail because of the concurrent queries rate limit,\n * and so we hove to retry the start query call if there is already lot of queries running.\n *\n * As we send multiple queries in single request some can fail and some can succeed and we have to also handle those\n * cases by only retrying the failed queries. We retry the failed queries until we hit the time limit or all queries\n * succeed and only then we pass the data forward. This means we wait longer but makes the code a bit simpler as we\n * can treat starting the query and polling as steps in a pipeline.\n * @param queryFun\n * @param targets\n * @param options\n */\nexport function runWithRetry(\n  queryFun: (targets: StartQueryRequest[]) => Observable<DataFrame[]>,\n  targets: StartQueryRequest[],\n  options: {\n    timeout?: number;\n    timeoutFunc?: (retry: number, startTime: number) => boolean;\n    retryWaitFunc?: (retry: number) => number;\n  } = {}\n): Observable<{ frames: DataFrame[]; error?: DataQueryError }> {\n  const startTime = new Date();\n  let retries = 0;\n  let timerID: any;\n  let subscription: Subscription;\n  let collected = {};\n\n  const timeoutFunction = options.timeoutFunc\n    ? options.timeoutFunc\n    : (retry: number, startTime: number) => {\n        return Date.now() >= startTime + (options.timeout === undefined ? defaultTimeout : options.timeout);\n      };\n\n  const retryWaitFunction = options.retryWaitFunc\n    ? options.retryWaitFunc\n    : (retry: number) => {\n        return Math.pow(2, retry) * 1000 + Math.random() * 100;\n      };\n\n  return new Observable((observer) => {\n    // Run function is where the logic takes place. We have it in a function so we can call it recursively.\n    function run(currentQueryParams: StartQueryRequest[]) {\n      subscription = queryFun(currentQueryParams).subscribe({\n        next(frames) {\n          // In case we successfully finished, merge the current response with whatever we already collected.\n          const collectedPreviously = toDataQueryResponse({ data: { results: collected } }).data || [];\n          observer.next({ frames: [...collectedPreviously, ...frames] });\n          observer.complete();\n        },\n        error(error: FetchError<{ results?: Record<string, Result> }> | string) {\n          // In case of error we first try to figure out what kind of error it is\n\n          // This means it was a generic 500 error probably so we just pass it on\n          if (typeof error === 'string') {\n            observer.error(error);\n            return;\n          }\n\n          // In case of multiple queries this some can error while some may be ok\n          const errorData = splitErrorData(error);\n\n          if (!errorData) {\n            // Not sure what happened but the error structure wasn't what we expected\n            observer.error(error);\n            return;\n          }\n\n          if (!errorData!.errors.length) {\n            // So there is no limit error but some other errors so nothing to retry so we just pass it as it would be\n            // otherwise.\n            observer.error(error);\n            return;\n          }\n\n          if (timeoutFunction(retries, startTime.valueOf())) {\n            // We timed out but we could have started some queries\n            if (Object.keys(collected).length || Object.keys(errorData.good).length) {\n              const dataResponse = toDataQueryResponse({\n                data: {\n                  results: {\n                    ...(errorData.good ?? {}),\n                    ...(collected ?? {}),\n                  },\n                },\n              });\n              dataResponse.error = {\n                ...(dataResponse.error ?? {}),\n                message: `Some queries timed out: ${errorData.errorMessage}`,\n              };\n              // So we consider this a partial success and pass the data forward but also with error to be shown to\n              // the user.\n              observer.next({\n                error: dataResponse.error,\n                frames: dataResponse.data,\n              });\n              observer.complete();\n            } else {\n              // So we timed out and there was no data to pass forward so we just pass the error\n              const dataResponse = toDataQueryResponse({ data: { results: error.data?.results ?? {} } });\n              observer.error(dataResponse.error);\n            }\n            return;\n          }\n\n          collected = {\n            ...collected,\n            ...errorData!.good,\n          };\n\n          timerID = setTimeout(\n            () => {\n              retries++;\n              console.log(`Attempt ${retries}`);\n              run(errorData!.errors);\n            },\n            // We want to know how long to wait for the next retry. First time this will be 0.\n            retryWaitFunction(retries + 1)\n          );\n        },\n      });\n    }\n    run(targets);\n    return () => {\n      // We clear only the latest timer and subscription but the observable should complete after one response so\n      // there should not be more things running at the same time.\n      clearTimeout(timerID);\n      subscription.unsubscribe();\n    };\n  });\n}\n\nfunction splitErrorData(error: FetchError<{ results?: Record<string, Result> }>) {\n  const results = error.data?.results;\n  if (!results) {\n    return undefined;\n  }\n  return Object.keys(results).reduce<{\n    errors: StartQueryRequest[];\n    good: Record<string, Result>;\n    errorMessage: string;\n  }>(\n    (acc, refId) => {\n      if (results[refId].error?.startsWith('LimitExceededException')) {\n        acc.errorMessage = results[refId].error!;\n        acc.errors.push(error.config.data.queries.find((q: any) => q.refId === refId));\n      } else {\n        acc.good[refId] = results[refId];\n      }\n      return acc;\n    },\n    { errors: [], good: {}, errorMessage: '' }\n  );\n}\n","import { monacoTypes } from '@grafana/ui';\n\nexport enum TokenType {\n  Parenthesis = 'delimiter.parenthesis.sql',\n  Whitespace = 'white.sql',\n  Keyword = 'keyword.sql',\n  Delimiter = 'delimiter.sql',\n  Operator = 'operator.sql',\n  Identifier = 'identifier.sql',\n  Type = 'type.sql',\n  Function = 'predefined.sql',\n  Number = 'number.sql',\n  String = 'string.sql',\n  Variable = 'variable.sql',\n}\n\nexport enum StatementPosition {\n  Unknown,\n  SelectKeyword,\n  AfterSelectKeyword,\n  AfterSelectFuncFirstArgument,\n  AfterFromKeyword,\n  SchemaFuncFirstArgument,\n  SchemaFuncExtraArgument,\n  FromKeyword,\n  AfterFrom,\n  WhereKey,\n  WhereComparisonOperator,\n  WhereValue,\n  AfterWhereValue,\n  AfterGroupByKeywords,\n  AfterGroupBy,\n  AfterOrderByKeywords,\n  AfterOrderByFunction,\n  AfterOrderByDirection,\n}\n\nexport enum SuggestionKind {\n  SelectKeyword,\n  FunctionsWithArguments,\n  Metrics,\n  FromKeyword,\n  SchemaKeyword,\n  Namespaces,\n  LabelKeys,\n  WhereKeyword,\n  GroupByKeywords,\n  OrderByKeywords,\n  FunctionsWithoutArguments,\n  LimitKeyword,\n  SortOrderDirectionKeyword,\n  ComparisonOperators,\n  LabelValues,\n  LogicalOperators,\n}\n\nexport enum CompletionItemPriority {\n  High = 'a',\n  MediumHigh = 'd',\n  Medium = 'g',\n  MediumLow = 'k',\n  Low = 'q',\n}\n\nexport interface Editor {\n  tokenize: (value: string, languageId: string) => monacoTypes.Token[][];\n}\n\nexport interface Range {\n  containsPosition: (range: monacoTypes.IRange, position: monacoTypes.IPosition) => boolean;\n}\n\nexport interface Monaco {\n  editor: Editor;\n  Range: Range;\n}\n","import { monacoTypes } from '@grafana/ui';\nimport { TokenType } from './types';\n\nexport class LinkedToken {\n  constructor(\n    public type: string,\n    public value: string,\n    public range: monacoTypes.IRange,\n    public previous: LinkedToken | null,\n    public next: LinkedToken | null\n  ) {}\n\n  isKeyword(): boolean {\n    return this.type === TokenType.Keyword;\n  }\n\n  isWhiteSpace(): boolean {\n    return this.type === TokenType.Whitespace;\n  }\n\n  isParenthesis(): boolean {\n    return this.type === TokenType.Parenthesis;\n  }\n\n  isIdentifier(): boolean {\n    return this.type === TokenType.Identifier;\n  }\n\n  isString(): boolean {\n    return this.type === TokenType.String;\n  }\n\n  isDoubleQuotedString(): boolean {\n    return this.type === TokenType.Type;\n  }\n\n  isVariable(): boolean {\n    return this.type === TokenType.Variable;\n  }\n\n  isFunction(): boolean {\n    return this.type === TokenType.Function;\n  }\n\n  is(type: TokenType, value?: string | number | boolean): boolean {\n    const isType = this.type === type;\n    return value !== undefined ? isType && this.value === value : isType;\n  }\n\n  getPreviousNonWhiteSpaceToken(): LinkedToken | null {\n    let curr = this.previous;\n    while (curr != null) {\n      if (!curr.isWhiteSpace()) {\n        return curr;\n      }\n      curr = curr.previous;\n    }\n    return null;\n  }\n\n  getPreviousOfType(type: TokenType, value?: string): LinkedToken | null {\n    let curr = this.previous;\n    while (curr != null) {\n      const isType = curr.type === type;\n      if (value !== undefined ? isType && curr.value === value : isType) {\n        return curr;\n      }\n      curr = curr.previous;\n    }\n    return null;\n  }\n\n  getPreviousUntil(type: TokenType, ignoreTypes: TokenType[], value?: string): LinkedToken[] | null {\n    let tokens: LinkedToken[] = [];\n    let curr = this.previous;\n    while (curr != null) {\n      if (ignoreTypes.some((t) => t === curr?.type)) {\n        curr = curr.previous;\n        continue;\n      }\n\n      const isType = curr.type === type;\n      if (value !== undefined ? isType && curr.value === value : isType) {\n        return tokens;\n      }\n      if (!curr.isWhiteSpace()) {\n        tokens.push(curr);\n      }\n      curr = curr.previous;\n    }\n\n    return tokens;\n  }\n\n  getNextUntil(type: TokenType, ignoreTypes: TokenType[], value?: string): LinkedToken[] | null {\n    let tokens: LinkedToken[] = [];\n    let curr = this.next;\n    while (curr != null) {\n      if (ignoreTypes.some((t) => t === curr?.type)) {\n        curr = curr.next;\n        continue;\n      }\n\n      const isType = curr.type === type;\n      if (value !== undefined ? isType && curr.value === value : isType) {\n        return tokens;\n      }\n      if (!curr.isWhiteSpace()) {\n        tokens.push(curr);\n      }\n      curr = curr.next;\n    }\n\n    return tokens;\n  }\n\n  getPreviousKeyword(): LinkedToken | null {\n    let curr = this.previous;\n    while (curr != null) {\n      if (curr.isKeyword()) {\n        return curr;\n      }\n      curr = curr.previous;\n    }\n    return null;\n  }\n\n  getNextNonWhiteSpaceToken(): LinkedToken | null {\n    let curr = this.next;\n    while (curr != null) {\n      if (!curr.isWhiteSpace()) {\n        return curr;\n      }\n      curr = curr.next;\n    }\n    return null;\n  }\n\n  getNextOfType(type: TokenType, value?: string): LinkedToken | null {\n    let curr = this.next;\n    while (curr != null) {\n      const isType = curr.type === type;\n      if (value !== undefined ? isType && curr.value === value : isType) {\n        return curr;\n      }\n      curr = curr.next;\n    }\n    return null;\n  }\n}\n","import { LinkedToken } from './LinkedToken';\nimport { FROM, SCHEMA, SELECT } from '../language';\nimport { TokenType } from './types';\n\nexport const getSelectToken = (currentToken: LinkedToken | null) =>\n  currentToken?.getPreviousOfType(TokenType.Keyword, SELECT) ?? null;\n\nexport const getSelectStatisticToken = (currentToken: LinkedToken | null) => {\n  const assumedStatisticToken = getSelectToken(currentToken)?.getNextNonWhiteSpaceToken();\n  return assumedStatisticToken?.isVariable() || assumedStatisticToken?.isFunction() ? assumedStatisticToken : null;\n};\n\nexport const getMetricNameToken = (currentToken: LinkedToken | null) => {\n  // statistic function is followed by `(` and then an argument\n  const assumedMetricNameToken = getSelectStatisticToken(currentToken)?.next?.next;\n  return assumedMetricNameToken?.isVariable() || assumedMetricNameToken?.isIdentifier() ? assumedMetricNameToken : null;\n};\n\nexport const getFromKeywordToken = (currentToken: LinkedToken | null) => {\n  const selectToken = getSelectToken(currentToken);\n  return selectToken?.getNextOfType(TokenType.Keyword, FROM);\n};\n\nexport const getNamespaceToken = (currentToken: LinkedToken | null) => {\n  const fromToken = getFromKeywordToken(currentToken);\n  const nextNonWhiteSpace = fromToken?.getNextNonWhiteSpaceToken();\n  if (\n    nextNonWhiteSpace?.isDoubleQuotedString() ||\n    (nextNonWhiteSpace?.isVariable() && nextNonWhiteSpace?.value.toUpperCase() !== SCHEMA)\n  ) {\n    // schema is not used\n    return nextNonWhiteSpace;\n  } else if (nextNonWhiteSpace?.isKeyword() && nextNonWhiteSpace.next?.is(TokenType.Parenthesis, '(')) {\n    // schema is specified\n    const assumedNamespaceToken = nextNonWhiteSpace.next?.next;\n    if (assumedNamespaceToken?.isDoubleQuotedString() || assumedNamespaceToken?.isVariable()) {\n      return assumedNamespaceToken;\n    }\n  }\n  return null;\n};\n","import type { Monaco, monacoTypes } from '@grafana/ui';\nimport { getTemplateSrv, TemplateSrv } from '@grafana/runtime';\nimport { uniq } from 'lodash';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { linkedTokenBuilder } from './linkedTokenBuilder';\nimport { getSuggestionKinds } from './suggestionKind';\nimport { getStatementPosition } from './statementPosition';\nimport { TRIGGER_SUGGEST } from './commands';\nimport { TokenType, SuggestionKind, CompletionItemPriority, StatementPosition } from './types';\nimport { LinkedToken } from './LinkedToken';\nimport {\n  BY,\n  FROM,\n  GROUP,\n  LIMIT,\n  ORDER,\n  SCHEMA,\n  SELECT,\n  ASC,\n  DESC,\n  WHERE,\n  COMPARISON_OPERATORS,\n  LOGICAL_OPERATORS,\n  STATISTICS,\n} from '../language';\nimport { getMetricNameToken, getNamespaceToken } from './tokenUtils';\n\ntype CompletionItem = monacoTypes.languages.CompletionItem;\n\nexport class CompletionItemProvider {\n  region: string;\n  templateVariables: string[];\n\n  constructor(private datasource: CloudWatchDatasource, private templateSrv: TemplateSrv = getTemplateSrv()) {\n    this.templateVariables = this.datasource.getVariables();\n    this.region = datasource.getActualRegion();\n  }\n\n  setRegion(region: string) {\n    this.region = region;\n  }\n\n  getCompletionProvider(monaco: Monaco) {\n    return {\n      triggerCharacters: [' ', '$', ',', '(', \"'\"],\n      provideCompletionItems: async (model: monacoTypes.editor.ITextModel, position: monacoTypes.IPosition) => {\n        const currentToken = linkedTokenBuilder(monaco, model, position);\n        const statementPosition = getStatementPosition(currentToken);\n        const suggestionKinds = getSuggestionKinds(statementPosition);\n        const suggestions = await this.getSuggestions(\n          monaco,\n          currentToken,\n          suggestionKinds,\n          statementPosition,\n          position\n        );\n\n        return {\n          suggestions,\n        };\n      },\n    };\n  }\n\n  private async getSuggestions(\n    monaco: Monaco,\n    currentToken: LinkedToken | null,\n    suggestionKinds: SuggestionKind[],\n    statementPosition: StatementPosition,\n    position: monacoTypes.IPosition\n  ): Promise<CompletionItem[]> {\n    let suggestions: CompletionItem[] = [];\n    const invalidRangeToken = currentToken?.isWhiteSpace() || currentToken?.isParenthesis();\n    const range =\n      invalidRangeToken || !currentToken?.range ? monaco.Range.fromPositions(position) : currentToken?.range;\n\n    const toCompletionItem = (value: string, rest: Partial<CompletionItem> = {}) => {\n      const item: CompletionItem = {\n        label: value,\n        insertText: value,\n        kind: monaco.languages.CompletionItemKind.Field,\n        range,\n        sortText: CompletionItemPriority.Medium,\n        ...rest,\n      };\n      return item;\n    };\n\n    function addSuggestion(value: string, rest: Partial<CompletionItem> = {}) {\n      suggestions = [...suggestions, toCompletionItem(value, rest)];\n    }\n\n    for (const suggestion of suggestionKinds) {\n      switch (suggestion) {\n        case SuggestionKind.SelectKeyword:\n          addSuggestion(SELECT, {\n            insertText: `${SELECT} $0`,\n            insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n            kind: monaco.languages.CompletionItemKind.Keyword,\n            command: TRIGGER_SUGGEST,\n          });\n          break;\n\n        case SuggestionKind.FunctionsWithArguments:\n          STATISTICS.map((s) =>\n            addSuggestion(s, {\n              insertText: `${s}($0)`,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              command: TRIGGER_SUGGEST,\n              kind: monaco.languages.CompletionItemKind.Function,\n            })\n          );\n          break;\n\n        case SuggestionKind.FunctionsWithoutArguments:\n          STATISTICS.map((s) =>\n            addSuggestion(s, {\n              insertText: `${s}() `,\n              insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n              command: TRIGGER_SUGGEST,\n              kind: monaco.languages.CompletionItemKind.Function,\n            })\n          );\n          break;\n\n        case SuggestionKind.Metrics:\n          {\n            const namespaceToken = getNamespaceToken(currentToken);\n            if (namespaceToken?.value) {\n              // if a namespace is specified, only suggest metrics for the namespace\n              const metrics = await this.datasource.getMetrics(\n                this.templateSrv.replace(namespaceToken?.value.replace(/\\\"/g, '')),\n                this.templateSrv.replace(this.region)\n              );\n              metrics.map((m) => addSuggestion(m.value));\n            } else {\n              // If no namespace is specified in the query, just list all metrics\n              const metrics = await this.datasource.getAllMetrics(this.templateSrv.replace(this.region));\n              uniq(metrics.map((m) => m.metricName)).map((m) => addSuggestion(m, { insertText: m }));\n            }\n          }\n          break;\n\n        case SuggestionKind.FromKeyword:\n          addSuggestion(FROM, {\n            insertText: `${FROM} `,\n            command: TRIGGER_SUGGEST,\n          });\n          break;\n\n        case SuggestionKind.SchemaKeyword:\n          addSuggestion(SCHEMA, {\n            sortText: CompletionItemPriority.High,\n            insertText: `${SCHEMA}($0)`,\n            insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n            command: TRIGGER_SUGGEST,\n            kind: monaco.languages.CompletionItemKind.Function,\n          });\n          break;\n\n        case SuggestionKind.Namespaces:\n          const metricNameToken = getMetricNameToken(currentToken);\n          let namespaces = [];\n          if (metricNameToken?.value) {\n            // if a metric is specified, only suggest namespaces that actually have that metric\n            const metrics = await this.datasource.getAllMetrics(this.region);\n            const metricName = this.templateSrv.replace(metricNameToken.value);\n            namespaces = metrics.filter((m) => m.metricName === metricName).map((m) => m.namespace);\n          } else {\n            // if no metric is specified, just suggest all namespaces\n            const ns = await this.datasource.getNamespaces();\n            namespaces = ns.map((n) => n.value);\n          }\n          namespaces.map((n) => addSuggestion(`\"${n}\"`, { insertText: `\"${n}\"` }));\n          break;\n\n        case SuggestionKind.LabelKeys:\n          {\n            const metricNameToken = getMetricNameToken(currentToken);\n            const namespaceToken = getNamespaceToken(currentToken);\n            if (namespaceToken?.value) {\n              let dimensionFilter = {};\n              let labelKeyTokens;\n              if (statementPosition === StatementPosition.SchemaFuncExtraArgument) {\n                labelKeyTokens = namespaceToken?.getNextUntil(TokenType.Parenthesis, [\n                  TokenType.Delimiter,\n                  TokenType.Whitespace,\n                ]);\n              } else if (statementPosition === StatementPosition.AfterGroupByKeywords) {\n                labelKeyTokens = currentToken?.getPreviousUntil(TokenType.Keyword, [\n                  TokenType.Delimiter,\n                  TokenType.Whitespace,\n                ]);\n              }\n              dimensionFilter = (labelKeyTokens || []).reduce((acc, curr) => {\n                return { ...acc, [curr.value]: null };\n              }, {});\n              const keys = await this.datasource.getDimensionKeys(\n                this.templateSrv.replace(namespaceToken.value.replace(/\\\"/g, '')),\n                this.templateSrv.replace(this.region),\n                dimensionFilter,\n                metricNameToken?.value ?? ''\n              );\n              keys.map((m) => {\n                const key = /[\\s\\.-]/.test(m.value) ? `\"${m.value}\"` : m.value;\n                addSuggestion(key);\n              });\n            }\n          }\n          break;\n\n        case SuggestionKind.LabelValues:\n          {\n            const namespaceToken = getNamespaceToken(currentToken);\n            const metricNameToken = getMetricNameToken(currentToken);\n            const labelKey = currentToken?.getPreviousNonWhiteSpaceToken()?.getPreviousNonWhiteSpaceToken();\n            if (namespaceToken?.value && labelKey?.value && metricNameToken?.value) {\n              const values = await this.datasource.getDimensionValues(\n                this.templateSrv.replace(this.region),\n                this.templateSrv.replace(namespaceToken.value.replace(/\\\"/g, '')),\n                this.templateSrv.replace(metricNameToken.value),\n                this.templateSrv.replace(labelKey.value),\n                {}\n              );\n              values.map((o) =>\n                addSuggestion(`'${o.value}'`, { insertText: `'${o.value}' `, command: TRIGGER_SUGGEST })\n              );\n            }\n          }\n          break;\n\n        case SuggestionKind.LogicalOperators:\n          LOGICAL_OPERATORS.map((o) =>\n            addSuggestion(`${o}`, {\n              insertText: `${o} `,\n              command: TRIGGER_SUGGEST,\n              sortText: CompletionItemPriority.MediumHigh,\n            })\n          );\n          break;\n\n        case SuggestionKind.WhereKeyword:\n          addSuggestion(`${WHERE}`, {\n            insertText: `${WHERE} `,\n            command: TRIGGER_SUGGEST,\n            sortText: CompletionItemPriority.High,\n          });\n          break;\n\n        case SuggestionKind.ComparisonOperators:\n          COMPARISON_OPERATORS.map((o) => addSuggestion(`${o}`, { insertText: `${o} `, command: TRIGGER_SUGGEST }));\n          break;\n\n        case SuggestionKind.GroupByKeywords:\n          addSuggestion(`${GROUP} ${BY}`, {\n            insertText: `${GROUP} ${BY} `,\n            command: TRIGGER_SUGGEST,\n            sortText: CompletionItemPriority.MediumHigh,\n          });\n          break;\n\n        case SuggestionKind.OrderByKeywords:\n          addSuggestion(`${ORDER} ${BY}`, {\n            insertText: `${ORDER} ${BY} `,\n            command: TRIGGER_SUGGEST,\n            sortText: CompletionItemPriority.Medium,\n          });\n          break;\n\n        case SuggestionKind.LimitKeyword:\n          addSuggestion(LIMIT, { insertText: `${LIMIT} `, sortText: CompletionItemPriority.MediumLow });\n          break;\n\n        case SuggestionKind.SortOrderDirectionKeyword:\n          [ASC, DESC].map((s) =>\n            addSuggestion(s, {\n              insertText: `${s} `,\n              command: TRIGGER_SUGGEST,\n            })\n          );\n          break;\n      }\n    }\n\n    // always suggest template variables\n    this.templateVariables.map((v) => {\n      addSuggestion(v, {\n        range,\n        label: v,\n        insertText: v,\n        kind: monaco.languages.CompletionItemKind.Variable,\n        sortText: CompletionItemPriority.Low,\n      });\n    });\n\n    return suggestions;\n  }\n}\n","import type { monacoTypes } from '@grafana/ui';\n\nimport language from '../definition';\nimport { LinkedToken } from './LinkedToken';\nimport { Monaco, TokenType } from './types';\n\nexport function linkedTokenBuilder(\n  monaco: Monaco,\n  model: monacoTypes.editor.ITextModel,\n  position: monacoTypes.IPosition\n) {\n  let current: LinkedToken | null = null;\n  let previous: LinkedToken | null = null;\n  const tokensPerLine = monaco.editor.tokenize(model.getValue() ?? '', language.id);\n\n  for (let lineIndex = 0; lineIndex < tokensPerLine.length; lineIndex++) {\n    const tokens = tokensPerLine[lineIndex];\n    // In case position is first column in new line, add empty whitespace token so that links are not broken\n    if (!tokens.length && previous) {\n      const token: monacoTypes.Token = {\n        offset: 0,\n        type: TokenType.Whitespace,\n        language: language.id,\n        _tokenBrand: undefined,\n      };\n      tokens.push(token);\n    }\n\n    for (let columnIndex = 0; columnIndex < tokens.length; columnIndex++) {\n      const token = tokens[columnIndex];\n      let endColumn =\n        tokens.length > columnIndex + 1 ? tokens[columnIndex + 1].offset + 1 : model.getLineLength(lineIndex + 1) + 1;\n\n      const range: monacoTypes.IRange = {\n        startLineNumber: lineIndex + 1,\n        startColumn: token.offset === 0 ? 0 : token.offset + 1,\n        endLineNumber: lineIndex + 1,\n        endColumn,\n      };\n\n      const value = model.getValueInRange(range);\n      const sqlToken: LinkedToken = new LinkedToken(token.type, value, range, previous, null);\n\n      if (monaco.Range.containsPosition(range, position)) {\n        current = sqlToken;\n      }\n\n      if (previous) {\n        previous.next = sqlToken;\n      }\n      previous = sqlToken;\n    }\n  }\n  return current;\n}\n","import { AND, ASC, BY, DESC, EQUALS, FROM, GROUP, NOT_EQUALS, ORDER, SCHEMA, SELECT, WHERE } from '../language';\nimport { LinkedToken } from './LinkedToken';\nimport { StatementPosition, TokenType } from './types';\n\nexport function getStatementPosition(currentToken: LinkedToken | null): StatementPosition {\n  const previousNonWhiteSpace = currentToken?.getPreviousNonWhiteSpaceToken();\n  const previousKeyword = currentToken?.getPreviousKeyword();\n\n  const previousIsSlash = currentToken?.getPreviousNonWhiteSpaceToken()?.is(TokenType.Operator, '/');\n  if (\n    currentToken === null ||\n    (currentToken.isWhiteSpace() && currentToken.previous === null) ||\n    (currentToken.is(TokenType.Keyword, SELECT) && currentToken.previous === null) ||\n    previousIsSlash ||\n    (currentToken.isIdentifier() && (previousIsSlash || currentToken?.previous === null))\n  ) {\n    return StatementPosition.SelectKeyword;\n  }\n\n  if (previousNonWhiteSpace?.value === SELECT) {\n    return StatementPosition.AfterSelectKeyword;\n  }\n\n  if (\n    (previousNonWhiteSpace?.is(TokenType.Parenthesis, '(') || currentToken?.is(TokenType.Parenthesis, '()')) &&\n    previousKeyword?.value === SELECT\n  ) {\n    return StatementPosition.AfterSelectFuncFirstArgument;\n  }\n\n  if (previousKeyword?.value === SELECT && previousNonWhiteSpace?.isParenthesis()) {\n    return StatementPosition.FromKeyword;\n  }\n\n  if (previousNonWhiteSpace?.value === FROM) {\n    return StatementPosition.AfterFromKeyword;\n  }\n\n  if (\n    (previousNonWhiteSpace?.is(TokenType.Parenthesis, '(') || currentToken?.is(TokenType.Parenthesis, '()')) &&\n    previousKeyword?.value === SCHEMA\n  ) {\n    return StatementPosition.SchemaFuncFirstArgument;\n  }\n\n  if (previousKeyword?.value === SCHEMA && previousNonWhiteSpace?.is(TokenType.Delimiter, ',')) {\n    return StatementPosition.SchemaFuncExtraArgument;\n  }\n\n  if (\n    (previousKeyword?.value === FROM && previousNonWhiteSpace?.isDoubleQuotedString()) ||\n    (previousKeyword?.value === FROM && previousNonWhiteSpace?.isVariable()) ||\n    (previousKeyword?.value === SCHEMA && previousNonWhiteSpace?.is(TokenType.Parenthesis, ')'))\n  ) {\n    return StatementPosition.AfterFrom;\n  }\n\n  if (\n    previousKeyword?.value === WHERE &&\n    (previousNonWhiteSpace?.isKeyword() ||\n      previousNonWhiteSpace?.is(TokenType.Parenthesis, '(') ||\n      previousNonWhiteSpace?.is(TokenType.Operator, AND))\n  ) {\n    return StatementPosition.WhereKey;\n  }\n\n  if (\n    previousKeyword?.value === WHERE &&\n    (previousNonWhiteSpace?.isIdentifier() || previousNonWhiteSpace?.isDoubleQuotedString())\n  ) {\n    return StatementPosition.WhereComparisonOperator;\n  }\n\n  if (\n    previousKeyword?.value === WHERE &&\n    (previousNonWhiteSpace?.is(TokenType.Operator, EQUALS) || previousNonWhiteSpace?.is(TokenType.Operator, NOT_EQUALS))\n  ) {\n    return StatementPosition.WhereValue;\n  }\n\n  if (\n    previousKeyword?.value === WHERE &&\n    (previousNonWhiteSpace?.isString() || previousNonWhiteSpace?.is(TokenType.Parenthesis, ')'))\n  ) {\n    return StatementPosition.AfterWhereValue;\n  }\n\n  if (\n    previousKeyword?.is(TokenType.Keyword, BY) &&\n    previousKeyword?.getPreviousKeyword()?.is(TokenType.Keyword, GROUP) &&\n    (previousNonWhiteSpace?.is(TokenType.Keyword, BY) || previousNonWhiteSpace?.is(TokenType.Delimiter, ','))\n  ) {\n    return StatementPosition.AfterGroupByKeywords;\n  }\n\n  if (\n    previousKeyword?.is(TokenType.Keyword, BY) &&\n    previousKeyword?.getPreviousKeyword()?.is(TokenType.Keyword, GROUP) &&\n    (previousNonWhiteSpace?.isIdentifier() || previousNonWhiteSpace?.isDoubleQuotedString())\n  ) {\n    return StatementPosition.AfterGroupBy;\n  }\n\n  if (\n    previousNonWhiteSpace?.is(TokenType.Keyword, BY) &&\n    previousNonWhiteSpace?.getPreviousKeyword()?.is(TokenType.Keyword, ORDER)\n  ) {\n    return StatementPosition.AfterOrderByKeywords;\n  }\n\n  if (\n    previousKeyword?.is(TokenType.Keyword, BY) &&\n    previousKeyword?.getPreviousKeyword()?.is(TokenType.Keyword, ORDER) &&\n    previousNonWhiteSpace?.is(TokenType.Parenthesis) &&\n    previousNonWhiteSpace?.getPreviousNonWhiteSpaceToken()?.is(TokenType.Function)\n  ) {\n    return StatementPosition.AfterOrderByFunction;\n  }\n\n  if (previousKeyword?.is(TokenType.Keyword, DESC) || previousKeyword?.is(TokenType.Keyword, ASC)) {\n    return StatementPosition.AfterOrderByDirection;\n  }\n\n  return StatementPosition.Unknown;\n}\n","import { StatementPosition, SuggestionKind } from './types';\n\nexport function getSuggestionKinds(statementPosition: StatementPosition): SuggestionKind[] {\n  switch (statementPosition) {\n    case StatementPosition.SelectKeyword:\n      return [SuggestionKind.SelectKeyword];\n    case StatementPosition.AfterSelectKeyword:\n      return [SuggestionKind.FunctionsWithArguments];\n    case StatementPosition.AfterSelectFuncFirstArgument:\n      return [SuggestionKind.Metrics];\n    case StatementPosition.AfterFromKeyword:\n      return [SuggestionKind.Namespaces, SuggestionKind.SchemaKeyword];\n    case StatementPosition.SchemaFuncFirstArgument:\n      return [SuggestionKind.Namespaces];\n    case StatementPosition.SchemaFuncExtraArgument:\n      return [SuggestionKind.LabelKeys];\n    case StatementPosition.FromKeyword:\n      return [SuggestionKind.FromKeyword];\n    case StatementPosition.AfterFrom:\n      return [\n        SuggestionKind.WhereKeyword,\n        SuggestionKind.GroupByKeywords,\n        SuggestionKind.OrderByKeywords,\n        SuggestionKind.LimitKeyword,\n      ];\n    case StatementPosition.WhereKey:\n      return [SuggestionKind.LabelKeys];\n    case StatementPosition.WhereComparisonOperator:\n      return [SuggestionKind.ComparisonOperators];\n    case StatementPosition.WhereValue:\n      return [SuggestionKind.LabelValues];\n    case StatementPosition.AfterWhereValue:\n      return [\n        SuggestionKind.LogicalOperators,\n        SuggestionKind.GroupByKeywords,\n        SuggestionKind.OrderByKeywords,\n        SuggestionKind.LimitKeyword,\n      ];\n    case StatementPosition.AfterGroupByKeywords:\n      return [SuggestionKind.LabelKeys];\n    case StatementPosition.AfterGroupBy:\n      return [SuggestionKind.OrderByKeywords, SuggestionKind.LimitKeyword];\n    case StatementPosition.AfterOrderByKeywords:\n      return [SuggestionKind.FunctionsWithoutArguments];\n    case StatementPosition.AfterOrderByFunction:\n      return [SuggestionKind.SortOrderDirectionKeyword, SuggestionKind.LimitKeyword];\n    case StatementPosition.AfterOrderByDirection:\n      return [SuggestionKind.LimitKeyword];\n  }\n\n  return [];\n}\n","import React from 'react';\nimport angular from 'angular';\nimport { find, findLast, isEmpty, isString, set } from 'lodash';\nimport { from, lastValueFrom, merge, Observable, of, throwError, zip } from 'rxjs';\nimport { catchError, concatMap, finalize, map, mergeMap, repeat, scan, share, takeWhile, tap } from 'rxjs/operators';\nimport { DataSourceWithBackend, FetchError, getBackendSrv, toDataQueryResponse } from '@grafana/runtime';\nimport { RowContextOptions } from '@grafana/ui/src/components/Logs/LogRowContextProvider';\nimport {\n  DataFrame,\n  DataQueryError,\n  DataQueryErrorType,\n  DataQueryRequest,\n  DataQueryResponse,\n  DataSourceInstanceSettings,\n  DataSourceWithLogsContextSupport,\n  dateMath,\n  LoadingState,\n  LogRowModel,\n  rangeUtil,\n  ScopedVars,\n  TableData,\n  TimeRange,\n  toLegacyResponseData,\n} from '@grafana/data';\n\nimport { notifyApp } from 'app/core/actions';\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { AppNotificationTimeout } from 'app/types';\nimport { store } from 'app/store/store';\nimport { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_srv';\nimport { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { ThrottlingErrorMessage } from './components/ThrottlingErrorMessage';\nimport memoizedDebounce from './memoizedDebounce';\nimport {\n  MetricEditorMode,\n  CloudWatchJsonData,\n  CloudWatchLogsQuery,\n  CloudWatchLogsQueryStatus,\n  CloudWatchMetricsQuery,\n  CloudWatchQuery,\n  DescribeLogGroupsRequest,\n  GetLogEventsRequest,\n  GetLogGroupFieldsRequest,\n  GetLogGroupFieldsResponse,\n  isCloudWatchLogsQuery,\n  LogAction,\n  MetricQueryType,\n  MetricQuery,\n  MetricRequest,\n  StartQueryRequest,\n  TSDBResponse,\n  Dimensions,\n  MetricFindSuggestData,\n  CloudWatchLogsRequest,\n} from './types';\nimport { CloudWatchLanguageProvider } from './language_provider';\nimport { VariableWithMultiSupport } from 'app/features/variables/types';\nimport { increasingInterval } from './utils/rxjs/increasingInterval';\nimport { toTestingStatus } from '@grafana/runtime/src/utils/queryResponse';\nimport { addDataLinksToLogsResponse } from './utils/datalinks';\nimport { runWithRetry } from './utils/logsRetry';\nimport { CompletionItemProvider } from './cloudwatch-sql/completion/CompletionItemProvider';\n\nconst DS_QUERY_ENDPOINT = '/api/ds/query';\n\n// Constants also defined in tsdb/cloudwatch/cloudwatch.go\nconst LOG_IDENTIFIER_INTERNAL = '__log__grafana_internal__';\nconst LOGSTREAM_IDENTIFIER_INTERNAL = '__logstream__grafana_internal__';\n\nconst displayAlert = (datasourceName: string, region: string) =>\n  store.dispatch(\n    notifyApp(\n      createErrorNotification(\n        `CloudWatch request limit reached in ${region} for data source ${datasourceName}`,\n        '',\n        React.createElement(ThrottlingErrorMessage, { region }, null)\n      )\n    )\n  );\n\nconst displayCustomError = (title: string, message: string) =>\n  store.dispatch(notifyApp(createErrorNotification(title, message)));\n\nexport const MAX_ATTEMPTS = 5;\n\nexport class CloudWatchDatasource\n  extends DataSourceWithBackend<CloudWatchQuery, CloudWatchJsonData>\n  implements DataSourceWithLogsContextSupport {\n  proxyUrl: any;\n  defaultRegion: any;\n  datasourceName: string;\n  languageProvider: CloudWatchLanguageProvider;\n  sqlCompletionItemProvider: CompletionItemProvider;\n  tracingDataSourceUid?: string;\n  logsTimeout: string;\n\n  type = 'cloudwatch';\n  standardStatistics = ['Average', 'Maximum', 'Minimum', 'Sum', 'SampleCount'];\n\n  debouncedAlert: (datasourceName: string, region: string) => void = memoizedDebounce(\n    displayAlert,\n    AppNotificationTimeout.Error\n  );\n  debouncedCustomAlert: (title: string, message: string) => void = memoizedDebounce(\n    displayCustomError,\n    AppNotificationTimeout.Error\n  );\n  logQueries: Record<string, { id: string; region: string; statsQuery: boolean }> = {};\n\n  constructor(\n    instanceSettings: DataSourceInstanceSettings<CloudWatchJsonData>,\n    private readonly templateSrv: TemplateSrv = getTemplateSrv(),\n    private readonly timeSrv: TimeSrv = getTimeSrv()\n  ) {\n    super(instanceSettings);\n    this.proxyUrl = instanceSettings.url;\n    this.defaultRegion = instanceSettings.jsonData.defaultRegion;\n    this.datasourceName = instanceSettings.name;\n    this.languageProvider = new CloudWatchLanguageProvider(this);\n    this.tracingDataSourceUid = instanceSettings.jsonData.tracingDatasourceUid;\n    this.logsTimeout = instanceSettings.jsonData.logsTimeout || '15m';\n    this.sqlCompletionItemProvider = new CompletionItemProvider(this);\n  }\n\n  query(options: DataQueryRequest<CloudWatchQuery>): Observable<DataQueryResponse> {\n    options = angular.copy(options);\n\n    let queries = options.targets.filter((item) => item.id !== '' || item.hide !== true);\n    const { logQueries, metricsQueries } = this.getTargetsByQueryMode(queries);\n\n    const dataQueryResponses: Array<Observable<DataQueryResponse>> = [];\n    if (logQueries.length > 0) {\n      dataQueryResponses.push(this.handleLogQueries(logQueries, options));\n    }\n\n    if (metricsQueries.length > 0) {\n      dataQueryResponses.push(this.handleMetricQueries(metricsQueries, options));\n    }\n\n    // No valid targets, return the empty result to save a round trip.\n    if (isEmpty(dataQueryResponses)) {\n      return of({\n        data: [],\n        state: LoadingState.Done,\n      });\n    }\n\n    return merge(...dataQueryResponses);\n  }\n\n  /**\n   * Handle log query. The log query works by starting the query on the CloudWatch and then periodically polling for\n   * results.\n   * @param logQueries\n   * @param options\n   */\n  handleLogQueries = (\n    logQueries: CloudWatchLogsQuery[],\n    options: DataQueryRequest<CloudWatchQuery>\n  ): Observable<DataQueryResponse> => {\n    const validLogQueries = logQueries.filter((item) => item.logGroupNames?.length);\n    if (logQueries.length > validLogQueries.length) {\n      return of({ data: [], error: { message: 'Log group is required' } });\n    }\n\n    // No valid targets, return the empty result to save a round trip.\n    if (isEmpty(validLogQueries)) {\n      return of({ data: [], state: LoadingState.Done });\n    }\n\n    const queryParams = logQueries.map((target: CloudWatchLogsQuery) => ({\n      queryString: target.expression || '',\n      refId: target.refId,\n      logGroupNames: target.logGroupNames,\n      region: this.replace(this.getActualRegion(target.region), options.scopedVars, true, 'region'),\n    }));\n\n    return runWithRetry(\n      (targets: StartQueryRequest[]) => {\n        return this.makeLogActionRequest('StartQuery', targets, {\n          makeReplacements: true,\n          scopedVars: options.scopedVars,\n          skipCache: true,\n        });\n      },\n      queryParams,\n      {\n        timeout: rangeUtil.intervalToMs(this.logsTimeout),\n      }\n    ).pipe(\n      mergeMap(({ frames, error }: { frames: DataFrame[]; error?: DataQueryError }) =>\n        // This queries for the results\n        this.logsQuery(\n          frames.map((dataFrame) => ({\n            queryId: dataFrame.fields[0].values.get(0),\n            region: dataFrame.meta?.custom?.['Region'] ?? 'default',\n            refId: dataFrame.refId!,\n            statsGroups: (logQueries.find((target) => target.refId === dataFrame.refId)! as CloudWatchLogsQuery)\n              .statsGroups,\n          }))\n        ).pipe(\n          map((response: DataQueryResponse) => {\n            if (!response.error && error) {\n              response.error = error;\n            }\n            return response;\n          })\n        )\n      ),\n      mergeMap((dataQueryResponse) => {\n        return from(\n          (async () => {\n            await addDataLinksToLogsResponse(\n              dataQueryResponse,\n              options,\n              this.timeSrv.timeRange(),\n              this.replace.bind(this),\n              this.getActualRegion.bind(this),\n              this.tracingDataSourceUid\n            );\n\n            return dataQueryResponse;\n          })()\n        );\n      })\n    );\n  };\n\n  filterMetricQuery({\n    region,\n    metricQueryType,\n    metricEditorMode,\n    expression,\n    metricName,\n    namespace,\n    sqlExpression,\n    statistic,\n    dimensions,\n    ...rest\n  }: CloudWatchMetricsQuery): boolean {\n    if (!region) {\n      return false;\n    }\n\n    if (metricQueryType === MetricQueryType.Search && metricEditorMode === MetricEditorMode.Builder) {\n      return !!namespace && !!metricName && !!statistic;\n    } else if (metricQueryType === MetricQueryType.Search && metricEditorMode === MetricEditorMode.Code) {\n      return !!expression;\n    } else if (metricQueryType === MetricQueryType.Query) {\n      // still TBD how to validate the visual query builder for SQL\n      return !!sqlExpression;\n    }\n\n    throw new Error('invalid metric editor mode');\n  }\n\n  handleMetricQueries = (\n    metricQueries: CloudWatchMetricsQuery[],\n    options: DataQueryRequest<CloudWatchQuery>\n  ): Observable<DataQueryResponse> => {\n    const validMetricsQueries = metricQueries.filter(this.filterMetricQuery).map(\n      (item: CloudWatchMetricsQuery): MetricQuery => {\n        item.region = this.replace(this.getActualRegion(item.region), options.scopedVars, true, 'region');\n        item.namespace = this.replace(item.namespace, options.scopedVars, true, 'namespace');\n        item.metricName = this.replace(item.metricName, options.scopedVars, true, 'metric name');\n        item.dimensions = this.convertDimensionFormat(item.dimensions ?? {}, options.scopedVars);\n        item.statistic = this.templateSrv.replace(item.statistic, options.scopedVars);\n        item.period = String(this.getPeriod(item, options)); // use string format for period in graph query, and alerting\n        item.id = this.templateSrv.replace(item.id, options.scopedVars);\n        item.expression = this.templateSrv.replace(item.expression, options.scopedVars);\n        item.sqlExpression = this.templateSrv.replace(item.sqlExpression, options.scopedVars, 'raw');\n\n        return {\n          intervalMs: options.intervalMs,\n          maxDataPoints: options.maxDataPoints,\n          ...item,\n          type: 'timeSeriesQuery',\n          datasource: this.getRef(),\n        };\n      }\n    );\n\n    // No valid targets, return the empty result to save a round trip.\n    if (isEmpty(validMetricsQueries)) {\n      return of({ data: [] });\n    }\n\n    const request = {\n      from: options?.range?.from.valueOf().toString(),\n      to: options?.range?.to.valueOf().toString(),\n      queries: validMetricsQueries,\n    };\n\n    return this.performTimeSeriesQuery(request, options.range);\n  };\n\n  /**\n   * Checks progress and polls data of a started logs query with some retry logic.\n   * @param queryParams\n   */\n  logsQuery(\n    queryParams: Array<{\n      queryId: string;\n      refId: string;\n      limit?: number;\n      region: string;\n      statsGroups?: string[];\n    }>\n  ): Observable<DataQueryResponse> {\n    this.logQueries = {};\n    queryParams.forEach((param) => {\n      this.logQueries[param.refId] = {\n        id: param.queryId,\n        region: param.region,\n        statsQuery: (param.statsGroups?.length ?? 0) > 0 ?? false,\n      };\n    });\n\n    const dataFrames = increasingInterval({ startPeriod: 100, endPeriod: 1000, step: 300 }).pipe(\n      concatMap((_) => this.makeLogActionRequest('GetQueryResults', queryParams, { skipCache: true })),\n      repeat(),\n      share()\n    );\n\n    const consecutiveFailedAttempts = dataFrames.pipe(\n      scan(\n        ({ failures, prevRecordsMatched }, frames) => {\n          failures++;\n          for (const frame of frames) {\n            const recordsMatched = frame.meta?.stats?.find((stat) => stat.displayName === 'Records scanned')?.value!;\n            if (recordsMatched > (prevRecordsMatched[frame.refId!] ?? 0)) {\n              failures = 0;\n            }\n            prevRecordsMatched[frame.refId!] = recordsMatched;\n          }\n\n          return { failures, prevRecordsMatched };\n        },\n        { failures: 0, prevRecordsMatched: {} as Record<string, number> }\n      ),\n      map(({ failures }) => failures),\n      share()\n    );\n\n    const queryResponse: Observable<DataQueryResponse> = zip(dataFrames, consecutiveFailedAttempts).pipe(\n      tap(([dataFrames]) => {\n        for (const frame of dataFrames) {\n          if (\n            [\n              CloudWatchLogsQueryStatus.Complete,\n              CloudWatchLogsQueryStatus.Cancelled,\n              CloudWatchLogsQueryStatus.Failed,\n            ].includes(frame.meta?.custom?.['Status']) &&\n            this.logQueries.hasOwnProperty(frame.refId!)\n          ) {\n            delete this.logQueries[frame.refId!];\n          }\n        }\n      }),\n      map(([dataFrames, failedAttempts]) => {\n        if (failedAttempts >= MAX_ATTEMPTS) {\n          for (const frame of dataFrames) {\n            set(frame, 'meta.custom.Status', CloudWatchLogsQueryStatus.Cancelled);\n          }\n        }\n\n        return {\n          data: dataFrames,\n          key: 'test-key',\n          state: dataFrames.every((dataFrame) =>\n            [\n              CloudWatchLogsQueryStatus.Complete,\n              CloudWatchLogsQueryStatus.Cancelled,\n              CloudWatchLogsQueryStatus.Failed,\n            ].includes(dataFrame.meta?.custom?.['Status'])\n          )\n            ? LoadingState.Done\n            : LoadingState.Loading,\n          error:\n            failedAttempts >= MAX_ATTEMPTS\n              ? {\n                  message: `error: query timed out after ${MAX_ATTEMPTS} attempts`,\n                  type: DataQueryErrorType.Timeout,\n                }\n              : undefined,\n        };\n      }),\n      takeWhile(({ state }) => state !== LoadingState.Error && state !== LoadingState.Done, true)\n    );\n\n    return withTeardown(queryResponse, () => this.stopQueries());\n  }\n\n  stopQueries() {\n    if (Object.keys(this.logQueries).length > 0) {\n      this.makeLogActionRequest(\n        'StopQuery',\n        Object.values(this.logQueries).map((logQuery) => ({ queryId: logQuery.id, region: logQuery.region })),\n        {\n          makeReplacements: false,\n          skipCache: true,\n        }\n      ).pipe(\n        finalize(() => {\n          this.logQueries = {};\n        })\n      );\n    }\n  }\n\n  async describeLogGroups(params: DescribeLogGroupsRequest): Promise<string[]> {\n    const dataFrames = await lastValueFrom(this.makeLogActionRequest('DescribeLogGroups', [params]));\n\n    const logGroupNames = dataFrames[0]?.fields[0]?.values.toArray() ?? [];\n    return logGroupNames;\n  }\n\n  async getLogGroupFields(params: GetLogGroupFieldsRequest): Promise<GetLogGroupFieldsResponse> {\n    const dataFrames = await lastValueFrom(this.makeLogActionRequest('GetLogGroupFields', [params]));\n\n    const fieldNames = dataFrames[0].fields[0].values.toArray();\n    const fieldPercentages = dataFrames[0].fields[1].values.toArray();\n    const getLogGroupFieldsResponse = {\n      logGroupFields: fieldNames.map((val, i) => ({ name: val, percent: fieldPercentages[i] })) ?? [],\n    };\n\n    return getLogGroupFieldsResponse;\n  }\n\n  getLogRowContext = async (\n    row: LogRowModel,\n    { limit = 10, direction = 'BACKWARD' }: RowContextOptions = {}\n  ): Promise<{ data: DataFrame[] }> => {\n    let logStreamField = null;\n    let logField = null;\n\n    for (const field of row.dataFrame.fields) {\n      if (field.name === LOGSTREAM_IDENTIFIER_INTERNAL) {\n        logStreamField = field;\n        if (logField !== null) {\n          break;\n        }\n      } else if (field.name === LOG_IDENTIFIER_INTERNAL) {\n        logField = field;\n        if (logStreamField !== null) {\n          break;\n        }\n      }\n    }\n\n    const requestParams: GetLogEventsRequest = {\n      limit,\n      startFromHead: direction !== 'BACKWARD',\n      logGroupName: parseLogGroupName(logField!.values.get(row.rowIndex)),\n      logStreamName: logStreamField!.values.get(row.rowIndex),\n    };\n\n    if (direction === 'BACKWARD') {\n      requestParams.endTime = row.timeEpochMs;\n    } else {\n      requestParams.startTime = row.timeEpochMs;\n    }\n\n    const dataFrames = await lastValueFrom(this.makeLogActionRequest('GetLogEvents', [requestParams]));\n\n    return {\n      data: dataFrames,\n    };\n  };\n\n  getVariables() {\n    return this.templateSrv.getVariables().map((v) => `$${v.name}`);\n  }\n\n  getPeriod(target: CloudWatchMetricsQuery, options: any) {\n    let period = this.templateSrv.replace(target.period, options.scopedVars) as any;\n    if (period && period.toLowerCase() !== 'auto') {\n      if (/^\\d+$/.test(period)) {\n        period = parseInt(period, 10);\n      } else {\n        period = rangeUtil.intervalToSeconds(period);\n      }\n\n      if (period < 1) {\n        period = 1;\n      }\n    }\n\n    return period || '';\n  }\n\n  performTimeSeriesQuery(request: MetricRequest, { from, to }: TimeRange): Observable<any> {\n    return this.awsRequest(DS_QUERY_ENDPOINT, request).pipe(\n      map((res) => {\n        const dataframes: DataFrame[] = toDataQueryResponse({ data: res }).data;\n        if (!dataframes || dataframes.length <= 0) {\n          return { data: [] };\n        }\n\n        const lastError = findLast(res.results, (v) => !!v.error);\n\n        return {\n          data: dataframes,\n          error: lastError ? { message: lastError.error } : null,\n        };\n      }),\n      catchError((err) => {\n        const isFrameError = err.data.results;\n\n        // Error is not frame specific\n        if (!isFrameError && err.data && err.data.message === 'Metric request error' && err.data.error) {\n          err.message = err.data.error;\n          return throwError(() => err);\n        }\n\n        // The error is either for a specific frame or for all the frames\n        const results: Array<{ error?: string }> = Object.values(err.data.results);\n        const firstErrorResult = results.find((r) => r.error);\n        if (firstErrorResult) {\n          err.message = firstErrorResult.error;\n        }\n\n        if (results.some((r) => r.error && /^Throttling:.*/.test(r.error))) {\n          const failedRedIds = Object.keys(err.data.results);\n          const regionsAffected = Object.values(request.queries).reduce(\n            (res: string[], { refId, region }) =>\n              (refId && !failedRedIds.includes(refId)) || res.includes(region) ? res : [...res, region],\n            []\n          ) as string[];\n          regionsAffected.forEach((region) => {\n            const actualRegion = this.getActualRegion(region);\n            if (actualRegion) {\n              this.debouncedAlert(this.datasourceName, actualRegion);\n            }\n          });\n        }\n\n        return throwError(() => err);\n      })\n    );\n  }\n\n  transformSuggestDataFromDataframes(suggestData: TSDBResponse): MetricFindSuggestData[] {\n    const frames = toDataQueryResponse({ data: suggestData }).data as DataFrame[];\n    const table = toLegacyResponseData(frames[0]) as TableData;\n\n    return table.rows.map(([text, value]) => ({\n      text,\n      value,\n      label: value,\n    }));\n  }\n\n  doMetricQueryRequest(subtype: string, parameters: any): Promise<MetricFindSuggestData[]> {\n    const range = this.timeSrv.timeRange();\n    return lastValueFrom(\n      this.awsRequest(DS_QUERY_ENDPOINT, {\n        from: range.from.valueOf().toString(),\n        to: range.to.valueOf().toString(),\n        queries: [\n          {\n            refId: 'metricFindQuery',\n            intervalMs: 1, // dummy\n            maxDataPoints: 1, // dummy\n            datasource: this.getRef(),\n            type: 'metricFindQuery',\n            subtype: subtype,\n            ...parameters,\n          },\n        ],\n      }).pipe(\n        map((r) => {\n          return this.transformSuggestDataFromDataframes(r);\n        })\n      )\n    );\n  }\n\n  makeLogActionRequest(\n    subtype: LogAction,\n    queryParams: CloudWatchLogsRequest[],\n    options: {\n      scopedVars?: ScopedVars;\n      makeReplacements?: boolean;\n      skipCache?: boolean;\n    } = {\n      makeReplacements: true,\n      skipCache: false,\n    }\n  ): Observable<DataFrame[]> {\n    const range = this.timeSrv.timeRange();\n\n    const requestParams = {\n      from: range.from.valueOf().toString(),\n      to: range.to.valueOf().toString(),\n      queries: queryParams.map((param: CloudWatchLogsRequest) => ({\n        refId: (param as StartQueryRequest).refId || 'A',\n        intervalMs: 1, // dummy\n        maxDataPoints: 1, // dummy\n        datasource: this.getRef(),\n        type: 'logAction',\n        subtype: subtype,\n        ...param,\n      })),\n    };\n\n    if (options.makeReplacements) {\n      requestParams.queries.forEach((query: CloudWatchLogsRequest) => {\n        const fieldsToReplace: Array<\n          keyof (GetLogEventsRequest & StartQueryRequest & DescribeLogGroupsRequest & GetLogGroupFieldsRequest)\n        > = ['queryString', 'logGroupNames', 'logGroupName', 'logGroupNamePrefix'];\n\n        const anyQuery: any = query;\n        for (const fieldName of fieldsToReplace) {\n          if (query.hasOwnProperty(fieldName)) {\n            if (Array.isArray(anyQuery[fieldName])) {\n              anyQuery[fieldName] = anyQuery[fieldName].map((val: string) =>\n                this.replace(val, options.scopedVars, true, fieldName)\n              );\n            } else {\n              anyQuery[fieldName] = this.replace(anyQuery[fieldName], options.scopedVars, true, fieldName);\n            }\n          }\n        }\n        // TODO: seems to be some sort of bug that we don't really send region with all queries. This means\n        //  if you select different than default region in editor you will get results for autocomplete from wrong\n        //  region.\n        if (anyQuery.region) {\n          anyQuery.region = this.replace(anyQuery.region, options.scopedVars, true, 'region');\n          anyQuery.region = this.getActualRegion(anyQuery.region);\n        }\n      });\n    }\n\n    const resultsToDataFrames = (val: any): DataFrame[] => toDataQueryResponse(val).data || [];\n    let headers = {};\n    if (options.skipCache) {\n      headers = {\n        'X-Cache-Skip': true,\n      };\n    }\n\n    return this.awsRequest(DS_QUERY_ENDPOINT, requestParams, headers).pipe(\n      map((response) => resultsToDataFrames({ data: response })),\n      catchError((err: FetchError) => {\n        if (err.status === 400) {\n          throw err;\n        }\n\n        if (err.data?.error) {\n          throw err.data.error;\n        } else if (err.data?.message) {\n          // In PROD we do not supply .error\n          throw err.data.message;\n        }\n\n        throw err;\n      })\n    );\n  }\n\n  getRegions(): Promise<Array<{ label: string; value: string; text: string }>> {\n    return this.doMetricQueryRequest('regions', null).then((regions: any) => [\n      { label: 'default', value: 'default', text: 'default' },\n      ...regions,\n    ]);\n  }\n\n  getNamespaces() {\n    return this.doMetricQueryRequest('namespaces', null);\n  }\n\n  async getMetrics(namespace: string | undefined, region?: string) {\n    if (!namespace) {\n      return [];\n    }\n\n    return this.doMetricQueryRequest('metrics', {\n      region: this.templateSrv.replace(this.getActualRegion(region)),\n      namespace: this.templateSrv.replace(namespace),\n    });\n  }\n\n  async getAllMetrics(region: string): Promise<Array<{ metricName: string; namespace: string }>> {\n    const values = await this.doMetricQueryRequest('all_metrics', {\n      region: this.templateSrv.replace(this.getActualRegion(region)),\n    });\n\n    return values.map((v) => ({ metricName: v.label, namespace: v.text }));\n  }\n\n  async getDimensionKeys(\n    namespace: string | undefined,\n    region: string,\n    dimensionFilters: Dimensions = {},\n    metricName = ''\n  ) {\n    if (!namespace) {\n      return [];\n    }\n\n    return this.doMetricQueryRequest('dimension_keys', {\n      region: this.templateSrv.replace(this.getActualRegion(region)),\n      namespace: this.templateSrv.replace(namespace),\n      dimensionFilters: this.convertDimensionFormat(dimensionFilters, {}),\n      metricName,\n    });\n  }\n\n  async getDimensionValues(\n    region: string,\n    namespace: string | undefined,\n    metricName: string | undefined,\n    dimensionKey: string,\n    filterDimensions: {}\n  ) {\n    if (!namespace || !metricName) {\n      return [];\n    }\n\n    const values = await this.doMetricQueryRequest('dimension_values', {\n      region: this.templateSrv.replace(this.getActualRegion(region)),\n      namespace: this.templateSrv.replace(namespace),\n      metricName: this.templateSrv.replace(metricName.trim()),\n      dimensionKey: this.templateSrv.replace(dimensionKey),\n      dimensions: this.convertDimensionFormat(filterDimensions, {}),\n    });\n\n    return values;\n  }\n\n  getEbsVolumeIds(region: string, instanceId: string) {\n    return this.doMetricQueryRequest('ebs_volume_ids', {\n      region: this.templateSrv.replace(this.getActualRegion(region)),\n      instanceId: this.templateSrv.replace(instanceId),\n    });\n  }\n\n  getEc2InstanceAttribute(region: string, attributeName: string, filters: any) {\n    return this.doMetricQueryRequest('ec2_instance_attribute', {\n      region: this.templateSrv.replace(this.getActualRegion(region)),\n      attributeName: this.templateSrv.replace(attributeName),\n      filters: filters,\n    });\n  }\n\n  getResourceARNs(region: string, resourceType: string, tags: any) {\n    return this.doMetricQueryRequest('resource_arns', {\n      region: this.templateSrv.replace(this.getActualRegion(region)),\n      resourceType: this.templateSrv.replace(resourceType),\n      tags: tags,\n    });\n  }\n\n  async metricFindQuery(query: string) {\n    let region;\n    let namespace;\n    let metricName;\n    let filterJson;\n\n    const regionQuery = query.match(/^regions\\(\\)/);\n    if (regionQuery) {\n      return this.getRegions();\n    }\n\n    const namespaceQuery = query.match(/^namespaces\\(\\)/);\n    if (namespaceQuery) {\n      return this.getNamespaces();\n    }\n\n    const metricNameQuery = query.match(/^metrics\\(([^\\)]+?)(,\\s?([^,]+?))?\\)/);\n    if (metricNameQuery) {\n      namespace = metricNameQuery[1];\n      region = metricNameQuery[3];\n      return this.getMetrics(namespace, region);\n    }\n\n    const dimensionKeysQuery = query.match(/^dimension_keys\\(([^\\)]+?)(,\\s?([^,]+?))?\\)/);\n    if (dimensionKeysQuery) {\n      namespace = dimensionKeysQuery[1];\n      region = dimensionKeysQuery[3];\n      return this.getDimensionKeys(namespace, region);\n    }\n\n    const dimensionValuesQuery = query.match(\n      /^dimension_values\\(([^,]+?),\\s?([^,]+?),\\s?([^,]+?),\\s?([^,]+?)(,\\s?(.+))?\\)/\n    );\n    if (dimensionValuesQuery) {\n      region = dimensionValuesQuery[1];\n      namespace = dimensionValuesQuery[2];\n      metricName = dimensionValuesQuery[3];\n      const dimensionKey = dimensionValuesQuery[4];\n      filterJson = {};\n      if (dimensionValuesQuery[6]) {\n        filterJson = JSON.parse(this.templateSrv.replace(dimensionValuesQuery[6]));\n      }\n\n      return this.getDimensionValues(region, namespace, metricName, dimensionKey, filterJson);\n    }\n\n    const ebsVolumeIdsQuery = query.match(/^ebs_volume_ids\\(([^,]+?),\\s?([^,]+?)\\)/);\n    if (ebsVolumeIdsQuery) {\n      region = ebsVolumeIdsQuery[1];\n      const instanceId = ebsVolumeIdsQuery[2];\n      return this.getEbsVolumeIds(region, instanceId);\n    }\n\n    const ec2InstanceAttributeQuery = query.match(/^ec2_instance_attribute\\(([^,]+?),\\s?([^,]+?),\\s?(.+?)\\)/);\n    if (ec2InstanceAttributeQuery) {\n      region = ec2InstanceAttributeQuery[1];\n      const targetAttributeName = ec2InstanceAttributeQuery[2];\n      filterJson = JSON.parse(this.templateSrv.replace(ec2InstanceAttributeQuery[3]));\n      return this.getEc2InstanceAttribute(region, targetAttributeName, filterJson);\n    }\n\n    const resourceARNsQuery = query.match(/^resource_arns\\(([^,]+?),\\s?([^,]+?),\\s?(.+?)\\)/);\n    if (resourceARNsQuery) {\n      region = resourceARNsQuery[1];\n      const resourceType = resourceARNsQuery[2];\n      const tagsJSON = JSON.parse(this.templateSrv.replace(resourceARNsQuery[3]));\n      return this.getResourceARNs(region, resourceType, tagsJSON);\n    }\n\n    const statsQuery = query.match(/^statistics\\(\\)/);\n    if (statsQuery) {\n      return this.standardStatistics.map((s: string) => ({ value: s, label: s, text: s }));\n    }\n\n    return Promise.resolve([]);\n  }\n\n  annotationQuery(options: any) {\n    const annotation = options.annotation;\n    const statistic = this.templateSrv.replace(annotation.statistic);\n    const defaultPeriod = annotation.prefixMatching ? '' : '300';\n    let period = annotation.period || defaultPeriod;\n    period = parseInt(period, 10);\n    const parameters = {\n      prefixMatching: annotation.prefixMatching,\n      region: this.templateSrv.replace(this.getActualRegion(annotation.region)),\n      namespace: this.templateSrv.replace(annotation.namespace),\n      metricName: this.templateSrv.replace(annotation.metricName),\n      dimensions: this.convertDimensionFormat(annotation.dimensions, {}),\n      statistic: statistic,\n      period: period,\n      actionPrefix: annotation.actionPrefix || '',\n      alarmNamePrefix: annotation.alarmNamePrefix || '',\n    };\n\n    return lastValueFrom(\n      this.awsRequest(DS_QUERY_ENDPOINT, {\n        from: options.range.from.valueOf().toString(),\n        to: options.range.to.valueOf().toString(),\n        queries: [\n          {\n            refId: 'annotationQuery',\n            datasource: this.getRef(),\n            type: 'annotationQuery',\n            ...parameters,\n          },\n        ],\n      }).pipe(\n        map((r) => {\n          const frames = toDataQueryResponse({ data: r }).data as DataFrame[];\n          const table = toLegacyResponseData(frames[0]) as TableData;\n          return table.rows.map((v) => ({\n            annotation: annotation,\n            time: Date.parse(v[0]),\n            title: v[1],\n            tags: [v[2]],\n            text: v[3],\n          }));\n        })\n      )\n    );\n  }\n\n  targetContainsTemplate(target: any) {\n    return (\n      this.templateSrv.variableExists(target.region) ||\n      this.templateSrv.variableExists(target.namespace) ||\n      this.templateSrv.variableExists(target.metricName) ||\n      this.templateSrv.variableExists(target.expression!) ||\n      target.logGroupNames?.some((logGroup: string) => this.templateSrv.variableExists(logGroup)) ||\n      find(target.dimensions, (v, k) => this.templateSrv.variableExists(k) || this.templateSrv.variableExists(v))\n    );\n  }\n\n  async testDatasource() {\n    // use billing metrics for test\n    const region = this.defaultRegion;\n    const namespace = 'AWS/Billing';\n    const metricName = 'EstimatedCharges';\n    const dimensions = {};\n\n    try {\n      await this.getDimensionValues(region ?? '', namespace, metricName, 'ServiceName', dimensions);\n      return {\n        status: 'success',\n        message: 'Data source is working',\n      };\n    } catch (error) {\n      return toTestingStatus(error);\n    }\n  }\n\n  awsRequest(url: string, data: MetricRequest, headers: Record<string, any> = {}): Observable<TSDBResponse> {\n    const options = {\n      method: 'POST',\n      url,\n      data,\n      headers,\n    };\n\n    return getBackendSrv()\n      .fetch<TSDBResponse>(options)\n      .pipe(map((result) => result.data));\n  }\n\n  getDefaultRegion() {\n    return this.defaultRegion;\n  }\n\n  getActualRegion(region?: string) {\n    if (region === 'default' || region === undefined || region === '') {\n      return this.getDefaultRegion();\n    }\n    return region;\n  }\n\n  showContextToggle() {\n    return true;\n  }\n\n  convertToCloudWatchTime(date: any, roundUp: any) {\n    if (isString(date)) {\n      date = dateMath.parse(date, roundUp);\n    }\n    return Math.round(date.valueOf() / 1000);\n  }\n\n  convertDimensionFormat(dimensions: Dimensions, scopedVars: ScopedVars) {\n    return Object.entries(dimensions).reduce((result, [key, value]) => {\n      key = this.replace(key, scopedVars, true, 'dimension keys');\n\n      if (Array.isArray(value)) {\n        return { ...result, [key]: value };\n      }\n\n      if (!value) {\n        return { ...result, [key]: null };\n      }\n\n      const valueVar = this.templateSrv\n        .getVariables()\n        .find(({ name }) => name === this.templateSrv.getVariableName(value));\n      if (valueVar) {\n        if (((valueVar as unknown) as VariableWithMultiSupport).multi) {\n          const values = this.templateSrv.replace(value, scopedVars, 'pipe').split('|');\n          return { ...result, [key]: values };\n        }\n        return { ...result, [key]: [this.templateSrv.replace(value, scopedVars)] };\n      }\n\n      return { ...result, [key]: [value] };\n    }, {});\n  }\n\n  replace(\n    target?: string,\n    scopedVars?: ScopedVars,\n    displayErrorIfIsMultiTemplateVariable?: boolean,\n    fieldName?: string\n  ) {\n    if (displayErrorIfIsMultiTemplateVariable && !!target) {\n      const variable = this.templateSrv\n        .getVariables()\n        .find(({ name }) => name === this.templateSrv.getVariableName(target));\n      if (variable && ((variable as unknown) as VariableWithMultiSupport).multi) {\n        this.debouncedCustomAlert(\n          'CloudWatch templating error',\n          `Multi template variables are not supported for ${fieldName || target}`\n        );\n      }\n    }\n\n    return this.templateSrv.replace(target, scopedVars);\n  }\n\n  getQueryDisplayText(query: CloudWatchQuery) {\n    if (query.queryMode === 'Logs') {\n      return query.expression ?? '';\n    } else {\n      return JSON.stringify(query);\n    }\n  }\n\n  getTargetsByQueryMode = (targets: CloudWatchQuery[]) => {\n    const logQueries: CloudWatchLogsQuery[] = [];\n    const metricsQueries: CloudWatchMetricsQuery[] = [];\n\n    targets.forEach((query) => {\n      const mode = query.queryMode ?? 'Metrics';\n      if (mode === 'Logs') {\n        logQueries.push(query as CloudWatchLogsQuery);\n      } else {\n        metricsQueries.push(query as CloudWatchMetricsQuery);\n      }\n    });\n\n    return {\n      logQueries,\n      metricsQueries,\n    };\n  };\n\n  interpolateVariablesInQueries(queries: CloudWatchQuery[], scopedVars: ScopedVars): CloudWatchQuery[] {\n    if (!queries.length) {\n      return queries;\n    }\n\n    return queries.map((query) => ({\n      ...query,\n      region: this.getActualRegion(this.replace(query.region, scopedVars)),\n      expression: this.replace(query.expression, scopedVars),\n\n      ...(!isCloudWatchLogsQuery(query) && this.interpolateMetricsQueryVariables(query, scopedVars)),\n    }));\n  }\n\n  interpolateMetricsQueryVariables(\n    query: CloudWatchMetricsQuery,\n    scopedVars: ScopedVars\n  ): Pick<CloudWatchMetricsQuery, 'alias' | 'metricName' | 'namespace' | 'period' | 'dimensions' | 'sqlExpression'> {\n    return {\n      alias: this.replace(query.alias, scopedVars),\n      metricName: this.replace(query.metricName, scopedVars),\n      namespace: this.replace(query.namespace, scopedVars),\n      period: this.replace(query.period, scopedVars),\n      sqlExpression: this.replace(query.sqlExpression, scopedVars),\n      dimensions: Object.entries(query.dimensions ?? {}).reduce((prev, [key, value]) => {\n        if (Array.isArray(value)) {\n          return { ...prev, [key]: value };\n        }\n\n        return { ...prev, [this.replace(key, scopedVars)]: this.replace(value, scopedVars) };\n      }, {}),\n    };\n  }\n}\n\nfunction withTeardown<T = any>(observable: Observable<T>, onUnsubscribe: () => void): Observable<T> {\n  return new Observable<T>((subscriber) => {\n    const innerSub = observable.subscribe({\n      next: (val) => subscriber.next(val),\n      error: (err) => subscriber.next(err),\n      complete: () => subscriber.complete(),\n    });\n\n    return () => {\n      innerSub.unsubscribe();\n      onUnsubscribe();\n    };\n  });\n}\n\nfunction parseLogGroupName(logIdentifier: string): string {\n  const colonIndex = logIdentifier.lastIndexOf(':');\n  return logIdentifier.substr(colonIndex + 1);\n}\n","import { defaultsDeep } from 'lodash';\nimport { CloudWatchAnnotationQuery } from './types';\n\nexport class CloudWatchAnnotationsQueryCtrl {\n  static templateUrl = 'partials/annotations.editor.html';\n  declare annotation: any;\n\n  /** @ngInject */\n  constructor($scope: any) {\n    this.annotation = $scope.ctrl.annotation;\n\n    defaultsDeep(this.annotation, {\n      namespace: '',\n      metricName: '',\n      expression: '',\n      dimensions: {},\n      region: 'default',\n      id: '',\n      alias: '',\n      statistic: 'Average',\n      matchExact: true,\n      prefixMatching: false,\n      actionPrefix: '',\n      alarmNamePrefix: '',\n    });\n\n    this.onChange = this.onChange.bind(this);\n  }\n\n  onChange(query: CloudWatchAnnotationQuery) {\n    Object.assign(this.annotation, query);\n  }\n}\n","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['', ''], ['', '']);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class TemplateTag\n * @classdesc Consumes a pipeline of composable transformer plugins and produces a template tag.\n */\nvar TemplateTag = function () {\n  /**\n   * constructs a template tag\n   * @constructs TemplateTag\n   * @param  {...Object} [...transformers] - an array or arguments list of transformers\n   * @return {Function}                    - a template tag\n   */\n  function TemplateTag() {\n    var _this = this;\n\n    for (var _len = arguments.length, transformers = Array(_len), _key = 0; _key < _len; _key++) {\n      transformers[_key] = arguments[_key];\n    }\n\n    _classCallCheck(this, TemplateTag);\n\n    this.tag = function (strings) {\n      for (var _len2 = arguments.length, expressions = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n        expressions[_key2 - 1] = arguments[_key2];\n      }\n\n      if (typeof strings === 'function') {\n        // if the first argument passed is a function, assume it is a template tag and return\n        // an intermediary tag that processes the template using the aforementioned tag, passing the\n        // result to our tag\n        return _this.interimTag.bind(_this, strings);\n      }\n\n      if (typeof strings === 'string') {\n        // if the first argument passed is a string, just transform it\n        return _this.transformEndResult(strings);\n      }\n\n      // else, return a transformed end result of processing the template with our tag\n      strings = strings.map(_this.transformString.bind(_this));\n      return _this.transformEndResult(strings.reduce(_this.processSubstitutions.bind(_this, expressions)));\n    };\n\n    // if first argument is an array, extrude it as a list of transformers\n    if (transformers.length > 0 && Array.isArray(transformers[0])) {\n      transformers = transformers[0];\n    }\n\n    // if any transformers are functions, this means they are not initiated - automatically initiate them\n    this.transformers = transformers.map(function (transformer) {\n      return typeof transformer === 'function' ? transformer() : transformer;\n    });\n\n    // return an ES2015 template tag\n    return this.tag;\n  }\n\n  /**\n   * Applies all transformers to a template literal tagged with this method.\n   * If a function is passed as the first argument, assumes the function is a template tag\n   * and applies it to the template, returning a template tag.\n   * @param  {(Function|String|Array<String>)} strings        - Either a template tag or an array containing template strings separated by identifier\n   * @param  {...*}                            ...expressions - Optional list of substitution values.\n   * @return {(String|Function)}                              - Either an intermediary tag function or the results of processing the template.\n   */\n\n\n  _createClass(TemplateTag, [{\n    key: 'interimTag',\n\n\n    /**\n     * An intermediary template tag that receives a template tag and passes the result of calling the template with the received\n     * template tag to our own template tag.\n     * @param  {Function}        nextTag          - the received template tag\n     * @param  {Array<String>}   template         - the template to process\n     * @param  {...*}            ...substitutions - `substitutions` is an array of all substitutions in the template\n     * @return {*}                                - the final processed value\n     */\n    value: function interimTag(previousTag, template) {\n      for (var _len3 = arguments.length, substitutions = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n        substitutions[_key3 - 2] = arguments[_key3];\n      }\n\n      return this.tag(_templateObject, previousTag.apply(undefined, [template].concat(substitutions)));\n    }\n\n    /**\n     * Performs bulk processing on the tagged template, transforming each substitution and then\n     * concatenating the resulting values into a string.\n     * @param  {Array<*>} substitutions - an array of all remaining substitutions present in this template\n     * @param  {String}   resultSoFar   - this iteration's result string so far\n     * @param  {String}   remainingPart - the template chunk after the current substitution\n     * @return {String}                 - the result of joining this iteration's processed substitution with the result\n     */\n\n  }, {\n    key: 'processSubstitutions',\n    value: function processSubstitutions(substitutions, resultSoFar, remainingPart) {\n      var substitution = this.transformSubstitution(substitutions.shift(), resultSoFar);\n      return ''.concat(resultSoFar, substitution, remainingPart);\n    }\n\n    /**\n     * Iterate through each transformer, applying the transformer's `onString` method to the template\n     * strings before all substitutions are processed.\n     * @param {String}  str - The input string\n     * @return {String}     - The final results of processing each transformer\n     */\n\n  }, {\n    key: 'transformString',\n    value: function transformString(str) {\n      var cb = function cb(res, transform) {\n        return transform.onString ? transform.onString(res) : res;\n      };\n      return this.transformers.reduce(cb, str);\n    }\n\n    /**\n     * When a substitution is encountered, iterates through each transformer and applies the transformer's\n     * `onSubstitution` method to the substitution.\n     * @param  {*}      substitution - The current substitution\n     * @param  {String} resultSoFar  - The result up to and excluding this substitution.\n     * @return {*}                   - The final result of applying all substitution transformations.\n     */\n\n  }, {\n    key: 'transformSubstitution',\n    value: function transformSubstitution(substitution, resultSoFar) {\n      var cb = function cb(res, transform) {\n        return transform.onSubstitution ? transform.onSubstitution(res, resultSoFar) : res;\n      };\n      return this.transformers.reduce(cb, substitution);\n    }\n\n    /**\n     * Iterates through each transformer, applying the transformer's `onEndResult` method to the\n     * template literal after all substitutions have finished processing.\n     * @param  {String} endResult - The processed template, just before it is returned from the tag\n     * @return {String}           - The final results of processing each transformer\n     */\n\n  }, {\n    key: 'transformEndResult',\n    value: function transformEndResult(endResult) {\n      var cb = function cb(res, transform) {\n        return transform.onEndResult ? transform.onEndResult(res) : res;\n      };\n      return this.transformers.reduce(cb, endResult);\n    }\n  }]);\n\n  return TemplateTag;\n}();\n\nexport default TemplateTag;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9UZW1wbGF0ZVRhZy9UZW1wbGF0ZVRhZy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInRyYW5zZm9ybWVycyIsInRhZyIsInN0cmluZ3MiLCJleHByZXNzaW9ucyIsImludGVyaW1UYWciLCJiaW5kIiwidHJhbnNmb3JtRW5kUmVzdWx0IiwibWFwIiwidHJhbnNmb3JtU3RyaW5nIiwicmVkdWNlIiwicHJvY2Vzc1N1YnN0aXR1dGlvbnMiLCJsZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJ0cmFuc2Zvcm1lciIsInByZXZpb3VzVGFnIiwidGVtcGxhdGUiLCJzdWJzdGl0dXRpb25zIiwicmVzdWx0U29GYXIiLCJyZW1haW5pbmdQYXJ0Iiwic3Vic3RpdHV0aW9uIiwidHJhbnNmb3JtU3Vic3RpdHV0aW9uIiwic2hpZnQiLCJjb25jYXQiLCJzdHIiLCJjYiIsInJlcyIsInRyYW5zZm9ybSIsIm9uU3RyaW5nIiwib25TdWJzdGl0dXRpb24iLCJlbmRSZXN1bHQiLCJvbkVuZFJlc3VsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7OztJQUlxQkEsVztBQUNuQjs7Ozs7O0FBTUEseUJBQTZCO0FBQUE7O0FBQUEsc0NBQWRDLFlBQWM7QUFBZEEsa0JBQWM7QUFBQTs7QUFBQTs7QUFBQSxTQXVCN0JDLEdBdkI2QixHQXVCdkIsVUFBQ0MsT0FBRCxFQUE2QjtBQUFBLHlDQUFoQkMsV0FBZ0I7QUFBaEJBLG1CQUFnQjtBQUFBOztBQUNqQyxVQUFJLE9BQU9ELE9BQVAsS0FBbUIsVUFBdkIsRUFBbUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EsZUFBTyxNQUFLRSxVQUFMLENBQWdCQyxJQUFoQixRQUEyQkgsT0FBM0IsQ0FBUDtBQUNEOztBQUVELFVBQUksT0FBT0EsT0FBUCxLQUFtQixRQUF2QixFQUFpQztBQUMvQjtBQUNBLGVBQU8sTUFBS0ksa0JBQUwsQ0FBd0JKLE9BQXhCLENBQVA7QUFDRDs7QUFFRDtBQUNBQSxnQkFBVUEsUUFBUUssR0FBUixDQUFZLE1BQUtDLGVBQUwsQ0FBcUJILElBQXJCLE9BQVosQ0FBVjtBQUNBLGFBQU8sTUFBS0Msa0JBQUwsQ0FDTEosUUFBUU8sTUFBUixDQUFlLE1BQUtDLG9CQUFMLENBQTBCTCxJQUExQixRQUFxQ0YsV0FBckMsQ0FBZixDQURLLENBQVA7QUFHRCxLQXpDNEI7O0FBQzNCO0FBQ0EsUUFBSUgsYUFBYVcsTUFBYixHQUFzQixDQUF0QixJQUEyQkMsTUFBTUMsT0FBTixDQUFjYixhQUFhLENBQWIsQ0FBZCxDQUEvQixFQUErRDtBQUM3REEscUJBQWVBLGFBQWEsQ0FBYixDQUFmO0FBQ0Q7O0FBRUQ7QUFDQSxTQUFLQSxZQUFMLEdBQW9CQSxhQUFhTyxHQUFiLENBQWlCLHVCQUFlO0FBQ2xELGFBQU8sT0FBT08sV0FBUCxLQUF1QixVQUF2QixHQUFvQ0EsYUFBcEMsR0FBb0RBLFdBQTNEO0FBQ0QsS0FGbUIsQ0FBcEI7O0FBSUE7QUFDQSxXQUFPLEtBQUtiLEdBQVo7QUFDRDs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7QUE0QkE7Ozs7Ozs7OytCQVFXYyxXLEVBQWFDLFEsRUFBNEI7QUFBQSx5Q0FBZkMsYUFBZTtBQUFmQSxxQkFBZTtBQUFBOztBQUNsRCxhQUFPLEtBQUtoQixHQUFaLGtCQUFrQmMsOEJBQVlDLFFBQVosU0FBeUJDLGFBQXpCLEVBQWxCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7O3lDQVFxQkEsYSxFQUFlQyxXLEVBQWFDLGEsRUFBZTtBQUM5RCxVQUFNQyxlQUFlLEtBQUtDLHFCQUFMLENBQ25CSixjQUFjSyxLQUFkLEVBRG1CLEVBRW5CSixXQUZtQixDQUFyQjtBQUlBLGFBQU8sR0FBR0ssTUFBSCxDQUFVTCxXQUFWLEVBQXVCRSxZQUF2QixFQUFxQ0QsYUFBckMsQ0FBUDtBQUNEOztBQUVEOzs7Ozs7Ozs7b0NBTWdCSyxHLEVBQUs7QUFDbkIsVUFBTUMsS0FBSyxTQUFMQSxFQUFLLENBQUNDLEdBQUQsRUFBTUMsU0FBTjtBQUFBLGVBQ1RBLFVBQVVDLFFBQVYsR0FBcUJELFVBQVVDLFFBQVYsQ0FBbUJGLEdBQW5CLENBQXJCLEdBQStDQSxHQUR0QztBQUFBLE9BQVg7QUFFQSxhQUFPLEtBQUsxQixZQUFMLENBQWtCUyxNQUFsQixDQUF5QmdCLEVBQXpCLEVBQTZCRCxHQUE3QixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7MENBT3NCSixZLEVBQWNGLFcsRUFBYTtBQUMvQyxVQUFNTyxLQUFLLFNBQUxBLEVBQUssQ0FBQ0MsR0FBRCxFQUFNQyxTQUFOO0FBQUEsZUFDVEEsVUFBVUUsY0FBVixHQUNJRixVQUFVRSxjQUFWLENBQXlCSCxHQUF6QixFQUE4QlIsV0FBOUIsQ0FESixHQUVJUSxHQUhLO0FBQUEsT0FBWDtBQUlBLGFBQU8sS0FBSzFCLFlBQUwsQ0FBa0JTLE1BQWxCLENBQXlCZ0IsRUFBekIsRUFBNkJMLFlBQTdCLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7O3VDQU1tQlUsUyxFQUFXO0FBQzVCLFVBQU1MLEtBQUssU0FBTEEsRUFBSyxDQUFDQyxHQUFELEVBQU1DLFNBQU47QUFBQSxlQUNUQSxVQUFVSSxXQUFWLEdBQXdCSixVQUFVSSxXQUFWLENBQXNCTCxHQUF0QixDQUF4QixHQUFxREEsR0FENUM7QUFBQSxPQUFYO0FBRUEsYUFBTyxLQUFLMUIsWUFBTCxDQUFrQlMsTUFBbEIsQ0FBeUJnQixFQUF6QixFQUE2QkssU0FBN0IsQ0FBUDtBQUNEOzs7Ozs7ZUFuSGtCL0IsVyIsImZpbGUiOiJUZW1wbGF0ZVRhZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGNsYXNzIFRlbXBsYXRlVGFnXG4gKiBAY2xhc3NkZXNjIENvbnN1bWVzIGEgcGlwZWxpbmUgb2YgY29tcG9zYWJsZSB0cmFuc2Zvcm1lciBwbHVnaW5zIGFuZCBwcm9kdWNlcyBhIHRlbXBsYXRlIHRhZy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVtcGxhdGVUYWcge1xuICAvKipcbiAgICogY29uc3RydWN0cyBhIHRlbXBsYXRlIHRhZ1xuICAgKiBAY29uc3RydWN0cyBUZW1wbGF0ZVRhZ1xuICAgKiBAcGFyYW0gIHsuLi5PYmplY3R9IFsuLi50cmFuc2Zvcm1lcnNdIC0gYW4gYXJyYXkgb3IgYXJndW1lbnRzIGxpc3Qgb2YgdHJhbnNmb3JtZXJzXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSAgICAgICAgICAgICAgICAgICAgLSBhIHRlbXBsYXRlIHRhZ1xuICAgKi9cbiAgY29uc3RydWN0b3IoLi4udHJhbnNmb3JtZXJzKSB7XG4gICAgLy8gaWYgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIGV4dHJ1ZGUgaXQgYXMgYSBsaXN0IG9mIHRyYW5zZm9ybWVyc1xuICAgIGlmICh0cmFuc2Zvcm1lcnMubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVyc1swXSkpIHtcbiAgICAgIHRyYW5zZm9ybWVycyA9IHRyYW5zZm9ybWVyc1swXTtcbiAgICB9XG5cbiAgICAvLyBpZiBhbnkgdHJhbnNmb3JtZXJzIGFyZSBmdW5jdGlvbnMsIHRoaXMgbWVhbnMgdGhleSBhcmUgbm90IGluaXRpYXRlZCAtIGF1dG9tYXRpY2FsbHkgaW5pdGlhdGUgdGhlbVxuICAgIHRoaXMudHJhbnNmb3JtZXJzID0gdHJhbnNmb3JtZXJzLm1hcCh0cmFuc2Zvcm1lciA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIHRyYW5zZm9ybWVyID09PSAnZnVuY3Rpb24nID8gdHJhbnNmb3JtZXIoKSA6IHRyYW5zZm9ybWVyO1xuICAgIH0pO1xuXG4gICAgLy8gcmV0dXJuIGFuIEVTMjAxNSB0ZW1wbGF0ZSB0YWdcbiAgICByZXR1cm4gdGhpcy50YWc7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhbGwgdHJhbnNmb3JtZXJzIHRvIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWdnZWQgd2l0aCB0aGlzIG1ldGhvZC5cbiAgICogSWYgYSBmdW5jdGlvbiBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCBhc3N1bWVzIHRoZSBmdW5jdGlvbiBpcyBhIHRlbXBsYXRlIHRhZ1xuICAgKiBhbmQgYXBwbGllcyBpdCB0byB0aGUgdGVtcGxhdGUsIHJldHVybmluZyBhIHRlbXBsYXRlIHRhZy5cbiAgICogQHBhcmFtICB7KEZ1bmN0aW9ufFN0cmluZ3xBcnJheTxTdHJpbmc+KX0gc3RyaW5ncyAgICAgICAgLSBFaXRoZXIgYSB0ZW1wbGF0ZSB0YWcgb3IgYW4gYXJyYXkgY29udGFpbmluZyB0ZW1wbGF0ZSBzdHJpbmdzIHNlcGFyYXRlZCBieSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSAgey4uLip9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4cHJlc3Npb25zIC0gT3B0aW9uYWwgbGlzdCBvZiBzdWJzdGl0dXRpb24gdmFsdWVzLlxuICAgKiBAcmV0dXJuIHsoU3RyaW5nfEZ1bmN0aW9uKX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEVpdGhlciBhbiBpbnRlcm1lZGlhcnkgdGFnIGZ1bmN0aW9uIG9yIHRoZSByZXN1bHRzIG9mIHByb2Nlc3NpbmcgdGhlIHRlbXBsYXRlLlxuICAgKi9cbiAgdGFnID0gKHN0cmluZ3MsIC4uLmV4cHJlc3Npb25zKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzdHJpbmdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBpZiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIGlzIGEgZnVuY3Rpb24sIGFzc3VtZSBpdCBpcyBhIHRlbXBsYXRlIHRhZyBhbmQgcmV0dXJuXG4gICAgICAvLyBhbiBpbnRlcm1lZGlhcnkgdGFnIHRoYXQgcHJvY2Vzc2VzIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgYWZvcmVtZW50aW9uZWQgdGFnLCBwYXNzaW5nIHRoZVxuICAgICAgLy8gcmVzdWx0IHRvIG91ciB0YWdcbiAgICAgIHJldHVybiB0aGlzLmludGVyaW1UYWcuYmluZCh0aGlzLCBzdHJpbmdzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHN0cmluZ3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBpZiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIGlzIGEgc3RyaW5nLCBqdXN0IHRyYW5zZm9ybSBpdFxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRW5kUmVzdWx0KHN0cmluZ3MpO1xuICAgIH1cblxuICAgIC8vIGVsc2UsIHJldHVybiBhIHRyYW5zZm9ybWVkIGVuZCByZXN1bHQgb2YgcHJvY2Vzc2luZyB0aGUgdGVtcGxhdGUgd2l0aCBvdXIgdGFnXG4gICAgc3RyaW5ncyA9IHN0cmluZ3MubWFwKHRoaXMudHJhbnNmb3JtU3RyaW5nLmJpbmQodGhpcykpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUVuZFJlc3VsdChcbiAgICAgIHN0cmluZ3MucmVkdWNlKHRoaXMucHJvY2Vzc1N1YnN0aXR1dGlvbnMuYmluZCh0aGlzLCBleHByZXNzaW9ucykpLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFuIGludGVybWVkaWFyeSB0ZW1wbGF0ZSB0YWcgdGhhdCByZWNlaXZlcyBhIHRlbXBsYXRlIHRhZyBhbmQgcGFzc2VzIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgcmVjZWl2ZWRcbiAgICogdGVtcGxhdGUgdGFnIHRvIG91ciBvd24gdGVtcGxhdGUgdGFnLlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gICAgICAgIG5leHRUYWcgICAgICAgICAgLSB0aGUgcmVjZWl2ZWQgdGVtcGxhdGUgdGFnXG4gICAqIEBwYXJhbSAge0FycmF5PFN0cmluZz59ICAgdGVtcGxhdGUgICAgICAgICAtIHRoZSB0ZW1wbGF0ZSB0byBwcm9jZXNzXG4gICAqIEBwYXJhbSAgey4uLip9ICAgICAgICAgICAgLi4uc3Vic3RpdHV0aW9ucyAtIGBzdWJzdGl0dXRpb25zYCBpcyBhbiBhcnJheSBvZiBhbGwgc3Vic3RpdHV0aW9ucyBpbiB0aGUgdGVtcGxhdGVcbiAgICogQHJldHVybiB7Kn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGhlIGZpbmFsIHByb2Nlc3NlZCB2YWx1ZVxuICAgKi9cbiAgaW50ZXJpbVRhZyhwcmV2aW91c1RhZywgdGVtcGxhdGUsIC4uLnN1YnN0aXR1dGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy50YWdgJHtwcmV2aW91c1RhZyh0ZW1wbGF0ZSwgLi4uc3Vic3RpdHV0aW9ucyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBidWxrIHByb2Nlc3Npbmcgb24gdGhlIHRhZ2dlZCB0ZW1wbGF0ZSwgdHJhbnNmb3JtaW5nIGVhY2ggc3Vic3RpdHV0aW9uIGFuZCB0aGVuXG4gICAqIGNvbmNhdGVuYXRpbmcgdGhlIHJlc3VsdGluZyB2YWx1ZXMgaW50byBhIHN0cmluZy5cbiAgICogQHBhcmFtICB7QXJyYXk8Kj59IHN1YnN0aXR1dGlvbnMgLSBhbiBhcnJheSBvZiBhbGwgcmVtYWluaW5nIHN1YnN0aXR1dGlvbnMgcHJlc2VudCBpbiB0aGlzIHRlbXBsYXRlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gICByZXN1bHRTb0ZhciAgIC0gdGhpcyBpdGVyYXRpb24ncyByZXN1bHQgc3RyaW5nIHNvIGZhclxuICAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgcmVtYWluaW5nUGFydCAtIHRoZSB0ZW1wbGF0ZSBjaHVuayBhZnRlciB0aGUgY3VycmVudCBzdWJzdGl0dXRpb25cbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgICAgICAgLSB0aGUgcmVzdWx0IG9mIGpvaW5pbmcgdGhpcyBpdGVyYXRpb24ncyBwcm9jZXNzZWQgc3Vic3RpdHV0aW9uIHdpdGggdGhlIHJlc3VsdFxuICAgKi9cbiAgcHJvY2Vzc1N1YnN0aXR1dGlvbnMoc3Vic3RpdHV0aW9ucywgcmVzdWx0U29GYXIsIHJlbWFpbmluZ1BhcnQpIHtcbiAgICBjb25zdCBzdWJzdGl0dXRpb24gPSB0aGlzLnRyYW5zZm9ybVN1YnN0aXR1dGlvbihcbiAgICAgIHN1YnN0aXR1dGlvbnMuc2hpZnQoKSxcbiAgICAgIHJlc3VsdFNvRmFyLFxuICAgICk7XG4gICAgcmV0dXJuICcnLmNvbmNhdChyZXN1bHRTb0Zhciwgc3Vic3RpdHV0aW9uLCByZW1haW5pbmdQYXJ0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIHRocm91Z2ggZWFjaCB0cmFuc2Zvcm1lciwgYXBwbHlpbmcgdGhlIHRyYW5zZm9ybWVyJ3MgYG9uU3RyaW5nYCBtZXRob2QgdG8gdGhlIHRlbXBsYXRlXG4gICAqIHN0cmluZ3MgYmVmb3JlIGFsbCBzdWJzdGl0dXRpb25zIGFyZSBwcm9jZXNzZWQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAgc3RyIC0gVGhlIGlucHV0IHN0cmluZ1xuICAgKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAtIFRoZSBmaW5hbCByZXN1bHRzIG9mIHByb2Nlc3NpbmcgZWFjaCB0cmFuc2Zvcm1lclxuICAgKi9cbiAgdHJhbnNmb3JtU3RyaW5nKHN0cikge1xuICAgIGNvbnN0IGNiID0gKHJlcywgdHJhbnNmb3JtKSA9PlxuICAgICAgdHJhbnNmb3JtLm9uU3RyaW5nID8gdHJhbnNmb3JtLm9uU3RyaW5nKHJlcykgOiByZXM7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJzLnJlZHVjZShjYiwgc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGEgc3Vic3RpdHV0aW9uIGlzIGVuY291bnRlcmVkLCBpdGVyYXRlcyB0aHJvdWdoIGVhY2ggdHJhbnNmb3JtZXIgYW5kIGFwcGxpZXMgdGhlIHRyYW5zZm9ybWVyJ3NcbiAgICogYG9uU3Vic3RpdHV0aW9uYCBtZXRob2QgdG8gdGhlIHN1YnN0aXR1dGlvbi5cbiAgICogQHBhcmFtICB7Kn0gICAgICBzdWJzdGl0dXRpb24gLSBUaGUgY3VycmVudCBzdWJzdGl0dXRpb25cbiAgICogQHBhcmFtICB7U3RyaW5nfSByZXN1bHRTb0ZhciAgLSBUaGUgcmVzdWx0IHVwIHRvIGFuZCBleGNsdWRpbmcgdGhpcyBzdWJzdGl0dXRpb24uXG4gICAqIEByZXR1cm4geyp9ICAgICAgICAgICAgICAgICAgIC0gVGhlIGZpbmFsIHJlc3VsdCBvZiBhcHBseWluZyBhbGwgc3Vic3RpdHV0aW9uIHRyYW5zZm9ybWF0aW9ucy5cbiAgICovXG4gIHRyYW5zZm9ybVN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgY29uc3QgY2IgPSAocmVzLCB0cmFuc2Zvcm0pID0+XG4gICAgICB0cmFuc2Zvcm0ub25TdWJzdGl0dXRpb25cbiAgICAgICAgPyB0cmFuc2Zvcm0ub25TdWJzdGl0dXRpb24ocmVzLCByZXN1bHRTb0ZhcilcbiAgICAgICAgOiByZXM7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJzLnJlZHVjZShjYiwgc3Vic3RpdHV0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIGVhY2ggdHJhbnNmb3JtZXIsIGFwcGx5aW5nIHRoZSB0cmFuc2Zvcm1lcidzIGBvbkVuZFJlc3VsdGAgbWV0aG9kIHRvIHRoZVxuICAgKiB0ZW1wbGF0ZSBsaXRlcmFsIGFmdGVyIGFsbCBzdWJzdGl0dXRpb25zIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy5cbiAgICogQHBhcmFtICB7U3RyaW5nfSBlbmRSZXN1bHQgLSBUaGUgcHJvY2Vzc2VkIHRlbXBsYXRlLCBqdXN0IGJlZm9yZSBpdCBpcyByZXR1cm5lZCBmcm9tIHRoZSB0YWdcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgLSBUaGUgZmluYWwgcmVzdWx0cyBvZiBwcm9jZXNzaW5nIGVhY2ggdHJhbnNmb3JtZXJcbiAgICovXG4gIHRyYW5zZm9ybUVuZFJlc3VsdChlbmRSZXN1bHQpIHtcbiAgICBjb25zdCBjYiA9IChyZXMsIHRyYW5zZm9ybSkgPT5cbiAgICAgIHRyYW5zZm9ybS5vbkVuZFJlc3VsdCA/IHRyYW5zZm9ybS5vbkVuZFJlc3VsdChyZXMpIDogcmVzO1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybWVycy5yZWR1Y2UoY2IsIGVuZFJlc3VsdCk7XG4gIH1cbn1cbiJdfQ==","var defaults = {\n  separator: '',\n  conjunction: '',\n  serial: false\n};\n\n/**\n * Converts an array substitution to a string containing a list\n * @param  {String} [opts.separator = ''] - the character that separates each item\n * @param  {String} [opts.conjunction = '']  - replace the last separator with this\n * @param  {Boolean} [opts.serial = false] - include the separator before the conjunction? (Oxford comma use-case)\n *\n * @return {Object}                     - a TemplateTag transformer\n */\nvar inlineArrayTransformer = function inlineArrayTransformer() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaults;\n  return {\n    onSubstitution: function onSubstitution(substitution, resultSoFar) {\n      // only operate on arrays\n      if (Array.isArray(substitution)) {\n        var arrayLength = substitution.length;\n        var separator = opts.separator;\n        var conjunction = opts.conjunction;\n        var serial = opts.serial;\n        // join each item in the array into a string where each item is separated by separator\n        // be sure to maintain indentation\n        var indent = resultSoFar.match(/(\\n?[^\\S\\n]+)$/);\n        if (indent) {\n          substitution = substitution.join(separator + indent[1]);\n        } else {\n          substitution = substitution.join(separator + ' ');\n        }\n        // if conjunction is set, replace the last separator with conjunction, but only if there is more than one substitution\n        if (conjunction && arrayLength > 1) {\n          var separatorIndex = substitution.lastIndexOf(separator);\n          substitution = substitution.slice(0, separatorIndex) + (serial ? separator : '') + ' ' + conjunction + substitution.slice(separatorIndex + 1);\n        }\n      }\n      return substitution;\n    }\n  };\n};\n\nexport default inlineArrayTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmxpbmVBcnJheVRyYW5zZm9ybWVyL2lubGluZUFycmF5VHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsiZGVmYXVsdHMiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiIsInNlcmlhbCIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJvcHRzIiwib25TdWJzdGl0dXRpb24iLCJzdWJzdGl0dXRpb24iLCJyZXN1bHRTb0ZhciIsIkFycmF5IiwiaXNBcnJheSIsImFycmF5TGVuZ3RoIiwibGVuZ3RoIiwiaW5kZW50IiwibWF0Y2giLCJqb2luIiwic2VwYXJhdG9ySW5kZXgiLCJsYXN0SW5kZXhPZiIsInNsaWNlIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxXQUFXO0FBQ2ZDLGFBQVcsRUFESTtBQUVmQyxlQUFhLEVBRkU7QUFHZkMsVUFBUTtBQUhPLENBQWpCOztBQU1BOzs7Ozs7OztBQVFBLElBQU1DLHlCQUF5QixTQUF6QkEsc0JBQXlCO0FBQUEsTUFBQ0MsSUFBRCx1RUFBUUwsUUFBUjtBQUFBLFNBQXNCO0FBQ25ETSxrQkFEbUQsMEJBQ3BDQyxZQURvQyxFQUN0QkMsV0FEc0IsRUFDVDtBQUN4QztBQUNBLFVBQUlDLE1BQU1DLE9BQU4sQ0FBY0gsWUFBZCxDQUFKLEVBQWlDO0FBQy9CLFlBQU1JLGNBQWNKLGFBQWFLLE1BQWpDO0FBQ0EsWUFBTVgsWUFBWUksS0FBS0osU0FBdkI7QUFDQSxZQUFNQyxjQUFjRyxLQUFLSCxXQUF6QjtBQUNBLFlBQU1DLFNBQVNFLEtBQUtGLE1BQXBCO0FBQ0E7QUFDQTtBQUNBLFlBQU1VLFNBQVNMLFlBQVlNLEtBQVosQ0FBa0IsZ0JBQWxCLENBQWY7QUFDQSxZQUFJRCxNQUFKLEVBQVk7QUFDVk4seUJBQWVBLGFBQWFRLElBQWIsQ0FBa0JkLFlBQVlZLE9BQU8sQ0FBUCxDQUE5QixDQUFmO0FBQ0QsU0FGRCxNQUVPO0FBQ0xOLHlCQUFlQSxhQUFhUSxJQUFiLENBQWtCZCxZQUFZLEdBQTlCLENBQWY7QUFDRDtBQUNEO0FBQ0EsWUFBSUMsZUFBZVMsY0FBYyxDQUFqQyxFQUFvQztBQUNsQyxjQUFNSyxpQkFBaUJULGFBQWFVLFdBQWIsQ0FBeUJoQixTQUF6QixDQUF2QjtBQUNBTSx5QkFDRUEsYUFBYVcsS0FBYixDQUFtQixDQUFuQixFQUFzQkYsY0FBdEIsS0FDQ2IsU0FBU0YsU0FBVCxHQUFxQixFQUR0QixJQUVBLEdBRkEsR0FHQUMsV0FIQSxHQUlBSyxhQUFhVyxLQUFiLENBQW1CRixpQkFBaUIsQ0FBcEMsQ0FMRjtBQU1EO0FBQ0Y7QUFDRCxhQUFPVCxZQUFQO0FBQ0Q7QUE1QmtELEdBQXRCO0FBQUEsQ0FBL0I7O0FBK0JBLGVBQWVILHNCQUFmIiwiZmlsZSI6ImlubGluZUFycmF5VHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBkZWZhdWx0cyA9IHtcbiAgc2VwYXJhdG9yOiAnJyxcbiAgY29uanVuY3Rpb246ICcnLFxuICBzZXJpYWw6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhcnJheSBzdWJzdGl0dXRpb24gdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3RcbiAqIEBwYXJhbSAge1N0cmluZ30gW29wdHMuc2VwYXJhdG9yID0gJyddIC0gdGhlIGNoYXJhY3RlciB0aGF0IHNlcGFyYXRlcyBlYWNoIGl0ZW1cbiAqIEBwYXJhbSAge1N0cmluZ30gW29wdHMuY29uanVuY3Rpb24gPSAnJ10gIC0gcmVwbGFjZSB0aGUgbGFzdCBzZXBhcmF0b3Igd2l0aCB0aGlzXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbb3B0cy5zZXJpYWwgPSBmYWxzZV0gLSBpbmNsdWRlIHRoZSBzZXBhcmF0b3IgYmVmb3JlIHRoZSBjb25qdW5jdGlvbj8gKE94Zm9yZCBjb21tYSB1c2UtY2FzZSlcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgPSAob3B0cyA9IGRlZmF1bHRzKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgLy8gb25seSBvcGVyYXRlIG9uIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KHN1YnN0aXR1dGlvbikpIHtcbiAgICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gc3Vic3RpdHV0aW9uLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNlcGFyYXRvciA9IG9wdHMuc2VwYXJhdG9yO1xuICAgICAgY29uc3QgY29uanVuY3Rpb24gPSBvcHRzLmNvbmp1bmN0aW9uO1xuICAgICAgY29uc3Qgc2VyaWFsID0gb3B0cy5zZXJpYWw7XG4gICAgICAvLyBqb2luIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgaW50byBhIHN0cmluZyB3aGVyZSBlYWNoIGl0ZW0gaXMgc2VwYXJhdGVkIGJ5IHNlcGFyYXRvclxuICAgICAgLy8gYmUgc3VyZSB0byBtYWludGFpbiBpbmRlbnRhdGlvblxuICAgICAgY29uc3QgaW5kZW50ID0gcmVzdWx0U29GYXIubWF0Y2goLyhcXG4/W15cXFNcXG5dKykkLyk7XG4gICAgICBpZiAoaW5kZW50KSB7XG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbi5qb2luKHNlcGFyYXRvciArIGluZGVudFsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb24uam9pbihzZXBhcmF0b3IgKyAnICcpO1xuICAgICAgfVxuICAgICAgLy8gaWYgY29uanVuY3Rpb24gaXMgc2V0LCByZXBsYWNlIHRoZSBsYXN0IHNlcGFyYXRvciB3aXRoIGNvbmp1bmN0aW9uLCBidXQgb25seSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHN1YnN0aXR1dGlvblxuICAgICAgaWYgKGNvbmp1bmN0aW9uICYmIGFycmF5TGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHN1YnN0aXR1dGlvbi5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgICAgICBzdWJzdGl0dXRpb24gPVxuICAgICAgICAgIHN1YnN0aXR1dGlvbi5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCkgK1xuICAgICAgICAgIChzZXJpYWwgPyBzZXBhcmF0b3IgOiAnJykgK1xuICAgICAgICAgICcgJyArXG4gICAgICAgICAgY29uanVuY3Rpb24gK1xuICAgICAgICAgIHN1YnN0aXR1dGlvbi5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3Vic3RpdHV0aW9uO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGlubGluZUFycmF5VHJhbnNmb3JtZXI7XG4iXX0=","function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/**\n * strips indentation from a template literal\n * @param  {String} type = 'initial' - whether to remove all indentation or just leading indentation. can be 'all' or 'initial'\n * @return {Object}                  - a TemplateTag transformer\n */\nvar stripIndentTransformer = function stripIndentTransformer() {\n  var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'initial';\n  return {\n    onEndResult: function onEndResult(endResult) {\n      if (type === 'initial') {\n        // remove the shortest leading indentation from each line\n        var match = endResult.match(/^[^\\S\\n]*(?=\\S)/gm);\n        var indent = match && Math.min.apply(Math, _toConsumableArray(match.map(function (el) {\n          return el.length;\n        })));\n        if (indent) {\n          var regexp = new RegExp('^.{' + indent + '}', 'gm');\n          return endResult.replace(regexp, '');\n        }\n        return endResult;\n      }\n      if (type === 'all') {\n        // remove all indentation from each line\n        return endResult.replace(/^[^\\S\\n]+/gm, '');\n      }\n      throw new Error('Unknown type: ' + type);\n    }\n  };\n};\n\nexport default stripIndentTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudFRyYW5zZm9ybWVyL3N0cmlwSW5kZW50VHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsInR5cGUiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsIm1hdGNoIiwiaW5kZW50IiwiTWF0aCIsIm1pbiIsIm1hcCIsImVsIiwibGVuZ3RoIiwicmVnZXhwIiwiUmVnRXhwIiwicmVwbGFjZSIsIkVycm9yIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7OztBQUtBLElBQU1BLHlCQUF5QixTQUF6QkEsc0JBQXlCO0FBQUEsTUFBQ0MsSUFBRCx1RUFBUSxTQUFSO0FBQUEsU0FBdUI7QUFDcERDLGVBRG9ELHVCQUN4Q0MsU0FEd0MsRUFDN0I7QUFDckIsVUFBSUYsU0FBUyxTQUFiLEVBQXdCO0FBQ3RCO0FBQ0EsWUFBTUcsUUFBUUQsVUFBVUMsS0FBVixDQUFnQixtQkFBaEIsQ0FBZDtBQUNBLFlBQU1DLFNBQVNELFNBQVNFLEtBQUtDLEdBQUwsZ0NBQVlILE1BQU1JLEdBQU4sQ0FBVTtBQUFBLGlCQUFNQyxHQUFHQyxNQUFUO0FBQUEsU0FBVixDQUFaLEVBQXhCO0FBQ0EsWUFBSUwsTUFBSixFQUFZO0FBQ1YsY0FBTU0sU0FBUyxJQUFJQyxNQUFKLFNBQWlCUCxNQUFqQixRQUE0QixJQUE1QixDQUFmO0FBQ0EsaUJBQU9GLFVBQVVVLE9BQVYsQ0FBa0JGLE1BQWxCLEVBQTBCLEVBQTFCLENBQVA7QUFDRDtBQUNELGVBQU9SLFNBQVA7QUFDRDtBQUNELFVBQUlGLFNBQVMsS0FBYixFQUFvQjtBQUNsQjtBQUNBLGVBQU9FLFVBQVVVLE9BQVYsQ0FBa0IsYUFBbEIsRUFBaUMsRUFBakMsQ0FBUDtBQUNEO0FBQ0QsWUFBTSxJQUFJQyxLQUFKLG9CQUEyQmIsSUFBM0IsQ0FBTjtBQUNEO0FBakJtRCxHQUF2QjtBQUFBLENBQS9COztBQW9CQSxlQUFlRCxzQkFBZiIsImZpbGUiOiJzdHJpcEluZGVudFRyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzdHJpcHMgaW5kZW50YXRpb24gZnJvbSBhIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZSA9ICdpbml0aWFsJyAtIHdoZXRoZXIgdG8gcmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBvciBqdXN0IGxlYWRpbmcgaW5kZW50YXRpb24uIGNhbiBiZSAnYWxsJyBvciAnaW5pdGlhbCdcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAtIGEgVGVtcGxhdGVUYWcgdHJhbnNmb3JtZXJcbiAqL1xuY29uc3Qgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciA9ICh0eXBlID0gJ2luaXRpYWwnKSA9PiAoe1xuICBvbkVuZFJlc3VsdChlbmRSZXN1bHQpIHtcbiAgICBpZiAodHlwZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAvLyByZW1vdmUgdGhlIHNob3J0ZXN0IGxlYWRpbmcgaW5kZW50YXRpb24gZnJvbSBlYWNoIGxpbmVcbiAgICAgIGNvbnN0IG1hdGNoID0gZW5kUmVzdWx0Lm1hdGNoKC9eW15cXFNcXG5dKig/PVxcUykvZ20pO1xuICAgICAgY29uc3QgaW5kZW50ID0gbWF0Y2ggJiYgTWF0aC5taW4oLi4ubWF0Y2gubWFwKGVsID0+IGVsLmxlbmd0aCkpO1xuICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGBeLnske2luZGVudH19YCwgJ2dtJyk7XG4gICAgICAgIHJldHVybiBlbmRSZXN1bHQucmVwbGFjZShyZWdleHAsICcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbmRSZXN1bHQ7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnYWxsJykge1xuICAgICAgLy8gcmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBmcm9tIGVhY2ggbGluZVxuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9eW15cXFNcXG5dKy9nbSwgJycpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZTogJHt0eXBlfWApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmlwSW5kZW50VHJhbnNmb3JtZXI7XG4iXX0=","/**\n * TemplateTag transformer that trims whitespace on the end result of a tagged template\n * @param  {String} side = '' - The side of the string to trim. Can be 'start' or 'end' (alternatively 'left' or 'right')\n * @return {Object}           - a TemplateTag transformer\n */\nvar trimResultTransformer = function trimResultTransformer() {\n  var side = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n  return {\n    onEndResult: function onEndResult(endResult) {\n      if (side === '') {\n        return endResult.trim();\n      }\n\n      side = side.toLowerCase();\n\n      if (side === 'start' || side === 'left') {\n        return endResult.replace(/^\\s*/, '');\n      }\n\n      if (side === 'end' || side === 'right') {\n        return endResult.replace(/\\s*$/, '');\n      }\n\n      throw new Error('Side not supported: ' + side);\n    }\n  };\n};\n\nexport default trimResultTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmltUmVzdWx0VHJhbnNmb3JtZXIvdHJpbVJlc3VsdFRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInNpZGUiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJFcnJvciJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0FBS0EsSUFBTUEsd0JBQXdCLFNBQXhCQSxxQkFBd0I7QUFBQSxNQUFDQyxJQUFELHVFQUFRLEVBQVI7QUFBQSxTQUFnQjtBQUM1Q0MsZUFENEMsdUJBQ2hDQyxTQURnQyxFQUNyQjtBQUNyQixVQUFJRixTQUFTLEVBQWIsRUFBaUI7QUFDZixlQUFPRSxVQUFVQyxJQUFWLEVBQVA7QUFDRDs7QUFFREgsYUFBT0EsS0FBS0ksV0FBTCxFQUFQOztBQUVBLFVBQUlKLFNBQVMsT0FBVCxJQUFvQkEsU0FBUyxNQUFqQyxFQUF5QztBQUN2QyxlQUFPRSxVQUFVRyxPQUFWLENBQWtCLE1BQWxCLEVBQTBCLEVBQTFCLENBQVA7QUFDRDs7QUFFRCxVQUFJTCxTQUFTLEtBQVQsSUFBa0JBLFNBQVMsT0FBL0IsRUFBd0M7QUFDdEMsZUFBT0UsVUFBVUcsT0FBVixDQUFrQixNQUFsQixFQUEwQixFQUExQixDQUFQO0FBQ0Q7O0FBRUQsWUFBTSxJQUFJQyxLQUFKLDBCQUFpQ04sSUFBakMsQ0FBTjtBQUNEO0FBakIyQyxHQUFoQjtBQUFBLENBQTlCOztBQW9CQSxlQUFlRCxxQkFBZiIsImZpbGUiOiJ0cmltUmVzdWx0VHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyIHRoYXQgdHJpbXMgd2hpdGVzcGFjZSBvbiB0aGUgZW5kIHJlc3VsdCBvZiBhIHRhZ2dlZCB0ZW1wbGF0ZVxuICogQHBhcmFtICB7U3RyaW5nfSBzaWRlID0gJycgLSBUaGUgc2lkZSBvZiB0aGUgc3RyaW5nIHRvIHRyaW0uIENhbiBiZSAnc3RhcnQnIG9yICdlbmQnIChhbHRlcm5hdGl2ZWx5ICdsZWZ0JyBvciAncmlnaHQnKVxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciA9IChzaWRlID0gJycpID0+ICh7XG4gIG9uRW5kUmVzdWx0KGVuZFJlc3VsdCkge1xuICAgIGlmIChzaWRlID09PSAnJykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC50cmltKCk7XG4gICAgfVxuXG4gICAgc2lkZSA9IHNpZGUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChzaWRlID09PSAnc3RhcnQnIHx8IHNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9eXFxzKi8sICcnKTtcbiAgICB9XG5cbiAgICBpZiAoc2lkZSA9PT0gJ2VuZCcgfHwgc2lkZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZGUgbm90IHN1cHBvcnRlZDogJHtzaWRlfWApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lcjtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaLists = new TemplateTag(inlineArrayTransformer({ separator: ',' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzL2NvbW1hTGlzdHMuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsImNvbW1hTGlzdHMiLCJzZXBhcmF0b3IiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsZ0JBQXhCO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MsMEJBQWxDOztBQUVBLElBQU1DLGFBQWEsSUFBSUosV0FBSixDQUNqQkUsdUJBQXVCLEVBQUVHLFdBQVcsR0FBYixFQUF2QixDQURpQixFQUVqQkosc0JBRmlCLEVBR2pCRSxxQkFIaUIsQ0FBbkI7O0FBTUEsZUFBZUMsVUFBZiIsImZpbGUiOiJjb21tYUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IGNvbW1hTGlzdHMgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJyB9KSxcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFMaXN0cztcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaListsAnd = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'and' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaListsAnd;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzQW5kL2NvbW1hTGlzdHNBbmQuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsImNvbW1hTGlzdHNBbmQiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZ0JBQWdCLElBQUlKLFdBQUosQ0FDcEJFLHVCQUF1QixFQUFFRyxXQUFXLEdBQWIsRUFBa0JDLGFBQWEsS0FBL0IsRUFBdkIsQ0FEb0IsRUFFcEJMLHNCQUZvQixFQUdwQkUscUJBSG9CLENBQXRCOztBQU1BLGVBQWVDLGFBQWYiLCJmaWxlIjoiY29tbWFMaXN0c0FuZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBjb21tYUxpc3RzQW5kID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyKHsgc2VwYXJhdG9yOiAnLCcsIGNvbmp1bmN0aW9uOiAnYW5kJyB9KSxcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFMaXN0c0FuZDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaListsOr = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'or' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaListsOr;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzT3IvY29tbWFMaXN0c09yLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJjb21tYUxpc3RzT3IiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZUFBZSxJQUFJSixXQUFKLENBQ25CRSx1QkFBdUIsRUFBRUcsV0FBVyxHQUFiLEVBQWtCQyxhQUFhLElBQS9CLEVBQXZCLENBRG1CLEVBRW5CTCxzQkFGbUIsRUFHbkJFLHFCQUhtQixDQUFyQjs7QUFNQSxlQUFlQyxZQUFmIiwiZmlsZSI6ImNvbW1hTGlzdHNPci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBjb21tYUxpc3RzT3IgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJywgY29uanVuY3Rpb246ICdvcicgfSksXG4gIHN0cmlwSW5kZW50VHJhbnNmb3JtZXIsXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hTGlzdHNPcjtcbiJdfQ==","var splitStringTransformer = function splitStringTransformer(splitBy) {\n  return {\n    onSubstitution: function onSubstitution(substitution, resultSoFar) {\n      if (splitBy != null && typeof splitBy === 'string') {\n        if (typeof substitution === 'string' && substitution.includes(splitBy)) {\n          substitution = substitution.split(splitBy);\n        }\n      } else {\n        throw new Error('You need to specify a string character to split by.');\n      }\n      return substitution;\n    }\n  };\n};\n\nexport default splitStringTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyL3NwbGl0U3RyaW5nVHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsic3BsaXRTdHJpbmdUcmFuc2Zvcm1lciIsIm9uU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwicmVzdWx0U29GYXIiLCJzcGxpdEJ5IiwiaW5jbHVkZXMiLCJzcGxpdCIsIkVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSx5QkFBeUIsU0FBekJBLHNCQUF5QjtBQUFBLFNBQVk7QUFDekNDLGtCQUR5QywwQkFDMUJDLFlBRDBCLEVBQ1pDLFdBRFksRUFDQztBQUN4QyxVQUFJQyxXQUFXLElBQVgsSUFBbUIsT0FBT0EsT0FBUCxLQUFtQixRQUExQyxFQUFvRDtBQUNsRCxZQUFJLE9BQU9GLFlBQVAsS0FBd0IsUUFBeEIsSUFBb0NBLGFBQWFHLFFBQWIsQ0FBc0JELE9BQXRCLENBQXhDLEVBQXdFO0FBQ3RFRix5QkFBZUEsYUFBYUksS0FBYixDQUFtQkYsT0FBbkIsQ0FBZjtBQUNEO0FBQ0YsT0FKRCxNQUlPO0FBQ0wsY0FBTSxJQUFJRyxLQUFKLENBQVUscURBQVYsQ0FBTjtBQUNEO0FBQ0QsYUFBT0wsWUFBUDtBQUNEO0FBVndDLEdBQVo7QUFBQSxDQUEvQjs7QUFhQSxlQUFlRixzQkFBZiIsImZpbGUiOiJzcGxpdFN0cmluZ1RyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgc3BsaXRTdHJpbmdUcmFuc2Zvcm1lciA9IHNwbGl0QnkgPT4gKHtcbiAgb25TdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uLCByZXN1bHRTb0Zhcikge1xuICAgIGlmIChzcGxpdEJ5ICE9IG51bGwgJiYgdHlwZW9mIHNwbGl0QnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZW9mIHN1YnN0aXR1dGlvbiA9PT0gJ3N0cmluZycgJiYgc3Vic3RpdHV0aW9uLmluY2x1ZGVzKHNwbGl0QnkpKSB7XG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbi5zcGxpdChzcGxpdEJ5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzcGVjaWZ5IGEgc3RyaW5nIGNoYXJhY3RlciB0byBzcGxpdCBieS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgfSxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyO1xuIl19","var isValidValue = function isValidValue(x) {\n  return x != null && !Number.isNaN(x) && typeof x !== 'boolean';\n};\n\nvar removeNonPrintingValuesTransformer = function removeNonPrintingValuesTransformer() {\n  return {\n    onSubstitution: function onSubstitution(substitution) {\n      if (Array.isArray(substitution)) {\n        return substitution.filter(isValidValue);\n      }\n      if (isValidValue(substitution)) {\n        return substitution;\n      }\n      return '';\n    }\n  };\n};\n\nexport default removeNonPrintingValuesTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyL3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsiaXNWYWxpZFZhbHVlIiwieCIsIk51bWJlciIsImlzTmFOIiwicmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lciIsIm9uU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxlQUFlLFNBQWZBLFlBQWU7QUFBQSxTQUNuQkMsS0FBSyxJQUFMLElBQWEsQ0FBQ0MsT0FBT0MsS0FBUCxDQUFhRixDQUFiLENBQWQsSUFBaUMsT0FBT0EsQ0FBUCxLQUFhLFNBRDNCO0FBQUEsQ0FBckI7O0FBR0EsSUFBTUcscUNBQXFDLFNBQXJDQSxrQ0FBcUM7QUFBQSxTQUFPO0FBQ2hEQyxrQkFEZ0QsMEJBQ2pDQyxZQURpQyxFQUNuQjtBQUMzQixVQUFJQyxNQUFNQyxPQUFOLENBQWNGLFlBQWQsQ0FBSixFQUFpQztBQUMvQixlQUFPQSxhQUFhRyxNQUFiLENBQW9CVCxZQUFwQixDQUFQO0FBQ0Q7QUFDRCxVQUFJQSxhQUFhTSxZQUFiLENBQUosRUFBZ0M7QUFDOUIsZUFBT0EsWUFBUDtBQUNEO0FBQ0QsYUFBTyxFQUFQO0FBQ0Q7QUFUK0MsR0FBUDtBQUFBLENBQTNDOztBQVlBLGVBQWVGLGtDQUFmIiwiZmlsZSI6InJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpc1ZhbGlkVmFsdWUgPSB4ID0+XG4gIHggIT0gbnVsbCAmJiAhTnVtYmVyLmlzTmFOKHgpICYmIHR5cGVvZiB4ICE9PSAnYm9vbGVhbic7XG5cbmNvbnN0IHJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIgPSAoKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzdWJzdGl0dXRpb24pKSB7XG4gICAgICByZXR1cm4gc3Vic3RpdHV0aW9uLmZpbHRlcihpc1ZhbGlkVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXNWYWxpZFZhbHVlKHN1YnN0aXR1dGlvbikpIHtcbiAgICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfSxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCByZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport splitStringTransformer from '../splitStringTransformer';\nimport removeNonPrintingValuesTransformer from '../removeNonPrintingValuesTransformer';\n\nvar html = new TemplateTag(splitStringTransformer('\\n'), removeNonPrintingValuesTransformer, inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);\n\nexport default html;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odG1sL2h0bWwuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInNwbGl0U3RyaW5nVHJhbnNmb3JtZXIiLCJyZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyIiwiaHRtbCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxrQ0FBUCxNQUErQyx1Q0FBL0M7O0FBRUEsSUFBTUMsT0FBTyxJQUFJTixXQUFKLENBQ1hJLHVCQUF1QixJQUF2QixDQURXLEVBRVhDLGtDQUZXLEVBR1hILHNCQUhXLEVBSVhELHNCQUpXLEVBS1hFLHFCQUxXLENBQWI7O0FBUUEsZUFBZUcsSUFBZiIsImZpbGUiOiJodG1sLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgc3BsaXRTdHJpbmdUcmFuc2Zvcm1lciBmcm9tICcuLi9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyJztcbmltcG9ydCByZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyIGZyb20gJy4uL3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXInO1xuXG5jb25zdCBodG1sID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyKCdcXG4nKSxcbiAgcmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lcixcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcixcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgaHRtbDtcbiJdfQ==","var replaceSubstitutionTransformer = function replaceSubstitutionTransformer(replaceWhat, replaceWith) {\n  return {\n    onSubstitution: function onSubstitution(substitution, resultSoFar) {\n      if (replaceWhat == null || replaceWith == null) {\n        throw new Error('replaceSubstitutionTransformer requires at least 2 arguments.');\n      }\n\n      // Do not touch if null or undefined\n      if (substitution == null) {\n        return substitution;\n      } else {\n        return substitution.toString().replace(replaceWhat, replaceWith);\n      }\n    }\n  };\n};\n\nexport default replaceSubstitutionTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIvcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lciIsInJlcGxhY2VXaGF0IiwicmVwbGFjZVdpdGgiLCJvblN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsInJlc3VsdFNvRmFyIiwiRXJyb3IiLCJ0b1N0cmluZyIsInJlcGxhY2UiXSwibWFwcGluZ3MiOiJBQUFBLElBQU1BLGlDQUFpQyxTQUFqQ0EsOEJBQWlDLENBQUNDLFdBQUQsRUFBY0MsV0FBZDtBQUFBLFNBQStCO0FBQ3BFQyxrQkFEb0UsMEJBQ3JEQyxZQURxRCxFQUN2Q0MsV0FEdUMsRUFDMUI7QUFDeEMsVUFBSUosZUFBZSxJQUFmLElBQXVCQyxlQUFlLElBQTFDLEVBQWdEO0FBQzlDLGNBQU0sSUFBSUksS0FBSixDQUNKLCtEQURJLENBQU47QUFHRDs7QUFFRDtBQUNBLFVBQUlGLGdCQUFnQixJQUFwQixFQUEwQjtBQUN4QixlQUFPQSxZQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBT0EsYUFBYUcsUUFBYixHQUF3QkMsT0FBeEIsQ0FBZ0NQLFdBQWhDLEVBQTZDQyxXQUE3QyxDQUFQO0FBQ0Q7QUFDRjtBQWRtRSxHQUEvQjtBQUFBLENBQXZDOztBQWlCQSxlQUFlRiw4QkFBZiIsImZpbGUiOiJyZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIgPSAocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgaWYgKHJlcGxhY2VXaGF0ID09IG51bGwgfHwgcmVwbGFjZVdpdGggPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAncmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyIHJlcXVpcmVzIGF0IGxlYXN0IDIgYXJndW1lbnRzLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERvIG5vdCB0b3VjaCBpZiBudWxsIG9yIHVuZGVmaW5lZFxuICAgIGlmIChzdWJzdGl0dXRpb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbi50b1N0cmluZygpLnJlcGxhY2UocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKTtcbiAgICB9XG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport splitStringTransformer from '../splitStringTransformer';\nimport replaceSubstitutionTransformer from '../replaceSubstitutionTransformer';\n\nvar safeHtml = new TemplateTag(splitStringTransformer('\\n'), inlineArrayTransformer, stripIndentTransformer, trimResultTransformer, replaceSubstitutionTransformer(/&/g, '&amp;'), replaceSubstitutionTransformer(/</g, '&lt;'), replaceSubstitutionTransformer(/>/g, '&gt;'), replaceSubstitutionTransformer(/\"/g, '&quot;'), replaceSubstitutionTransformer(/'/g, '&#x27;'), replaceSubstitutionTransformer(/`/g, '&#x60;'));\n\nexport default safeHtml;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zYWZlSHRtbC9zYWZlSHRtbC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwic3BsaXRTdHJpbmdUcmFuc2Zvcm1lciIsInJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lciIsInNhZmVIdG1sIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLDhCQUFQLE1BQTJDLG1DQUEzQzs7QUFFQSxJQUFNQyxXQUFXLElBQUlOLFdBQUosQ0FDZkksdUJBQXVCLElBQXZCLENBRGUsRUFFZkYsc0JBRmUsRUFHZkQsc0JBSGUsRUFJZkUscUJBSmUsRUFLZkUsK0JBQStCLElBQS9CLEVBQXFDLE9BQXJDLENBTGUsRUFNZkEsK0JBQStCLElBQS9CLEVBQXFDLE1BQXJDLENBTmUsRUFPZkEsK0JBQStCLElBQS9CLEVBQXFDLE1BQXJDLENBUGUsRUFRZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBUmUsRUFTZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBVGUsRUFVZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBVmUsQ0FBakI7O0FBYUEsZUFBZUMsUUFBZiIsImZpbGUiOiJzYWZlSHRtbC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHNwbGl0U3RyaW5nVHJhbnNmb3JtZXIgZnJvbSAnLi4vc3BsaXRTdHJpbmdUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcic7XG5cbmNvbnN0IHNhZmVIdG1sID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyKCdcXG4nKSxcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcixcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuICByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoLyYvZywgJyZhbXA7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvPC9nLCAnJmx0OycpLFxuICByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoLz4vZywgJyZndDsnKSxcbiAgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyKC9cIi9nLCAnJnF1b3Q7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvJy9nLCAnJiN4Mjc7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvYC9nLCAnJiN4NjA7JyksXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBzYWZlSHRtbDtcbiJdfQ==","/**\n * Replaces tabs, newlines and spaces with the chosen value when they occur in sequences\n * @param  {(String|RegExp)} replaceWhat - the value or pattern that should be replaced\n * @param  {*}               replaceWith - the replacement value\n * @return {Object}                      - a TemplateTag transformer\n */\nvar replaceResultTransformer = function replaceResultTransformer(replaceWhat, replaceWith) {\n  return {\n    onEndResult: function onEndResult(endResult) {\n      if (replaceWhat == null || replaceWith == null) {\n        throw new Error('replaceResultTransformer requires at least 2 arguments.');\n      }\n      return endResult.replace(replaceWhat, replaceWith);\n    }\n  };\n};\n\nexport default replaceResultTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIvcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VXaGF0IiwicmVwbGFjZVdpdGgiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsIkVycm9yIiwicmVwbGFjZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztBQU1BLElBQU1BLDJCQUEyQixTQUEzQkEsd0JBQTJCLENBQUNDLFdBQUQsRUFBY0MsV0FBZDtBQUFBLFNBQStCO0FBQzlEQyxlQUQ4RCx1QkFDbERDLFNBRGtELEVBQ3ZDO0FBQ3JCLFVBQUlILGVBQWUsSUFBZixJQUF1QkMsZUFBZSxJQUExQyxFQUFnRDtBQUM5QyxjQUFNLElBQUlHLEtBQUosQ0FDSix5REFESSxDQUFOO0FBR0Q7QUFDRCxhQUFPRCxVQUFVRSxPQUFWLENBQWtCTCxXQUFsQixFQUErQkMsV0FBL0IsQ0FBUDtBQUNEO0FBUjZELEdBQS9CO0FBQUEsQ0FBakM7O0FBV0EsZUFBZUYsd0JBQWYiLCJmaWxlIjoicmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBsYWNlcyB0YWJzLCBuZXdsaW5lcyBhbmQgc3BhY2VzIHdpdGggdGhlIGNob3NlbiB2YWx1ZSB3aGVuIHRoZXkgb2NjdXIgaW4gc2VxdWVuY2VzXG4gKiBAcGFyYW0gIHsoU3RyaW5nfFJlZ0V4cCl9IHJlcGxhY2VXaGF0IC0gdGhlIHZhbHVlIG9yIHBhdHRlcm4gdGhhdCBzaG91bGQgYmUgcmVwbGFjZWRcbiAqIEBwYXJhbSAgeyp9ICAgICAgICAgICAgICAgcmVwbGFjZVdpdGggLSB0aGUgcmVwbGFjZW1lbnQgdmFsdWVcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciA9IChyZXBsYWNlV2hhdCwgcmVwbGFjZVdpdGgpID0+ICh7XG4gIG9uRW5kUmVzdWx0KGVuZFJlc3VsdCkge1xuICAgIGlmIChyZXBsYWNlV2hhdCA9PSBudWxsIHx8IHJlcGxhY2VXaXRoID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciByZXF1aXJlcyBhdCBsZWFzdCAyIGFyZ3VtZW50cy4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKHJlcGxhY2VXaGF0LCByZXBsYWNlV2l0aCk7XG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyO1xuIl19","import TemplateTag from '../TemplateTag';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLine = new TemplateTag(replaceResultTransformer(/(?:\\n(?:\\s*))+/g, ' '), trimResultTransformer);\n\nexport default oneLine;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lL29uZUxpbmUuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxVQUFVLElBQUlILFdBQUosQ0FDZEUseUJBQXlCLGlCQUF6QixFQUE0QyxHQUE1QyxDQURjLEVBRWRELHFCQUZjLENBQWhCOztBQUtBLGVBQWVFLE9BQWYiLCJmaWxlIjoib25lTGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IG9uZUxpbmUgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcigvKD86XFxuKD86XFxzKikpKy9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lO1xuIl19","import TemplateTag from '../TemplateTag';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineTrim = new TemplateTag(replaceResultTransformer(/(?:\\n\\s*)/g, ''), trimResultTransformer);\n\nexport default oneLineTrim;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lVHJpbS9vbmVMaW5lVHJpbS5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsIm9uZUxpbmVUcmltIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxjQUFjLElBQUlILFdBQUosQ0FDbEJFLHlCQUF5QixZQUF6QixFQUF1QyxFQUF2QyxDQURrQixFQUVsQkQscUJBRmtCLENBQXBCOztBQUtBLGVBQWVFLFdBQWYiLCJmaWxlIjoib25lTGluZVRyaW0uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lVHJpbSA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXG5cXHMqKS9nLCAnJyksXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG9uZUxpbmVUcmltO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaLists = new TemplateTag(inlineArrayTransformer({ separator: ',' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0cy9vbmVMaW5lQ29tbWFMaXN0cy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lQ29tbWFMaXN0cyIsInNlcGFyYXRvciJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyx3QkFBUCxNQUFxQyw2QkFBckM7O0FBRUEsSUFBTUMsb0JBQW9CLElBQUlKLFdBQUosQ0FDeEJDLHVCQUF1QixFQUFFSSxXQUFXLEdBQWIsRUFBdkIsQ0FEd0IsRUFFeEJGLHlCQUF5QixVQUF6QixFQUFxQyxHQUFyQyxDQUZ3QixFQUd4QkQscUJBSHdCLENBQTFCOztBQU1BLGVBQWVFLGlCQUFmIiwiZmlsZSI6Im9uZUxpbmVDb21tYUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lQ29tbWFMaXN0cyA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcih7IHNlcGFyYXRvcjogJywnIH0pLFxuICByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIoLyg/OlxccyspL2csICcgJyksXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG9uZUxpbmVDb21tYUxpc3RzO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaListsOr = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'or' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaListsOr;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0c09yL29uZUxpbmVDb21tYUxpc3RzT3IuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwicmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIiwib25lTGluZUNvbW1hTGlzdHNPciIsInNlcGFyYXRvciIsImNvbmp1bmN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxzQkFBc0IsSUFBSUosV0FBSixDQUMxQkMsdUJBQXVCLEVBQUVJLFdBQVcsR0FBYixFQUFrQkMsYUFBYSxJQUEvQixFQUF2QixDQUQwQixFQUUxQkgseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRjBCLEVBRzFCRCxxQkFIMEIsQ0FBNUI7O0FBTUEsZUFBZUUsbUJBQWYiLCJmaWxlIjoib25lTGluZUNvbW1hTGlzdHNPci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgaW5saW5lQXJyYXlUcmFuc2Zvcm1lciBmcm9tICcuLi9pbmxpbmVBcnJheVRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcbmltcG9ydCByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyJztcblxuY29uc3Qgb25lTGluZUNvbW1hTGlzdHNPciA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcih7IHNlcGFyYXRvcjogJywnLCBjb25qdW5jdGlvbjogJ29yJyB9KSxcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lQ29tbWFMaXN0c09yO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaListsAnd = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'and' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaListsAnd;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0c0FuZC9vbmVMaW5lQ29tbWFMaXN0c0FuZC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lQ29tbWFMaXN0c0FuZCIsInNlcGFyYXRvciIsImNvbmp1bmN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyx1QkFBdUIsSUFBSUosV0FBSixDQUMzQkMsdUJBQXVCLEVBQUVJLFdBQVcsR0FBYixFQUFrQkMsYUFBYSxLQUEvQixFQUF2QixDQUQyQixFQUUzQkgseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRjJCLEVBRzNCRCxxQkFIMkIsQ0FBN0I7O0FBTUEsZUFBZUUsb0JBQWYiLCJmaWxlIjoib25lTGluZUNvbW1hTGlzdHNBbmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IG9uZUxpbmVDb21tYUxpc3RzQW5kID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyKHsgc2VwYXJhdG9yOiAnLCcsIGNvbmp1bmN0aW9uOiAnYW5kJyB9KSxcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lQ29tbWFMaXN0c0FuZDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar inlineLists = new TemplateTag(inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);\n\nexport default inlineLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmxpbmVMaXN0cy9pbmxpbmVMaXN0cy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwiaW5saW5lTGlzdHMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsZ0JBQXhCO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MsMEJBQWxDOztBQUVBLElBQU1DLGNBQWMsSUFBSUosV0FBSixDQUNsQkUsc0JBRGtCLEVBRWxCRCxzQkFGa0IsRUFHbEJFLHFCQUhrQixDQUFwQjs7QUFNQSxlQUFlQyxXQUFmIiwiZmlsZSI6ImlubGluZUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IGlubGluZUxpc3RzID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyLFxuICBzdHJpcEluZGVudFRyYW5zZm9ybWVyLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBpbmxpbmVMaXN0cztcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineInlineLists = new TemplateTag(inlineArrayTransformer, replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineInlineLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lSW5saW5lTGlzdHMvb25lTGluZUlubGluZUxpc3RzLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsIm9uZUxpbmVJbmxpbmVMaXN0cyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyx3QkFBUCxNQUFxQyw2QkFBckM7O0FBRUEsSUFBTUMscUJBQXFCLElBQUlKLFdBQUosQ0FDekJDLHNCQUR5QixFQUV6QkUseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRnlCLEVBR3pCRCxxQkFIeUIsQ0FBM0I7O0FBTUEsZUFBZUUsa0JBQWYiLCJmaWxlIjoib25lTGluZUlubGluZUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lSW5saW5lTGlzdHMgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIsXG4gIHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcigvKD86XFxzKykvZywgJyAnKSxcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgb25lTGluZUlubGluZUxpc3RzO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar stripIndent = new TemplateTag(stripIndentTransformer, trimResultTransformer);\n\nexport default stripIndent;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudC9zdHJpcEluZGVudC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJzdHJpcEluZGVudCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsY0FBYyxJQUFJSCxXQUFKLENBQ2xCQyxzQkFEa0IsRUFFbEJDLHFCQUZrQixDQUFwQjs7QUFLQSxlQUFlQyxXQUFmIiwiZmlsZSI6InN0cmlwSW5kZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBzdHJpcEluZGVudCA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgc3RyaXBJbmRlbnQ7XG4iXX0=","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar stripIndents = new TemplateTag(stripIndentTransformer('all'), trimResultTransformer);\n\nexport default stripIndents;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudHMvc3RyaXBJbmRlbnRzLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInN0cmlwSW5kZW50cyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZUFBZSxJQUFJSCxXQUFKLENBQ25CQyx1QkFBdUIsS0FBdkIsQ0FEbUIsRUFFbkJDLHFCQUZtQixDQUFyQjs7QUFLQSxlQUFlQyxZQUFmIiwiZmlsZSI6InN0cmlwSW5kZW50cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcblxuY29uc3Qgc3RyaXBJbmRlbnRzID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzdHJpcEluZGVudFRyYW5zZm9ybWVyKCdhbGwnKSxcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgc3RyaXBJbmRlbnRzO1xuIl19","import React, { PureComponent } from 'react';\nimport { stripIndent, stripIndents } from 'common-tags';\nimport { QueryEditorHelpProps } from '@grafana/data';\nimport Prism from 'prismjs';\nimport tokenizer from '../syntax';\nimport { flattenTokens } from '@grafana/ui/src/slate-plugins/slate-prism';\nimport { css, cx } from '@emotion/css';\nimport { CloudWatchQuery } from '../types';\n\ninterface QueryExample {\n  category: string;\n  examples: Array<{\n    title: string;\n    expr: string;\n  }>;\n}\n\nconst CLIQ_EXAMPLES: QueryExample[] = [\n  {\n    category: 'Lambda',\n    examples: [\n      {\n        title: 'View latency statistics for 5-minute intervals',\n        expr: stripIndents`filter @type = \"REPORT\" |\n                           stats avg(@duration), max(@duration), min(@duration) by bin(5m)`,\n      },\n      {\n        title: 'Determine the amount of overprovisioned memory',\n        expr: stripIndent`\n        filter @type = \"REPORT\" |\n        stats max(@memorySize / 1024 / 1024) as provisonedMemoryMB,\n              min(@maxMemoryUsed / 1024 / 1024) as smallestMemoryRequestMB,\n              avg(@maxMemoryUsed / 1024 / 1024) as avgMemoryUsedMB,\n              max(@maxMemoryUsed / 1024 / 1024) as maxMemoryUsedMB,\n              provisonedMemoryMB - maxMemoryUsedMB as overProvisionedMB`,\n      },\n      {\n        title: 'Find the most expensive requests',\n        expr: stripIndents`filter @type = \"REPORT\" |\n                           fields @requestId, @billedDuration |\n                           sort by @billedDuration desc`,\n      },\n    ],\n  },\n\n  {\n    category: 'VPC Flow Logs',\n    examples: [\n      {\n        title: 'Average, min, and max byte transfers by source and destination IP addresses',\n        expr: `stats avg(bytes), min(bytes), max(bytes) by srcAddr, dstAddr`,\n      },\n      {\n        title: 'IP addresses using UDP transfer protocol',\n        expr: 'filter protocol=17 | stats count(*) by srcAddr',\n      },\n      {\n        title: 'Top 10 byte transfers by source and destination IP addresses',\n        expr: stripIndents`stats sum(bytes) as bytesTransferred by srcAddr, dstAddr |\n                           sort bytesTransferred desc |\n                           limit 10`,\n      },\n      {\n        title: 'Top 20 source IP addresses with highest number of rejected requests',\n        expr: stripIndents`filter action=\"REJECT\" |\n                           stats count(*) as numRejections by srcAddr |\n                           sort numRejections desc |\n                           limit 20`,\n      },\n    ],\n  },\n  {\n    category: 'CloudTrail',\n    examples: [\n      {\n        title: 'Number of log entries by service, event type, and region',\n        expr: 'stats count(*) by eventSource, eventName, awsRegion',\n      },\n\n      {\n        title: 'Number of log entries by region and EC2 event type',\n        expr: stripIndents`filter eventSource=\"ec2.amazonaws.com\" |\n                           stats count(*) as eventCount by eventName, awsRegion |\n                           sort eventCount desc`,\n      },\n\n      {\n        title: 'Regions, usernames, and ARNs of newly created IAM users',\n        expr: stripIndents`filter eventName=\"CreateUser\" |\n                           fields awsRegion, requestParameters.userName, responseElements.user.arn`,\n      },\n    ],\n  },\n  {\n    category: 'Common Queries',\n    examples: [\n      {\n        title: '25 most recently added log events',\n        expr: stripIndents`fields @timestamp, @message |\n                           sort @timestamp desc |\n                           limit 25`,\n      },\n      {\n        title: 'Number of exceptions logged every 5 minutes',\n        expr: stripIndents`filter @message like /Exception/ |\n                           stats count(*) as exceptionCount by bin(5m) |\n                           sort exceptionCount desc`,\n      },\n      {\n        title: 'List of log events that are not exceptions',\n        expr: 'fields @message | filter @message not like /Exception/',\n      },\n    ],\n  },\n  {\n    category: 'Route 53',\n    examples: [\n      {\n        title: 'Number of requests received every 10  minutes by edge location',\n        expr: 'stats count(*) by queryType, bin(10m)',\n      },\n      {\n        title: 'Number of unsuccessful requests by domain',\n        expr: 'filter responseCode=\"SERVFAIL\" | stats count(*) by queryName',\n      },\n      {\n        title: 'Number of requests received every 10  minutes by edge location',\n        expr: 'stats count(*) as numRequests by resolverIp | sort numRequests desc | limit 10',\n      },\n    ],\n  },\n  {\n    category: 'AWS AppSync',\n    examples: [\n      {\n        title: 'Number of unique HTTP status codes',\n        expr: stripIndents`fields ispresent(graphQLAPIId) as isApi |\n                           filter isApi |\n                           filter logType = \"RequestSummary\" |\n                           stats count() as statusCount by statusCode |\n                           sort statusCount desc`,\n      },\n      {\n        title: 'Top 10 resolvers with maximum latency',\n        expr: stripIndents`fields resolverArn, duration |\n                           filter logType = \"Tracing\" |\n                           sort duration desc |\n                           limit 10`,\n      },\n      {\n        title: 'Most frequently invoked resolvers',\n        expr: stripIndents`fields ispresent(resolverArn) as isRes |\n                           stats count() as invocationCount by resolverArn |\n                           filter isRes |\n                           filter logType = \"Tracing\" |\n                           sort invocationCount desc |\n                           limit 10`,\n      },\n      {\n        title: 'Resolvers with most errors in mapping templates',\n        expr: stripIndents`fields ispresent(resolverArn) as isRes |\n                           stats count() as errorCount by resolverArn, logType |\n                           filter isRes and (logType = \"RequestMapping\" or logType = \"ResponseMapping\") and fieldInError |\n                           sort errorCount desc |\n                           limit 10`,\n      },\n      {\n        title: 'Field latency statistics',\n        expr: stripIndents`fields requestId, latency |\n                           filter logType = \"RequestSummary\" |\n                           sort latency desc |\n                           limit 10`,\n      },\n      {\n        title: 'Resolver latency statistics',\n        expr: stripIndents`fields ispresent(resolverArn) as isRes |\n                           filter isRes |\n                           filter logType = \"Tracing\" |\n                           stats min(duration), max(duration), avg(duration) as avgDur by resolverArn |\n                           sort avgDur desc |\n                           limit 10`,\n      },\n      {\n        title: 'Top 10 requests with maximum latency',\n        expr: stripIndents`fields requestId, latency |\n                           filter logType = \"RequestSummary\" |\n                           sort latency desc |\n                           limit 10`,\n      },\n    ],\n  },\n];\n\nfunction renderHighlightedMarkup(code: string, keyPrefix: string) {\n  const grammar = tokenizer;\n  const tokens = flattenTokens(Prism.tokenize(code, grammar));\n  const spans = tokens\n    .filter((token) => typeof token !== 'string')\n    .map((token, i) => {\n      return (\n        <span\n          className={`prism-token token ${token.types.join(' ')} ${token.aliases.join(' ')}`}\n          key={`${keyPrefix}-token-${i}`}\n        >\n          {token.content}\n        </span>\n      );\n    });\n\n  return <div className=\"slate-query-field\">{spans}</div>;\n}\n\nconst exampleCategory = css`\n  margin-top: 5px;\n`;\n\nexport default class LogsCheatSheet extends PureComponent<\n  QueryEditorHelpProps<CloudWatchQuery>,\n  { userExamples: string[] }\n> {\n  onClickExample(query: CloudWatchQuery) {\n    this.props.onClickExample(query);\n  }\n\n  renderExpression(expr: string, keyPrefix: string) {\n    return (\n      <div\n        className=\"cheat-sheet-item__example\"\n        key={expr}\n        onClick={(e) =>\n          this.onClickExample({ refId: 'A', expression: expr, queryMode: 'Logs', region: 'default', id: 'A' })\n        }\n      >\n        <pre>{renderHighlightedMarkup(expr, keyPrefix)}</pre>\n      </div>\n    );\n  }\n\n  renderLogsCheatSheet() {\n    return (\n      <div>\n        <h2>CloudWatch Logs Cheat Sheet</h2>\n        {CLIQ_EXAMPLES.map((cat, i) => (\n          <div key={`${cat.category}-${i}`}>\n            <div className={`cheat-sheet-item__title ${cx(exampleCategory)}`}>{cat.category}</div>\n            {cat.examples.map((item, j) => (\n              <div className=\"cheat-sheet-item\" key={`item-${j}`}>\n                <h4>{item.title}</h4>\n                {this.renderExpression(item.expr, `item-${j}`)}\n              </div>\n            ))}\n          </div>\n        ))}\n      </div>\n    );\n  }\n\n  render() {\n    return (\n      <div>\n        <h3>CloudWatch Logs cheat sheet</h3>\n        {CLIQ_EXAMPLES.map((cat, i) => (\n          <div key={`cat-${i}`}>\n            <div className={`cheat-sheet-item__title ${cx(exampleCategory)}`}>{cat.category}</div>\n            {cat.examples.map((item, j) => (\n              <div className=\"cheat-sheet-item\" key={`item-${j}`}>\n                <h4>{item.title}</h4>\n                {this.renderExpression(item.expr, `item-${j}`)}\n              </div>\n            ))}\n          </div>\n        ))}\n      </div>\n    );\n  }\n}\n","import { DataSourcePlugin } from '@grafana/data';\nimport { ConfigEditor } from './components/ConfigEditor';\nimport { CloudWatchDatasource } from './datasource';\nimport { CloudWatchAnnotationsQueryCtrl } from './annotations_query_ctrl';\nimport { CloudWatchJsonData, CloudWatchQuery } from './types';\nimport { CloudWatchLogsQueryEditor } from './components/LogsQueryEditor';\nimport { PanelQueryEditor } from './components/PanelQueryEditor';\nimport { MetaInspector } from './components/MetaInspector';\nimport LogsCheatSheet from './components/LogsCheatSheet';\n\nexport const plugin = new DataSourcePlugin<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData>(\n  CloudWatchDatasource\n)\n  .setQueryEditorHelp(LogsCheatSheet)\n  .setConfigEditor(ConfigEditor)\n  .setQueryEditor(PanelQueryEditor)\n  .setMetadataInspector(MetaInspector)\n  .setExploreMetricsQueryField(PanelQueryEditor)\n  .setExploreLogsQueryField(CloudWatchLogsQueryEditor)\n  .setAnnotationQueryCtrl(CloudWatchAnnotationsQueryCtrl);\n","import React, { FC, useEffect, useState } from 'react';\nimport { useDebounce } from 'react-use';\nimport { Input, InlineField } from '@grafana/ui';\nimport {\n  rangeUtil,\n  DataSourcePluginOptionsEditorProps,\n  onUpdateDatasourceJsonDataOption,\n  updateDatasourcePluginJsonDataOption,\n} from '@grafana/data';\nimport { ConnectionConfig } from '@grafana/aws-sdk';\n\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { store } from 'app/store/store';\nimport { notifyApp } from 'app/core/actions';\nimport { createWarningNotification } from 'app/core/copy/appNotification';\n\nimport { CloudWatchJsonData, CloudWatchSecureJsonData } from '../types';\nimport { CloudWatchDatasource } from '../datasource';\nimport { XrayLinkConfig } from './XrayLinkConfig';\n\nexport type Props = DataSourcePluginOptionsEditorProps<CloudWatchJsonData, CloudWatchSecureJsonData>;\n\nexport const ConfigEditor: FC<Props> = (props: Props) => {\n  const { options } = props;\n\n  const datasource = useDatasource(options.name);\n  useAuthenticationWarning(options.jsonData);\n  const logsTimeoutError = useTimoutValidation(props.options.jsonData.logsTimeout);\n\n  return (\n    <>\n      <ConnectionConfig\n        {...props}\n        loadRegions={\n          datasource &&\n          (() => datasource!.getRegions().then((r) => r.filter((r) => r.value !== 'default').map((v) => v.value)))\n        }\n      >\n        <InlineField label=\"Namespaces of Custom Metrics\" labelWidth={28} tooltip=\"Namespaces of Custom Metrics.\">\n          <Input\n            width={60}\n            placeholder=\"Namespace1,Namespace2\"\n            value={options.jsonData.customMetricsNamespaces || ''}\n            onChange={onUpdateDatasourceJsonDataOption(props, 'customMetricsNamespaces')}\n          />\n        </InlineField>\n      </ConnectionConfig>\n\n      <h3 className=\"page-heading\">CloudWatch Logs</h3>\n      <div className=\"gf-form-group\">\n        <InlineField\n          label=\"Timeout\"\n          labelWidth={28}\n          tooltip='Custom timout for CloudWatch Logs insights queries which have max concurrency limits. Default is 15 minutes. Must be a valid duration string, such as \"15m\" \"30s\" \"2000ms\" etc.'\n          invalid={Boolean(logsTimeoutError)}\n        >\n          <Input\n            width={60}\n            placeholder=\"15m\"\n            value={options.jsonData.logsTimeout || ''}\n            onChange={onUpdateDatasourceJsonDataOption(props, 'logsTimeout')}\n            title={'The timeout must be a valid duration string, such as \"15m\" \"30s\" \"2000ms\" etc.'}\n          />\n        </InlineField>\n      </div>\n\n      <XrayLinkConfig\n        onChange={(uid) => updateDatasourcePluginJsonDataOption(props, 'tracingDatasourceUid', uid)}\n        datasourceUid={options.jsonData.tracingDatasourceUid}\n      />\n    </>\n  );\n};\n\nfunction useAuthenticationWarning(jsonData: CloudWatchJsonData) {\n  const addWarning = (message: string) => {\n    store.dispatch(notifyApp(createWarningNotification('CloudWatch Authentication', message)));\n  };\n\n  useEffect(() => {\n    if (jsonData.authType === 'arn') {\n      addWarning('Since grafana 7.3 authentication type \"arn\" is deprecated, falling back to default SDK provider');\n    } else if (jsonData.authType === 'credentials' && !jsonData.profile && !jsonData.database) {\n      addWarning(\n        'As of grafana 7.3 authentication type \"credentials\" should be used only for shared file credentials. \\\n             If you don\\'t have a credentials file, switch to the default SDK provider for extracting credentials \\\n             from environment variables or IAM roles'\n      );\n    }\n  }, [jsonData.authType, jsonData.database, jsonData.profile]);\n}\n\nfunction useDatasource(datasourceName: string) {\n  const [datasource, setDatasource] = useState<CloudWatchDatasource>();\n\n  useEffect(() => {\n    getDatasourceSrv()\n      .loadDatasource(datasourceName)\n      .then((datasource) => {\n        // It's really difficult to type .loadDatasource() because it's inherently untyped as it involves two JSON.parse()'s\n        // So a \"as\" type assertion here is a necessary evil.\n        setDatasource(datasource as CloudWatchDatasource);\n      });\n  }, [datasourceName]);\n\n  return datasource;\n}\n\nfunction useTimoutValidation(value: string | undefined) {\n  const [err, setErr] = useState<undefined | string>(undefined);\n  useDebounce(\n    () => {\n      if (value) {\n        try {\n          rangeUtil.describeInterval(value);\n          setErr(undefined);\n        } catch (e) {\n          setErr(e.toString());\n        }\n      } else {\n        setErr(undefined);\n      }\n    },\n    350,\n    [value]\n  );\n  return err;\n}\n","import React, { useMemo } from 'react';\nimport { MetadataInspectorProps } from '@grafana/data';\nimport { CloudWatchDatasource } from '../datasource';\nimport { CloudWatchQuery, CloudWatchJsonData } from '../types';\nimport { groupBy } from 'lodash';\n\nexport type Props = MetadataInspectorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData>;\n\nexport function MetaInspector({ data = [] }: Props) {\n  const rows = useMemo(() => groupBy(data, 'refId'), [data]);\n\n  return (\n    <>\n      <table className=\"filter-table form-inline\">\n        <thead>\n          <tr>\n            <th>RefId</th>\n            <th>Metric Data Query ID</th>\n            <th>Metric Data Query Expression</th>\n            <th>Period</th>\n            <th />\n          </tr>\n        </thead>\n        {Object.entries(rows).map(([refId, frames], idx) => {\n          if (!frames.length) {\n            return null;\n          }\n\n          const frame = frames[0];\n          const custom = frame.meta?.custom;\n          if (!custom) {\n            return null;\n          }\n\n          return (\n            <tbody key={idx}>\n              <tr>\n                <td>{refId}</td>\n                <td>{custom.id}</td>\n                <td>{frame.meta?.executedQueryString}</td>\n                <td>{custom.period}</td>\n              </tr>\n            </tbody>\n          );\n        })}\n      </table>\n    </>\n  );\n}\n"],"names":["getStyles","theme","infoText","css","spacing","colors","text","secondary","xRayDsId","XrayLinkConfig","datasourceUid","onChange","hasXrayDatasource","Boolean","getDatasourceSrv","getList","pluginId","length","styles","useStyles2","className","Alert","title","severity","InlineField","htmlFor","label","labelWidth","tooltip","DataSourcePicker","ds","uid","current","noDefault","ThrottlingErrorMessage","region","target","rel","href","func","wait","mem","memoize","args","debounce","leading","JSON","stringify","CloudWatchLanguageProvider","LanguageProvider","constructor","datasource","initialValues","super","s","replace","trim","url","params","lastValueFrom","this","awsRequest","startTask","Promise","resolve","then","started","async","logGroups","fetchedFieldsCache","Date","now","time","sortedUniq","join","fields","results","all","map","logGroup","getLogGroupFields","logGroupName","Set","reduce","acc","cur","concat","logGroupFields","f","name","values","suggs","getFieldCompletionItems","context","logGroupNames","functionSuggestions","searchFunctionType","SearchFunctionType","items","STRING_FUNCTIONS","DATETIME_FUNCTIONS","IP_FUNCTIONS","suggestions","push","commandToken","curToken","queryCommand","content","toLowerCase","prevToken","prevNonWhitespaceToken","currentTokenIsFirstArg","handleSortCommand","currentTokenIsAfterCommandAndEmpty","isTokenType","next","currentTokenIsAfterCommand","token","types","includes","nextNonWhitespaceToken","currentTokenIsComma","currentTokenIsCommaOrAfterComma","typeaheadOutput","getFieldAndFilterFunctionCompletionItems","getStatsAggCompletionItems","forEach","group","skipFilter","sugg","boolFuncs","getBoolFuncCompletionItems","fieldsSuggestions","comparisonSuggestions","getComparisonCompletionItems","QUERY_COMMANDS","FIELD_AND_FILTER_FUNCTIONS","AGGREGATION_FUNCTIONS_STATS","BOOLEAN_FUNCTIONS","NUMERIC_OPERATORS","fetchFields","field","insertText","match","undefined","Object","assign","getSyntax","syntax","isStatsQuery","query","grammar","Prism","find","toString","type","input","value","tokens","data","get","filter","offsets","start","selection","offset","end","isFirstToken","prev","getCommandCompletionItems","parenthesisToken","maybeFunctionToken","funcsWithFieldArgs","isInsideFunctionParenthesis","keyword","maybeKeyword","getPreviousTokenExcluding","isAfterKeyword","handleKeyword","handleComparison","startToken","thisToken","previousCommandToken","handleCommand","isFirstArgument","funcName","exclude","main","item","dispatch","state","subscriber","counter","period","step","endPeriod","newPeriod","Math","min","schedule","createInternalXrayLink","getDataSourceSrv","e","console","error","internal","queryType","datasourceName","createAwsConsoleLink","range","interpolatedExpression","expression","interpolatedGroups","urlProps","to","toISOString","from","timeType","tz","editorString","isLiveTail","source","encodeUrl","targetBlank","runWithRetry","queryFun","targets","options","startTime","timerID","subscription","retries","collected","timeoutFunction","timeoutFunc","retry","timeout","retryWaitFunction","retryWaitFunc","pow","random","Observable","observer","run","currentQueryParams","subscribe","frames","collectedPreviously","toDataQueryResponse","complete","errorData","keys","refId","startsWith","errorMessage","errors","config","queries","q","good","splitErrorData","valueOf","dataResponse","message","setTimeout","log","clearTimeout","unsubscribe","TokenType","StatementPosition","SuggestionKind","CompletionItemPriority","LinkedToken","previous","isKeyword","Keyword","isWhiteSpace","Whitespace","isParenthesis","Parenthesis","isIdentifier","Identifier","isString","String","isDoubleQuotedString","Type","isVariable","Variable","isFunction","Function","is","isType","getPreviousNonWhiteSpaceToken","curr","getPreviousOfType","getPreviousUntil","ignoreTypes","some","t","getNextUntil","getPreviousKeyword","getNextNonWhiteSpaceToken","getNextOfType","getSelectToken","currentToken","SELECT","getMetricNameToken","assumedMetricNameToken","assumedStatisticToken","getSelectStatisticToken","getNamespaceToken","fromToken","selectToken","FROM","getFromKeywordToken","nextNonWhiteSpace","toUpperCase","SCHEMA","assumedNamespaceToken","CompletionItemProvider","templateSrv","getTemplateSrv","templateVariables","getVariables","getActualRegion","setRegion","getCompletionProvider","monaco","triggerCharacters","provideCompletionItems","model","position","tokensPerLine","editor","tokenize","getValue","language","lineIndex","_tokenBrand","columnIndex","endColumn","getLineLength","startLineNumber","startColumn","endLineNumber","getValueInRange","sqlToken","Range","containsPosition","linkedTokenBuilder","statementPosition","previousNonWhiteSpace","previousKeyword","previousIsSlash","Operator","SelectKeyword","AfterSelectKeyword","AfterSelectFuncFirstArgument","FromKeyword","AfterFromKeyword","SchemaFuncFirstArgument","Delimiter","SchemaFuncExtraArgument","AfterFrom","WHERE","AND","WhereKey","WhereComparisonOperator","EQUALS","NOT_EQUALS","WhereValue","AfterWhereValue","BY","GROUP","AfterGroupByKeywords","AfterGroupBy","ORDER","AfterOrderByKeywords","AfterOrderByFunction","DESC","ASC","AfterOrderByDirection","Unknown","getStatementPosition","suggestionKinds","FunctionsWithArguments","Metrics","Namespaces","SchemaKeyword","LabelKeys","WhereKeyword","GroupByKeywords","OrderByKeywords","LimitKeyword","ComparisonOperators","LabelValues","LogicalOperators","FunctionsWithoutArguments","SortOrderDirectionKeyword","getSuggestionKinds","getSuggestions","fromPositions","toCompletionItem","rest","kind","languages","CompletionItemKind","Field","sortText","Medium","addSuggestion","suggestion","insertTextRules","CompletionItemInsertTextRule","InsertAsSnippet","command","TRIGGER_SUGGEST","STATISTICS","namespaceToken","getMetrics","m","metrics","getAllMetrics","uniq","metricName","High","metricNameToken","namespaces","namespace","getNamespaces","n","labelKeyTokens","dimensionFilter","getDimensionKeys","test","labelKey","getDimensionValues","o","LOGICAL_OPERATORS","MediumHigh","COMPARISON_OPERATORS","LIMIT","MediumLow","v","Low","DS_QUERY_ENDPOINT","displayAlert","store","notifyApp","createErrorNotification","React","displayCustomError","CloudWatchDatasource","DataSourceWithBackend","instanceSettings","timeSrv","getTimeSrv","memoizedDebounce","AppNotificationTimeout","logQueries","validLogQueries","of","isEmpty","LoadingState","makeLogActionRequest","makeReplacements","scopedVars","skipCache","queryString","rangeUtil","logsTimeout","pipe","mergeMap","logsQuery","dataFrame","queryId","meta","custom","statsGroups","response","dataQueryResponse","request","replaceFn","getRegion","tracingDatasourceUid","fieldName","curTarget","interpolatedRegion","xrayLink","links","addDataLinksToLogsResponse","timeRange","bind","tracingDataSourceUid","metricQueries","validMetricsQueries","filterMetricQuery","dimensions","convertDimensionFormat","statistic","getPeriod","id","sqlExpression","intervalMs","maxDataPoints","getRef","performTimeSeriesQuery","row","limit","direction","logStreamField","logField","requestParams","startFromHead","parseLogGroupName","rowIndex","logStreamName","endTime","timeEpochMs","metricsQueries","queryMode","proxyUrl","defaultRegion","jsonData","languageProvider","sqlCompletionItemProvider","angular","hide","getTargetsByQueryMode","dataQueryResponses","handleLogQueries","handleMetricQueries","merge","metricQueryType","metricEditorMode","MetricQueryType","MetricEditorMode","Error","queryParams","param","statsQuery","dataFrames","startPeriod","scheduler","asyncScheduler","add","increasingInterval","concatMap","_","repeat","share","consecutiveFailedAttempts","scan","failures","prevRecordsMatched","frame","recordsMatched","stats","stat","displayName","queryResponse","zip","tap","CloudWatchLogsQueryStatus","hasOwnProperty","failedAttempts","set","key","every","DataQueryErrorType","takeWhile","observable","onUnsubscribe","stopQueries","innerSub","val","err","logQuery","finalize","toArray","fieldNames","fieldPercentages","i","percent","parseInt","res","dataframes","lastError","findLast","catchError","throwError","firstErrorResult","r","failedRedIds","actualRegion","debouncedAlert","transformSuggestDataFromDataframes","suggestData","toLegacyResponseData","rows","doMetricQueryRequest","subtype","parameters","fieldsToReplace","anyQuery","Array","isArray","headers","resultsToDataFrames","status","getRegions","regions","dimensionFilters","dimensionKey","filterDimensions","getEbsVolumeIds","instanceId","getEc2InstanceAttribute","attributeName","filters","getResourceARNs","resourceType","tags","filterJson","metricNameQuery","dimensionKeysQuery","dimensionValuesQuery","parse","ebsVolumeIdsQuery","ec2InstanceAttributeQuery","targetAttributeName","resourceARNsQuery","tagsJSON","standardStatistics","annotationQuery","annotation","defaultPeriod","prefixMatching","actionPrefix","alarmNamePrefix","targetContainsTemplate","variableExists","k","toTestingStatus","method","getBackendSrv","fetch","result","getDefaultRegion","showContextToggle","convertToCloudWatchTime","date","roundUp","dateMath","round","entries","valueVar","getVariableName","multi","split","displayErrorIfIsMultiTemplateVariable","variable","debouncedCustomAlert","getQueryDisplayText","interpolateVariablesInQueries","isCloudWatchLogsQuery","interpolateMetricsQueryVariables","alias","logIdentifier","colonIndex","lastIndexOf","substr","CloudWatchAnnotationsQueryCtrl","$scope","ctrl","defaultsDeep","matchExact","strings","raw","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","Constructor","protoProps","staticProps","prototype","_templateObject","freeze","_classCallCheck","instance","TypeError","TemplateTag","_this","_len","arguments","transformers","_key","tag","_len2","expressions","_key2","interimTag","transformEndResult","transformString","processSubstitutions","transformer","previousTag","template","_len3","substitutions","_key3","apply","resultSoFar","remainingPart","substitution","transformSubstitution","shift","str","transform","onString","onSubstitution","endResult","onEndResult","defaults","separator","conjunction","serial","opts","arrayLength","indent","separatorIndex","slice","_toConsumableArray","arr","arr2","el","regexp","RegExp","side","splitBy","isValidValue","x","Number","isNaN","replaceWhat","replaceWith","CLIQ_EXAMPLES","category","examples","expr","stripIndents","stripIndent","renderHighlightedMarkup","code","keyPrefix","tokenizer","spans","flattenTokens","aliases","exampleCategory","LogsCheatSheet","PureComponent","onClickExample","renderExpression","onClick","renderLogsCheatSheet","cat","cx","j","render","plugin","DataSourcePlugin","setQueryEditorHelp","setConfigEditor","setDatasource","useState","useEffect","loadDatasource","useDatasource","addWarning","createWarningNotification","authType","profile","database","useAuthenticationWarning","logsTimeoutError","setErr","useDebounce","useTimoutValidation","ConnectionConfig","loadRegions","Input","width","placeholder","customMetricsNamespaces","onUpdateDatasourceJsonDataOption","invalid","updateDatasourcePluginJsonDataOption","setQueryEditor","PanelQueryEditor","setMetadataInspector","useMemo","groupBy","idx","executedQueryString","setExploreMetricsQueryField","setExploreLogsQueryField","CloudWatchLogsQueryEditor","setAnnotationQueryCtrl"],"sourceRoot":""}