{"version":3,"file":"4436.0dfd49f78dc93c695e30.js","mappings":"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","sources":["webpack://grafana/./public/app/angular/AngularLocationWrapper.ts","webpack://grafana/./public/app/angular/core_module.ts","webpack://grafana/./public/app/angular/panel/panel_directive.ts","webpack://grafana/./public/app/angular/panel/panel_editor_tab.ts","webpack://grafana/./public/app/angular/panel/query_editor_row.ts","webpack://grafana/./public/app/angular/filters/filters.ts","webpack://grafana/./public/app/angular/services/alert_srv.ts","webpack://grafana/./public/app/angular/services/dynamic_directive_srv.ts","webpack://grafana/./public/app/angular/services/ng_react.ts","webpack://grafana/./public/app/angular/services/segment_srv.ts","webpack://grafana/./public/app/angular/services/popover_srv.ts","webpack://grafana/./public/app/angular/services/timer.ts","webpack://grafana/./public/app/angular/services/AngularLoader.ts","webpack://grafana/./public/app/angular/jquery_extended.ts","webpack://grafana/./public/app/angular/dropdown_typeahead.ts","webpack://grafana/./public/app/angular/autofill_event_fix.ts","webpack://grafana/./public/app/angular/metric_segment.ts","webpack://grafana/./public/app/angular/misc.ts","webpack://grafana/./public/app/angular/ng_model_on_blur.ts","webpack://grafana/./public/app/angular/tags.ts","webpack://grafana/./public/app/angular/rebuild_on_change.ts","webpack://grafana/./public/app/angular/give_focus.ts","webpack://grafana/./public/app/angular/diff-view.ts","webpack://grafana/./public/app/angular/array_join.ts","webpack://grafana/./public/app/angular/react2angular.ts","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/AnnotationQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor.tsx","webpack://grafana/./public/app/core/components/Select/MetricSelect.tsx","webpack://grafana/./public/app/plugins/datasource/loki/components/AnnotationsQueryEditor.tsx","webpack://grafana/./public/app/angular/angular_wrappers.ts","webpack://grafana/./public/app/angular/components/query_part_editor.ts","webpack://grafana/./public/app/angular/components/form_dropdown/form_dropdown.ts","webpack://grafana/./public/app/angular/components/scroll.ts","webpack://grafana/./public/app/angular/components/jsontree.ts","webpack://grafana/./public/app/angular/components/switch.ts","webpack://grafana/./public/app/angular/components/info_popover.ts","webpack://grafana/./public/app/angular/components/spectrum_picker.ts","webpack://grafana/./public/app/angular/components/code_editor/code_editor.ts","webpack://grafana/./public/app/angular/components/sql_part/sql_part_editor.ts","webpack://grafana/./public/app/angular/components/HttpSettingsCtrl.ts","webpack://grafana/./public/app/angular/components/TlsAuthSettingsCtrl.ts","webpack://grafana/./public/app/angular/components/plugin_component.ts","webpack://grafana/./public/app/angular/GrafanaCtrl.ts","webpack://grafana/./public/app/core/navigation/patch/RouteParamsProvider.ts","webpack://grafana/./public/app/core/navigation/patch/RouteProvider.ts","webpack://grafana/./public/app/angular/bridgeReactAngularRouting.ts","webpack://grafana/./public/app/angular/services/UtilSrv.ts","webpack://grafana/./public/app/angular/services/annotations_srv.ts","webpack://grafana/./public/app/angular/AngularApp.ts","webpack://grafana/./public/app/angular/registerComponents.ts","webpack://grafana/./public/app/angular/injectorMonkeyPatch.ts","webpack://grafana/./public/app/angular/panel/metrics_panel_ctrl.ts","webpack://grafana/./public/app/angular/panel/panel_ctrl.ts","webpack://grafana/./public/app/angular/panel/query_ctrl.ts","webpack://grafana/./public/app/angular/partials.ts","webpack://grafana/./public/app/angular/promiseToDigest.ts","webpack://grafana/./public/app/plugins/datasource/loki/components/LokiOptionFields.tsx","webpack://grafana/./public/app/plugins/datasource/loki/types.ts","webpack://grafana/./public/app/plugins/sdk.ts","webpack://grafana/./public/vendor/angular-other/angular-strap.js","webpack://grafana/./public/vendor/bootstrap/bootstrap.js","webpack://grafana/./public/vendor/tagsinput/bootstrap-tagsinput.js","webpack://grafana/../../opt/drone/yarncache/angular-bindonce-npm-0.3.1-63597abd34-6a9adeb527.zip/node_modules/angular-bindonce/bindonce.js","webpack://grafana/../../opt/drone/yarncache/angular-route-npm-1.8.2-11a799fee9-08d84d6a35.zip/node_modules/angular-route/angular-route.js","webpack://grafana/../../opt/drone/yarncache/angular-route-npm-1.8.2-11a799fee9-08d84d6a35.zip/node_modules/angular-route/index.js","webpack://grafana/../../opt/drone/yarncache/angular-sanitize-npm-1.8.2-378e7cdaed-df06ddee2a.zip/node_modules/angular-sanitize/angular-sanitize.js","webpack://grafana/../../opt/drone/yarncache/angular-sanitize-npm-1.8.2-378e7cdaed-df06ddee2a.zip/node_modules/angular-sanitize/index.js","webpack://grafana/../../opt/drone/yarncache/baron-npm-3.0.3-255b365962-5fd57232e2.zip/node_modules/baron/src/autoUpdate.js","webpack://grafana/../../opt/drone/yarncache/baron-npm-3.0.3-255b365962-5fd57232e2.zip/node_modules/baron/src/controls.js","webpack://grafana/../../opt/drone/yarncache/baron-npm-3.0.3-255b365962-5fd57232e2.zip/node_modules/baron/src/core.js","webpack://grafana/../../opt/drone/yarncache/baron-npm-3.0.3-255b365962-5fd57232e2.zip/node_modules/baron/src/fix.js","webpack://grafana/../../opt/drone/yarncache/baron-npm-3.0.3-255b365962-5fd57232e2.zip/node_modules/baron/src/log.js","webpack://grafana/../../opt/drone/yarncache/baron-npm-3.0.3-255b365962-5fd57232e2.zip/node_modules/baron/src/utils.js"],"sourcesContent":["import { deprecationWarning, urlUtil } from '@grafana/data';\nimport { locationSearchToObject, locationService, navigationLogger } from '@grafana/runtime';\n\n// Ref: https://github.com/angular/angular.js/blob/ae8e903edf88a83fedd116ae02c0628bf72b150c/src/ng/location.js#L5\nconst DEFAULT_PORTS: Record<string, number> = { http: 80, https: 443, ftp: 21 };\n\nexport class AngularLocationWrapper {\n  constructor() {\n    this.absUrl = this.wrapInDeprecationWarning(this.absUrl);\n    this.hash = this.wrapInDeprecationWarning(this.hash);\n    this.host = this.wrapInDeprecationWarning(this.host);\n    this.path = this.wrapInDeprecationWarning(this.path);\n    this.port = this.wrapInDeprecationWarning(this.port, 'window.location');\n    this.protocol = this.wrapInDeprecationWarning(this.protocol, 'window.location');\n    this.replace = this.wrapInDeprecationWarning(this.replace);\n    this.search = this.wrapInDeprecationWarning(this.search);\n    this.state = this.wrapInDeprecationWarning(this.state);\n    this.url = this.wrapInDeprecationWarning(this.url);\n  }\n\n  wrapInDeprecationWarning(fn: Function, replacement?: string) {\n    let self = this;\n\n    return function wrapper() {\n      deprecationWarning('$location', fn.name, replacement || 'locationService');\n      return fn.apply(self, arguments);\n    };\n  }\n\n  absUrl(): string {\n    return `${window.location.origin}${this.url()}`;\n  }\n\n  hash(newHash?: string | null) {\n    navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: hash');\n\n    if (!newHash) {\n      return locationService.getLocation().hash.slice(1);\n    } else {\n      throw new Error('AngularLocationWrapper method not implemented.');\n    }\n  }\n\n  host(): string {\n    return new URL(window.location.href).hostname;\n  }\n\n  path(pathname?: any) {\n    navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: path');\n\n    const location = locationService.getLocation();\n\n    if (pathname !== undefined && pathname !== null) {\n      let parsedPath = String(pathname);\n      parsedPath = parsedPath.startsWith('/') ? parsedPath : `/${parsedPath}`;\n      const url = new URL(`${window.location.origin}${parsedPath}`);\n\n      locationService.push({\n        pathname: url.pathname,\n        search: url.search.length > 0 ? url.search : location.search,\n        hash: url.hash.length > 0 ? url.hash : location.hash,\n      });\n      return this;\n    }\n\n    if (pathname === null) {\n      locationService.push('/');\n      return this;\n    }\n\n    return location.pathname;\n  }\n\n  port(): number | null {\n    const url = new URL(window.location.href);\n    return parseInt(url.port, 10) || DEFAULT_PORTS[url.protocol] || null;\n  }\n\n  protocol(): string {\n    return new URL(window.location.href).protocol.slice(0, -1);\n  }\n\n  replace() {\n    throw new Error('AngularLocationWrapper method not implemented.');\n  }\n\n  search(search?: any, paramValue?: any) {\n    navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: search');\n    if (!search) {\n      return locationService.getSearchObject();\n    }\n\n    if (search && arguments.length > 1) {\n      locationService.partial({\n        [search]: paramValue,\n      });\n\n      return this;\n    }\n\n    if (search) {\n      let newQuery;\n\n      if (typeof search === 'object') {\n        newQuery = { ...search };\n      } else {\n        newQuery = locationSearchToObject(search);\n      }\n\n      for (const key of Object.keys(newQuery)) {\n        // removing params with null | undefined\n        if (newQuery[key] === null || newQuery[key] === undefined) {\n          delete newQuery[key];\n        }\n      }\n\n      const updatedUrl = urlUtil.renderUrl(locationService.getLocation().pathname, newQuery);\n      locationService.push(updatedUrl);\n    }\n\n    return this;\n  }\n\n  state(state?: any) {\n    navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: state');\n    throw new Error('AngularLocationWrapper method not implemented.');\n  }\n\n  url(newUrl?: any) {\n    navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: url');\n\n    if (newUrl !== undefined) {\n      if (newUrl.startsWith('#')) {\n        locationService.push({ ...locationService.getLocation(), hash: newUrl });\n      } else if (newUrl.startsWith('?')) {\n        locationService.push({ ...locationService.getLocation(), search: newUrl });\n      } else if (newUrl.trim().length === 0) {\n        locationService.push('/');\n      } else {\n        locationService.push(newUrl);\n      }\n\n      return locationService;\n    }\n\n    const location = locationService.getLocation();\n    return `${location.pathname}${location.search}${location.hash}`;\n  }\n}\n","import angular from 'angular';\n\nconst coreModule = angular.module('grafana.core', ['ngRoute']);\n\n// legacy modules\nconst angularModules = [\n  coreModule,\n  angular.module('grafana.controllers', []),\n  angular.module('grafana.directives', []),\n  angular.module('grafana.factories', []),\n  angular.module('grafana.services', []),\n  angular.module('grafana.filters', []),\n  angular.module('grafana.routes', []),\n];\n\nexport { angularModules, coreModule };\n\nexport default coreModule;\n","// @ts-ignore\nimport baron from 'baron';\nimport { Subscription } from 'rxjs';\n\nimport { PanelEvents } from '@grafana/data';\nimport { RefreshEvent } from '@grafana/runtime';\nimport { coreModule } from 'app/angular/core_module';\nimport { PanelDirectiveReadyEvent, RenderEvent } from 'app/types/events';\n\nimport { PanelModel } from '../../features/dashboard/state';\n\nimport { PanelCtrl } from './panel_ctrl';\n\nconst panelTemplate = `\n  <ng-transclude class=\"panel-height-helper\"></ng-transclude>\n`;\n\ncoreModule.directive('grafanaPanel', ($rootScope, $document, $timeout) => {\n  return {\n    restrict: 'E',\n    template: panelTemplate,\n    transclude: true,\n    scope: { ctrl: '=' },\n    link: (scope: any, elem) => {\n      const ctrl: PanelCtrl = scope.ctrl;\n      const panel: PanelModel = scope.ctrl.panel;\n      const subs = new Subscription();\n\n      let panelScrollbar: any;\n\n      function resizeScrollableContent() {\n        if (panelScrollbar) {\n          panelScrollbar.update();\n        }\n      }\n\n      ctrl.events.on(PanelEvents.componentDidMount, () => {\n        if ((ctrl as any).__proto__.constructor.scrollable) {\n          const scrollRootClass = 'baron baron__root baron__clipper panel-content--scrollable';\n          const scrollerClass = 'baron__scroller';\n          const scrollBarHTML = `\n            <div class=\"baron__track\">\n              <div class=\"baron__bar\"></div>\n            </div>\n          `;\n\n          const scrollRoot = elem;\n          const scroller = elem.find(':first').find(':first');\n\n          scrollRoot.addClass(scrollRootClass);\n          $(scrollBarHTML).appendTo(scrollRoot);\n          scroller.addClass(scrollerClass);\n\n          panelScrollbar = baron({\n            root: scrollRoot[0],\n            scroller: scroller[0],\n            bar: '.baron__bar',\n            barOnCls: '_scrollbar',\n            scrollingCls: '_scrolling',\n          });\n\n          panelScrollbar.scroll();\n        }\n      });\n\n      function updateDimensionsFromParentScope() {\n        ctrl.height = scope.$parent.$parent.size.height;\n        ctrl.width = scope.$parent.$parent.size.width;\n      }\n\n      updateDimensionsFromParentScope();\n\n      // Pass PanelModel events down to angular controller event emitter\n      subs.add(\n        panel.events.subscribe(RefreshEvent, () => {\n          updateDimensionsFromParentScope();\n          ctrl.events.emit('refresh');\n        })\n      );\n\n      subs.add(\n        panel.events.subscribe(RenderEvent, (event) => {\n          // this event originated from angular so no need to bubble it back\n          if (event.payload?.fromAngular) {\n            return;\n          }\n\n          updateDimensionsFromParentScope();\n\n          $timeout(() => {\n            resizeScrollableContent();\n            ctrl.events.emit('render');\n          });\n        })\n      );\n\n      subs.add(\n        ctrl.events.subscribe(RenderEvent, (event) => {\n          // this event originated from angular so bubble it to react so the PanelChromeAngular can update the panel header alert state\n          if (event.payload) {\n            event.payload.fromAngular = true;\n            panel.events.publish(event);\n          }\n        })\n      );\n\n      scope.$on('$destroy', () => {\n        elem.off();\n\n        // Remove PanelModel.event subs\n        subs.unsubscribe();\n        // Remove Angular controller event subs\n        ctrl.events.emit(PanelEvents.panelTeardown);\n        ctrl.events.removeAllListeners();\n\n        if (panelScrollbar) {\n          panelScrollbar.dispose();\n        }\n      });\n\n      panel.events.publish(PanelDirectiveReadyEvent);\n    },\n  };\n});\n","import angular from 'angular';\n\nconst directiveModule = angular.module('grafana.directives');\nconst directiveCache: any = {};\n\n/** @ngInject */\nfunction panelEditorTab(dynamicDirectiveSrv: any) {\n  return dynamicDirectiveSrv.create({\n    scope: {\n      ctrl: '=',\n      editorTab: '=',\n    },\n    directive: (scope: any) => {\n      const pluginId = scope.ctrl.pluginId;\n      const tabName = scope.editorTab.title\n        .toLowerCase()\n        .replace(' ', '-')\n        .replace('&', '')\n        .replace(' ', '')\n        .replace(' ', '-');\n\n      if (directiveCache[pluginId]) {\n        if (directiveCache[pluginId][tabName]) {\n          return directiveCache[pluginId][tabName];\n        }\n      } else {\n        directiveCache[pluginId] = [];\n      }\n\n      const result = {\n        fn: () => scope.editorTab.directiveFn(),\n        name: `panel-editor-tab-${pluginId}${tabName}`,\n      };\n\n      directiveCache[pluginId][tabName] = result;\n\n      return result;\n    },\n  });\n}\n\ndirectiveModule.directive('panelEditorTab', panelEditorTab);\n","import { coreModule } from 'app/angular/core_module';\n\nexport class QueryRowCtrl {\n  target: any;\n  queryCtrl: any;\n  panelCtrl: any;\n  panel: any;\n  hasTextEditMode = false;\n\n  $onInit() {\n    this.panelCtrl = this.queryCtrl.panelCtrl;\n    this.target = this.queryCtrl.target;\n    this.panel = this.panelCtrl.panel;\n\n    if (this.hasTextEditMode && this.queryCtrl.toggleEditorMode) {\n      // expose this function to react parent component\n      this.panelCtrl.toggleEditorMode = this.queryCtrl.toggleEditorMode.bind(this.queryCtrl);\n    }\n\n    if (this.queryCtrl.getCollapsedText) {\n      // expose this function to react parent component\n      this.panelCtrl.getCollapsedText = this.queryCtrl.getCollapsedText.bind(this.queryCtrl);\n    }\n  }\n}\n\n/** @ngInject */\nfunction queryEditorRowDirective() {\n  return {\n    restrict: 'E',\n    controller: QueryRowCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    templateUrl: 'public/app/angular/panel/partials/query_editor_row.html',\n    transclude: true,\n    scope: {\n      queryCtrl: '=',\n      canCollapse: '=',\n      hasTextEditMode: '=',\n    },\n  };\n}\n\ncoreModule.directive('queryEditorRow', queryEditorRowDirective);\n","import angular from 'angular';\nimport { isArray, isNull, isObject, isUndefined } from 'lodash';\n\nimport { dateTime } from '@grafana/data';\nimport { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_srv';\n\nimport coreModule from '../core_module';\n\ncoreModule.filter('stringSort', () => {\n  return (input: any) => {\n    return input.sort();\n  };\n});\n\ncoreModule.filter('slice', () => {\n  return (arr: any[], start: any, end: any) => {\n    if (!isUndefined(arr)) {\n      return arr.slice(start, end);\n    }\n    return arr;\n  };\n});\n\ncoreModule.filter('stringify', () => {\n  return (arr: any[]) => {\n    if (isObject(arr) && !isArray(arr)) {\n      return angular.toJson(arr);\n    } else {\n      return isNull(arr) ? null : arr.toString();\n    }\n  };\n});\n\ncoreModule.filter('moment', () => {\n  return (date: string, mode: string) => {\n    switch (mode) {\n      case 'ago':\n        return dateTime(date).fromNow();\n    }\n    return dateTime(date).fromNow();\n  };\n});\n\nfunction interpolateTemplateVars(templateSrv: TemplateSrv = getTemplateSrv()) {\n  const filterFunc: any = (text: string, scope: any) => {\n    let scopedVars;\n    if (scope.ctrl) {\n      scopedVars = (scope.ctrl.panel || scope.ctrl.row).scopedVars;\n    } else {\n      scopedVars = scope.row.scopedVars;\n    }\n\n    return templateSrv.replaceWithText(text, scopedVars);\n  };\n\n  filterFunc.$stateful = true;\n  return filterFunc;\n}\n\ncoreModule.filter('interpolateTemplateVars', interpolateTemplateVars);\nexport default {};\n","import coreModule from 'app/angular/core_module';\n\nexport class AlertSrv {\n  constructor() {}\n\n  set() {\n    console.warn('old deprecated alert srv being used');\n  }\n}\n\n// this is just added to not break old plugins that might be using it\ncoreModule.service('alertSrv', AlertSrv);\n","import angular from 'angular';\n\nimport coreModule from '../core_module';\n\nclass DynamicDirectiveSrv {\n  /** @ngInject */\n  constructor(private $compile: angular.ICompileService) {}\n\n  addDirective(element: any, name: string, scope: any) {\n    const child = angular.element(document.createElement(name));\n    this.$compile(child)(scope);\n\n    element.empty();\n    element.append(child);\n  }\n\n  link(scope: any, elem: JQLite, attrs: any, options: any) {\n    const directiveInfo = options.directive(scope);\n    if (!directiveInfo || !directiveInfo.fn) {\n      elem.empty();\n      return;\n    }\n\n    if (!directiveInfo.fn.registered) {\n      coreModule.directive(attrs.$normalize(directiveInfo.name), directiveInfo.fn);\n      directiveInfo.fn.registered = true;\n    }\n\n    this.addDirective(elem, directiveInfo.name, scope);\n  }\n\n  create(options: any) {\n    const directiveDef = {\n      restrict: 'E',\n      scope: options.scope,\n      link: (scope: any, elem: JQLite, attrs: any) => {\n        if (options.watchPath) {\n          let childScope: any = null;\n          scope.$watch(options.watchPath, () => {\n            if (childScope) {\n              childScope.$destroy();\n            }\n            childScope = scope.$new();\n            this.link(childScope, elem, attrs, options);\n          });\n        } else {\n          this.link(scope, elem, attrs, options);\n        }\n      },\n    };\n\n    return directiveDef;\n  }\n}\n\ncoreModule.service('dynamicDirectiveSrv', DynamicDirectiveSrv);\n","//\n// This is using ng-react with this PR applied https://github.com/ngReact/ngReact/pull/199\n//\n\n// # ngReact\n// ### Use React Components inside of your Angular applications\n//\n// Composed of\n// - reactComponent (generic directive for delegating off to React Components)\n// - reactDirective (factory for creating specific directives that correspond to reactComponent directives)\n\nimport angular, { auto } from 'angular';\nimport { kebabCase } from 'lodash';\nimport React, { ComponentType } from 'react';\nimport ReactDOM from 'react-dom';\n\n// get a react component from name (components can be an angular injectable e.g. value, factory or\n// available on window\nfunction getReactComponent(name: string | Function, $injector: auto.IInjectorService): ComponentType {\n  // if name is a function assume it is component and return it\n  if (angular.isFunction(name)) {\n    return name as unknown as ComponentType;\n  }\n\n  // a React component name must be specified\n  if (!name) {\n    throw new Error('ReactComponent name attribute must be specified');\n  }\n\n  // ensure the specified React component is accessible, and fail fast if it's not\n  let reactComponent;\n  try {\n    reactComponent = $injector.get(name);\n  } catch (e) {}\n\n  if (!reactComponent) {\n    try {\n      reactComponent = name.split('.').reduce((current, namePart) => {\n        // @ts-ignore\n        return current[namePart];\n      }, window);\n    } catch (e) {}\n  }\n\n  if (!reactComponent) {\n    throw Error('Cannot find react component ' + name);\n  }\n\n  return reactComponent as unknown as ComponentType;\n}\n\n// wraps a function with scope.$apply, if already applied just return\nfunction applied(fn: any, scope: any) {\n  if (fn.wrappedInApply) {\n    return fn;\n  }\n  // this had the equivalent of `eslint-disable-next-line prefer-arrow/prefer-arrow-functions`\n  const wrapped: any = function () {\n    const args = arguments;\n    const phase = scope.$root.$$phase;\n    if (phase === '$apply' || phase === '$digest') {\n      return fn.apply(null, args);\n    } else {\n      return scope.$apply(() => {\n        return fn.apply(null, args);\n      });\n    }\n  };\n  wrapped.wrappedInApply = true;\n  return wrapped;\n}\n\n/**\n * wraps functions on obj in scope.$apply\n *\n * keeps backwards compatibility, as if propsConfig is not passed, it will\n * work as before, wrapping all functions and won't wrap only when specified.\n *\n * @version 0.4.1\n * @param obj react component props\n * @param scope current scope\n * @param propsConfig configuration object for all properties\n * @returns {Object} props with the functions wrapped in scope.$apply\n */\nfunction applyFunctions(obj: any, scope: any, propsConfig?: any): object {\n  return Object.keys(obj || {}).reduce((prev, key) => {\n    const value = obj[key];\n    const config = (propsConfig || {})[key] || {};\n    /**\n     * wrap functions in a function that ensures they are scope.$applied\n     * ensures that when function is called from a React component\n     * the Angular digest cycle is run\n     */\n    // @ts-ignore\n    prev[key] = angular.isFunction(value) && config.wrapApply !== false ? applied(value, scope) : value;\n\n    return prev;\n  }, {});\n}\n\n/**\n *\n * @param watchDepth (value of HTML watch-depth attribute)\n * @param scope (angular scope)\n *\n * Uses the watchDepth attribute to determine how to watch props on scope.\n * If watchDepth attribute is NOT reference or collection, watchDepth defaults to deep watching by value\n */\nfunction watchProps(watchDepth: string, scope: any, watchExpressions: any[], listener: any) {\n  const supportsWatchCollection = angular.isFunction(scope.$watchCollection);\n  const supportsWatchGroup = angular.isFunction(scope.$watchGroup);\n\n  const watchGroupExpressions = [];\n\n  for (const expr of watchExpressions) {\n    const actualExpr = getPropExpression(expr);\n    const exprWatchDepth = getPropWatchDepth(watchDepth, expr);\n\n    // ignore empty expressions & expressions with functions\n    if (!actualExpr || actualExpr.match(/\\(.*\\)/) || exprWatchDepth === 'one-time') {\n      continue;\n    }\n\n    if (exprWatchDepth === 'collection' && supportsWatchCollection) {\n      scope.$watchCollection(actualExpr, listener);\n    } else if (exprWatchDepth === 'reference' && supportsWatchGroup) {\n      watchGroupExpressions.push(actualExpr);\n    } else {\n      scope.$watch(actualExpr, listener, exprWatchDepth !== 'reference');\n    }\n  }\n\n  if (watchDepth === 'one-time') {\n    listener();\n  }\n\n  if (watchGroupExpressions.length) {\n    scope.$watchGroup(watchGroupExpressions, listener);\n  }\n}\n\n// render React component, with scope[attrs.props] being passed in as the component props\nfunction renderComponent(component: any, props: object, scope: any, elem: Element[]) {\n  scope.$evalAsync(() => {\n    ReactDOM.render(React.createElement(component, props), elem[0]);\n  });\n}\n\n// get prop name from prop (string or array)\nfunction getPropName(prop: any) {\n  return Array.isArray(prop) ? prop[0] : prop;\n}\n\n// get prop name from prop (string or array)\nfunction getPropConfig(prop: any) {\n  return Array.isArray(prop) ? prop[1] : {};\n}\n\n// get prop expression from prop (string or array)\nfunction getPropExpression(prop: any) {\n  return Array.isArray(prop) ? prop[0] : prop;\n}\n\n/**\n * Finds the normalized attribute knowing that React props accept any type of capitalization and it also handles\n * kabab case attributes which can be used in case the attribute would also be a standard html attribute and would be\n * evaluated by the browser as such.\n * @param attrs All attributes of the component.\n * @param propName Name of the prop that react component expects.\n */\nfunction findAttribute(attrs: object, propName: string): string {\n  const index = Object.keys(attrs).find((attr: any) => {\n    return attr.toLowerCase() === propName.toLowerCase() || kebabCase(attr) === kebabCase(propName);\n  });\n  // @ts-ignore\n  return attrs[index];\n}\n\n// get watch depth of prop (string or array)\nfunction getPropWatchDepth(defaultWatch: string, prop: string | any[]) {\n  const customWatchDepth = Array.isArray(prop) && angular.isObject(prop[1]) && prop[1].watchDepth;\n  return customWatchDepth || defaultWatch;\n}\n\n// # reactComponent\n// Directive that allows React components to be used in Angular templates.\n//\n// Usage:\n//     <react-component name=\"Hello\" props=\"name\"/>\n//\n// This requires that there exists an injectable or globally available 'Hello' React component.\n// The 'props' attribute is optional and is passed to the component.\n//\n// The following would would create and register the component:\n//\n//     var module = angular.module('ace.react.components');\n//     module.value('Hello', React.createClass({\n//         render: function() {\n//             return <div>Hello {this.props.name}</div>;\n//         }\n//     }));\n//\nconst reactComponent = ($injector: any): any => {\n  return {\n    restrict: 'E',\n    replace: true,\n    link: function (scope: any, elem: Element[], attrs: any) {\n      const reactComponent = getReactComponent(attrs.name, $injector);\n\n      const renderMyComponent = () => {\n        const scopeProps = scope.$eval(attrs.props);\n        const props = applyFunctions(scopeProps, scope);\n\n        renderComponent(reactComponent, props, scope, elem);\n      };\n\n      // If there are props, re-render when they change\n      attrs.props ? watchProps(attrs.watchDepth, scope, [attrs.props], renderMyComponent) : renderMyComponent();\n\n      // cleanup when scope is destroyed\n      scope.$on('$destroy', () => {\n        if (!attrs.onScopeDestroy) {\n          ReactDOM.unmountComponentAtNode(elem[0]);\n        } else {\n          scope.$eval(attrs.onScopeDestroy, {\n            unmountComponent: ReactDOM.unmountComponentAtNode.bind(this, elem[0]),\n          });\n        }\n      });\n    },\n  };\n};\n\n// # reactDirective\n// Factory function to create directives for React components.\n//\n// With a component like this:\n//\n//     var module = angular.module('ace.react.components');\n//     module.value('Hello', React.createClass({\n//         render: function() {\n//             return <div>Hello {this.props.name}</div>;\n//         }\n//     }));\n//\n// A directive can be created and registered with:\n//\n//     module.directive('hello', function(reactDirective) {\n//         return reactDirective('Hello', ['name']);\n//     });\n//\n// Where the first argument is the injectable or globally accessible name of the React component\n// and the second argument is an array of property names to be watched and passed to the React component\n// as props.\n//\n// This directive can then be used like this:\n//\n//     <hello name=\"name\"/>\n//\nconst reactDirective = ($injector: auto.IInjectorService) => {\n  return (reactComponentName: string, props: string[], conf: any, injectableProps: any) => {\n    const directive = {\n      restrict: 'E',\n      replace: true,\n      link: function (scope: any, elem: Element[], attrs: any) {\n        const reactComponent = getReactComponent(reactComponentName, $injector);\n\n        // if props is not defined, fall back to use the React component's propTypes if present\n        props = props || Object.keys(reactComponent.propTypes || {});\n\n        // for each of the properties, get their scope value and set it to scope.props\n        const renderMyComponent = () => {\n          let scopeProps: any = {};\n          const config: any = {};\n\n          props.forEach((prop) => {\n            const propName = getPropName(prop);\n            scopeProps[propName] = scope.$eval(findAttribute(attrs, propName));\n            config[propName] = getPropConfig(prop);\n          });\n\n          scopeProps = applyFunctions(scopeProps, scope, config);\n          scopeProps = angular.extend({}, scopeProps, injectableProps);\n          renderComponent(reactComponent, scopeProps, scope, elem);\n        };\n\n        // watch each property name and trigger an update whenever something changes,\n        // to update scope.props with new values\n        const propExpressions = props.map((prop) => {\n          return Array.isArray(prop)\n            ? [findAttribute(attrs, prop[0]), getPropConfig(prop)]\n            : findAttribute(attrs, prop);\n        });\n\n        // If we don't have any props, then our watch statement won't fire.\n        props.length ? watchProps(attrs.watchDepth, scope, propExpressions, renderMyComponent) : renderMyComponent();\n\n        // cleanup when scope is destroyed\n        scope.$on('$destroy', () => {\n          if (!attrs.onScopeDestroy) {\n            ReactDOM.unmountComponentAtNode(elem[0]);\n          } else {\n            scope.$eval(attrs.onScopeDestroy, {\n              unmountComponent: ReactDOM.unmountComponentAtNode.bind(this, elem[0]),\n            });\n          }\n        });\n      },\n    };\n    return angular.extend(directive, conf);\n  };\n};\n\nconst ngModule = angular.module('react', []);\nngModule.directive('reactComponent', ['$injector', reactComponent]);\nngModule.factory('reactDirective', ['$injector', reactDirective]);\n","import { each, isString, map } from 'lodash';\n\nimport coreModule from '../core_module';\n\n/** @ngInject */\nexport function uiSegmentSrv(this: any, $sce: any, templateSrv: any) {\n  const self = this;\n\n  class MetricSegment {\n    value: string;\n    html: any;\n    type: any;\n    expandable?: boolean;\n    text?: string;\n    cssClass?: string;\n    fake?: boolean;\n    custom?: boolean;\n    selectMode?: any;\n\n    constructor(options: any) {\n      if (options === '*' || options.value === '*') {\n        this.value = '*';\n        this.html = $sce.trustAsHtml('<i class=\"fa fa-asterisk\"><i>');\n        this.type = options.type;\n        this.expandable = true;\n        return;\n      }\n\n      if (isString(options)) {\n        this.value = options;\n        this.html = $sce.trustAsHtml(templateSrv.highlightVariablesAsHtml(this.value));\n        return;\n      }\n\n      // temp hack to work around legacy inconsistency in segment model\n      this.text = options.value;\n\n      this.cssClass = options.cssClass;\n      this.custom = options.custom;\n      this.type = options.type;\n      this.fake = options.fake;\n      this.value = options.value;\n      this.selectMode = options.selectMode;\n      this.expandable = options.expandable;\n      this.html = options.html || $sce.trustAsHtml(templateSrv.highlightVariablesAsHtml(this.value));\n    }\n  }\n\n  this.getSegmentForValue = function (value: string, fallbackText: string) {\n    if (value) {\n      return this.newSegment(value);\n    } else {\n      return this.newSegment({ value: fallbackText, fake: true });\n    }\n  };\n\n  this.newSelectMeasurement = () => {\n    return new MetricSegment({ value: 'select measurement', fake: true });\n  };\n\n  this.newFake = (text: string, type: string, cssClass: string) => {\n    return new MetricSegment({ value: text, fake: true, type: type, cssClass: cssClass });\n  };\n\n  this.newSegment = (options: any) => {\n    return new MetricSegment(options);\n  };\n\n  this.newKey = (key: string) => {\n    return new MetricSegment({ value: key, type: 'key', cssClass: 'query-segment-key' });\n  };\n\n  this.newKeyValue = (value: string) => {\n    return new MetricSegment({ value: value, type: 'value', cssClass: 'query-segment-value' });\n  };\n\n  this.newCondition = (condition: string) => {\n    return new MetricSegment({ value: condition, type: 'condition', cssClass: 'query-keyword' });\n  };\n\n  this.newOperator = (op: string) => {\n    return new MetricSegment({ value: op, type: 'operator', cssClass: 'query-segment-operator' });\n  };\n\n  this.newOperators = (ops: string[]) => {\n    return map(ops, (op) => {\n      return new MetricSegment({ value: op, type: 'operator', cssClass: 'query-segment-operator' });\n    });\n  };\n\n  this.transformToSegments = (addTemplateVars: boolean, variableTypeFilter: string) => {\n    return (results: any[]) => {\n      const segments = map(results, (segment) => {\n        return self.newSegment({ value: segment.text, expandable: segment.expandable });\n      });\n\n      if (addTemplateVars) {\n        each(templateSrv.getVariables(), (variable) => {\n          if (variableTypeFilter === void 0 || variableTypeFilter === variable.type) {\n            segments.unshift(self.newSegment({ type: 'value', value: '$' + variable.name, expandable: true }));\n          }\n        });\n      }\n\n      return segments;\n    };\n  };\n\n  this.newSelectMetric = () => {\n    return new MetricSegment({ value: 'select metric', fake: true });\n  };\n\n  this.newPlusButton = () => {\n    return new MetricSegment({\n      fake: true,\n      html: '<i class=\"fa fa-plus \"></i>',\n      type: 'plus-button',\n      cssClass: 'query-part',\n    });\n  };\n}\n\ncoreModule.service('uiSegmentSrv', uiSegmentSrv);\n","import { extend } from 'lodash';\n// @ts-ignore\nimport Drop from 'tether-drop';\n\nimport { GrafanaRootScope } from 'app/angular/GrafanaCtrl';\nimport coreModule from 'app/angular/core_module';\n\n/** @ngInject */\nfunction popoverSrv(this: any, $compile: any, $rootScope: GrafanaRootScope, $timeout: any) {\n  let openDrop: any = null;\n\n  this.close = () => {\n    if (openDrop) {\n      openDrop.close();\n    }\n  };\n\n  this.show = (options: any) => {\n    if (openDrop) {\n      openDrop.close();\n      openDrop = null;\n    }\n\n    const scope = extend($rootScope.$new(true), options.model);\n    let drop: any;\n\n    const cleanUp = () => {\n      setTimeout(() => {\n        scope.$destroy();\n\n        if (drop.tether) {\n          drop.destroy();\n        }\n\n        if (options.onClose) {\n          options.onClose();\n        }\n      });\n\n      openDrop = null;\n    };\n\n    scope.dismiss = () => {\n      drop.close();\n    };\n\n    const contentElement = document.createElement('div');\n    contentElement.innerHTML = options.template;\n\n    $compile(contentElement)(scope);\n\n    $timeout(() => {\n      drop = new Drop({\n        target: options.element,\n        content: contentElement,\n        position: options.position,\n        classes: options.classNames || 'drop-popover',\n        openOn: options.openOn,\n        hoverCloseDelay: 200,\n        tetherOptions: {\n          constraints: [{ to: 'scrollParent', attachment: 'together' }],\n        },\n      });\n\n      drop.on('close', () => {\n        cleanUp();\n      });\n\n      openDrop = drop;\n      openDrop.open();\n    }, 100);\n\n    // return close function\n    return () => {\n      if (drop) {\n        drop.close();\n      }\n    };\n  };\n}\n\ncoreModule.service('popoverSrv', popoverSrv);\n","import { ITimeoutService } from 'angular';\nimport { without, each } from 'lodash';\n\nimport coreModule from 'app/angular/core_module';\n\n// This service really just tracks a list of $timeout promises to give us a\n// method for canceling them all when we need to\nexport class Timer {\n  timers: Array<angular.IPromise<any>> = [];\n\n  /** @ngInject */\n  constructor(private $timeout: ITimeoutService) {}\n\n  register(promise: angular.IPromise<any>) {\n    this.timers.push(promise);\n    return promise;\n  }\n\n  cancel(promise: angular.IPromise<any>) {\n    this.timers = without(this.timers, promise);\n    this.$timeout.cancel(promise);\n  }\n\n  cancelAll() {\n    each(this.timers, (t) => {\n      this.$timeout.cancel(t);\n    });\n    this.timers = [];\n  }\n}\n\ncoreModule.service('timer', Timer);\n","import angular from 'angular';\nimport { assign } from 'lodash';\n\nimport { AngularComponent, AngularLoader as AngularLoaderInterface } from '@grafana/runtime';\nimport { GrafanaRootScope } from 'app/angular/GrafanaCtrl';\nimport coreModule from 'app/angular/core_module';\n\nexport class AngularLoader implements AngularLoaderInterface {\n  /** @ngInject */\n  constructor(private $compile: any, private $rootScope: GrafanaRootScope) {}\n\n  load(elem: any, scopeProps: any, template: string): AngularComponent {\n    const scope = this.$rootScope.$new();\n\n    assign(scope, scopeProps);\n\n    const compiledElem = this.$compile(template)(scope);\n    const rootNode = angular.element(elem);\n    rootNode.append(compiledElem);\n\n    return {\n      destroy: () => {\n        scope.$destroy();\n        compiledElem.remove();\n      },\n      digest: () => {\n        if (!scope.$$phase) {\n          scope.$digest();\n        }\n      },\n      getScope: () => {\n        return scope;\n      },\n    };\n  }\n}\n\ncoreModule.service('angularLoader', AngularLoader);\n","import angular from 'angular';\nimport $ from 'jquery';\nimport { extend } from 'lodash';\n\nconst $win = $(window);\n\n$.fn.place_tt = (() => {\n  const defaults = {\n    offset: 5,\n  };\n\n  return function (this: any, x: number, y: number, opts: any) {\n    opts = $.extend(true, {}, defaults, opts);\n\n    return this.each(() => {\n      const $tooltip = $(this);\n      let width, height;\n\n      $tooltip.addClass('grafana-tooltip');\n\n      $('#tooltip').remove();\n      $tooltip.appendTo(document.body);\n\n      if (opts.compile) {\n        angular\n          .element(document)\n          .injector()\n          .invoke([\n            '$compile',\n            '$rootScope',\n            ($compile, $rootScope) => {\n              const tmpScope = $rootScope.$new(true);\n              extend(tmpScope, opts.scopeData);\n\n              $compile($tooltip)(tmpScope);\n              tmpScope.$digest();\n              tmpScope.$destroy();\n            },\n          ]);\n      }\n\n      width = $tooltip.outerWidth(true)!;\n      height = $tooltip.outerHeight(true)!;\n\n      const left = x + opts.offset + width > $win.width()! ? x - opts.offset - width : x + opts.offset;\n      const top = y + opts.offset + height > $win.height()! ? y - opts.offset - height : y + opts.offset;\n\n      $tooltip.css('left', left > 0 ? left : 0);\n      $tooltip.css('top', top > 0 ? top : 0);\n    });\n  };\n})();\n","import $ from 'jquery';\nimport { each, reduce } from 'lodash';\n\nimport coreModule from './core_module';\n\n/** @ngInject */\nexport function dropdownTypeahead($compile: any) {\n  const inputTemplate =\n    '<input type=\"text\"' +\n    ' class=\"gf-form-input input-medium tight-form-input\"' +\n    ' spellcheck=\"false\" style=\"display:none\"></input>';\n\n  const buttonTemplate =\n    '<a class=\"gf-form-label tight-form-func dropdown-toggle\"' +\n    ' tabindex=\"1\" gf-dropdown=\"menuItems\" data-toggle=\"dropdown\"' +\n    ' ><i class=\"fa fa-plus\"></i></a>';\n\n  return {\n    scope: {\n      menuItems: '=dropdownTypeahead',\n      dropdownTypeaheadOnSelect: '&dropdownTypeaheadOnSelect',\n      model: '=ngModel',\n    },\n    link: ($scope: any, elem: any, attrs: any) => {\n      const $input = $(inputTemplate);\n      const $button = $(buttonTemplate);\n      $input.appendTo(elem);\n      $button.appendTo(elem);\n\n      if (attrs.linkText) {\n        $button.html(attrs.linkText);\n      }\n\n      if (attrs.ngModel) {\n        $scope.$watch('model', (newValue: any) => {\n          each($scope.menuItems, (item) => {\n            each(item.submenu, (subItem) => {\n              if (subItem.value === newValue) {\n                $button.html(subItem.text);\n              }\n            });\n          });\n        });\n      }\n\n      const typeaheadValues = reduce(\n        $scope.menuItems,\n        (memo: any[], value, index) => {\n          if (!value.submenu) {\n            value.click = 'menuItemSelected(' + index + ')';\n            memo.push(value.text);\n          } else {\n            each(value.submenu, (item, subIndex) => {\n              item.click = 'menuItemSelected(' + index + ',' + subIndex + ')';\n              memo.push(value.text + ' ' + item.text);\n            });\n          }\n          return memo;\n        },\n        []\n      );\n\n      const closeDropdownMenu = () => {\n        $input.hide();\n        $input.val('');\n        $button.show();\n        $button.focus();\n        elem.removeClass('open');\n      };\n\n      $scope.menuItemSelected = (index: number, subIndex: number) => {\n        const menuItem = $scope.menuItems[index];\n        const payload: any = { $item: menuItem };\n        if (menuItem.submenu && subIndex !== void 0) {\n          payload.$subItem = menuItem.submenu[subIndex];\n        }\n        $scope.dropdownTypeaheadOnSelect(payload);\n        closeDropdownMenu();\n      };\n\n      $input.attr('data-provide', 'typeahead');\n      $input.typeahead({\n        source: typeaheadValues,\n        minLength: 1,\n        items: 10,\n        updater: (value: string) => {\n          const result: any = {};\n          each($scope.menuItems, (menuItem) => {\n            each(menuItem.submenu, (submenuItem) => {\n              if (value === menuItem.text + ' ' + submenuItem.text) {\n                result.$subItem = submenuItem;\n                result.$item = menuItem;\n              }\n            });\n          });\n\n          if (result.$item) {\n            $scope.$apply(() => {\n              $scope.dropdownTypeaheadOnSelect(result);\n            });\n          }\n\n          $input.trigger('blur');\n          return '';\n        },\n      });\n\n      $button.click(() => {\n        $button.hide();\n        $input.show();\n        $input.focus();\n      });\n\n      $input.keyup(() => {\n        elem.toggleClass('open', $input.val() === '');\n      });\n\n      elem.mousedown((evt: Event) => {\n        evt.preventDefault();\n      });\n\n      $input.blur(() => {\n        $input.hide();\n        $input.val('');\n        $button.show();\n        $button.focus();\n        // clicking the function dropdown menu won't\n        // work if you remove class at once\n        setTimeout(() => {\n          elem.removeClass('open');\n        }, 200);\n      });\n\n      $compile(elem.contents())($scope);\n    },\n  };\n}\n\n/** @ngInject */\nexport function dropdownTypeahead2($compile: any) {\n  const inputTemplate =\n    '<input type=\"text\"' + ' class=\"gf-form-input\"' + ' spellcheck=\"false\" style=\"display:none\"></input>';\n\n  const buttonTemplate =\n    '<a class=\"{{buttonTemplateClass}} dropdown-toggle\"' +\n    ' tabindex=\"1\" gf-dropdown=\"menuItems\" data-toggle=\"dropdown\"' +\n    ' ><i class=\"fa fa-plus\"></i></a>';\n\n  return {\n    scope: {\n      menuItems: '=dropdownTypeahead2',\n      dropdownTypeaheadOnSelect: '&dropdownTypeaheadOnSelect',\n      model: '=ngModel',\n      buttonTemplateClass: '@',\n    },\n    link: ($scope: any, elem: any, attrs: any) => {\n      const $input = $(inputTemplate);\n\n      if (!$scope.buttonTemplateClass) {\n        $scope.buttonTemplateClass = 'gf-form-input';\n      }\n\n      const $button = $(buttonTemplate);\n      const timeoutId = {\n        blur: null as any,\n      };\n      $input.appendTo(elem);\n      $button.appendTo(elem);\n\n      if (attrs.linkText) {\n        $button.html(attrs.linkText);\n      }\n\n      if (attrs.ngModel) {\n        $scope.$watch('model', (newValue: any) => {\n          each($scope.menuItems, (item) => {\n            each(item.submenu, (subItem) => {\n              if (subItem.value === newValue) {\n                $button.html(subItem.text);\n              }\n            });\n          });\n        });\n      }\n\n      const typeaheadValues = reduce(\n        $scope.menuItems,\n        (memo: any[], value, index) => {\n          if (!value.submenu) {\n            value.click = 'menuItemSelected(' + index + ')';\n            memo.push(value.text);\n          } else {\n            each(value.submenu, (item, subIndex) => {\n              item.click = 'menuItemSelected(' + index + ',' + subIndex + ')';\n              memo.push(value.text + ' ' + item.text);\n            });\n          }\n          return memo;\n        },\n        []\n      );\n\n      const closeDropdownMenu = () => {\n        $input.hide();\n        $input.val('');\n        $button.show();\n        $button.focus();\n        elem.removeClass('open');\n      };\n\n      $scope.menuItemSelected = (index: number, subIndex: number) => {\n        const menuItem = $scope.menuItems[index];\n        const payload: any = { $item: menuItem };\n        if (menuItem.submenu && subIndex !== void 0) {\n          payload.$subItem = menuItem.submenu[subIndex];\n        }\n        $scope.dropdownTypeaheadOnSelect(payload);\n        closeDropdownMenu();\n      };\n\n      $input.attr('data-provide', 'typeahead');\n      $input.typeahead({\n        source: typeaheadValues,\n        minLength: 1,\n        items: 10,\n        updater: (value: string) => {\n          const result: any = {};\n          each($scope.menuItems, (menuItem) => {\n            each(menuItem.submenu, (submenuItem) => {\n              if (value === menuItem.text + ' ' + submenuItem.text) {\n                result.$subItem = submenuItem;\n                result.$item = menuItem;\n              }\n            });\n          });\n\n          if (result.$item) {\n            $scope.$apply(() => {\n              $scope.dropdownTypeaheadOnSelect(result);\n            });\n          }\n\n          $input.trigger('blur');\n          return '';\n        },\n      });\n\n      $button.click(() => {\n        $button.hide();\n        $input.show();\n        $input.focus();\n      });\n\n      $input.keyup(() => {\n        elem.toggleClass('open', $input.val() === '');\n      });\n\n      elem.mousedown((evt: Event) => {\n        evt.preventDefault();\n        timeoutId.blur = null;\n      });\n\n      $input.blur(() => {\n        timeoutId.blur = setTimeout(() => {\n          closeDropdownMenu();\n        }, 1);\n      });\n\n      $compile(elem.contents())($scope);\n    },\n  };\n}\n\ncoreModule.directive('dropdownTypeahead', dropdownTypeahead);\ncoreModule.directive('dropdownTypeahead2', dropdownTypeahead2);\n","import coreModule from './core_module';\n\n/** @ngInject */\nexport function autofillEventFix($compile: any) {\n  return {\n    link: ($scope: any, elem: any) => {\n      const input = elem[0];\n      const dispatchChangeEvent = () => {\n        const event = new Event('change');\n        return input.dispatchEvent(event);\n      };\n      const onAnimationStart = ({ animationName }: AnimationEvent) => {\n        switch (animationName) {\n          case 'onAutoFillStart':\n            return dispatchChangeEvent();\n          case 'onAutoFillCancel':\n            return dispatchChangeEvent();\n        }\n        return null;\n      };\n\n      // const onChange = (evt: Event) => console.log(evt);\n\n      input.addEventListener('animationstart', onAnimationStart);\n      // input.addEventListener('change', onChange);\n\n      $scope.$on('$destroy', () => {\n        input.removeEventListener('animationstart', onAnimationStart);\n        // input.removeEventListener('change', onChange);\n      });\n    },\n  };\n}\n\ncoreModule.directive('autofillEventFix', autofillEventFix);\n","import $ from 'jquery';\nimport { debounce, find, indexOf, map, escape, unescape } from 'lodash';\n\nimport { TemplateSrv } from 'app/features/templating/template_srv';\n\nimport coreModule from './core_module';\n\n/** @ngInject */\nexport function metricSegment($compile: any, $sce: any, templateSrv: TemplateSrv) {\n  const inputTemplate =\n    '<input type=\"text\" data-provide=\"typeahead\" ' +\n    ' class=\"gf-form-input input-medium\"' +\n    ' spellcheck=\"false\" style=\"display:none\"></input>';\n\n  const linkTemplate =\n    '<a class=\"gf-form-label\" ng-class=\"segment.cssClass\" ' +\n    'tabindex=\"1\" give-focus=\"segment.focus\" ng-bind-html=\"segment.html\"></a>';\n\n  const selectTemplate =\n    '<a class=\"gf-form-input gf-form-input--dropdown\" ng-class=\"segment.cssClass\" ' +\n    'tabindex=\"1\" give-focus=\"segment.focus\" ng-bind-html=\"segment.html\"></a>';\n\n  return {\n    scope: {\n      segment: '=',\n      getOptions: '&',\n      onChange: '&',\n      debounce: '@',\n    },\n    link: ($scope: any, elem: any) => {\n      const $input = $(inputTemplate);\n      const segment = $scope.segment;\n      const $button = $(segment.selectMode ? selectTemplate : linkTemplate);\n      let options = null;\n      let cancelBlur: any = null;\n      let linkMode = true;\n      const debounceLookup = $scope.debounce;\n\n      $input.appendTo(elem);\n      $button.appendTo(elem);\n\n      $scope.updateVariableValue = (value: string) => {\n        if (value === '' || segment.value === value) {\n          return;\n        }\n\n        $scope.$apply(() => {\n          const selected: any = find($scope.altSegments, { value: value });\n          if (selected) {\n            segment.value = selected.value;\n            segment.html = selected.html || $sce.trustAsHtml(templateSrv.highlightVariablesAsHtml(selected.value));\n            segment.fake = false;\n            segment.expandable = selected.expandable;\n\n            if (selected.type) {\n              segment.type = selected.type;\n            }\n          } else if (segment.custom !== 'false') {\n            segment.value = value;\n            segment.html = $sce.trustAsHtml(templateSrv.highlightVariablesAsHtml(value));\n            segment.expandable = true;\n            segment.fake = false;\n          }\n\n          $scope.onChange();\n        });\n      };\n\n      $scope.switchToLink = (fromClick: boolean) => {\n        if (linkMode && !fromClick) {\n          return;\n        }\n\n        clearTimeout(cancelBlur);\n        cancelBlur = null;\n        linkMode = true;\n        $input.hide();\n        $button.show();\n        $scope.updateVariableValue($input.val());\n      };\n\n      $scope.inputBlur = () => {\n        // happens long before the click event on the typeahead options\n        // need to have long delay because the blur\n        cancelBlur = setTimeout($scope.switchToLink, 200);\n      };\n\n      $scope.source = (query: string, callback: any) => {\n        $scope.$apply(() => {\n          $scope.getOptions({ $query: query }).then((altSegments: any) => {\n            $scope.altSegments = altSegments;\n            options = map($scope.altSegments, (alt) => {\n              return escape(alt.value);\n            });\n\n            // add custom values\n            if (segment.custom !== 'false') {\n              if (!segment.fake && indexOf(options, segment.value) === -1) {\n                options.unshift(escape(segment.value));\n              }\n            }\n\n            callback(options);\n          });\n        });\n      };\n\n      $scope.updater = (value: string) => {\n        value = unescape(value);\n        if (value === segment.value) {\n          clearTimeout(cancelBlur);\n          $input.focus();\n          return value;\n        }\n\n        $input.val(value);\n        $scope.switchToLink(true);\n\n        return value;\n      };\n\n      $scope.matcher = function (item: string) {\n        if (linkMode) {\n          return false;\n        }\n        let str = this.query;\n        if (str[0] === '/') {\n          str = str.substring(1);\n        }\n        if (str[str.length - 1] === '/') {\n          str = str.substring(0, str.length - 1);\n        }\n        try {\n          return item.toLowerCase().match(str.toLowerCase());\n        } catch (e) {\n          return false;\n        }\n      };\n\n      $input.attr('data-provide', 'typeahead');\n      $input.typeahead({\n        source: $scope.source,\n        minLength: 0,\n        items: 10000,\n        updater: $scope.updater,\n        matcher: $scope.matcher,\n      });\n\n      const typeahead = $input.data('typeahead');\n      typeahead.lookup = function () {\n        this.query = this.$element.val() || '';\n        const items = this.source(this.query, $.proxy(this.process, this));\n        return items ? this.process(items) : items;\n      };\n\n      if (debounceLookup) {\n        typeahead.lookup = debounce(typeahead.lookup, 500, { leading: true });\n      }\n\n      $button.keydown((evt) => {\n        // trigger typeahead on down arrow or enter key\n        if (evt.keyCode === 40 || evt.keyCode === 13) {\n          $button.click();\n        }\n      });\n\n      $button.click(() => {\n        options = null;\n        $input.css('width', Math.max($button.width()!, 80) + 16 + 'px');\n\n        $button.hide();\n        $input.show();\n        $input.focus();\n\n        linkMode = false;\n\n        const typeahead = $input.data('typeahead');\n        if (typeahead) {\n          $input.val('');\n          typeahead.lookup();\n        }\n      });\n\n      $input.blur($scope.inputBlur);\n\n      $compile(elem.contents())($scope);\n    },\n  };\n}\n\n/** @ngInject */\nexport function metricSegmentModel(uiSegmentSrv: any) {\n  return {\n    template:\n      '<metric-segment segment=\"segment\" get-options=\"getOptionsInternal()\" on-change=\"onSegmentChange()\"></metric-segment>',\n    restrict: 'E',\n    scope: {\n      property: '=',\n      options: '=',\n      getOptions: '&',\n      onChange: '&',\n    },\n    link: {\n      pre: function postLink($scope: any, elem: any, attrs: any) {\n        let cachedOptions: any;\n\n        $scope.valueToSegment = (value: any) => {\n          const option: any = find($scope.options, { value: value });\n          const segment = {\n            cssClass: attrs.cssClass,\n            custom: attrs.custom,\n            value: option ? option.text : value,\n            selectMode: attrs.selectMode,\n          };\n\n          return uiSegmentSrv.newSegment(segment);\n        };\n\n        $scope.getOptionsInternal = () => {\n          if ($scope.options) {\n            cachedOptions = $scope.options;\n            return Promise.resolve(\n              map($scope.options, (option) => {\n                return { value: option.text };\n              })\n            );\n          } else {\n            return $scope.getOptions().then((options: any) => {\n              cachedOptions = options;\n              return map(options, (option) => {\n                if (option.html) {\n                  return option;\n                }\n                return { value: option.text };\n              });\n            });\n          }\n        };\n\n        $scope.onSegmentChange = () => {\n          if (cachedOptions) {\n            const option: any = find(cachedOptions, { text: $scope.segment.value });\n            if (option && option.value !== $scope.property) {\n              $scope.property = option.value;\n            } else if (attrs.custom !== 'false') {\n              $scope.property = $scope.segment.value;\n            }\n          } else {\n            $scope.property = $scope.segment.value;\n          }\n\n          // needs to call this after digest so\n          // property is synced with outerscope\n          $scope.$$postDigest(() => {\n            $scope.$apply(() => {\n              $scope.onChange();\n            });\n          });\n        };\n\n        $scope.segment = $scope.valueToSegment($scope.property);\n      },\n    },\n  };\n}\n\ncoreModule.directive('metricSegment', metricSegment);\ncoreModule.directive('metricSegmentModel', metricSegmentModel);\n","import angular from 'angular';\n\nimport coreModule from './core_module';\n\n/** @ngInject */\nfunction tip($compile: any) {\n  return {\n    restrict: 'E',\n    link: (scope: any, elem: any, attrs: any) => {\n      let _t =\n        '<i class=\"grafana-tip fa fa-' +\n        (attrs.icon || 'question-circle') +\n        '\" bs-tooltip=\"\\'' +\n        // here we double-html-encode any special characters in the source string\n        // this is needed so that the final html contains the encoded entities as they\n        // will be decoded when _t is parsed by angular\n        elem.text().replace(/[\\'\\\"\\\\{}<>&]/g, (m: string) => '&amp;#' + m.charCodeAt(0) + ';') +\n        '\\'\"></i>';\n      elem.replaceWith($compile(angular.element(_t))(scope));\n    },\n  };\n}\n\n/** @ngInject */\nfunction compile($compile: any) {\n  return {\n    restrict: 'A',\n    link: (scope: any, element: any, attrs: any) => {\n      scope.$watch(\n        (scope: any) => {\n          return scope.$eval(attrs.compile);\n        },\n        (value: any) => {\n          element.html(value);\n          $compile(element.contents())(scope);\n        }\n      );\n    },\n  };\n}\n\nfunction watchChange() {\n  return {\n    scope: { onchange: '&watchChange' },\n    link: (scope: any, element: any) => {\n      element.on('input', () => {\n        scope.$apply(() => {\n          scope.onchange({ inputValue: element.val() });\n        });\n      });\n    },\n  };\n}\n\n/** @ngInject */\nfunction editorOptBool($compile: any) {\n  return {\n    restrict: 'E',\n    link: (scope: any, elem: any, attrs: any) => {\n      const ngchange = attrs.change ? ' ng-change=\"' + attrs.change + '\"' : '';\n      const tip = attrs.tip ? ' <tip>' + attrs.tip + '</tip>' : '';\n      const showIf = attrs.showIf ? ' ng-show=\"' + attrs.showIf + '\" ' : '';\n\n      const template =\n        '<div class=\"editor-option gf-form-checkbox text-center\"' +\n        showIf +\n        '>' +\n        ' <label for=\"' +\n        attrs.model +\n        '\" class=\"small\">' +\n        attrs.text +\n        tip +\n        '</label>' +\n        '<input class=\"cr1\" id=\"' +\n        attrs.model +\n        '\" type=\"checkbox\" ' +\n        '       ng-model=\"' +\n        attrs.model +\n        '\"' +\n        ngchange +\n        '       ng-checked=\"' +\n        attrs.model +\n        '\"></input>' +\n        ' <label for=\"' +\n        attrs.model +\n        '\" class=\"cr1\"></label>';\n      elem.replaceWith($compile(angular.element(template))(scope));\n    },\n  };\n}\n\n/** @ngInject */\nfunction editorCheckbox($compile: any, $interpolate: any) {\n  return {\n    restrict: 'E',\n    link: (scope: any, elem: any, attrs: any) => {\n      const text = $interpolate(attrs.text)(scope);\n      const model = $interpolate(attrs.model)(scope);\n      const ngchange = attrs.change ? ' ng-change=\"' + attrs.change + '\"' : '';\n      const tip = attrs.tip ? ' <tip>' + attrs.tip + '</tip>' : '';\n      const label = '<label for=\"' + scope.$id + model + '\" class=\"checkbox-label\">' + text + tip + '</label>';\n\n      let template =\n        '<input class=\"cr1\" id=\"' +\n        scope.$id +\n        model +\n        '\" type=\"checkbox\" ' +\n        '       ng-model=\"' +\n        model +\n        '\"' +\n        ngchange +\n        '       ng-checked=\"' +\n        model +\n        '\"></input>' +\n        ' <label for=\"' +\n        scope.$id +\n        model +\n        '\" class=\"cr1\"></label>';\n\n      template = template + label;\n      elem.addClass('gf-form-checkbox');\n      elem.html($compile(angular.element(template))(scope));\n    },\n  };\n}\n\n/** @ngInject */\nfunction gfDropdown($parse: any, $compile: any, $timeout: any) {\n  function buildTemplate(items: any, placement?: any) {\n    const upclass = placement === 'top' ? 'dropup' : '';\n    const ul = ['<ul class=\"dropdown-menu ' + upclass + '\" role=\"menu\" aria-labelledby=\"drop1\">', '</ul>'];\n\n    for (let index = 0; index < items.length; index++) {\n      const item = items[index];\n\n      if (item.divider) {\n        ul.splice(index + 1, 0, '<li class=\"divider\"></li>');\n        continue;\n      }\n\n      let li =\n        '<li' +\n        (item.submenu && item.submenu.length ? ' class=\"dropdown-submenu\"' : '') +\n        '>' +\n        '<a tabindex=\"-1\" ng-href=\"' +\n        (item.href || '') +\n        '\"' +\n        (item.click ? ' ng-click=\"' + item.click + '\"' : '') +\n        (item.target ? ' target=\"' + item.target + '\"' : '') +\n        (item.method ? ' data-method=\"' + item.method + '\"' : '') +\n        '>' +\n        (item.text || '') +\n        '</a>';\n\n      if (item.submenu && item.submenu.length) {\n        li += buildTemplate(item.submenu).join('\\n');\n      }\n\n      li += '</li>';\n      ul.splice(index + 1, 0, li);\n    }\n\n    return ul;\n  }\n\n  return {\n    restrict: 'EA',\n    scope: true,\n    link: function postLink(scope: any, iElement: any, iAttrs: any) {\n      const getter = $parse(iAttrs.gfDropdown),\n        items = getter(scope);\n      $timeout(() => {\n        const placement = iElement.data('placement');\n        const dropdown = angular.element(buildTemplate(items, placement).join(''));\n        dropdown.insertAfter(iElement);\n        $compile(iElement.next('ul.dropdown-menu'))(scope);\n      });\n\n      iElement.addClass('dropdown-toggle').attr('data-toggle', 'dropdown');\n    },\n  };\n}\n\ncoreModule.directive('tip', tip);\ncoreModule.directive('compile', compile);\ncoreModule.directive('watchChange', watchChange);\ncoreModule.directive('editorOptBool', editorOptBool);\ncoreModule.directive('editorCheckbox', editorCheckbox);\ncoreModule.directive('gfDropdown', gfDropdown);\n","import { rangeUtil } from '@grafana/data';\n\nimport coreModule from './core_module';\n\nfunction ngModelOnBlur() {\n  return {\n    restrict: 'A',\n    priority: 1,\n    require: 'ngModel',\n    link: (scope: any, elm: any, attr: any, ngModelCtrl: any) => {\n      if (attr.type === 'radio' || attr.type === 'checkbox') {\n        return;\n      }\n\n      elm.off('input keydown change');\n      elm.bind('blur', () => {\n        scope.$apply(() => {\n          ngModelCtrl.$setViewValue(elm.val());\n        });\n      });\n    },\n  };\n}\n\nfunction emptyToNull() {\n  return {\n    restrict: 'A',\n    require: 'ngModel',\n    link: (scope: any, elm: any, attrs: any, ctrl: any) => {\n      ctrl.$parsers.push((viewValue: any) => {\n        if (viewValue === '') {\n          return null;\n        }\n        return viewValue;\n      });\n    },\n  };\n}\n\nfunction validTimeSpan() {\n  return {\n    require: 'ngModel',\n    link: (scope: any, elm: any, attrs: any, ctrl: any) => {\n      ctrl.$validators.integer = (modelValue: any, viewValue: any) => {\n        if (ctrl.$isEmpty(modelValue)) {\n          return true;\n        }\n        if (viewValue.indexOf('$') === 0 || viewValue.indexOf('+$') === 0) {\n          return true; // allow template variable\n        }\n        const info = rangeUtil.describeTextRange(viewValue);\n        return info.invalid !== true;\n      };\n    },\n  };\n}\n\ncoreModule.directive('ngModelOnblur', ngModelOnBlur);\ncoreModule.directive('emptyToNull', emptyToNull);\ncoreModule.directive('validTimeSpan', validTimeSpan);\n","import angular from 'angular';\nimport $ from 'jquery';\n\nimport { getTagColorsFromName } from '@grafana/ui';\n\nimport coreModule from './core_module';\nimport 'vendor/tagsinput/bootstrap-tagsinput.js';\n\nfunction setColor(name: string, element: JQuery) {\n  const { color, borderColor } = getTagColorsFromName(name);\n  element.css('background-color', color);\n  element.css('border-color', borderColor);\n}\n\nfunction tagColorFromName() {\n  return {\n    scope: { tagColorFromName: '=' },\n    link: (scope: any, element: any) => {\n      setColor(scope.tagColorFromName, element);\n    },\n  };\n}\n\nfunction bootstrapTagsinput() {\n  function getItemProperty(scope: any, property: any) {\n    if (!property) {\n      return undefined;\n    }\n\n    if (angular.isFunction(scope.$parent[property])) {\n      return scope.$parent[property];\n    }\n\n    return (item: any) => {\n      return item[property];\n    };\n  }\n\n  return {\n    restrict: 'EA',\n    scope: {\n      model: '=ngModel',\n      onTagsUpdated: '&',\n    },\n    template: '<select multiple></select>',\n    replace: false,\n    link: function (scope: any, element: any, attrs: any) {\n      if (!angular.isArray(scope.model)) {\n        scope.model = [];\n      }\n\n      const select = $('select', element);\n\n      if (attrs.placeholder) {\n        select.attr('placeholder', attrs.placeholder);\n      }\n\n      select.tagsinput({\n        typeahead: {\n          source: angular.isFunction(scope.$parent[attrs.typeaheadSource])\n            ? scope.$parent[attrs.typeaheadSource]\n            : null,\n        },\n        widthClass: attrs.widthClass,\n        itemValue: getItemProperty(scope, attrs.itemvalue),\n        itemText: getItemProperty(scope, attrs.itemtext),\n        tagClass: angular.isFunction(scope.$parent[attrs.tagclass])\n          ? scope.$parent[attrs.tagclass]\n          : () => {\n              return attrs.tagclass;\n            },\n      });\n\n      select.on('itemAdded', (event: any) => {\n        if (scope.model.indexOf(event.item) === -1) {\n          scope.model.push(event.item);\n          if (scope.onTagsUpdated) {\n            scope.onTagsUpdated();\n          }\n        }\n        const tagElement = select\n          .next()\n          .children('span')\n          .filter(() => {\n            return $(this).text() === event.item;\n          });\n        setColor(event.item, tagElement);\n      });\n\n      select.on('itemRemoved', (event: any) => {\n        const idx = scope.model.indexOf(event.item);\n        if (idx !== -1) {\n          scope.model.splice(idx, 1);\n          if (scope.onTagsUpdated) {\n            scope.onTagsUpdated();\n          }\n        }\n      });\n\n      scope.$watch(\n        'model',\n        () => {\n          if (!angular.isArray(scope.model)) {\n            scope.model = [];\n          }\n\n          select.tagsinput('removeAll');\n\n          for (let i = 0; i < scope.model.length; i++) {\n            select.tagsinput('add', scope.model[i]);\n          }\n        },\n        true\n      );\n    },\n  };\n}\n\ncoreModule.directive('tagColorFromName', tagColorFromName);\ncoreModule.directive('bootstrapTagsinput', bootstrapTagsinput);\n","import $ from 'jquery';\n\nimport coreModule from './core_module';\n\nfunction getBlockNodes(nodes: any[]) {\n  let node = nodes[0];\n  const endNode = nodes[nodes.length - 1];\n  let blockNodes: any[] | undefined;\n  node = node.nextSibling;\n\n  for (let i = 1; node !== endNode && node; i++) {\n    if (blockNodes || nodes[i] !== node) {\n      if (!blockNodes) {\n        blockNodes = $([].slice.call(nodes, 0, i)) as any;\n      }\n\n      blockNodes!.push(node);\n    }\n    node = node.nextSibling;\n  }\n\n  return blockNodes || nodes;\n}\n\n/** @ngInject */\nfunction rebuildOnChange($animate: any) {\n  return {\n    multiElement: true,\n    terminal: true,\n    transclude: true,\n    priority: 600,\n    restrict: 'E',\n    link: (scope: any, elem: any, attrs: any, ctrl: any, transclude: any) => {\n      let block: any, childScope: any, previousElements: any;\n\n      function cleanUp() {\n        if (previousElements) {\n          previousElements.remove();\n          previousElements = null;\n        }\n        if (childScope) {\n          childScope.$destroy();\n          childScope = null;\n        }\n        if (block) {\n          previousElements = getBlockNodes(block.clone);\n          $animate.leave(previousElements).then(() => {\n            previousElements = null;\n          });\n          block = null;\n        }\n      }\n\n      scope.$watch(attrs.property, function rebuildOnChangeAction(value: any, oldValue: any) {\n        if (childScope && value !== oldValue) {\n          cleanUp();\n        }\n\n        if (!childScope && (value || attrs.showNull)) {\n          transclude((clone: any, newScope: any) => {\n            childScope = newScope;\n            clone[clone.length++] = document.createComment(' end rebuild on change ');\n            block = { clone: clone };\n            $animate.enter(clone, elem.parent(), elem);\n          });\n        } else {\n          cleanUp();\n        }\n      });\n    },\n  };\n}\n\ncoreModule.directive('rebuildOnChange', rebuildOnChange);\n","import coreModule from './core_module';\n\ncoreModule.directive('giveFocus', () => {\n  return (scope: any, element: any, attrs: any) => {\n    element.click((e: any) => {\n      e.stopPropagation();\n    });\n\n    scope.$watch(\n      attrs.giveFocus,\n      (newValue: any) => {\n        if (!newValue) {\n          return;\n        }\n        setTimeout(() => {\n          element.focus();\n          const domEl: any = element[0];\n          if (domEl.setSelectionRange) {\n            const pos = element.val().length * 2;\n            domEl.setSelectionRange(pos, pos);\n          }\n        }, 200);\n      },\n      true\n    );\n  };\n});\n\nexport default {};\n","import angular from 'angular';\n\nimport { GrafanaRootScope } from 'app/angular/GrafanaCtrl';\n\nimport coreModule from './core_module';\n\nexport class DeltaCtrl {\n  observer: any;\n\n  /** @ngInject */\n  constructor() {\n    const waitForCompile = () => {};\n\n    this.observer = new MutationObserver(waitForCompile);\n\n    const observerConfig = {\n      attributes: true,\n      attributeFilter: ['class'],\n      characterData: false,\n      childList: true,\n      subtree: false,\n    };\n\n    this.observer.observe(angular.element('.delta-html')[0], observerConfig);\n  }\n\n  $onDestroy() {\n    this.observer.disconnect();\n  }\n}\n\nexport function delta() {\n  return {\n    controller: DeltaCtrl,\n    replace: false,\n    restrict: 'A',\n  };\n}\ncoreModule.directive('diffDelta', delta);\n\n// Link to JSON line number\nexport class LinkJSONCtrl {\n  /** @ngInject */\n  constructor(private $scope: any, private $rootScope: GrafanaRootScope, private $anchorScroll: any) {}\n\n  goToLine(line: number) {\n    let unbind: () => void;\n\n    const scroll = () => {\n      this.$anchorScroll(`l${line}`);\n      unbind();\n    };\n\n    this.$scope.switchView().then(() => {\n      unbind = this.$rootScope.$on('json-diff-ready', scroll.bind(this));\n    });\n  }\n}\n\nexport function linkJson() {\n  return {\n    controller: LinkJSONCtrl,\n    controllerAs: 'ctrl',\n    replace: true,\n    restrict: 'E',\n    scope: {\n      line: '@lineDisplay',\n      link: '@lineLink',\n      switchView: '&',\n    },\n    template: `<a class=\"diff-linenum btn btn-inverse btn-small\" ng-click=\"ctrl.goToLine(link)\">Line {{ line }}</a>`,\n  };\n}\ncoreModule.directive('diffLinkJson', linkJson);\n","import { isArray } from 'lodash';\n\nimport coreModule from './core_module';\n\nexport function arrayJoin() {\n  'use strict';\n\n  return {\n    restrict: 'A',\n    require: 'ngModel',\n    link: (scope: any, element: any, attr: any, ngModel: any) => {\n      function split_array(text: string) {\n        return (text || '').split(',');\n      }\n\n      function join_array(text: string) {\n        if (isArray(text)) {\n          return ((text || '') as any).join(',');\n        } else {\n          return text;\n        }\n      }\n\n      ngModel.$parsers.push(split_array);\n      ngModel.$formatters.push(join_array);\n    },\n  };\n}\n\ncoreModule.directive('arrayJoin', arrayJoin);\n","import coreModule from 'app/angular/core_module';\nimport { provideTheme } from 'app/core/utils/ConfigProvider';\n\nexport function react2AngularDirective(name: string, component: any, options: any) {\n  coreModule.directive(name, [\n    'reactDirective',\n    (reactDirective) => {\n      return reactDirective(provideTheme(component), options);\n    },\n  ]);\n}\n","import React from 'react';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\nimport { LegacyForms } from '@grafana/ui';\n\nimport CloudMonitoringDatasource from '../datasource';\nimport { AnnotationTarget, EditorMode, MetricDescriptor, MetricKind } from '../types';\n\nimport { AnnotationsHelp, LabelFilter, Metrics, Project, QueryEditorRow } from './';\n\nconst { Input } = LegacyForms;\n\nexport interface Props {\n  refId: string;\n  onQueryChange: (target: AnnotationTarget) => void;\n  target: AnnotationTarget;\n  datasource: CloudMonitoringDatasource;\n  templateSrv: TemplateSrv;\n}\n\ninterface State extends AnnotationTarget {\n  variableOptionGroup: SelectableValue<string>;\n  variableOptions: Array<SelectableValue<string>>;\n  labels: any;\n  [key: string]: any;\n}\n\nconst DefaultTarget: State = {\n  editorMode: EditorMode.Visual,\n  projectName: '',\n  projects: [],\n  metricType: '',\n  filters: [],\n  metricKind: MetricKind.GAUGE,\n  valueType: '',\n  refId: 'annotationQuery',\n  title: '',\n  text: '',\n  labels: {},\n  variableOptionGroup: {},\n  variableOptions: [],\n};\n\nexport class AnnotationQueryEditor extends React.Component<Props, State> {\n  state: State = DefaultTarget;\n\n  async UNSAFE_componentWillMount() {\n    // Unfortunately, migrations like this need to go UNSAFE_componentWillMount. As soon as there's\n    // migration hook for this module.ts, we can do the migrations there instead.\n    const { target, datasource } = this.props;\n    if (!target.projectName) {\n      target.projectName = datasource.getDefaultProject();\n    }\n\n    const variableOptionGroup = {\n      label: 'Template Variables',\n      options: datasource.getVariables().map(toOption),\n    };\n\n    const projects = await datasource.getProjects();\n    this.setState({\n      variableOptionGroup,\n      variableOptions: variableOptionGroup.options,\n      ...target,\n      projects,\n    });\n\n    datasource\n      .getLabels(target.metricType, target.projectName, target.refId)\n      .then((labels) => this.setState({ labels }));\n  }\n\n  onMetricTypeChange = ({ valueType, metricKind, type, unit }: MetricDescriptor) => {\n    const { onQueryChange, datasource } = this.props;\n    this.setState(\n      {\n        metricType: type,\n        unit,\n        valueType,\n        metricKind,\n      },\n      () => {\n        onQueryChange(this.state);\n      }\n    );\n    datasource.getLabels(type, this.state.refId, this.state.projectName).then((labels) => this.setState({ labels }));\n  };\n\n  onChange(prop: string, value: string | string[]) {\n    this.setState({ [prop]: value }, () => {\n      this.props.onQueryChange(this.state);\n    });\n  }\n\n  render() {\n    const { metricType, projectName, filters, title, text, variableOptionGroup, labels, variableOptions } = this.state;\n    const { datasource } = this.props;\n\n    return (\n      <>\n        <Project\n          refId={this.props.refId}\n          templateVariableOptions={variableOptions}\n          datasource={datasource}\n          projectName={projectName || datasource.getDefaultProject()}\n          onChange={(value) => this.onChange('projectName', value)}\n        />\n        <Metrics\n          refId={this.props.refId}\n          projectName={projectName}\n          metricType={metricType}\n          templateSrv={datasource.templateSrv}\n          datasource={datasource}\n          templateVariableOptions={variableOptions}\n          onChange={(metric) => this.onMetricTypeChange(metric)}\n        >\n          {(metric) => (\n            <>\n              <LabelFilter\n                labels={labels}\n                filters={filters}\n                onChange={(value) => this.onChange('filters', value)}\n                variableOptionGroup={variableOptionGroup}\n              />\n            </>\n          )}\n        </Metrics>\n\n        <QueryEditorRow label=\"Title\">\n          <Input\n            type=\"text\"\n            className=\"gf-form-input width-20\"\n            value={title}\n            onChange={(e) => this.onChange('title', e.target.value)}\n          />\n        </QueryEditorRow>\n        <QueryEditorRow label=\"Text\">\n          <Input\n            type=\"text\"\n            className=\"gf-form-input width-20\"\n            value={text}\n            onChange={(e) => this.onChange('text', e.target.value)}\n          />\n        </QueryEditorRow>\n\n        <AnnotationsHelp />\n      </>\n    );\n  }\n}\n","import React, { ChangeEvent } from 'react';\n\nimport { PanelData } from '@grafana/data';\nimport { EditorField, EditorHeader, EditorRow, InlineSelect, Space } from '@grafana/experimental';\nimport { Input, Switch } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../datasource';\nimport { useRegions } from '../hooks';\nimport { CloudWatchAnnotationQuery, CloudWatchMetricsQuery } from '../types';\n\nimport { MetricStatEditor } from './MetricStatEditor';\n\nexport type Props = {\n  query: CloudWatchAnnotationQuery;\n  datasource: CloudWatchDatasource;\n  onChange: (value: CloudWatchAnnotationQuery) => void;\n  data?: PanelData;\n};\n\nexport function AnnotationQueryEditor(props: React.PropsWithChildren<Props>) {\n  const { query, onChange, datasource } = props;\n\n  const [regions, regionIsLoading] = useRegions(datasource);\n\n  return (\n    <>\n      <EditorHeader>\n        <InlineSelect\n          label=\"Region\"\n          value={regions.find((v) => v.value === query.region)}\n          placeholder=\"Select region\"\n          allowCustomValue\n          onChange={({ value: region }) => region && onChange({ ...query, region })}\n          options={regions}\n          isLoading={regionIsLoading}\n        />\n      </EditorHeader>\n      <Space v={0.5} />\n      <MetricStatEditor\n        {...props}\n        disableExpressions={true}\n        onChange={(editorQuery: CloudWatchMetricsQuery) => onChange({ ...query, ...editorQuery })}\n        onRunQuery={() => {}}\n      ></MetricStatEditor>\n      <Space v={0.5} />\n      <EditorRow>\n        <EditorField label=\"Period\" width={26} tooltip=\"Minimum interval between points in seconds.\">\n          <Input\n            value={query.period || ''}\n            placeholder=\"auto\"\n            onChange={(event: ChangeEvent<HTMLInputElement>) => onChange({ ...query, period: event.target.value })}\n          />\n        </EditorField>\n        <EditorField label=\"Enable Prefix Matching\" optional={true}>\n          <Switch\n            value={query.prefixMatching}\n            onChange={(e) => {\n              onChange({\n                ...query,\n                prefixMatching: e.currentTarget.checked,\n              });\n            }}\n          />\n        </EditorField>\n        <EditorField label=\"Action\" optional={true}>\n          <Input\n            disabled={!query.prefixMatching}\n            value={query.actionPrefix || ''}\n            onChange={(event: ChangeEvent<HTMLInputElement>) =>\n              onChange({ ...query, actionPrefix: event.target.value })\n            }\n          />\n        </EditorField>\n        <EditorField label=\"Alarm Name\" optional={true}>\n          <Input\n            disabled={!query.prefixMatching}\n            value={query.alarmNamePrefix || ''}\n            onChange={(event: ChangeEvent<HTMLInputElement>) =>\n              onChange({ ...query, alarmNamePrefix: event.target.value })\n            }\n          />\n        </EditorField>\n      </EditorRow>\n    </>\n  );\n}\n","import { flatten } from 'lodash';\nimport React, { useMemo, useCallback, FC } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { LegacyForms } from '@grafana/ui';\nimport { Variable } from 'app/types/templates';\nconst { Select } = LegacyForms;\n\nexport interface Props {\n  onChange: (value: string | undefined) => void;\n  options: Array<SelectableValue<string>>;\n  isSearchable: boolean;\n  value: string;\n  placeholder?: string;\n  className?: string;\n  variables?: Variable[];\n}\n\nexport const MetricSelect: FC<Props> = (props) => {\n  const { value, placeholder, className, isSearchable, onChange } = props;\n  const options = useSelectOptions(props);\n  const selected = useSelectedOption(options, value);\n  const onChangeValue = useCallback((selectable: SelectableValue<string>) => onChange(selectable.value), [onChange]);\n\n  return (\n    <Select\n      menuShouldPortal\n      className={className}\n      isMulti={false}\n      isClearable={false}\n      backspaceRemovesValue={false}\n      onChange={onChangeValue}\n      options={options}\n      isSearchable={isSearchable}\n      maxMenuHeight={500}\n      placeholder={placeholder}\n      noOptionsMessage={() => 'No options found'}\n      value={selected}\n    />\n  );\n};\n\nconst useSelectOptions = ({ variables = [], options }: Props): Array<SelectableValue<string>> => {\n  return useMemo(() => {\n    if (!Array.isArray(variables) || variables.length === 0) {\n      return options;\n    }\n\n    return [\n      {\n        label: 'Template Variables',\n        options: variables.map(({ name }) => ({\n          label: `$${name}`,\n          value: `$${name}`,\n        })),\n      },\n      ...options,\n    ];\n  }, [variables, options]);\n};\n\nconst useSelectedOption = (options: Array<SelectableValue<string>>, value: string): SelectableValue<string> => {\n  return useMemo(() => {\n    const allOptions = options.every((o) => o.options) ? flatten(options.map((o) => o.options)) : options;\n    return allOptions.find((option) => option.value === value);\n  }, [options, value]);\n};\n","// Libraries\nimport React, { memo } from 'react';\n\n// Types\nimport { LokiDatasource } from '../datasource';\nimport { LokiQuery } from '../types';\n\nimport { LokiOptionFields } from './LokiOptionFields';\nimport { LokiQueryField } from './LokiQueryField';\n\ninterface Props {\n  expr: string;\n  maxLines?: number;\n  instant?: boolean;\n  datasource: LokiDatasource;\n  onChange: (query: LokiQuery) => void;\n}\n\nexport const LokiAnnotationsQueryEditor = memo(function LokiAnnotationQueryEditor(props: Props) {\n  const { expr, maxLines, instant, datasource, onChange } = props;\n\n  const queryWithRefId: LokiQuery = {\n    refId: '',\n    expr,\n    maxLines,\n    instant,\n  };\n  return (\n    <div className=\"gf-form-group\">\n      <LokiQueryField\n        datasource={datasource}\n        query={queryWithRefId}\n        onChange={onChange}\n        onRunQuery={() => {}}\n        onBlur={() => {}}\n        history={[]}\n        ExtraFieldElement={\n          <LokiOptionFields\n            lineLimitValue={queryWithRefId?.maxLines?.toString() || ''}\n            resolution={queryWithRefId.resolution || 1}\n            query={queryWithRefId}\n            onRunQuery={() => {}}\n            onChange={onChange}\n          />\n        }\n      />\n    </div>\n  );\n});\n","import {\n  ClipboardButton,\n  ColorPicker,\n  DataLinksInlineEditor,\n  DataSourceHttpSettings,\n  GraphContextMenu,\n  Icon,\n  LegacyForms,\n  SeriesColorPickerPopoverWithTheme,\n  Spinner,\n  UnitPicker,\n} from '@grafana/ui';\nimport { react2AngularDirective } from 'app/angular/react2angular';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport { TimePickerSettings } from 'app/features/dashboard/components/DashboardSettings/TimePickerSettings';\nimport { AnnotationQueryEditor as CloudMonitoringAnnotationQueryEditor } from 'app/plugins/datasource/cloud-monitoring/components/AnnotationQueryEditor';\nimport { QueryEditor as CloudMonitoringQueryEditor } from 'app/plugins/datasource/cloud-monitoring/components/QueryEditor';\nimport { AnnotationQueryEditor as CloudWatchAnnotationQueryEditor } from 'app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor';\nimport QueryEditor from 'app/plugins/datasource/grafana-azure-monitor-datasource/components/QueryEditor/QueryEditor';\n\nimport EmptyListCTA from '../core/components/EmptyListCTA/EmptyListCTA';\nimport { Footer } from '../core/components/Footer/Footer';\nimport PageHeader from '../core/components/PageHeader/PageHeader';\nimport { MetricSelect } from '../core/components/Select/MetricSelect';\nimport { TagFilter } from '../core/components/TagFilter/TagFilter';\nimport { HelpModal } from '../core/components/help/HelpModal';\nimport { SearchField, SearchResults, SearchResultsFilter } from '../features/search';\nimport { LokiAnnotationsQueryEditor } from '../plugins/datasource/loki/components/AnnotationsQueryEditor';\n\nconst { SecretFormField } = LegacyForms;\n\nexport function registerAngularDirectives() {\n  react2AngularDirective('footer', Footer, []);\n  react2AngularDirective('icon', Icon, [\n    'name',\n    'size',\n    'type',\n    ['onClick', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('spinner', Spinner, ['inline']);\n  react2AngularDirective('helpModal', HelpModal, []);\n  react2AngularDirective('pageHeader', PageHeader, ['model', 'noTabs']);\n  react2AngularDirective('emptyListCta', EmptyListCTA, [\n    'title',\n    'buttonIcon',\n    'buttonLink',\n    'buttonTitle',\n    ['onClick', { watchDepth: 'reference', wrapApply: true }],\n    'proTip',\n    'proTipLink',\n    'proTipLinkTitle',\n    'proTipTarget',\n    'infoBox',\n    'infoBoxTitle',\n  ]);\n  //Search\n  react2AngularDirective('searchField', SearchField, [\n    'query',\n    'autoFocus',\n    ['onChange', { watchDepth: 'reference' }],\n    ['onKeyDown', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('searchResults', SearchResults, [\n    'results',\n    'editable',\n    'selectors',\n    ['onSelectionChanged', { watchDepth: 'reference' }],\n    ['onTagSelected', { watchDepth: 'reference' }],\n    ['onFolderExpanding', { watchDepth: 'reference' }],\n    ['onToggleSelection', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('searchFilters', SearchResultsFilter, [\n    'allChecked',\n    'canMove',\n    'canDelete',\n    'tagFilterOptions',\n    'selectedStarredFilter',\n    'selectedTagFilter',\n    ['onSelectAllChanged', { watchDepth: 'reference' }],\n    ['deleteItem', { watchDepth: 'reference' }],\n    ['moveTo', { watchDepth: 'reference' }],\n    ['onStarredFilterChange', { watchDepth: 'reference' }],\n    ['onTagFilterChange', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('tagFilter', TagFilter, [\n    'tags',\n    ['onChange', { watchDepth: 'reference' }],\n    ['tagOptions', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('colorPicker', ColorPicker, [\n    'color',\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('seriesColorPickerPopover', SeriesColorPickerPopoverWithTheme, [\n    'color',\n    'series',\n    'onColorChange',\n    'onToggleAxis',\n  ]);\n  react2AngularDirective('unitPicker', UnitPicker, [\n    'value',\n    'width',\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('metricSelect', MetricSelect, [\n    'options',\n    'onChange',\n    'value',\n    'isSearchable',\n    'className',\n    'placeholder',\n    ['variables', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('cloudMonitoringQueryEditor', CloudMonitoringQueryEditor, [\n    'target',\n    'onQueryChange',\n    'onExecuteQuery',\n    ['events', { watchDepth: 'reference' }],\n    ['datasource', { watchDepth: 'reference' }],\n    ['templateSrv', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('cloudMonitoringAnnotationQueryEditor', CloudMonitoringAnnotationQueryEditor, [\n    'target',\n    'onQueryChange',\n    ['datasource', { watchDepth: 'reference' }],\n    ['templateSrv', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('cloudwatchAnnotationQueryEditor', CloudWatchAnnotationQueryEditor, [\n    'query',\n    'onChange',\n    ['datasource', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('secretFormField', SecretFormField, [\n    'value',\n    'isConfigured',\n    'inputWidth',\n    'labelWidth',\n    'aria-label',\n    ['onReset', { watchDepth: 'reference', wrapApply: true }],\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('graphContextMenu', GraphContextMenu, [\n    'x',\n    'y',\n    'itemsGroup',\n    ['onClose', { watchDepth: 'reference', wrapApply: true }],\n    ['getContextMenuSource', { watchDepth: 'reference', wrapApply: true }],\n    ['timeZone', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n\n  // We keep the drilldown terminology here because of as using data-* directive\n  // being in conflict with HTML data attributes\n  react2AngularDirective('drilldownLinksEditor', DataLinksInlineEditor, [\n    'value',\n    'links',\n    'suggestions',\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n\n  react2AngularDirective('lokiAnnotationsQueryEditor', LokiAnnotationsQueryEditor, [\n    'expr',\n    'maxLines',\n    'instant',\n    'onChange',\n    ['datasource', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('datasourceHttpSettingsNext', DataSourceHttpSettings, [\n    'defaultUrl',\n    'showAccessOptions',\n    'dataSourceConfig',\n    'showForwardOAuthIdentityOption',\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('folderPicker', FolderPicker, [\n    'labelClass',\n    'rootName',\n    'enableCreateNew',\n    'enableReset',\n    'initialTitle',\n    'initialFolderId',\n    'dashboardId',\n    'onCreateFolder',\n    ['enterFolderCreation', { watchDepth: 'reference', wrapApply: true }],\n    ['exitFolderCreation', { watchDepth: 'reference', wrapApply: true }],\n    ['onLoad', { watchDepth: 'reference', wrapApply: true }],\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n\n  react2AngularDirective('timePickerSettings', TimePickerSettings, [\n    'renderCount',\n    'refreshIntervals',\n    'timePickerHidden',\n    'nowDelay',\n    'timezone',\n    ['onTimeZoneChange', { watchDepth: 'reference', wrapApply: true }],\n    ['onRefreshIntervalChange', { watchDepth: 'reference', wrapApply: true }],\n    ['onNowDelayChange', { watchDepth: 'reference', wrapApply: true }],\n    ['onHideTimePickerChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n\n  react2AngularDirective('azureMonitorQueryEditor', QueryEditor, [\n    'query',\n    ['datasource', { watchDepth: 'reference' }],\n    'onChange',\n  ]);\n\n  react2AngularDirective('clipboardButton', ClipboardButton, [\n    ['getText', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n}\n","import $ from 'jquery';\nimport { debounce, each, map, partial, escape, unescape } from 'lodash';\n\nimport coreModule from 'app/angular/core_module';\n\nimport { promiseToDigest } from '../promiseToDigest';\n\nconst template = `\n<div class=\"dropdown cascade-open\">\n<a ng-click=\"showActionsMenu()\" class=\"query-part-name pointer dropdown-toggle\" data-toggle=\"dropdown\">{{part.def.type}}</a>\n<span>(</span><span class=\"query-part-parameters\"></span><span>)</span>\n<ul class=\"dropdown-menu\">\n  <li ng-repeat=\"action in partActions\">\n    <a ng-click=\"triggerPartAction(action)\">{{action.text}}</a>\n  </li>\n</ul>\n`;\n\n/** @ngInject */\nexport function queryPartEditorDirective(templateSrv: any) {\n  const paramTemplate = '<input type=\"text\" class=\"hide input-mini tight-form-func-param\"></input>';\n\n  return {\n    restrict: 'E',\n    template: template,\n    scope: {\n      part: '=',\n      handleEvent: '&',\n      debounce: '@',\n    },\n    link: function postLink($scope: any, elem: any) {\n      const part = $scope.part;\n      const partDef = part.def;\n      const $paramsContainer = elem.find('.query-part-parameters');\n      const debounceLookup = $scope.debounce;\n\n      $scope.partActions = [];\n\n      function clickFuncParam(this: any, paramIndex: number) {\n        const $link = $(this);\n        const $input = $link.next();\n\n        $input.val(part.params[paramIndex]);\n        $input.css('width', $link.width()! + 16 + 'px');\n\n        $link.hide();\n        $input.show();\n        $input.focus();\n        $input.select();\n\n        const typeahead = $input.data('typeahead');\n        if (typeahead) {\n          $input.val('');\n          typeahead.lookup();\n        }\n      }\n\n      function inputBlur(this: any, paramIndex: number) {\n        const $input = $(this);\n        const $link = $input.prev();\n        const newValue = $input.val();\n\n        if (newValue !== '' || part.def.params[paramIndex].optional) {\n          $link.html(templateSrv.highlightVariablesAsHtml(newValue));\n\n          part.updateParam($input.val(), paramIndex);\n          $scope.$apply(() => {\n            $scope.handleEvent({ $event: { name: 'part-param-changed' } });\n          });\n        }\n\n        $input.hide();\n        $link.show();\n      }\n\n      function inputKeyPress(this: any, paramIndex: number, e: any) {\n        if (e.which === 13) {\n          inputBlur.call(this, paramIndex);\n        }\n      }\n\n      function inputKeyDown(this: any) {\n        this.style.width = (3 + this.value.length) * 8 + 'px';\n      }\n\n      function addTypeahead($input: JQuery, param: any, paramIndex: number) {\n        if (!param.options && !param.dynamicLookup) {\n          return;\n        }\n\n        const typeaheadSource = (query: string, callback: any) => {\n          if (param.options) {\n            let options = param.options;\n            if (param.type === 'int') {\n              options = map(options, (val) => {\n                return val.toString();\n              });\n            }\n            return options;\n          }\n\n          $scope.$apply(() => {\n            $scope.handleEvent({ $event: { name: 'get-param-options' } }).then((result: any) => {\n              const dynamicOptions = map(result, (op) => {\n                return escape(op.value);\n              });\n              callback(dynamicOptions);\n            });\n          });\n        };\n\n        $input.attr('data-provide', 'typeahead');\n\n        $input.typeahead({\n          source: typeaheadSource,\n          minLength: 0,\n          items: 1000,\n          updater: (value: string) => {\n            value = unescape(value);\n            setTimeout(() => {\n              inputBlur.call($input[0], paramIndex);\n            }, 0);\n            return value;\n          },\n        });\n\n        const typeahead = $input.data('typeahead');\n        typeahead.lookup = function () {\n          this.query = this.$element.val() || '';\n          const items = this.source(this.query, $.proxy(this.process, this));\n          return items ? this.process(items) : items;\n        };\n\n        if (debounceLookup) {\n          typeahead.lookup = debounce(typeahead.lookup, 500, { leading: true });\n        }\n      }\n\n      $scope.showActionsMenu = () => {\n        promiseToDigest($scope)(\n          $scope.handleEvent({ $event: { name: 'get-part-actions' } }).then((res: any) => {\n            $scope.partActions = res;\n          })\n        );\n      };\n\n      $scope.triggerPartAction = (action: string) => {\n        $scope.handleEvent({ $event: { name: 'action', action: action } });\n      };\n\n      function addElementsAndCompile() {\n        each(partDef.params, (param: any, index: number) => {\n          if (param.optional && part.params.length <= index) {\n            return;\n          }\n\n          if (index > 0) {\n            $('<span>, </span>').appendTo($paramsContainer);\n          }\n\n          const paramValue = templateSrv.highlightVariablesAsHtml(part.params[index]);\n          const $paramLink = $('<a class=\"graphite-func-param-link pointer\">' + paramValue + '</a>');\n          const $input = $(paramTemplate);\n\n          $paramLink.appendTo($paramsContainer);\n          $input.appendTo($paramsContainer);\n\n          $input.blur(partial(inputBlur, index));\n          $input.keyup(inputKeyDown);\n          $input.keypress(partial(inputKeyPress, index));\n          $paramLink.click(partial(clickFuncParam, index));\n\n          addTypeahead($input, param, index);\n        });\n      }\n\n      function relink() {\n        $paramsContainer.empty();\n        addElementsAndCompile();\n      }\n\n      relink();\n    },\n  };\n}\n\ncoreModule.directive('queryPartEditor', queryPartEditorDirective);\n","import { ISCEService } from 'angular';\nimport { debounce, find, indexOf, map, isObject, escape, unescape } from 'lodash';\n\nimport coreModule from '../../core_module';\nimport { promiseToDigest } from '../../promiseToDigest';\n\nfunction typeaheadMatcher(this: any, item: string) {\n  let str = this.query;\n  if (str === '') {\n    return true;\n  }\n  if (str[0] === '/') {\n    str = str.substring(1);\n  }\n  if (str[str.length - 1] === '/') {\n    str = str.substring(0, str.length - 1);\n  }\n  return item.toLowerCase().match(str.toLowerCase());\n}\n\nexport class FormDropdownCtrl {\n  inputElement: JQLite;\n  linkElement: JQLite;\n  model: any;\n  display: any;\n  text: any;\n  options: any;\n  cssClass: any;\n  cssClasses: any;\n  allowCustom: any;\n  labelMode: boolean;\n  linkMode: boolean;\n  cancelBlur: any;\n  onChange: any;\n  getOptions: any;\n  optionCache: any;\n  lookupText: boolean;\n  placeholder: any;\n  startOpen: any;\n  debounce: boolean;\n\n  /** @ngInject */\n  constructor(private $scope: any, $element: JQLite, private $sce: ISCEService, private templateSrv: any) {\n    this.inputElement = $element.find('input').first();\n    this.linkElement = $element.find('a').first();\n    this.linkMode = true;\n    this.cancelBlur = null;\n    this.labelMode = false;\n    this.lookupText = false;\n    this.debounce = false;\n\n    // listen to model changes\n    $scope.$watch('ctrl.model', this.modelChanged.bind(this));\n  }\n\n  $onInit() {\n    if (this.labelMode) {\n      this.cssClasses = 'gf-form-label ' + this.cssClass;\n    } else {\n      this.cssClasses = 'gf-form-input gf-form-input--dropdown ' + this.cssClass;\n    }\n\n    if (this.placeholder) {\n      this.inputElement.attr('placeholder', this.placeholder);\n    }\n\n    this.inputElement.attr('data-provide', 'typeahead');\n    this.inputElement.typeahead({\n      source: this.typeaheadSource.bind(this),\n      minLength: 0,\n      items: 10000,\n      updater: this.typeaheadUpdater.bind(this),\n      matcher: typeaheadMatcher,\n    });\n\n    // modify typeahead lookup\n    // this = typeahead\n    const typeahead = this.inputElement.data('typeahead');\n    typeahead.lookup = function () {\n      this.query = this.$element.val() || '';\n      this.source(this.query, this.process.bind(this));\n    };\n\n    if (this.debounce) {\n      typeahead.lookup = debounce(typeahead.lookup, 500, { leading: true });\n    }\n\n    this.linkElement.keydown((evt) => {\n      // trigger typeahead on down arrow or enter key\n      if (evt.keyCode === 40 || evt.keyCode === 13) {\n        this.linkElement.click();\n      }\n    });\n\n    this.inputElement.keydown((evt) => {\n      if (evt.keyCode === 13) {\n        setTimeout(() => {\n          this.inputElement.blur();\n        }, 300);\n      }\n    });\n\n    this.inputElement.blur(this.inputBlur.bind(this));\n\n    if (this.startOpen) {\n      setTimeout(this.open.bind(this), 0);\n    }\n  }\n\n  getOptionsInternal(query: string) {\n    return promiseToDigest(this.$scope)(Promise.resolve(this.getOptions({ $query: query })));\n  }\n\n  isPromiseLike(obj: any) {\n    return obj && typeof obj.then === 'function';\n  }\n\n  modelChanged() {\n    if (isObject(this.model)) {\n      this.updateDisplay((this.model as any).text);\n    } else {\n      // if we have text use it\n      if (this.lookupText) {\n        this.getOptionsInternal('').then((options: any) => {\n          const item: any = find(options, { value: this.model });\n          this.updateDisplay(item ? item.text : this.model);\n        });\n      } else {\n        this.updateDisplay(this.model);\n      }\n    }\n  }\n\n  typeaheadSource(query: string, callback: (res: any) => void) {\n    this.getOptionsInternal(query).then((options: any) => {\n      this.optionCache = options;\n\n      // extract texts\n      const optionTexts = map(options, (op: any) => {\n        return escape(op.text);\n      });\n\n      // add custom values\n      if (this.allowCustom && this.text !== '') {\n        if (indexOf(optionTexts, this.text) === -1) {\n          optionTexts.unshift(this.text);\n        }\n      }\n\n      callback(optionTexts);\n    });\n  }\n\n  typeaheadUpdater(text: string) {\n    if (text === this.text) {\n      clearTimeout(this.cancelBlur);\n      this.inputElement.focus();\n      return text;\n    }\n\n    this.inputElement.val(text);\n    this.switchToLink(true);\n    return text;\n  }\n\n  switchToLink(fromClick: boolean) {\n    if (this.linkMode && !fromClick) {\n      return;\n    }\n\n    clearTimeout(this.cancelBlur);\n    this.cancelBlur = null;\n    this.linkMode = true;\n    this.inputElement.hide();\n    this.linkElement.show();\n    this.updateValue(this.inputElement.val() as string);\n  }\n\n  inputBlur() {\n    // happens long before the click event on the typeahead options\n    // need to have long delay because the blur\n    this.cancelBlur = setTimeout(this.switchToLink.bind(this), 200);\n  }\n\n  updateValue(text: string) {\n    text = unescape(text);\n\n    if (text === '' || this.text === text) {\n      return;\n    }\n\n    this.$scope.$apply(() => {\n      const option: any = find(this.optionCache, { text: text });\n\n      if (option) {\n        if (isObject(this.model)) {\n          this.model = option;\n        } else {\n          this.model = option.value;\n        }\n        this.text = option.text;\n      } else if (this.allowCustom) {\n        if (isObject(this.model)) {\n          (this.model as any).text = (this.model as any).value = text;\n        } else {\n          this.model = text;\n        }\n        this.text = text;\n      }\n\n      // needs to call this after digest so\n      // property is synced with outerscope\n      this.$scope.$$postDigest(() => {\n        this.$scope.$apply(() => {\n          this.onChange({ $option: option });\n        });\n      });\n    });\n  }\n\n  updateDisplay(text: string) {\n    this.text = text;\n    this.display = this.$sce.trustAsHtml(this.templateSrv.highlightVariablesAsHtml(text));\n  }\n\n  open() {\n    this.inputElement.css('width', Math.max(this.linkElement.width()!, 80) + 16 + 'px');\n\n    this.inputElement.show();\n    this.inputElement.focus();\n\n    this.linkElement.hide();\n    this.linkMode = false;\n\n    const typeahead = this.inputElement.data('typeahead');\n    if (typeahead) {\n      this.inputElement.val('');\n      typeahead.lookup();\n    }\n  }\n}\n\nconst template = `\n<input type=\"text\"\n  data-provide=\"typeahead\"\n  class=\"gf-form-input\"\n  spellcheck=\"false\"\n  style=\"display:none\">\n</input>\n<a ng-class=\"ctrl.cssClasses\"\n   tabindex=\"1\"\n   ng-click=\"ctrl.open()\"\n   give-focus=\"ctrl.focus\"\n   ng-bind-html=\"ctrl.display || '&nbsp;'\">\n</a>\n`;\n\nexport function formDropdownDirective() {\n  return {\n    restrict: 'E',\n    template: template,\n    controller: FormDropdownCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    scope: {\n      model: '=',\n      getOptions: '&',\n      onChange: '&',\n      cssClass: '@',\n      allowCustom: '@',\n      labelMode: '@',\n      lookupText: '@',\n      placeholder: '@',\n      startOpen: '@',\n      debounce: '@',\n    },\n  };\n}\n\ncoreModule.directive('gfFormDropdown', formDropdownDirective);\n","// @ts-ignore\nimport baron from 'baron';\nimport $ from 'jquery';\n\nimport coreModule from 'app/angular/core_module';\n\nconst scrollBarHTML = `\n<div class=\"baron__track\">\n  <div class=\"baron__bar\"></div>\n</div>\n`;\n\nconst scrollRootClass = 'baron baron__root';\nconst scrollerClass = 'baron__scroller';\n\nexport function geminiScrollbar() {\n  return {\n    restrict: 'A',\n    link: (scope: any, elem: any, attrs: any) => {\n      let scrollRoot = elem.parent();\n      const scroller = elem;\n\n      if (attrs.grafanaScrollbar && attrs.grafanaScrollbar === 'scrollonroot') {\n        scrollRoot = scroller;\n      }\n\n      scrollRoot.addClass(scrollRootClass);\n      $(scrollBarHTML).appendTo(scrollRoot);\n      elem.addClass(scrollerClass);\n\n      const scrollParams = {\n        root: scrollRoot[0],\n        scroller: scroller[0],\n        bar: '.baron__bar',\n        barOnCls: '_scrollbar',\n        scrollingCls: '_scrolling',\n        track: '.baron__track',\n        direction: 'v',\n      };\n\n      const scrollbar = baron(scrollParams);\n\n      scope.$on('$destroy', () => {\n        scrollbar.dispose();\n      });\n    },\n  };\n}\n\ncoreModule.directive('grafanaScrollbar', geminiScrollbar);\n","import { JsonExplorer } from '@grafana/ui';\nimport coreModule from 'app/angular/core_module';\n\ncoreModule.directive('jsonTree', [\n  function jsonTreeDirective() {\n    return {\n      restrict: 'E',\n      scope: {\n        object: '=',\n        startExpanded: '@',\n        rootName: '@',\n      },\n      link: (scope: any, elem) => {\n        let expansionLevel = scope.startExpanded;\n        if (scope.startExpanded === 'true') {\n          expansionLevel = 2;\n        } else if (scope.startExpanded === 'false') {\n          expansionLevel = 1;\n        }\n        const jsonObject = { [scope.rootName]: scope.object };\n        const jsonExp = new JsonExplorer(jsonObject, expansionLevel, {\n          animateOpen: true,\n        });\n        const html = jsonExp.render(true);\n        elem.append(html);\n      },\n    };\n  },\n]);\n","import coreModule from 'app/angular/core_module';\n\nconst template = `\n<label for=\"check-{{ctrl.id}}\" class=\"gf-form-switch-container\">\n  <div class=\"gf-form-label {{ctrl.labelClass}}\" ng-show=\"ctrl.label\">\n    {{ctrl.label}}\n    <info-popover mode=\"right-normal\" ng-if=\"ctrl.tooltip\" position=\"top center\">\n      {{ctrl.tooltip}}\n    </info-popover>\n  </div>\n  <div class=\"gf-form-switch {{ctrl.switchClass}}\" ng-if=\"ctrl.show\">\n    <input id=\"check-{{ctrl.id}}\" type=\"checkbox\" ng-model=\"ctrl.checked\" ng-change=\"ctrl.internalOnChange()\">\n    <span class=\"gf-form-switch__slider\"></span>\n  </div>\n</label>\n`;\n\nconst checkboxTemplate = `\n<label for=\"check-{{ctrl.id}}\" class=\"gf-form-switch-container\">\n   <div class=\"gf-form-label {{ctrl.labelClass}}\" ng-show=\"ctrl.label\">\n    {{ctrl.label}}\n    <info-popover mode=\"right-normal\" ng-if=\"ctrl.tooltip\" position=\"top center\">\n      {{ctrl.tooltip}}\n    </info-popover>\n  </div>\n  <div class=\"gf-form-checkbox {{ctrl.switchClass}}\" ng-if=\"ctrl.show\">\n    <input id=\"check-{{ctrl.id}}\" type=\"checkbox\" ng-model=\"ctrl.checked\" ng-change=\"ctrl.internalOnChange()\">\n    <span class=\"gf-form-switch__checkbox\"></span>\n  </div>\n</label>\n`;\n\nexport class SwitchCtrl {\n  onChange: any;\n  checked: any;\n  show: any;\n  id: any;\n  label?: string;\n\n  /** @ngInject */\n  constructor($scope: any, private $timeout: any) {\n    this.show = true;\n    this.id = $scope.$id;\n  }\n\n  internalOnChange() {\n    return this.$timeout(() => {\n      return this.onChange();\n    });\n  }\n}\n\nexport function switchDirective() {\n  return {\n    restrict: 'E',\n    controller: SwitchCtrl,\n    controllerAs: 'ctrl',\n    bindToController: true,\n    scope: {\n      checked: '=',\n      label: '@',\n      labelClass: '@',\n      tooltip: '@',\n      switchClass: '@',\n      onChange: '&',\n    },\n    template: template,\n  };\n}\n\nexport function checkboxDirective() {\n  return {\n    restrict: 'E',\n    controller: SwitchCtrl,\n    controllerAs: 'ctrl',\n    bindToController: true,\n    scope: {\n      checked: '=',\n      label: '@',\n      labelClass: '@',\n      tooltip: '@',\n      switchClass: '@',\n      onChange: '&',\n    },\n    template: checkboxTemplate,\n  };\n}\n\ncoreModule.directive('gfFormSwitch', switchDirective);\ncoreModule.directive('gfFormCheckbox', checkboxDirective);\n","import { each } from 'lodash';\n// @ts-ignore\nimport Drop from 'tether-drop';\n\nimport coreModule from 'app/angular/core_module';\n\nexport function infoPopover() {\n  return {\n    restrict: 'E',\n    template: `<icon name=\"'info-circle'\" style=\"margin-left: 10px;\" size=\"'xs'\"></icon>`,\n    transclude: true,\n    link: (scope: any, elem: any, attrs: any, ctrl: any, transclude: any) => {\n      const offset = attrs.offset || '0 -10px';\n      const position = attrs.position || 'right middle';\n      let classes = 'drop-help drop-hide-out-of-bounds';\n      const openOn = 'hover';\n\n      elem.addClass('gf-form-help-icon');\n\n      if (attrs.wide) {\n        classes += ' drop-wide';\n      }\n\n      if (attrs.mode) {\n        elem.addClass('gf-form-help-icon--' + attrs.mode);\n      }\n\n      transclude((clone: any, newScope: any) => {\n        const content = document.createElement('div');\n        content.className = 'markdown-html';\n\n        each(clone, (node) => {\n          content.appendChild(node);\n        });\n\n        const dropOptions = {\n          target: elem[0],\n          content: content,\n          position: position,\n          classes: classes,\n          openOn: openOn,\n          hoverOpenDelay: 400,\n          tetherOptions: {\n            offset: offset,\n            constraints: [\n              {\n                to: 'window',\n                attachment: 'together',\n                pin: true,\n              },\n            ],\n          },\n        };\n\n        // Create drop in next digest after directive content is rendered.\n        scope.$applyAsync(() => {\n          const drop = new Drop(dropOptions);\n\n          const unbind = scope.$on('$destroy', () => {\n            drop.destroy();\n            unbind();\n          });\n        });\n      });\n    },\n  };\n}\n\ncoreModule.directive('infoPopover', infoPopover);\n","/**\n * Wrapper for the new ngReact <color-picker> directive for backward compatibility.\n * Allows remaining <spectrum-picker> untouched in outdated plugins.\n * Technically, it's just a wrapper for react component with two-way data binding support.\n */\nimport coreModule from '../core_module';\n\n/** @ngInject */\nexport function spectrumPicker() {\n  return {\n    restrict: 'E',\n    require: 'ngModel',\n    scope: true,\n    replace: true,\n    template: '<color-picker color=\"ngModel.$viewValue\" on-change=\"onColorChange\"></color-picker>',\n    link: (scope: any, element: any, attrs: any, ngModel: any) => {\n      scope.ngModel = ngModel;\n      scope.onColorChange = (color: string) => {\n        ngModel.$setViewValue(color);\n      };\n    },\n  };\n}\ncoreModule.directive('spectrumPicker', spectrumPicker);\n","/**\n * codeEditor directive based on Ace code editor\n * https://github.com/ajaxorg/ace\n *\n * Basic usage:\n * <code-editor content=\"ctrl.target.query\" on-change=\"ctrl.panelCtrl.refresh()\"\n *  data-mode=\"sql\" data-show-gutter>\n * </code-editor>\n *\n * Params:\n * content:      Editor content.\n * onChange:     Function called on content change (invoked on editor blur, ctrl+enter, not on every change).\n * getCompleter: Function returned external completer. Completer is an object implemented getCompletions() method,\n *               see Prometheus Data Source implementation for details.\n *\n * Some Ace editor options available via data-* attributes:\n * data-mode               - Language mode (text, sql, javascript, etc.). Default is 'text'.\n * data-theme              - Editor theme (eg 'solarized_dark').\n * data-max-lines          - Max editor height in lines. Editor grows automatically from 1 to maxLines.\n * data-show-gutter        - Show gutter (contains line numbers and additional info).\n * data-tab-size           - Tab size, default is 2.\n * data-behaviours-enabled - Specifies whether to use behaviors or not. \"Behaviors\" in this case is the auto-pairing of\n *                           special characters, like quotation marks, parenthesis, or brackets.\n * data-snippets-enabled   - Specifies whether to use snippets or not. \"Snippets\" are small pieces of code that can be\n *                           inserted via the completion box.\n *\n * Keybindings:\n * Ctrl-Enter (Command-Enter): run onChange() function\n */\n\nimport coreModule from 'app/angular/core_module';\nimport config from 'app/core/config';\n\nconst DEFAULT_THEME_DARK = 'ace/theme/grafana-dark';\nconst DEFAULT_THEME_LIGHT = 'ace/theme/textmate';\nconst DEFAULT_MODE = 'text';\nconst DEFAULT_MAX_LINES = 10;\nconst DEFAULT_TAB_SIZE = 2;\nconst DEFAULT_BEHAVIORS = true;\nconst DEFAULT_SNIPPETS = true;\n\nconst editorTemplate = `<div></div>`;\n\nasync function link(scope: any, elem: any, attrs: any) {\n  // Options\n  const langMode = attrs.mode || DEFAULT_MODE;\n  const maxLines = attrs.maxLines || DEFAULT_MAX_LINES;\n  const showGutter = attrs.showGutter !== undefined;\n  const tabSize = attrs.tabSize || DEFAULT_TAB_SIZE;\n  const behavioursEnabled = attrs.behavioursEnabled ? attrs.behavioursEnabled === 'true' : DEFAULT_BEHAVIORS;\n  const snippetsEnabled = attrs.snippetsEnabled ? attrs.snippetsEnabled === 'true' : DEFAULT_SNIPPETS;\n\n  // Initialize editor\n  const aceElem = elem.get(0);\n  const { default: ace } = await import(/* webpackChunkName: \"brace\" */ 'brace');\n  await import('brace/ext/language_tools');\n  await import('brace/theme/textmate');\n  await import('brace/mode/text');\n  await import('brace/snippets/text');\n  await import('brace/mode/sql');\n  await import('brace/snippets/sql');\n  await import('brace/mode/sqlserver');\n  await import('brace/snippets/sqlserver');\n  await import('brace/mode/markdown');\n  await import('brace/snippets/markdown');\n  await import('brace/mode/json');\n  await import('brace/snippets/json');\n\n  // @ts-ignore\n  await import('./theme-grafana-dark');\n\n  const codeEditor = ace.edit(aceElem);\n  const editorSession = codeEditor.getSession();\n\n  const editorOptions = {\n    maxLines: maxLines,\n    showGutter: showGutter,\n    tabSize: tabSize,\n    behavioursEnabled: behavioursEnabled,\n    highlightActiveLine: false,\n    showPrintMargin: false,\n    autoScrollEditorIntoView: true, // this is needed if editor is inside scrollable page\n  };\n\n  // Set options\n  codeEditor.setOptions(editorOptions);\n  // disable depreacation warning\n  codeEditor.$blockScrolling = Infinity;\n  // Padding hacks\n  (codeEditor.renderer as any).setScrollMargin(10, 10);\n  codeEditor.renderer.setPadding(10);\n\n  setThemeMode();\n  setLangMode(langMode);\n  setEditorContent(scope.content);\n\n  // Add classes\n  elem.addClass('gf-code-editor');\n  const textarea = elem.find('textarea');\n  textarea.addClass('gf-form-input');\n\n  // All aria-label to be set for accessibility\n  textarea.attr('aria-label', attrs.textareaLabel);\n\n  if (scope.codeEditorFocus) {\n    setTimeout(() => {\n      textarea.focus();\n      const domEl = textarea[0];\n      if (domEl.setSelectionRange) {\n        const pos = textarea.val().length * 2;\n        domEl.setSelectionRange(pos, pos);\n      }\n    }, 100);\n  }\n\n  // Event handlers\n  editorSession.on('change', (e) => {\n    scope.$apply(() => {\n      const newValue = codeEditor.getValue();\n      scope.content = newValue;\n    });\n  });\n\n  // Sync with outer scope - update editor content if model has been changed from outside of directive.\n  scope.$watch('content', (newValue: any, oldValue: any) => {\n    const editorValue = codeEditor.getValue();\n    if (newValue !== editorValue && newValue !== oldValue) {\n      scope.$$postDigest(() => {\n        setEditorContent(newValue);\n      });\n    }\n  });\n\n  codeEditor.on('blur', () => {\n    scope.onChange();\n  });\n\n  scope.$on('$destroy', () => {\n    codeEditor.destroy();\n  });\n\n  // Keybindings\n  codeEditor.commands.addCommand({\n    name: 'executeQuery',\n    bindKey: { win: 'Ctrl-Enter', mac: 'Command-Enter' },\n    exec: () => {\n      scope.onChange();\n    },\n  });\n\n  function setLangMode(lang: string) {\n    ace.acequire('ace/ext/language_tools');\n    codeEditor.setOptions({\n      enableBasicAutocompletion: true,\n      enableLiveAutocompletion: true,\n      enableSnippets: snippetsEnabled,\n    });\n\n    if (scope.getCompleter()) {\n      // make copy of array as ace seems to share completers array between instances\n      const anyEditor = codeEditor as any;\n      anyEditor.completers = anyEditor.completers.slice();\n      anyEditor.completers.push(scope.getCompleter());\n    }\n\n    const aceModeName = `ace/mode/${lang}`;\n    editorSession.setMode(aceModeName);\n  }\n\n  function setThemeMode() {\n    let theme = DEFAULT_THEME_DARK;\n    if (config.bootData.user.lightTheme) {\n      theme = DEFAULT_THEME_LIGHT;\n    }\n\n    codeEditor.setTheme(theme);\n  }\n\n  function setEditorContent(value: string) {\n    codeEditor.setValue(value);\n    codeEditor.clearSelection();\n  }\n}\n\nexport function codeEditorDirective() {\n  return {\n    restrict: 'E',\n    template: editorTemplate,\n    scope: {\n      content: '=',\n      datasource: '=',\n      codeEditorFocus: '<',\n      onChange: '&',\n      getCompleter: '&',\n    },\n    link: link,\n  };\n}\n\ncoreModule.directive('codeEditor', codeEditorDirective);\n","import $ from 'jquery';\nimport { debounce, each, indexOf, map, partial, escape, unescape } from 'lodash';\n\nimport coreModule from 'app/angular/core_module';\n\nconst template = `\n<div class=\"dropdown cascade-open\">\n<a ng-click=\"showActionsMenu()\" class=\"query-part-name pointer dropdown-toggle\" data-toggle=\"dropdown\">{{part.label}}</a>\n<span>{{part.def.wrapOpen}}</span><span class=\"query-part-parameters\"></span><span>{{part.def.wrapClose}}</span>\n<ul class=\"dropdown-menu\">\n  <li ng-repeat=\"action in partActions\">\n    <a ng-click=\"triggerPartAction(action)\">{{action.text}}</a>\n  </li>\n</ul>\n`;\n\n/** @ngInject */\nexport function sqlPartEditorDirective(templateSrv: any) {\n  const paramTemplate = '<input type=\"text\" class=\"hide input-mini\"></input>';\n\n  return {\n    restrict: 'E',\n    template: template,\n    scope: {\n      part: '=',\n      handleEvent: '&',\n      debounce: '@',\n    },\n    link: function postLink($scope: any, elem: any) {\n      const part = $scope.part;\n      const partDef = part.def;\n      const $paramsContainer = elem.find('.query-part-parameters');\n      const debounceLookup = $scope.debounce;\n      let cancelBlur: any = null;\n\n      $scope.partActions = [];\n\n      function clickFuncParam(this: any, paramIndex: number) {\n        const $link = $(this);\n        const $input = $link.next();\n\n        $input.val(part.params[paramIndex]);\n        $input.css('width', $link.width()! + 16 + 'px');\n\n        $link.hide();\n        $input.show();\n        $input.focus();\n        $input.select();\n\n        const typeahead = $input.data('typeahead');\n        if (typeahead) {\n          $input.val('');\n          typeahead.lookup();\n        }\n      }\n\n      function inputBlur($input: JQuery, paramIndex: number) {\n        cancelBlur = setTimeout(() => {\n          switchToLink($input, paramIndex);\n        }, 200);\n      }\n\n      function switchToLink($input: JQuery, paramIndex: number) {\n        const $link = $input.prev();\n        const newValue = $input.val();\n\n        if (newValue !== '' || part.def.params[paramIndex].optional) {\n          $link.html(templateSrv.highlightVariablesAsHtml(newValue));\n\n          part.updateParam($input.val(), paramIndex);\n          $scope.$apply(() => {\n            $scope.handleEvent({ $event: { name: 'part-param-changed' } });\n          });\n        }\n\n        $input.hide();\n        $link.show();\n      }\n\n      function inputKeyPress(this: any, paramIndex: number, e: any) {\n        if (e.which === 13) {\n          switchToLink($(this), paramIndex);\n        }\n      }\n\n      function inputKeyDown(this: any) {\n        this.style.width = (3 + this.value.length) * 8 + 'px';\n      }\n\n      function addTypeahead($input: JQuery, param: any, paramIndex: number) {\n        if (!param.options && !param.dynamicLookup) {\n          return;\n        }\n\n        const typeaheadSource = (query: string, callback: any) => {\n          if (param.options) {\n            let options = param.options;\n            if (param.type === 'int') {\n              options = map(options, (val) => {\n                return val.toString();\n              });\n            }\n            return options;\n          }\n\n          $scope.$apply(() => {\n            $scope.handleEvent({ $event: { name: 'get-param-options', param: param } }).then((result: any) => {\n              const dynamicOptions = map(result, (op) => {\n                return escape(op.value);\n              });\n\n              // add current value to dropdown if it's not in dynamicOptions\n              if (indexOf(dynamicOptions, part.params[paramIndex]) === -1) {\n                dynamicOptions.unshift(escape(part.params[paramIndex]));\n              }\n\n              callback(dynamicOptions);\n            });\n          });\n        };\n\n        $input.attr('data-provide', 'typeahead');\n\n        $input.typeahead({\n          source: typeaheadSource,\n          minLength: 0,\n          items: 1000,\n          updater: (value: string) => {\n            value = unescape(value);\n            if (value === part.params[paramIndex]) {\n              clearTimeout(cancelBlur);\n              $input.focus();\n              return value;\n            }\n            return value;\n          },\n        });\n\n        const typeahead = $input.data('typeahead');\n        typeahead.lookup = function () {\n          this.query = this.$element.val() || '';\n          const items = this.source(this.query, $.proxy(this.process, this));\n          return items ? this.process(items) : items;\n        };\n\n        if (debounceLookup) {\n          typeahead.lookup = debounce(typeahead.lookup, 500, { leading: true });\n        }\n      }\n\n      $scope.showActionsMenu = () => {\n        $scope.handleEvent({ $event: { name: 'get-part-actions' } }).then((res: any) => {\n          $scope.partActions = res;\n        });\n      };\n\n      $scope.triggerPartAction = (action: string) => {\n        $scope.handleEvent({ $event: { name: 'action', action: action } });\n      };\n\n      function addElementsAndCompile() {\n        each(partDef.params, (param: any, index: number) => {\n          if (param.optional && part.params.length <= index) {\n            return;\n          }\n\n          if (index > 0) {\n            $('<span>' + partDef.separator + '</span>').appendTo($paramsContainer);\n          }\n\n          const paramValue = templateSrv.highlightVariablesAsHtml(part.params[index]);\n          const $paramLink = $('<a class=\"query-part__link\">' + paramValue + '</a>');\n          const $input = $(paramTemplate);\n\n          $paramLink.appendTo($paramsContainer);\n          $input.appendTo($paramsContainer);\n\n          $input.blur(partial(inputBlur, $input, index));\n          $input.keyup(inputKeyDown);\n          $input.keypress(partial(inputKeyPress, index));\n          $paramLink.click(partial(clickFuncParam, index));\n\n          addTypeahead($input, param, index);\n        });\n      }\n\n      function relink() {\n        $paramsContainer.empty();\n        addElementsAndCompile();\n      }\n\n      relink();\n    },\n  };\n}\n\ncoreModule.directive('sqlPartEditor', sqlPartEditorDirective);\n","import { coreModule } from 'app/angular/core_module';\n\ncoreModule.directive('datasourceHttpSettings', () => {\n  return {\n    scope: {\n      current: '=',\n      suggestUrl: '@',\n      noDirectAccess: '@',\n      showForwardOAuthIdentityOption: '@',\n    },\n    templateUrl: 'public/app/angular/partials/http_settings_next.html',\n    link: {\n      pre: ($scope: any) => {\n        // do not show access option if direct access is disabled\n        $scope.showAccessOption = $scope.noDirectAccess !== 'true';\n        $scope.onChange = (datasourceSetting: any) => {\n          $scope.current = datasourceSetting;\n        };\n      },\n    },\n  };\n});\n","import { coreModule } from 'app/angular/core_module';\n\ncoreModule.directive('datasourceTlsAuthSettings', () => {\n  return {\n    scope: {\n      current: '=',\n    },\n    templateUrl: 'public/app/angular/partials/tls_auth_settings.html',\n  };\n});\n","import angular, { ILocationService } from 'angular';\nimport { each } from 'lodash';\n\nimport { DataSourceApi, PanelEvents } from '@grafana/data';\nimport coreModule from 'app/angular/core_module';\nimport config from 'app/core/config';\n\nimport { importPanelPlugin } from '../../features/plugins/importPanelPlugin';\nimport { importDataSourcePlugin, importAppPlugin } from '../../features/plugins/plugin_loader';\n\n/** @ngInject */\nfunction pluginDirectiveLoader($compile: any, $http: any, $templateCache: any, $location: ILocationService) {\n  function getTemplate(component: { template: any; templateUrl: any }) {\n    if (component.template) {\n      return Promise.resolve(component.template);\n    }\n    const cached = $templateCache.get(component.templateUrl);\n    if (cached) {\n      return Promise.resolve(cached);\n    }\n    return $http.get(component.templateUrl).then((res: any) => {\n      return res.data;\n    });\n  }\n\n  function relativeTemplateUrlToAbs(templateUrl: string, baseUrl: string) {\n    if (!templateUrl) {\n      return undefined;\n    }\n    if (templateUrl.indexOf('public') === 0) {\n      return templateUrl;\n    }\n    return baseUrl + '/' + templateUrl;\n  }\n\n  function getPluginComponentDirective(options: any) {\n    // handle relative template urls for plugin templates\n    options.Component.templateUrl = relativeTemplateUrlToAbs(options.Component.templateUrl, options.baseUrl);\n\n    return () => {\n      return {\n        templateUrl: options.Component.templateUrl,\n        template: options.Component.template,\n        restrict: 'E',\n        controller: options.Component,\n        controllerAs: 'ctrl',\n        bindToController: true,\n        scope: options.bindings,\n        link: (scope: any, elem: any, attrs: any, ctrl: any) => {\n          if (ctrl.link) {\n            ctrl.link(scope, elem, attrs, ctrl);\n          }\n          if (ctrl.init) {\n            ctrl.init();\n          }\n        },\n      };\n    };\n  }\n\n  function loadPanelComponentInfo(scope: any, attrs: any) {\n    const componentInfo: any = {\n      name: 'panel-plugin-' + scope.panel.type,\n      bindings: { dashboard: '=', panel: '=', row: '=' },\n      attrs: {\n        dashboard: 'dashboard',\n        panel: 'panel',\n        class: 'panel-height-helper',\n      },\n    };\n\n    const panelInfo = config.panels[scope.panel.type];\n    return importPanelPlugin(panelInfo.id).then((panelPlugin) => {\n      const PanelCtrl = panelPlugin.angularPanelCtrl;\n      componentInfo.Component = PanelCtrl;\n\n      if (!PanelCtrl || PanelCtrl.registered) {\n        return componentInfo;\n      }\n\n      if (PanelCtrl.templatePromise) {\n        return PanelCtrl.templatePromise.then((res: any) => {\n          return componentInfo;\n        });\n      }\n\n      if (panelInfo) {\n        PanelCtrl.templateUrl = relativeTemplateUrlToAbs(PanelCtrl.templateUrl, panelInfo.baseUrl);\n      }\n\n      PanelCtrl.templatePromise = getTemplate(PanelCtrl).then((template: any) => {\n        PanelCtrl.templateUrl = null;\n        PanelCtrl.template = `<grafana-panel ctrl=\"ctrl\" class=\"panel-height-helper\">${template}</grafana-panel>`;\n        return componentInfo;\n      });\n\n      return PanelCtrl.templatePromise;\n    });\n  }\n\n  function getModule(scope: any, attrs: any): any {\n    switch (attrs.type) {\n      // QueryCtrl\n      case 'query-ctrl': {\n        const ds: DataSourceApi = scope.ctrl.datasource as DataSourceApi;\n\n        return Promise.resolve({\n          baseUrl: ds.meta.baseUrl,\n          name: 'query-ctrl-' + ds.meta.id,\n          bindings: { target: '=', panelCtrl: '=', datasource: '=' },\n          attrs: {\n            target: 'ctrl.target',\n            'panel-ctrl': 'ctrl',\n            datasource: 'ctrl.datasource',\n          },\n          Component: ds.components!.QueryCtrl,\n        });\n      }\n      // Annotations\n      case 'annotations-query-ctrl': {\n        const baseUrl = scope.ctrl.currentDatasource.meta.baseUrl;\n        const pluginId = scope.ctrl.currentDatasource.meta.id;\n\n        return importDataSourcePlugin(scope.ctrl.currentDatasource.meta).then((dsPlugin) => {\n          return {\n            baseUrl,\n            name: 'annotations-query-ctrl-' + pluginId,\n            bindings: { annotation: '=', datasource: '=' },\n            attrs: {\n              annotation: 'ctrl.currentAnnotation',\n              datasource: 'ctrl.currentDatasource',\n            },\n            Component: dsPlugin.components.AnnotationsQueryCtrl,\n          };\n        });\n      }\n      // Datasource ConfigCtrl\n      case 'datasource-config-ctrl': {\n        const dsMeta = scope.ctrl.datasourceMeta;\n        const angularUrl = $location.url();\n        return importDataSourcePlugin(dsMeta).then((dsPlugin) => {\n          scope.$watch(\n            'ctrl.current',\n            () => {\n              // This watcher can trigger when we navigate away due to late digests\n              // This check is to stop onModelChanged from being called when navigating away\n              // as it triggers a redux action which comes before the angular $routeChangeSucces and\n              // This makes the bridgeSrv think location changed from redux before detecting it was actually\n              // changed from angular.\n              if (angularUrl === $location.url()) {\n                scope.onModelChanged(scope.ctrl.current);\n              }\n            },\n            true\n          );\n\n          return {\n            baseUrl: dsMeta.baseUrl,\n            name: 'ds-config-' + dsMeta.id,\n            bindings: { meta: '=', current: '=' },\n            attrs: { meta: 'ctrl.datasourceMeta', current: 'ctrl.current' },\n            Component: dsPlugin.angularConfigCtrl,\n          };\n        });\n      }\n      // AppConfigCtrl\n      case 'app-config-ctrl': {\n        const model = scope.ctrl.model;\n        return importAppPlugin(model).then((appPlugin) => {\n          return {\n            baseUrl: model.baseUrl,\n            name: 'app-config-' + model.id,\n            bindings: { appModel: '=', appEditCtrl: '=' },\n            attrs: { 'app-model': 'ctrl.model', 'app-edit-ctrl': 'ctrl' },\n            Component: appPlugin.angularConfigCtrl,\n          };\n        });\n      }\n      // Panel\n      case 'panel': {\n        return loadPanelComponentInfo(scope, attrs);\n      }\n      default: {\n        return Promise.reject({\n          message: 'Could not find component type: ' + attrs.type,\n        });\n      }\n    }\n  }\n\n  function appendAndCompile(scope: any, elem: JQuery, componentInfo: any) {\n    const child = angular.element(document.createElement(componentInfo.name));\n    each(componentInfo.attrs, (value, key) => {\n      child.attr(key, value);\n    });\n\n    $compile(child)(scope);\n    elem.empty();\n\n    // let a binding digest cycle complete before adding to dom\n    setTimeout(() => {\n      scope.$applyAsync(() => {\n        elem.append(child);\n        setTimeout(() => {\n          scope.$applyAsync(() => {\n            scope.$broadcast(PanelEvents.componentDidMount.name);\n          });\n        });\n      });\n    });\n  }\n\n  function registerPluginComponent(scope: any, elem: JQuery, attrs: any, componentInfo: any) {\n    if (componentInfo.notFound) {\n      elem.empty();\n      return;\n    }\n\n    if (!componentInfo.Component) {\n      throw {\n        message: 'Failed to find exported plugin component for ' + componentInfo.name,\n      };\n    }\n\n    if (!componentInfo.Component.registered) {\n      const directiveName = attrs.$normalize(componentInfo.name);\n      const directiveFn = getPluginComponentDirective(componentInfo);\n      coreModule.directive(directiveName, directiveFn);\n      componentInfo.Component.registered = true;\n    }\n\n    appendAndCompile(scope, elem, componentInfo);\n  }\n\n  return {\n    restrict: 'E',\n    link: (scope: any, elem: JQuery, attrs: any) => {\n      getModule(scope, attrs)\n        .then((componentInfo: any) => {\n          registerPluginComponent(scope, elem, attrs, componentInfo);\n        })\n        .catch((err: any) => {\n          console.error('Plugin component error', err);\n        });\n    },\n  };\n}\n\ncoreModule.directive('pluginComponent', pluginDirectiveLoader);\n","import { IRootScopeService, IAngularEvent, auto } from 'angular';\nimport $ from 'jquery';\nimport _ from 'lodash'; // eslint-disable-line lodash/import-scope\n\nimport { AppEvent } from '@grafana/data';\nimport { setLegacyAngularInjector, setAppEvents, setAngularLoader } from '@grafana/runtime';\nimport { colors } from '@grafana/ui';\nimport coreModule from 'app/angular/core_module';\nimport { AngularLoader } from 'app/angular/services/AngularLoader';\nimport appEvents from 'app/core/app_events';\nimport config from 'app/core/config';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport { initGrafanaLive } from 'app/features/live';\nimport { CoreEvents, AppEventEmitter, AppEventConsumer } from 'app/types';\n\nimport { UtilSrv } from './services/UtilSrv';\n\nexport type GrafanaRootScope = IRootScopeService & AppEventEmitter & AppEventConsumer & { colors: string[] };\n\nexport class GrafanaCtrl {\n  /** @ngInject */\n  constructor(\n    $scope: any,\n    utilSrv: UtilSrv,\n    $rootScope: GrafanaRootScope,\n    contextSrv: ContextSrv,\n    angularLoader: AngularLoader,\n    $injector: auto.IInjectorService\n  ) {\n    // make angular loader service available to react components\n    setAngularLoader(angularLoader);\n    setLegacyAngularInjector($injector);\n    setAppEvents(appEvents);\n\n    initGrafanaLive();\n\n    $scope.init = () => {\n      $scope.contextSrv = contextSrv;\n      $scope.appSubUrl = config.appSubUrl;\n      $scope._ = _;\n      utilSrv.init();\n    };\n\n    $rootScope.colors = colors;\n\n    $rootScope.onAppEvent = function <T>(\n      event: AppEvent<T> | string,\n      callback: (event: IAngularEvent, ...args: any[]) => void,\n      localScope?: any\n    ) {\n      let unbind;\n      if (typeof event === 'string') {\n        unbind = $rootScope.$on(event, callback);\n      } else {\n        unbind = $rootScope.$on(event.name, callback);\n      }\n\n      let callerScope = this;\n      if (callerScope.$id === 1 && !localScope) {\n        console.warn('warning rootScope onAppEvent called without localscope');\n      }\n      if (localScope) {\n        callerScope = localScope;\n      }\n      callerScope.$on('$destroy', unbind);\n    };\n\n    $rootScope.appEvent = <T>(event: AppEvent<T> | string, payload?: T | any) => {\n      if (typeof event === 'string') {\n        $rootScope.$emit(event, payload);\n        appEvents.emit(event, payload);\n      } else {\n        $rootScope.$emit(event.name, payload);\n        appEvents.emit(event, payload);\n      }\n    };\n\n    $scope.init();\n  }\n}\n\n/** @ngInject */\nexport function grafanaAppDirective() {\n  return {\n    restrict: 'E',\n    controller: GrafanaCtrl,\n    link: (scope: IRootScopeService & AppEventEmitter, elem: JQuery) => {\n      const body = $('body');\n      // see https://github.com/zenorocha/clipboard.js/issues/155\n      $.fn.modal.Constructor.prototype.enforceFocus = () => {};\n\n      appEvents.on(CoreEvents.toggleSidemenuHidden, () => {\n        body.toggleClass('sidemenu-hidden');\n      });\n\n      // handle in active view state class\n      let lastActivity = new Date().getTime();\n      let activeUser = true;\n      const inActiveTimeLimit = 60 * 5000;\n\n      function checkForInActiveUser() {\n        if (!activeUser) {\n          return;\n        }\n        // only go to activity low mode on dashboard page\n        if (!body.hasClass('page-dashboard')) {\n          return;\n        }\n\n        if (new Date().getTime() - lastActivity > inActiveTimeLimit) {\n          activeUser = false;\n          body.addClass('view-mode--inactive');\n        }\n      }\n\n      function userActivityDetected() {\n        lastActivity = new Date().getTime();\n        if (!activeUser) {\n          activeUser = true;\n          body.removeClass('view-mode--inactive');\n        }\n      }\n\n      // mouse and keyboard is user activity\n      body.mousemove(userActivityDetected);\n      body.keydown(userActivityDetected);\n      // set useCapture = true to catch event here\n      document.addEventListener('wheel', userActivityDetected, { capture: true, passive: true });\n      // treat tab change as activity\n      document.addEventListener('visibilitychange', userActivityDetected);\n\n      // check every 2 seconds\n      setInterval(checkForInActiveUser, 2000);\n\n      // handle document clicks that should hide things\n      body.click((evt) => {\n        const target = $(evt.target);\n        if (target.parents().length === 0) {\n          return;\n        }\n\n        // ensure dropdown menu doesn't impact on z-index\n        body.find('.dropdown-menu-open').removeClass('dropdown-menu-open');\n\n        // for stuff that animates, slides out etc, clicking it needs to\n        // hide it right away\n        const clickAutoHide = target.closest('[data-click-hide]');\n        if (clickAutoHide.length) {\n          const clickAutoHideParent = clickAutoHide.parent();\n          clickAutoHide.detach();\n          setTimeout(() => {\n            clickAutoHideParent.append(clickAutoHide);\n          }, 100);\n        }\n\n        // hide popovers\n        const popover = elem.find('.popover');\n        if (popover.length > 0 && target.parents('.graph-legend').length === 0) {\n          popover.hide();\n        }\n      });\n    },\n  };\n}\n\ncoreModule.directive('grafanaApp', grafanaAppDirective);\n","// This is empty for now, as I think it's not going to be necessary.\n// This replaces Angular RouteParamsProvider implementation with a dummy one to keep the ball rolling\n\nimport { navigationLogger } from '@grafana/runtime';\n\nexport class RouteParamsProvider {\n  constructor() {\n    navigationLogger('Patch angular', false, 'RouteParamsProvider');\n  }\n  $get = () => {\n    // throw new Error('TODO: Refactor $routeParams');\n  };\n}\n","// This is empty for now, as I think it's not going to be necessary.\n// This replaces Angular RouteProvider implementation with a dummy one to keep the ball rolling\n\nimport { navigationLogger } from '@grafana/runtime';\n\nexport class RouteProvider {\n  constructor() {\n    navigationLogger('Patch angular', false, 'RouteProvider');\n  }\n\n  $get() {\n    return this;\n  }\n}\n","import { ILocationService } from 'angular';\n\nimport { RouteParamsProvider } from '../core/navigation/patch/RouteParamsProvider';\nimport { RouteProvider } from '../core/navigation/patch/RouteProvider';\n\nimport { AngularLocationWrapper } from './AngularLocationWrapper';\nimport { coreModule } from './core_module';\n\n// Neutralizing Angular’s location tampering\n// https://stackoverflow.com/a/19825756\nconst tamperAngularLocation = () => {\n  coreModule.config([\n    '$provide',\n    ($provide: any) => {\n      $provide.decorator('$browser', [\n        '$delegate',\n        ($delegate: any) => {\n          $delegate.onUrlChange = () => {};\n          $delegate.url = () => '';\n\n          return $delegate;\n        },\n      ]);\n    },\n  ]);\n};\n\n// Intercepting $location service with implementation based on history\nconst interceptAngularLocation = () => {\n  coreModule.config([\n    '$provide',\n    ($provide: any) => {\n      $provide.decorator('$location', [\n        '$delegate',\n        ($delegate: ILocationService) => {\n          $delegate = new AngularLocationWrapper() as unknown as ILocationService;\n          return $delegate;\n        },\n      ]);\n    },\n  ]);\n  coreModule.provider('$route', RouteProvider);\n  coreModule.provider('$routeParams', RouteParamsProvider);\n};\n\nexport function initAngularRoutingBridge() {\n  tamperAngularLocation();\n  interceptAngularLocation();\n}\n","import { deprecationWarning } from '@grafana/data';\nimport { GrafanaRootScope } from 'app/angular/GrafanaCtrl';\nimport { appEvents } from 'app/core/app_events';\n\nimport { HideModalEvent, ShowModalEvent } from '../../types/events';\n\n/**\n * Old legacy utilSrv exposed to angular services and handles angular modals.\n * Not used by any core or known external plugin.\n */\nexport class UtilSrv {\n  modalScope: any;\n\n  /** @ngInject */\n  constructor(private $rootScope: GrafanaRootScope, private $modal: any) {}\n\n  init() {\n    appEvents.subscribe(ShowModalEvent, (e) => this.showModal(e.payload));\n    appEvents.subscribe(HideModalEvent, this.hideModal.bind(this));\n  }\n\n  /**\n   * @deprecated use showModalReact instead that has this capability built in\n   */\n  hideModal() {\n    deprecationWarning('UtilSrv', 'hideModal', 'showModalReact');\n    if (this.modalScope && this.modalScope.dismiss) {\n      this.modalScope.dismiss();\n    }\n  }\n\n  /**\n   * @deprecated use showModalReact instead\n   */\n  showModal(options: any) {\n    deprecationWarning('UtilSrv', 'showModal', 'showModalReact');\n    if (this.modalScope && this.modalScope.dismiss) {\n      this.modalScope.dismiss();\n    }\n\n    this.modalScope = options.scope;\n\n    if (options.model) {\n      this.modalScope = this.$rootScope.$new();\n      this.modalScope.model = options.model;\n    } else if (!this.modalScope) {\n      this.modalScope = this.$rootScope.$new();\n    }\n\n    const modal = this.$modal({\n      modalClass: options.modalClass,\n      template: options.src,\n      templateHtml: options.templateHtml,\n      persist: false,\n      show: false,\n      scope: this.modalScope,\n      keyboard: false,\n      backdrop: options.backdrop,\n    });\n\n    Promise.resolve(modal).then((modalEl) => {\n      modalEl.modal('show');\n    });\n  }\n}\n","import { cloneDeep } from 'lodash';\n\nimport { AnnotationEvent, deprecationWarning } from '@grafana/data';\nimport { deleteAnnotation, saveAnnotation, updateAnnotation } from 'app/features/annotations/api';\nimport { AnnotationQueryOptions } from 'app/features/annotations/types';\n\n/**\n * @deprecated AnnotationsSrv is deprecated in favor of DashboardQueryRunner\n */\nexport class AnnotationsSrv {\n  /**\n   * @deprecated clearPromiseCaches is deprecated\n   */\n  clearPromiseCaches() {\n    deprecationWarning('annotations_srv.ts', 'clearPromiseCaches', 'DashboardQueryRunner');\n  }\n\n  /**\n   * @deprecated getAnnotations is deprecated in favor of DashboardQueryRunner.getResult\n   */\n  getAnnotations(options: AnnotationQueryOptions) {\n    deprecationWarning('annotations_srv.ts', 'getAnnotations', 'DashboardQueryRunner.getResult');\n    return Promise.resolve({ annotations: [], alertState: undefined });\n  }\n\n  /**\n   * @deprecated getAlertStates is deprecated in favor of DashboardQueryRunner.getResult\n   */\n  getAlertStates(options: any) {\n    deprecationWarning('annotations_srv.ts', 'getAlertStates', 'DashboardQueryRunner.getResult');\n    return Promise.resolve(undefined);\n  }\n\n  /**\n   * @deprecated getGlobalAnnotations is deprecated in favor of DashboardQueryRunner.getResult\n   */\n  getGlobalAnnotations(options: AnnotationQueryOptions) {\n    deprecationWarning('annotations_srv.ts', 'getGlobalAnnotations', 'DashboardQueryRunner.getResult');\n    return Promise.resolve([]);\n  }\n\n  /**\n   * @deprecated saveAnnotationEvent is deprecated\n   */\n  saveAnnotationEvent(annotation: AnnotationEvent) {\n    deprecationWarning('annotations_srv.ts', 'saveAnnotationEvent', 'api/saveAnnotation');\n    return saveAnnotation(annotation);\n  }\n\n  /**\n   * @deprecated updateAnnotationEvent is deprecated\n   */\n  updateAnnotationEvent(annotation: AnnotationEvent) {\n    deprecationWarning('annotations_srv.ts', 'updateAnnotationEvent', 'api/updateAnnotation');\n    return updateAnnotation(annotation);\n  }\n\n  /**\n   * @deprecated deleteAnnotationEvent is deprecated\n   */\n  deleteAnnotationEvent(annotation: AnnotationEvent) {\n    deprecationWarning('annotations_srv.ts', 'deleteAnnotationEvent', 'api/deleteAnnotation');\n    return deleteAnnotation(annotation);\n  }\n\n  /**\n   * @deprecated translateQueryResult is deprecated in favor of DashboardQueryRunner/utils/translateQueryResult\n   */\n  translateQueryResult(annotation: any, results: any) {\n    deprecationWarning('annotations_srv.ts', 'translateQueryResult', 'DashboardQueryRunner/utils/translateQueryResult');\n    // if annotation has snapshotData\n    // make clone and remove it\n    if (annotation.snapshotData) {\n      annotation = cloneDeep(annotation);\n      delete annotation.snapshotData;\n    }\n\n    for (const item of results) {\n      item.source = annotation;\n      item.color = annotation.iconColor;\n      item.type = annotation.name;\n      item.isRegion = item.timeEnd && item.time !== item.timeEnd;\n    }\n\n    return results;\n  }\n}\n","import 'angular';\n\nimport 'angular-route';\nimport 'angular-sanitize';\nimport 'angular-bindonce';\nimport 'vendor/bootstrap/bootstrap';\nimport 'vendor/angular-other/angular-strap';\nimport angular from 'angular'; //eslint-disable-line no-duplicate-imports\nimport { extend } from 'lodash';\n\nimport { getTemplateSrv } from '@grafana/runtime';\nimport coreModule, { angularModules } from 'app/angular/core_module';\nimport appEvents from 'app/core/app_events';\nimport { config } from 'app/core/config';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { DashboardLoaderSrv } from 'app/features/dashboard/services/DashboardLoaderSrv';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { exposeToPlugin } from 'app/features/plugins/plugin_loader';\nimport * as sdk from 'app/plugins/sdk';\n\nimport { registerAngularDirectives } from './angular_wrappers';\nimport { initAngularRoutingBridge } from './bridgeReactAngularRouting';\nimport { monkeyPatchInjectorWithPreAssignedBindings } from './injectorMonkeyPatch';\nimport { promiseToDigest } from './promiseToDigest';\nimport { registerComponents } from './registerComponents';\n\nexport class AngularApp {\n  ngModuleDependencies: any[];\n  preBootModules: any[];\n  registerFunctions: any;\n\n  constructor() {\n    this.preBootModules = [];\n    this.ngModuleDependencies = [];\n    this.registerFunctions = {};\n  }\n\n  init() {\n    const app = angular.module('grafana', []);\n\n    app.config(\n      (\n        $controllerProvider: angular.IControllerProvider,\n        $compileProvider: angular.ICompileProvider,\n        $filterProvider: angular.IFilterProvider,\n        $httpProvider: angular.IHttpProvider,\n        $provide: angular.auto.IProvideService\n      ) => {\n        if (config.buildInfo.env !== 'development') {\n          $compileProvider.debugInfoEnabled(false);\n        }\n\n        $httpProvider.useApplyAsync(true);\n\n        this.registerFunctions.controller = $controllerProvider.register;\n        this.registerFunctions.directive = $compileProvider.directive;\n        this.registerFunctions.factory = $provide.factory;\n        this.registerFunctions.service = $provide.service;\n        this.registerFunctions.filter = $filterProvider.register;\n\n        $provide.decorator('$http', [\n          '$delegate',\n          '$templateCache',\n          ($delegate: any, $templateCache: any) => {\n            const get = $delegate.get;\n            $delegate.get = (url: string, config: any) => {\n              if (url.match(/\\.html$/)) {\n                // some template's already exist in the cache\n                if (!$templateCache.get(url)) {\n                  url += '?v=' + new Date().getTime();\n                }\n              }\n              return get(url, config);\n            };\n            return $delegate;\n          },\n        ]);\n      }\n    );\n\n    this.ngModuleDependencies = [\n      'grafana.core',\n      'ngSanitize',\n      '$strap.directives',\n      'grafana',\n      'pasvaz.bindonce',\n      'react',\n    ];\n\n    // makes it possible to add dynamic stuff\n    angularModules.forEach((m: angular.IModule) => {\n      this.useModule(m);\n    });\n\n    // register react angular wrappers\n    angular.module('grafana.services').service('dashboardLoaderSrv', DashboardLoaderSrv);\n\n    coreModule.factory('timeSrv', () => getTimeSrv());\n    coreModule.factory('templateSrv', () => getTemplateSrv());\n\n    registerAngularDirectives();\n    registerComponents();\n    initAngularRoutingBridge();\n\n    // Angular plugins import this\n    exposeToPlugin('angular', angular);\n    exposeToPlugin('app/core/utils/promiseToDigest', { promiseToDigest, __esModule: true });\n    exposeToPlugin('app/plugins/sdk', sdk);\n    exposeToPlugin('app/core/core_module', coreModule);\n    exposeToPlugin('app/core/core', {\n      coreModule: coreModule,\n      appEvents: appEvents,\n      contextSrv: contextSrv,\n      __esModule: true,\n    });\n\n    // disable tool tip animation\n    $.fn.tooltip.defaults.animation = false;\n  }\n\n  useModule(module: angular.IModule) {\n    if (this.preBootModules) {\n      this.preBootModules.push(module);\n    } else {\n      extend(module, this.registerFunctions);\n    }\n    this.ngModuleDependencies.push(module.name);\n    return module;\n  }\n\n  bootstrap() {\n    const injector = angular.bootstrap(document.getElementById('ngRoot')!, this.ngModuleDependencies);\n\n    monkeyPatchInjectorWithPreAssignedBindings(injector);\n\n    injector.invoke(() => {\n      this.preBootModules.forEach((module) => {\n        extend(module, this.registerFunctions);\n      });\n\n      // I don't know\n      return () => {};\n    });\n\n    return injector;\n  }\n}\n","import { getBackendSrv, getDataSourceSrv } from '@grafana/runtime';\nimport { contextSrv } from 'app/core/core';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { validationSrv } from 'app/features/manage-dashboards/services/ValidationSrv';\nimport { getLinkSrv } from 'app/features/panel/panellinks/link_srv';\n\nimport coreModule from './core_module';\nimport { UtilSrv } from './services/UtilSrv';\nimport { AnnotationsSrv } from './services/annotations_srv';\n\nexport function registerComponents() {\n  coreModule.factory('backendSrv', () => getBackendSrv());\n  coreModule.factory('contextSrv', () => contextSrv);\n  coreModule.factory('dashboardSrv', () => getDashboardSrv());\n  coreModule.factory('datasourceSrv', () => getDataSourceSrv());\n  coreModule.factory('linkSrv', () => getLinkSrv());\n  coreModule.factory('validationSrv', () => validationSrv);\n  coreModule.service('annotationsSrv', AnnotationsSrv);\n  coreModule.service('utilSrv', UtilSrv);\n}\n","export function monkeyPatchInjectorWithPreAssignedBindings(injector: any) {\n  injector.oldInvoke = injector.invoke;\n  injector.invoke = (fn: any, self: any, locals: any, serviceName: any) => {\n    const parentScope = locals?.$scope?.$parent;\n\n    if (parentScope) {\n      // PanelCtrl\n      if (parentScope.panel) {\n        self.panel = parentScope.panel;\n      }\n\n      // Panels & dashboard SettingsCtrl\n      if (parentScope.dashboard) {\n        self.dashboard = parentScope.dashboard;\n      }\n\n      // Query editors\n      if (parentScope.ctrl?.target) {\n        self.panelCtrl = parentScope.ctrl;\n        self.datasource = parentScope.ctrl.datasource;\n        self.target = parentScope.ctrl.target;\n      }\n\n      // Data source ConfigCtrl\n      if (parentScope.ctrl?.datasourceMeta) {\n        self.meta = parentScope.ctrl.datasourceMeta;\n        self.current = parentScope.ctrl.current;\n      }\n\n      // Data source AnnotationsQueryCtrl\n      if (parentScope.ctrl?.currentAnnotation) {\n        self.annotation = parentScope.ctrl.currentAnnotation;\n        self.datasource = parentScope.ctrl.currentDatasource;\n      }\n\n      // App config ctrl\n      if (parentScope.isAppConfigCtrl) {\n        self.appEditCtrl = parentScope.ctrl;\n        self.appModel = parentScope.ctrl.model;\n      }\n\n      // App page ctrl\n      if (parentScope.$parent?.$parent?.ctrl?.appModel) {\n        self.appModel = parentScope.$parent?.$parent?.ctrl?.appModel;\n      }\n    }\n\n    return injector.oldInvoke(fn, self, locals, serviceName);\n  };\n}\n","import { isArray } from 'lodash';\nimport { Unsubscribable } from 'rxjs';\n\nimport {\n  DataFrame,\n  DataQueryResponse,\n  DataSourceApi,\n  LegacyResponseData,\n  LoadingState,\n  PanelData,\n  PanelEvents,\n  TimeRange,\n  toDataFrameDTO,\n  toLegacyResponseData,\n} from '@grafana/data';\nimport { PanelCtrl } from 'app/angular/panel/panel_ctrl';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { applyPanelTimeOverrides } from 'app/features/dashboard/utils/panel';\n\nimport { PanelQueryRunner } from '../../features/query/state/PanelQueryRunner';\n\nclass MetricsPanelCtrl extends PanelCtrl {\n  declare datasource: DataSourceApi;\n  declare range: TimeRange;\n\n  contextSrv: ContextSrv;\n  datasourceSrv: any;\n  timeSrv: any;\n  templateSrv: any;\n  interval: any;\n  intervalMs: any;\n  resolution: any;\n  timeInfo?: string;\n  skipDataOnInit = false;\n  dataList: LegacyResponseData[] = [];\n  querySubscription?: Unsubscribable | null;\n  useDataFrames = false;\n  panelData?: PanelData;\n\n  constructor($scope: any, $injector: any) {\n    super($scope, $injector);\n\n    this.contextSrv = $injector.get('contextSrv');\n    this.datasourceSrv = $injector.get('datasourceSrv');\n    this.timeSrv = $injector.get('timeSrv');\n    this.templateSrv = $injector.get('templateSrv');\n    this.panel.datasource = this.panel.datasource || null;\n\n    this.events.on(PanelEvents.refresh, this.onMetricsPanelRefresh.bind(this));\n    this.events.on(PanelEvents.panelTeardown, this.onPanelTearDown.bind(this));\n    this.events.on(PanelEvents.componentDidMount, this.onMetricsPanelMounted.bind(this));\n  }\n\n  private onMetricsPanelMounted() {\n    const queryRunner = this.panel.getQueryRunner() as PanelQueryRunner;\n    this.querySubscription = queryRunner\n      .getData({ withTransforms: true, withFieldConfig: true })\n      .subscribe(this.panelDataObserver);\n  }\n\n  private onPanelTearDown() {\n    if (this.querySubscription) {\n      this.querySubscription.unsubscribe();\n      this.querySubscription = null;\n    }\n  }\n\n  private onMetricsPanelRefresh() {\n    // ignore fetching data if another panel is in fullscreen\n    if (this.otherPanelInFullscreenMode()) {\n      return;\n    }\n\n    // if we have snapshot data use that\n    if (this.panel.snapshotData) {\n      this.updateTimeRange();\n      let data = this.panel.snapshotData;\n      // backward compatibility\n      if (!isArray(data)) {\n        data = data.data;\n      }\n\n      this.panelData = {\n        state: LoadingState.Done,\n        series: data,\n        timeRange: this.range,\n      };\n\n      // Defer panel rendering till the next digest cycle.\n      // For some reason snapshot panels don't init at this time, so this helps to avoid rendering issues.\n      return this.$timeout(() => {\n        this.events.emit(PanelEvents.dataSnapshotLoad, data);\n      });\n    }\n\n    // clear loading/error state\n    delete this.error;\n    this.loading = true;\n\n    // load datasource service\n    return this.datasourceSrv\n      .get(this.panel.datasource, this.panel.scopedVars)\n      .then(this.issueQueries.bind(this))\n      .catch((err: any) => {\n        this.processDataError(err);\n      });\n  }\n\n  processDataError(err: any) {\n    // if canceled  keep loading set to true\n    if (err.cancelled) {\n      console.log('Panel request cancelled', err);\n      return;\n    }\n\n    this.error = err.message || 'Request Error';\n\n    if (err.data) {\n      if (err.data.message) {\n        this.error = err.data.message;\n      } else if (err.data.error) {\n        this.error = err.data.error;\n      }\n    }\n\n    this.angularDirtyCheck();\n  }\n\n  angularDirtyCheck() {\n    if (!this.$scope.$root.$$phase) {\n      this.$scope.$digest();\n    }\n  }\n\n  // Updates the response with information from the stream\n  panelDataObserver = {\n    next: (data: PanelData) => {\n      this.panelData = data;\n\n      if (data.state === LoadingState.Error) {\n        this.loading = false;\n        this.processDataError(data.error);\n      }\n\n      // Ignore data in loading state\n      if (data.state === LoadingState.Loading) {\n        this.loading = true;\n        this.angularDirtyCheck();\n        return;\n      }\n\n      if (data.request) {\n        const { timeInfo } = data.request;\n        if (timeInfo) {\n          this.timeInfo = timeInfo;\n        }\n      }\n\n      if (data.timeRange) {\n        this.range = data.timeRange;\n      }\n\n      if (this.useDataFrames) {\n        this.handleDataFrames(data.series);\n      } else {\n        // Make the results look as if they came directly from a <6.2 datasource request\n        const legacy = data.series.map((v) => toLegacyResponseData(v));\n        this.handleQueryResult({ data: legacy });\n      }\n\n      this.angularDirtyCheck();\n    },\n  };\n\n  updateTimeRange(datasource?: DataSourceApi) {\n    this.datasource = datasource || this.datasource;\n    this.range = this.timeSrv.timeRange();\n\n    const newTimeData = applyPanelTimeOverrides(this.panel, this.range);\n    this.timeInfo = newTimeData.timeInfo;\n    this.range = newTimeData.timeRange;\n  }\n\n  issueQueries(datasource: DataSourceApi) {\n    this.updateTimeRange(datasource);\n\n    this.datasource = datasource;\n\n    const panel = this.panel as PanelModel;\n    const queryRunner = panel.getQueryRunner();\n\n    return queryRunner.run({\n      datasource: panel.datasource,\n      queries: panel.targets,\n      panelId: panel.id,\n      dashboardId: this.dashboard.id,\n      timezone: this.dashboard.getTimezone(),\n      timeInfo: this.timeInfo,\n      timeRange: this.range,\n      maxDataPoints: panel.maxDataPoints || this.width,\n      minInterval: panel.interval,\n      scopedVars: panel.scopedVars,\n      cacheTimeout: panel.cacheTimeout,\n      transformations: panel.transformations,\n    });\n  }\n\n  handleDataFrames(data: DataFrame[]) {\n    this.loading = false;\n\n    if (this.dashboard && this.dashboard.snapshot) {\n      this.panel.snapshotData = data.map((frame) => toDataFrameDTO(frame));\n    }\n\n    try {\n      this.events.emit(PanelEvents.dataFramesReceived, data);\n    } catch (err) {\n      this.processDataError(err);\n    }\n  }\n\n  handleQueryResult(result: DataQueryResponse) {\n    this.loading = false;\n\n    if (this.dashboard.snapshot) {\n      this.panel.snapshotData = result.data;\n    }\n\n    if (!result || !result.data) {\n      console.log('Data source query result invalid, missing data field:', result);\n      result = { data: [] };\n    }\n\n    try {\n      this.events.emit(PanelEvents.dataReceived, result.data);\n    } catch (err) {\n      this.processDataError(err);\n    }\n  }\n}\n\nexport { MetricsPanelCtrl };\n","import { auto } from 'angular';\nimport { isString } from 'lodash';\n\nimport {\n  AppEvent,\n  PanelEvents,\n  PanelPluginMeta,\n  AngularPanelMenuItem,\n  EventBusExtended,\n  EventBusSrv,\n} from '@grafana/data';\nimport { AngularLocationWrapper } from 'app/angular/AngularLocationWrapper';\nimport config from 'app/core/config';\nimport { profiler } from 'app/core/core';\n\nimport { DashboardModel } from '../../features/dashboard/state';\n\nexport class PanelCtrl {\n  panel: any;\n  error: any;\n  declare dashboard: DashboardModel;\n  pluginName = '';\n  pluginId = '';\n  editorTabs: any;\n  $scope: any;\n  $injector: auto.IInjectorService;\n  $timeout: any;\n  editModeInitiated = false;\n  declare height: number;\n  declare width: number;\n  containerHeight: any;\n  events: EventBusExtended;\n  loading = false;\n  timing: any;\n  $location: AngularLocationWrapper;\n\n  constructor($scope: any, $injector: auto.IInjectorService) {\n    this.panel = this.panel ?? $scope.$parent.panel;\n    this.dashboard = this.dashboard ?? $scope.$parent.dashboard;\n    this.$injector = $injector;\n    this.$scope = $scope;\n    this.$timeout = $injector.get('$timeout');\n    this.editorTabs = [];\n    this.$location = new AngularLocationWrapper();\n    this.events = new EventBusSrv();\n    this.timing = {}; // not used but here to not break plugins\n\n    const plugin = config.panels[this.panel.type];\n    if (plugin) {\n      this.pluginId = plugin.id;\n      this.pluginName = plugin.name;\n    }\n\n    $scope.$on(PanelEvents.componentDidMount.name, () => this.panelDidMount());\n  }\n\n  panelDidMount() {\n    this.events.emit(PanelEvents.componentDidMount);\n    this.events.emit(PanelEvents.initialized);\n    this.dashboard.panelInitialized(this.panel);\n  }\n\n  renderingCompleted() {\n    profiler.renderingCompleted();\n  }\n\n  refresh() {\n    this.panel.refresh();\n  }\n\n  publishAppEvent<T>(event: AppEvent<T>, payload?: T) {\n    this.$scope.$root.appEvent(event, payload);\n  }\n\n  initEditMode() {\n    if (!this.editModeInitiated) {\n      this.editModeInitiated = true;\n      this.events.emit(PanelEvents.editModeInitialized);\n    }\n  }\n\n  addEditorTab(title: string, directiveFn: any, index?: number, icon?: any) {\n    const editorTab = { title, directiveFn, icon };\n\n    if (isString(directiveFn)) {\n      editorTab.directiveFn = () => {\n        return { templateUrl: directiveFn };\n      };\n    }\n\n    if (index) {\n      this.editorTabs.splice(index, 0, editorTab);\n    } else {\n      this.editorTabs.push(editorTab);\n    }\n  }\n\n  getExtendedMenu() {\n    const menu: AngularPanelMenuItem[] = [];\n    this.events.emit(PanelEvents.initPanelActions, menu);\n    return menu;\n  }\n\n  // Override in sub-class to add items before extended menu\n  async getAdditionalMenuItems(): Promise<any[]> {\n    return [];\n  }\n\n  otherPanelInFullscreenMode() {\n    return this.dashboard.otherPanelInFullscreen(this.panel);\n  }\n\n  render(payload?: any) {\n    this.events.emit(PanelEvents.render, payload);\n  }\n\n  // overriden from react\n  onPluginTypeChange = (plugin: PanelPluginMeta) => {};\n}\n","import { auto } from 'angular';\nimport { indexOf } from 'lodash';\n\nexport class QueryCtrl<T = any> {\n  target!: T;\n  datasource!: any;\n  panelCtrl!: any;\n  panel: any;\n  hasRawMode!: boolean;\n  error?: string | null;\n  isLastQuery: boolean;\n\n  constructor(public $scope: any, public $injector: auto.IInjectorService) {\n    this.panelCtrl = this.panelCtrl ?? $scope.ctrl.panelCtrl;\n    this.target = this.target ?? $scope.ctrl.target;\n    this.datasource = this.datasource ?? $scope.ctrl.datasource;\n    this.panel = this.panelCtrl?.panel ?? $scope.ctrl.panelCtrl.panel;\n    this.isLastQuery = indexOf(this.panel.targets, this.target) === this.panel.targets.length - 1;\n  }\n\n  refresh() {\n    this.panelCtrl.refresh();\n  }\n}\n","let templates = (require as any).context('../', true, /\\.html$/);\ntemplates.keys().forEach((key: string) => {\n  templates(key);\n});\n","import { IScope } from 'angular';\n\nexport const promiseToDigest = ($scope: IScope) => (promise: Promise<any>) => promise.finally($scope.$evalAsync);\n","// Libraries\nimport { css, cx } from '@emotion/css';\nimport { map } from 'lodash';\nimport React, { memo } from 'react';\n\n// Types\nimport { SelectableValue } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { InlineFormLabel, RadioButtonGroup, InlineField, Input, Select } from '@grafana/ui';\n\nimport { LokiQuery, LokiQueryType } from '../types';\n\nexport interface LokiOptionFieldsProps {\n  lineLimitValue: string;\n  resolution: number;\n  query: LokiQuery;\n  onChange: (value: LokiQuery) => void;\n  onRunQuery: () => void;\n  runOnBlur?: boolean;\n}\n\nexport const queryTypeOptions: Array<SelectableValue<LokiQueryType>> = [\n  { value: LokiQueryType.Range, label: 'Range', description: 'Run query over a range of time.' },\n  {\n    value: LokiQueryType.Instant,\n    label: 'Instant',\n    description: 'Run query against a single point in time. For this query, the \"To\" time is used.',\n  },\n];\n\nif (config.featureToggles.lokiLive) {\n  queryTypeOptions.push({\n    value: LokiQueryType.Stream,\n    label: 'Stream',\n    description: 'Run a query and keep sending results on an interval',\n  });\n}\n\nexport const DEFAULT_RESOLUTION: SelectableValue<number> = {\n  value: 1,\n  label: '1/1',\n};\n\nexport const RESOLUTION_OPTIONS: Array<SelectableValue<number>> = [DEFAULT_RESOLUTION].concat(\n  map([2, 3, 4, 5, 10], (value: number) => ({\n    value,\n    label: '1/' + value,\n  }))\n);\n\nexport function LokiOptionFields(props: LokiOptionFieldsProps) {\n  const { lineLimitValue, resolution, onRunQuery, runOnBlur, onChange } = props;\n  const query = props.query ?? {};\n  let queryType = query.queryType ?? (query.instant ? LokiQueryType.Instant : LokiQueryType.Range);\n\n  function onChangeQueryLimit(value: string) {\n    const nextQuery = { ...query, maxLines: preprocessMaxLines(value) };\n    onChange(nextQuery);\n  }\n\n  function onQueryTypeChange(queryType: LokiQueryType) {\n    const { instant, range, ...rest } = query;\n    onChange({ ...rest, queryType });\n  }\n\n  function onMaxLinesChange(e: React.SyntheticEvent<HTMLInputElement>) {\n    if (query.maxLines !== preprocessMaxLines(e.currentTarget.value)) {\n      onChangeQueryLimit(e.currentTarget.value);\n    }\n  }\n\n  function onReturnKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n    if (e.key === 'Enter') {\n      onRunQuery();\n    }\n  }\n\n  function onResolutionChange(option: SelectableValue<number>) {\n    const nextQuery = { ...query, resolution: option.value };\n    onChange(nextQuery);\n  }\n\n  return (\n    <div aria-label=\"Loki extra field\" className=\"gf-form-inline\">\n      {/*Query type field*/}\n      <div\n        data-testid=\"queryTypeField\"\n        className={cx(\n          'gf-form explore-input-margin',\n          css`\n            flex-wrap: nowrap;\n          `\n        )}\n        aria-label=\"Query type field\"\n      >\n        <InlineFormLabel width=\"auto\">Query type</InlineFormLabel>\n\n        <RadioButtonGroup\n          options={queryTypeOptions}\n          value={queryType}\n          onChange={(type: LokiQueryType) => {\n            onQueryTypeChange(type);\n            if (runOnBlur) {\n              onRunQuery();\n            }\n          }}\n        />\n      </div>\n      {/*Line limit field*/}\n      <div\n        data-testid=\"lineLimitField\"\n        className={cx(\n          'gf-form',\n          css`\n            flex-wrap: nowrap;\n          `\n        )}\n        aria-label=\"Line limit field\"\n      >\n        <InlineField label=\"Line limit\" tooltip={'Upper limit for number of log lines returned by query.'}>\n          <Input\n            className=\"width-4\"\n            placeholder=\"auto\"\n            type=\"number\"\n            min={0}\n            onChange={onMaxLinesChange}\n            onKeyDown={onReturnKeyDown}\n            value={lineLimitValue}\n            onBlur={() => {\n              if (runOnBlur) {\n                onRunQuery();\n              }\n            }}\n          />\n        </InlineField>\n        <InlineField\n          label=\"Resolution\"\n          tooltip={\n            'Resolution 1/1 sets step parameter of Loki metrics range queries such that each pixel corresponds to one data point. For better performance, lower resolutions can be picked. 1/2 only retrieves a data point for every other pixel, and 1/10 retrieves one data point per 10 pixels.'\n          }\n        >\n          <Select\n            isSearchable={false}\n            onChange={onResolutionChange}\n            options={RESOLUTION_OPTIONS}\n            value={resolution}\n            aria-label=\"Select resolution\"\n            menuShouldPortal\n          />\n        </InlineField>\n      </div>\n    </div>\n  );\n}\n\nexport default memo(LokiOptionFields);\n\nexport function preprocessMaxLines(value: string): number {\n  if (value.length === 0) {\n    // empty input - falls back to dataSource.maxLines limit\n    return NaN;\n  } else if (value.length > 0 && (isNaN(+value) || +value < 0)) {\n    // input with at least 1 character and that is either incorrect (value in the input field is not a number) or negative\n    // falls back to the limit of 0 lines\n    return 0;\n  } else {\n    // default case - correct input\n    return +value;\n  }\n}\n","import { DataQuery, DataSourceJsonData, QueryResultMeta, ScopedVars } from '@grafana/data';\n\nimport { QueryEditorMode } from '../prometheus/querybuilder/shared/types';\n\nimport { LokiVisualQuery } from './querybuilder/types';\n\nexport interface LokiInstantQueryRequest {\n  query: string;\n  limit?: number;\n  time?: string;\n  direction?: 'BACKWARD' | 'FORWARD';\n}\n\nexport interface LokiRangeQueryRequest {\n  query: string;\n  limit?: number;\n  start?: number;\n  end?: number;\n  step?: number;\n  direction?: 'BACKWARD' | 'FORWARD';\n}\n\nexport enum LokiResultType {\n  Stream = 'streams',\n  Vector = 'vector',\n  Matrix = 'matrix',\n}\n\nexport enum LokiQueryType {\n  Range = 'range',\n  Instant = 'instant',\n  Stream = 'stream',\n}\n\nexport interface LokiQuery extends DataQuery {\n  queryType?: LokiQueryType;\n  expr: string;\n  query?: string;\n  format?: string;\n  reverse?: boolean;\n  legendFormat?: string;\n  valueWithRefId?: boolean;\n  maxLines?: number;\n  resolution?: number;\n  /** Used in range queries */\n  volumeQuery?: boolean;\n  /* @deprecated now use queryType */\n  range?: boolean;\n  /* @deprecated now use queryType */\n  instant?: boolean;\n  editorMode?: QueryEditorMode;\n  /** Temporary until we have a parser */\n  visualQuery?: LokiVisualQuery;\n}\n\nexport interface LokiOptions extends DataSourceJsonData {\n  maxLines?: string;\n  derivedFields?: DerivedFieldConfig[];\n  alertmanager?: string;\n}\n\nexport interface LokiStats {\n  [component: string]: {\n    [label: string]: number;\n  };\n}\n\nexport interface LokiVectorResult {\n  metric: { [label: string]: string };\n  value: [number, string];\n}\n\nexport interface LokiVectorResponse {\n  status: string;\n  data: {\n    resultType: LokiResultType.Vector;\n    result: LokiVectorResult[];\n    stats?: LokiStats;\n  };\n}\n\nexport interface LokiMatrixResult {\n  metric: Record<string, string>;\n  values: Array<[number, string]>;\n}\n\nexport interface LokiMatrixResponse {\n  status: string;\n  data: {\n    resultType: LokiResultType.Matrix;\n    result: LokiMatrixResult[];\n    stats?: LokiStats;\n  };\n}\n\nexport interface LokiStreamResult {\n  stream: Record<string, string>;\n  values: Array<[string, string]>;\n}\n\nexport interface LokiStreamResponse {\n  status: string;\n  data: {\n    resultType: LokiResultType.Stream;\n    result: LokiStreamResult[];\n    stats?: LokiStats;\n  };\n}\n\nexport interface LokiTailResponse {\n  streams: LokiStreamResult[];\n  dropped_entries?: Array<{\n    labels: Record<string, string>;\n    timestamp: string;\n  }> | null;\n}\n\nexport type LokiResult = LokiVectorResult | LokiMatrixResult | LokiStreamResult;\nexport type LokiResponse = LokiVectorResponse | LokiMatrixResponse | LokiStreamResponse;\n\nexport interface LokiLogsStreamEntry {\n  line: string;\n  ts: string;\n}\n\nexport interface LokiExpression {\n  regexp: string;\n  query: string;\n}\n\nexport type DerivedFieldConfig = {\n  matcherRegex: string;\n  name: string;\n  url?: string;\n  urlDisplayLabel?: string;\n  datasourceUid?: string;\n};\n\nexport interface TransformerOptions {\n  format?: string;\n  legendFormat?: string;\n  step: number;\n  start: number;\n  end: number;\n  query: string;\n  responseListLength: number;\n  refId: string;\n  scopedVars: ScopedVars;\n  meta?: QueryResultMeta;\n  valueWithRefId?: boolean;\n}\n","import { makeClassES5Compatible } from '@grafana/data';\nimport { loadPluginCss } from '@grafana/runtime';\nimport { MetricsPanelCtrl as MetricsPanelCtrlES6 } from 'app/angular/panel/metrics_panel_ctrl';\nimport { PanelCtrl as PanelCtrlES6 } from 'app/angular/panel/panel_ctrl';\nimport { QueryCtrl as QueryCtrlES6 } from 'app/angular/panel/query_ctrl';\n\nconst PanelCtrl = makeClassES5Compatible(PanelCtrlES6);\nconst MetricsPanelCtrl = makeClassES5Compatible(MetricsPanelCtrlES6);\nconst QueryCtrl = makeClassES5Compatible(QueryCtrlES6);\n\nexport { PanelCtrl, MetricsPanelCtrl, QueryCtrl, loadPluginCss };\n","/**\n * AngularStrap - Twitter Bootstrap directives for AngularJS\n * @version v0.7.5 - 2013-07-21\n * @link http://mgcrea.github.com/angular-strap\n * @author Olivier Louvignes <olivier@mg-crea.com>\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\nangular.module('$strap.config', []).value('$strapConfig', {});\nangular.module('$strap.filters', ['$strap.config']);\nangular.module('$strap.directives', ['$strap.config']);\nangular.module('$strap', [\n  '$strap.filters',\n  '$strap.directives',\n  '$strap.config'\n]);\n'use strict';\nangular.module('$strap.directives').factory('$modal', [\n  '$rootScope',\n  '$compile',\n  '$http',\n  '$timeout',\n  '$q',\n  '$templateCache',\n  '$strapConfig',\n  function ($rootScope, $compile, $http, $timeout, $q, $templateCache, $strapConfig) {\n    var ModalFactory = function ModalFactory(config) {\n      function Modal(config) {\n        var options = angular.extend({ show: true }, $strapConfig.modal, config);\n        var scope = options.scope ? options.scope : $rootScope.$new()\n        var templateUrl = options.template;\n        return $q.when(options.templateHtml || $templateCache.get(templateUrl) || $http.get(templateUrl, { cache: true }).then(function (res) {\n          return res.data;\n        })).then(function onSuccess(template) {\n          var id = scope.$id;\n          if (templateUrl) {\n            id += templateUrl.replace('.html', '').replace(/[\\/|\\.|:]/g, '-');\n          }\n          // grafana change, removed fade\n          var $modal = $('<div class=\"modal hide\" tabindex=\"-1\"></div>').attr('id', id).html(template);\n          if (options.modalClass)\n            $modal.addClass(options.modalClass);\n          $('body').append($modal);\n          $timeout(function () {\n            $compile($modal)(scope);\n          });\n          scope.$modal = function (name) {\n            $modal.modal(name);\n          };\n          angular.forEach([\n            'show',\n            'hide'\n          ], function (name) {\n            scope[name] = function () {\n              $modal.modal(name);\n            };\n          });\n          scope.dismiss = scope.hide;\n          angular.forEach([\n            'show',\n            'shown',\n            'hide',\n            'hidden'\n          ], function (name) {\n            $modal.on(name, function (ev) {\n              scope.$emit('modal-' + name, ev);\n            });\n          });\n          $modal.on('shown', function (ev) {\n            $('input[autofocus], textarea[autofocus]', $modal).first().trigger('focus');\n          });\n          $modal.on('hidden', function (ev) {\n            if (!options.persist)\n              scope.$destroy();\n          });\n          scope.$on('$destroy', function () {\n            $modal.remove();\n          });\n          $modal.modal(options);\n          return $modal;\n        });\n      }\n      return new Modal(config);\n    };\n    return ModalFactory;\n  }\n])\n\n'use strict';\nangular.module('$strap.directives').directive('bsTooltip', [\n  '$parse',\n  '$compile',\n  function ($parse, $compile) {\n    return {\n      restrict: 'A',\n      scope: true,\n      link: function postLink(scope, element, attrs, ctrl) {\n        var getter = $parse(attrs.bsTooltip), setter = getter.assign, value = getter(scope);\n        scope.$watch(attrs.bsTooltip, function (newValue, oldValue) {\n          if (newValue !== oldValue) {\n            value = newValue;\n          }\n        });\n        // Grafana change, always hide other tooltips\n        if (true) {\n          element.on('show', function (ev) {\n            $('.tooltip.in').each(function () {\n              var $this = $(this), tooltip = $this.data('tooltip');\n              if (tooltip && !tooltip.$element.is(element)) {\n                $this.tooltip('hide');\n              }\n            });\n          });\n        }\n        element.tooltip({\n          title: function () {\n            return angular.isFunction(value) ? value.apply(null, arguments) : value;\n          },\n          html: true,\n          container: 'body', // Grafana change\n        });\n        var tooltip = element.data('tooltip');\n        tooltip.show = function () {\n          var r = $.fn.tooltip.Constructor.prototype.show.apply(this, arguments);\n          this.tip().data('tooltip', this);\n          return r;\n        };\n        scope._tooltip = function (event) {\n          element.tooltip(event);\n        };\n        scope.hide = function () {\n          element.tooltip('hide');\n        };\n        scope.show = function () {\n          element.tooltip('show');\n        };\n        scope.dismiss = scope.hide;\n      }\n    };\n  }\n]);\n\n'use strict';\nangular.module('$strap.directives').directive('bsTypeahead', [\n  '$parse',\n  function ($parse) {\n    return {\n      restrict: 'A',\n      require: '?ngModel',\n      link: function postLink(scope, element, attrs, controller) {\n        var getter = $parse(attrs.bsTypeahead), setter = getter.assign, value = getter(scope);\n        scope.$watch(attrs.bsTypeahead, function (newValue, oldValue) {\n          if (newValue !== oldValue) {\n            value = newValue;\n          }\n        });\n        element.attr('data-provide', 'typeahead');\n        element.typeahead({\n          source: function (query) {\n            return angular.isFunction(value) ? value.apply(null, arguments) : value;\n          },\n          minLength: attrs.minLength || 1,\n          items: attrs.items,\n          updater: function (value) {\n            if (controller) {\n              scope.$apply(function () {\n                controller.$setViewValue(value);\n              });\n            }\n            scope.$emit('typeahead-updated', value);\n            return value;\n          }\n        });\n        var typeahead = element.data('typeahead');\n        typeahead.lookup = function (ev) {\n          var items;\n          this.query = this.$element.val() || '';\n          if (this.query.length < this.options.minLength) {\n            return this.shown ? this.hide() : this;\n          }\n          items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source;\n          return items ? this.process(items) : this;\n        };\n        if (!!attrs.matchAll) {\n          typeahead.matcher = function (item) {\n            return true;\n          };\n        }\n        if (attrs.minLength === '0') {\n          setTimeout(function () {\n            element.on('focus', function () {\n              element.val().length === 0 && setTimeout(element.typeahead.bind(element, 'lookup'), 200);\n            });\n          });\n        }\n      }\n    };\n  }\n]);\n","/* ===================================================\n * bootstrap-transition.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#transitions\n * ===================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)\n   * ======================================================= */\n\n  $(function() {\n\n    $.support.transition = (function() {\n\n      var transitionEnd = (function() {\n\n        var el = document.createElement('bootstrap')\n          , transEndEventNames = {\n            'WebkitTransition': 'webkitTransitionEnd'\n            , 'MozTransition': 'transitionend'\n            , 'OTransition': 'oTransitionEnd otransitionend'\n            , 'transition': 'transitionend'\n          }\n          , name\n\n        for (name in transEndEventNames) {\n          if (el.style[name] !== undefined) {\n            return transEndEventNames[name]\n          }\n        }\n\n      }())\n\n      return transitionEnd && {\n        end: transitionEnd\n      }\n\n    })()\n\n  })\n\n}(window.jQuery);/* ==========================================================\n * bootstrap-alert.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#alerts\n * ==========================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function($) {\n\n  \"use strict\"; // jshint ;_;\n\n  /* ============================================================\n   * bootstrap-dropdown.js v2.3.2\n   * http://getbootstrap.com/2.3.2/javascript.html#dropdowns\n   * ============================================================\n   * Copyright 2013 Twitter, Inc.\n   *\n   * Licensed under the Apache License, Version 2.0 (the \"License\");\n   * you may not use this file except in compliance with the License.\n   * You may obtain a copy of the License at\n   *\n   * http://www.apache.org/licenses/LICENSE-2.0\n   *\n   * Unless required by applicable law or agreed to in writing, software\n   * distributed under the License is distributed on an \"AS IS\" BASIS,\n   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   * See the License for the specific language governing permissions and\n   * limitations under the License.\n   * ============================================================ */\n\n\n  /* DROPDOWN CLASS DEFINITION\n   * ========================= */\n\n  var toggle = '[data-toggle=dropdown]'\n    , Dropdown = function(element) {\n      var $el = $(element).on('click.dropdown.data-api', this.toggle)\n      $('html').on('click.dropdown.data-api', function() {\n        $el.parent().removeClass('open')\n      })\n    }\n\n  Dropdown.prototype = {\n\n    constructor: Dropdown\n\n    , toggle: function(e) {\n      var $this = $(this)\n        , $parent\n        , isActive\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      clearMenus()\n\n      if (!isActive) {\n        if ('ontouchstart' in document.documentElement) {\n          // if mobile we we use a backdrop because click events don't delegate\n          $('<div class=\"dropdown-backdrop\"/>').insertBefore($(this)).on('click', clearMenus)\n        }\n        $parent.toggleClass('open')\n      }\n\n      $this.focus()\n\n      return false\n    }\n\n    , keydown: function(e) {\n      var $this\n        , $items\n        , $active\n        , $parent\n        , isActive\n        , index\n\n      if (!/(38|40|27)/.test(e.keyCode)) return\n\n      $this = $(this)\n\n      e.preventDefault()\n      e.stopPropagation()\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      if (!isActive || (isActive && e.keyCode == 27)) {\n        if (e.which == 27) $parent.find(toggle).focus()\n        return $this.click()\n      }\n\n      $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n      if (!$items.length) return\n\n      index = $items.index($items.filter(':focus'))\n\n      if (e.keyCode == 38 && index > 0) index--                                        // up\n      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n      if (!~index) index = 0\n\n      $items\n        .eq(index)\n        .focus()\n    }\n\n  }\n\n  function clearMenus() {\n    $('.dropdown-backdrop').remove()\n    $(toggle).each(function() {\n      getParent($(this)).removeClass('open')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      // grafana backport fix from bootstrap 3\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = selector && $.find(selector)\n\n    if (!$parent || !$parent.length) $parent = $this.parent()\n\n    return $parent\n  }\n\n\n  /* DROPDOWN PLUGIN DEFINITION\n   * ========================== */\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function(option) {\n    return this.each(function() {\n      var $this = $(this)\n        , data = $this.data('dropdown')\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  /* DROPDOWN NO CONFLICT\n   * ==================== */\n\n  $.fn.dropdown.noConflict = function() {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  /* APPLY TO STANDARD DROPDOWN ELEMENTS\n   * =================================== */\n\n  $(document)\n    .on('click.dropdown.data-api', clearMenus)\n    .on('click.dropdown.data-api', '.dropdown form', function(e) { e.stopPropagation() })\n    .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.dropdown.data-api', toggle + ', [role=menu]', Dropdown.prototype.keydown)\n\n}(window.jQuery);\n/* =========================================================\n * bootstrap-modal.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#modals\n * =========================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n\n!function($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n  /* MODAL CLASS DEFINITION\n   * ====================== */\n\n  var Modal = function(element, options) {\n    this.options = options\n    this.$element = $(element)\n      .delegate('[data-dismiss=\"modal\"]', 'click.dismiss.modal', $.proxy(this.hide, this))\n    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)\n  }\n\n  Modal.prototype = {\n\n    constructor: Modal\n\n    , toggle: function() {\n      return this[!this.isShown ? 'show' : 'hide']()\n    }\n\n    , show: function() {\n      var that = this\n        , e = $.Event('show')\n\n      this.$element.trigger(e)\n\n      if (this.isShown || e.isDefaultPrevented()) return\n\n      this.isShown = true\n\n      this.escape()\n\n      this.backdrop(function() {\n        var transition = $.support.transition && that.$element.hasClass('fade')\n\n        if (!that.$element.parent().length) {\n          that.$element.appendTo(document.body) //don't move modals dom position\n        }\n\n        that.$element.show()\n\n        if (transition) {\n          that.$element[0].offsetWidth // force reflow\n        }\n\n        that.$element\n          .addClass('in')\n          .attr('aria-hidden', false)\n\n        that.enforceFocus()\n\n        transition ?\n          that.$element.one($.support.transition.end, function() { that.$element.focus().trigger('shown') }) :\n          that.$element.focus().trigger('shown')\n\n      })\n    }\n\n    , hide: function(e) {\n      e && e.preventDefault()\n\n      var that = this\n\n      e = $.Event('hide')\n\n      this.$element.trigger(e)\n\n      if (!this.isShown || e.isDefaultPrevented()) return\n\n      this.isShown = false\n\n      this.escape()\n\n      $(document).off('focusin.modal')\n\n      this.$element\n        .removeClass('in')\n        .attr('aria-hidden', true)\n\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.hideWithTransition() :\n        this.hideModal()\n    }\n\n    , enforceFocus: function() {\n      var that = this\n      $(document).on('focusin.modal', function(e) {\n        if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {\n          that.$element.focus()\n        }\n      })\n    }\n\n    , escape: function() {\n      var that = this\n      if (this.isShown && this.options.keyboard) {\n        this.$element.on('keyup.dismiss.modal', function(e) {\n          e.which == 27 && that.hide()\n        })\n      } else if (!this.isShown) {\n        this.$element.off('keyup.dismiss.modal')\n      }\n    }\n\n    , hideWithTransition: function() {\n      var that = this\n        , timeout = setTimeout(function() {\n          that.$element.off($.support.transition.end)\n          that.hideModal()\n        }, 500)\n\n      this.$element.one($.support.transition.end, function() {\n        clearTimeout(timeout)\n        that.hideModal()\n      })\n    }\n\n    , hideModal: function() {\n      var that = this\n      this.$element.hide()\n      this.backdrop(function() {\n        that.removeBackdrop()\n        that.$element.trigger('hidden')\n      })\n    }\n\n    , removeBackdrop: function() {\n      this.$backdrop && this.$backdrop.remove()\n      this.$backdrop = null\n    }\n\n    , backdrop: function(callback) {\n      var that = this\n        , animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n      if (this.isShown && this.options.backdrop) {\n        var doAnimate = $.support.transition && animate\n\n        this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n          .appendTo(document.body)\n\n        this.$backdrop.click(\n          this.options.backdrop == 'static' ?\n            $.proxy(this.$element[0].focus, this.$element[0])\n            : $.proxy(this.hide, this)\n        )\n\n        if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n        this.$backdrop.addClass('in')\n\n        if (!callback) return\n\n        doAnimate ?\n          this.$backdrop.one($.support.transition.end, callback) :\n          callback()\n\n      } else if (!this.isShown && this.$backdrop) {\n        this.$backdrop.removeClass('in')\n\n        $.support.transition && this.$element.hasClass('fade') ?\n          this.$backdrop.one($.support.transition.end, callback) :\n          callback()\n\n      } else if (callback) {\n        callback()\n      }\n    }\n  }\n\n\n  /* MODAL PLUGIN DEFINITION\n   * ======================= */\n\n  var old = $.fn.modal\n\n  $.fn.modal = function(option) {\n    return this.each(function() {\n      var $this = $(this)\n        , data = $this.data('modal')\n        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)\n      if (!data) $this.data('modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option]()\n      else if (options.show) data.show()\n    })\n  }\n\n  $.fn.modal.defaults = {\n    backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n  /* MODAL NO CONFLICT\n   * ================= */\n\n  $.fn.modal.noConflict = function() {\n    $.fn.modal = old\n    return this\n  }\n\n\n  /* MODAL DATA-API\n   * ============== */\n\n  $(document).on('click.modal.data-api', '[data-toggle=\"modal\"]', function(e) {\n    var $this = $(this)\n      , href = $this.attr('href')\n      , $target = $.find($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n      , option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option)\n      .one('hide', function() {\n        $this.focus()\n      })\n  })\n\n}(window.jQuery);\n/* ===========================================================\n * bootstrap-tooltip.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#tooltips\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ===========================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n  /* TOOLTIP PUBLIC CLASS DEFINITION\n   * =============================== */\n\n  var Tooltip = function(element, options) {\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.prototype = {\n\n    constructor: Tooltip\n\n    , init: function(type, element, options) {\n      var eventIn\n        , eventOut\n        , triggers\n        , trigger\n        , i\n\n      this.type = type\n      this.$element = $(element)\n      this.options = this.getOptions(options)\n      this.enabled = true\n\n      triggers = this.options.trigger.split(' ')\n\n      for (i = triggers.length; i--;) {\n        trigger = triggers[i]\n        if (trigger == 'click') {\n          this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n        } else if (trigger != 'manual') {\n          eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'\n          eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n          this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n          this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n        }\n      }\n\n      this.options.selector ?\n        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n        this.fixTitle()\n    }\n\n    , getOptions: function(options) {\n      options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)\n\n      if (options.delay && typeof options.delay == 'number') {\n        options.delay = {\n          show: options.delay\n          , hide: options.delay\n        }\n      }\n\n      return options\n    }\n\n    , enter: function(e) {\n      var defaults = $.fn[this.type].defaults\n        , options = {}\n        , self\n\n      this._options && $.each(this._options, function(key, value) {\n        if (defaults[key] != value) options[key] = value\n      }, this)\n\n      self = $(e.currentTarget)[this.type](options).data(this.type)\n\n      if (!self.options.delay || !self.options.delay.show) return self.show()\n\n      clearTimeout(this.timeout)\n      self.hoverState = 'in'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'in') self.show()\n      }, self.options.delay.show)\n    }\n\n    , leave: function(e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n\n      if (this.timeout) clearTimeout(this.timeout)\n      if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n      self.hoverState = 'out'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'out') self.hide()\n      }, self.options.delay.hide)\n    }\n\n    , show: function() {\n      var $tip\n        , pos\n        , actualWidth\n        , actualHeight\n        , placement\n        , tp\n        , e = $.Event('show')\n\n      if (this.hasContent() && this.enabled) {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $tip = this.tip()\n        this.setContent()\n\n        if (this.options.animation) {\n          $tip.addClass('fade')\n        }\n\n        placement = typeof this.options.placement == 'function' ?\n          this.options.placement.call(this, $tip[0], this.$element[0]) :\n          this.options.placement\n\n        $tip\n          .detach()\n          .css({ top: 0, left: 0, display: 'block' })\n\n        if (this.options.container) {\n          $tip.appendTo($.find(this.options.container));\n        } else {\n          $tip.insertAfter(this.$element)\n        }\n\n        pos = this.getPosition()\n\n        actualWidth = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n\n        switch (placement) {\n          case 'bottom':\n            tp = { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 }\n            break\n          case 'top':\n            tp = { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 }\n            break\n          case 'left':\n            tp = { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth }\n            break\n          case 'right':\n            tp = { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }\n            break\n\n          // extend placements (top)\n          case 'topLeft':\n            tp = { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - (actualWidth * .10) };\n            break;\n          case 'topRight':\n            tp = { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - (actualWidth * .90) };\n            break;\n\n          // extend placements (right)\n          case 'rightTop':\n            tp = { top: pos.top + pos.height / 2 - (actualHeight * .10), left: pos.left + pos.width };\n            break;\n          case 'rightBottom':\n            tp = { top: pos.top + pos.height / 2 - (actualHeight * .90), left: pos.left + pos.width };\n            break;\n\n          // extend placements (bottom)\n          case 'bottomLeft':\n            tp = { top: pos.top + pos.height, left: pos.left + pos.width / 2 - (actualWidth * .10) };\n            break;\n          case 'bottomRight':\n            tp = { top: pos.top + pos.height, left: pos.left + pos.width / 2 - (actualWidth * .90) };\n            break;\n\n          // extend placements (left)\n          case 'leftTop':\n            tp = { top: pos.top + pos.height / 2 - (actualHeight * .10), left: pos.left - actualWidth };\n            break;\n          case 'leftBottom':\n            tp = { top: pos.top + pos.height / 2 - (actualHeight * .90), left: pos.left - actualWidth };\n            break;\n\n\n        }\n\n        this.applyPlacement(tp, placement)\n        this.$element.trigger('shown')\n      }\n    }\n\n    , applyPlacement: function(offset, placement) {\n      var $tip = this.tip()\n        , width = $tip[0].offsetWidth\n        , height = $tip[0].offsetHeight\n        , actualWidth\n        , actualHeight\n        , delta\n        , replace\n\n      $tip\n        .offset(offset)\n        .addClass(placement)\n        .addClass('in')\n\n      actualWidth = $tip[0].offsetWidth\n      actualHeight = $tip[0].offsetHeight\n\n      if (placement == 'top' && actualHeight != height) {\n        offset.top = offset.top + height - actualHeight\n        replace = true\n      }\n\n      if (placement == 'bottom' || placement == 'top') {\n        delta = 0\n\n        if (offset.left < 0) {\n          delta = offset.left * -2\n          offset.left = 0\n          $tip.offset(offset)\n          actualWidth = $tip[0].offsetWidth\n          actualHeight = $tip[0].offsetHeight\n        }\n\n        this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n      } else {\n        this.replaceArrow(actualHeight - height, actualHeight, 'top')\n      }\n\n      if (replace) $tip.offset(offset)\n    }\n\n    , replaceArrow: function(delta, dimension, position) {\n      this\n        .arrow()\n        .css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n    }\n\n    , setContent: function() {\n      var $tip = this.tip()\n        , title = this.getTitle()\n\n      //$tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n      $tip.find('.tooltip-inner').text(title)\n      $tip.removeClass('fade in top bottom left right')\n    }\n\n    , hide: function() {\n      var that = this\n        , $tip = this.tip()\n        , e = $.Event('hide')\n\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n\n      $tip.removeClass('in')\n\n      function removeWithAnimation() {\n        var timeout = setTimeout(function() {\n          $tip.off($.support.transition.end).detach()\n        }, 500)\n\n        $tip.one($.support.transition.end, function() {\n          clearTimeout(timeout)\n          $tip.detach()\n        })\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        removeWithAnimation() :\n        $tip.detach()\n\n      this.$element.trigger('hidden')\n\n      return this\n    }\n\n    , fixTitle: function() {\n      var $e = this.$element\n      if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {\n        $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n      }\n    }\n\n    , hasContent: function() {\n      return this.getTitle()\n    }\n\n    , getPosition: function() {\n      var el = this.$element[0]\n      return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n        width: el.offsetWidth\n        , height: el.offsetHeight\n      }, this.$element.offset())\n    }\n\n    , getTitle: function() {\n      var title\n        , $e = this.$element\n        , o = this.options\n\n      title = $e.attr('data-original-title')\n        || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)\n\n      return title\n    }\n\n    , tip: function() {\n      return this.$tip = this.$tip || $(this.options.template)\n    }\n\n    , arrow: function() {\n      return this.$arrow = this.$arrow || this.tip().find(\".tooltip-arrow\")\n    }\n\n    , validate: function() {\n      if (!this.$element[0].parentNode) {\n        this.hide()\n        this.$element = null\n        this.options = null\n      }\n    }\n\n    , enable: function() {\n      this.enabled = true\n    }\n\n    , disable: function() {\n      this.enabled = false\n    }\n\n    , toggleEnabled: function() {\n      this.enabled = !this.enabled\n    }\n\n    , toggle: function(e) {\n      var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this\n      self.tip().hasClass('in') ? self.hide() : self.show()\n    }\n\n    , destroy: function() {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  }\n\n\n  /* TOOLTIP PLUGIN DEFINITION\n   * ========================= */\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function(option) {\n    return this.each(function() {\n      var $this = $(this)\n        , data = $this.data('tooltip')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n  $.fn.tooltip.defaults = {\n    animation: true\n    , placement: 'top'\n    , selector: false\n    , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n    , trigger: 'hover focus'\n    , title: ''\n    , delay: 0\n    , html: false\n    , container: false\n  }\n\n\n  /* TOOLTIP NO CONFLICT\n   * =================== */\n\n  $.fn.tooltip.noConflict = function() {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================\n * bootstrap-tab.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#tabs\n * ========================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================== */\n\n\n!function($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n  /* TAB CLASS DEFINITION\n   * ==================== */\n\n  var Tab = function(element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype = {\n\n    constructor: Tab\n\n    , show: function() {\n      var $this = this.element\n        , $ul = $this.closest('ul:not(.dropdown-menu)')\n        , selector = $this.attr('data-target')\n        , previous\n        , $target\n        , e\n\n      if (!selector) {\n        selector = $this.attr('href')\n        selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n      }\n\n      if ($this.parent('li').hasClass('active')) return\n\n      previous = $ul.find('.active:last a')[0]\n\n      e = $.Event('show', {\n        relatedTarget: previous\n      })\n\n      $this.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      $target = $.find(selector)\n\n      this.activate($this.parent('li'), $ul)\n      this.activate($target, $target.parent(), function() {\n        $this.trigger({\n          type: 'shown'\n          , relatedTarget: previous\n        })\n      })\n    }\n\n    , activate: function(element, container, callback) {\n      var $active = container.find('> .active')\n        , transition = callback\n          && $.support.transition\n          && $active.hasClass('fade')\n\n      function next() {\n        $active\n          .removeClass('active')\n          .find('> .dropdown-menu > .active')\n          .removeClass('active')\n\n        element.addClass('active')\n\n        if (transition) {\n          element[0].offsetWidth // reflow for transition\n          element.addClass('in')\n        } else {\n          element.removeClass('fade')\n        }\n\n        if (element.parent('.dropdown-menu')) {\n          element.closest('li.dropdown').addClass('active')\n        }\n\n        callback && callback()\n      }\n\n      transition ?\n        $active.one($.support.transition.end, next) :\n        next()\n\n      $active.removeClass('in')\n    }\n  }\n\n\n  /* TAB PLUGIN DEFINITION\n   * ===================== */\n\n  var old = $.fn.tab\n\n  $.fn.tab = function(option) {\n    return this.each(function() {\n      var $this = $(this)\n        , data = $this.data('tab')\n      if (!data) $this.data('tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n  /* TAB NO CONFLICT\n   * =============== */\n\n  $.fn.tab.noConflict = function() {\n    $.fn.tab = old\n    return this\n  }\n\n\n  /* TAB DATA-API\n   * ============ */\n\n  $(document).on('click.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function(e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);/* =============================================================\n * bootstrap-typeahead.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#typeahead\n * =============================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n  /* TYPEAHEAD PUBLIC CLASS DEFINITION\n   * ================================= */\n\n  var Typeahead = function(element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.typeahead.defaults, options)\n    this.matcher = this.options.matcher || this.matcher\n    this.sorter = this.options.sorter || this.sorter\n    this.highlighter = this.options.highlighter || this.highlighter\n    this.updater = this.options.updater || this.updater\n    this.source = this.options.source\n    this.$menu = $(this.options.menu)\n    this.shown = false\n    this.listen()\n  }\n\n  Typeahead.prototype = {\n\n    constructor: Typeahead\n\n    , select: function() {\n      // CHANGE (rashidkpc) If nothing is selected, use existing value\n      var val = this.$menu.find('.active').attr('data-value') || this.$element.val();\n      this.$element\n        .val(this.updater(val))\n        .change()\n      return this.hide()\n    }\n\n    , updater: function(item) {\n      return item\n    }\n\n    , show: function() {\n      var pos = $.extend({}, this.$element.position(), {\n        height: this.$element[0].offsetHeight\n      })\n\n      this.$menu\n        .insertAfter(this.$element)\n        .css({\n          top: pos.top + pos.height\n          , left: pos.left\n        })\n        .show()\n\n      this.shown = true\n      return this\n    }\n\n    , hide: function() {\n      this.$menu.hide()\n      this.shown = false\n      return this\n    }\n\n    , lookup: function(event) {\n      var items\n\n      this.query = this.$element.val()\n\n      if (!this.query || this.query.length < this.options.minLength) {\n        return this.shown ? this.hide() : this\n      }\n\n      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source\n\n      return items ? this.process(items) : this\n    }\n\n    , process: function(items) {\n      var that = this\n\n      items = $.grep(items, function(item) {\n        return that.matcher(item)\n      })\n\n      items = this.sorter(items)\n\n      if (!items.length) {\n        return this.shown ? this.hide() : this\n      }\n\n      return this.render(items.slice(0, this.options.items)).show()\n    }\n\n    , matcher: function(item) {\n      return ~item.toLowerCase().indexOf(this.query.toLowerCase())\n    }\n\n    , sorter: function(items) {\n      var beginswith = []\n        , caseSensitive = []\n        , caseInsensitive = []\n        , item\n\n      while (item = items.shift()) {\n        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)\n        else if (~item.indexOf(this.query)) caseSensitive.push(item)\n        else caseInsensitive.push(item)\n      }\n\n      return beginswith.concat(caseSensitive, caseInsensitive)\n    }\n\n    , highlighter: function(item) {\n      var query = this.query.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&')\n      if (!query) {\n        return item;\n      }\n      return item.replace(new RegExp('(' + query + ')', 'ig'), function($1, match) {\n        return '<strong>' + match + '</strong>'\n      });\n    }\n\n    , render: function(items) {\n      var that = this\n\n      items = $(items).map(function(i, item) {\n        i = $(that.options.item).attr('data-value', item)\n        i.find('a').html(that.highlighter(item))\n        return i[0]\n      })\n\n      // CHANGE (rashidpc) Do not select first element by default\n      // items.first().addClass('active')\n      this.$menu.html(items)\n      return this\n    }\n\n    , next: function(event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , next = active.next()\n\n      if (!next.length) {\n        next = $(this.$menu.find('li')[0])\n      }\n\n      next.addClass('active')\n    }\n\n    , prev: function(event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , prev = active.prev()\n\n      if (!prev.length) {\n        prev = this.$menu.find('li').last()\n      }\n\n      prev.addClass('active')\n    }\n\n    , listen: function() {\n      this.$element\n        .on('focus', $.proxy(this.focus, this))\n        .on('blur', $.proxy(this.blur, this))\n        .on('keypress', $.proxy(this.keypress, this))\n        .on('keyup', $.proxy(this.keyup, this))\n\n      if (this.eventSupported('keydown')) {\n        this.$element.on('keydown', $.proxy(this.keydown, this))\n      }\n\n      this.$menu\n        .on('click', $.proxy(this.click, this))\n        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))\n        .on('mouseleave', 'li', $.proxy(this.mouseleave, this))\n    },\n\n    destroy: function() {\n      this.$element.off().removeData('typeahead');\n      this.$menu.off();\n    }\n\n    , eventSupported: function(eventName) {\n      var isSupported = eventName in this.$element\n      if (!isSupported) {\n        this.$element.setAttribute(eventName, 'return;')\n        isSupported = typeof this.$element[eventName] === 'function'\n      }\n      return isSupported\n    }\n\n    , move: function(e) {\n      if (!this.shown) return\n\n      // grafana change, shift+left parenthesis\n      if (e.shiftKey && e.keyCode === 40) {\n        return;\n      }\n\n      switch (e.keyCode) {\n        case 9: // tab\n        case 13: // enter\n        case 27: // escape\n          e.preventDefault()\n          break\n\n        case 38: // up arrow\n          e.preventDefault()\n          this.prev()\n          break\n\n        case 40: // down arrow\n          e.preventDefault()\n          this.next()\n          break\n      }\n\n      e.stopPropagation()\n    }\n\n    , keydown: function(e) {\n      this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40, 38, 9, 13, 27, 57])\n      this.move(e)\n    }\n\n    , keypress: function(e) {\n      if (this.suppressKeyPressRepeat) return\n      this.move(e)\n    }\n\n    , keyup: function(e) {\n      switch (e.keyCode) {\n        case 40: // down arrow\n        case 38: // up arrow\n        case 16: // shift\n        case 17: // ctrl\n        case 18: // alt\n          break\n\n        case 9: // tab\n        case 13: // enter\n          if (!this.shown) return\n          this.select()\n          break\n\n        case 27: // escape\n          if (!this.shown) return\n          this.hide()\n          break\n\n        default:\n          this.lookup();\n      }\n\n      if (e.keyCode === 13 && typeof this.$menu.find('.active').attr('data-value') === 'undefined') {\n        // CHANGE (rashidkpc). Enter was hit, nothing was selected from typeahead, submit form\n        this.$element.submit();\n      } else {\n        e.stopPropagation()\n        e.preventDefault()\n      }\n\n    }\n\n    , focus: function(e) {\n      this.focused = true\n    }\n\n    , blur: function(e) {\n      this.focused = false\n      if (!this.mousedover && this.shown) this.hide()\n    }\n\n    , click: function(e) {\n      e.stopPropagation()\n      e.preventDefault()\n      this.select()\n      this.$element.focus()\n    }\n\n    , mouseenter: function(e) {\n      this.mousedover = true\n      this.$menu.find('.active').removeClass('active')\n      $(e.currentTarget).addClass('active')\n    }\n\n    , mouseleave: function(e) {\n      this.mousedover = false\n      if (!this.focused && this.shown) this.hide()\n    }\n\n  }\n\n\n  /* TYPEAHEAD PLUGIN DEFINITION\n   * =========================== */\n\n  var old = $.fn.typeahead\n\n  $.fn.typeahead = function(option) {\n    return this.each(function() {\n      var $this = $(this)\n        , data = $this.data('typeahead')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.typeahead.defaults = {\n    source: []\n    , items: 8\n    , menu: '<ul class=\"typeahead dropdown-menu\"></ul>'\n    , item: '<li><a href=\"#\"></a></li>'\n    , minLength: 1\n  }\n\n  $.fn.typeahead.Constructor = Typeahead\n\n\n  /* TYPEAHEAD NO CONFLICT\n   * =================== */\n\n  $.fn.typeahead.noConflict = function() {\n    $.fn.typeahead = old\n    return this\n  }\n\n\n  /* TYPEAHEAD DATA-API\n   * ================== */\n\n  $(document).on('focus.typeahead.data-api', '[data-provide=\"typeahead\"]', function(e) {\n    var $this = $(this)\n    if ($this.data('typeahead')) return\n    $this.typeahead($this.data())\n  })\n\n}(window.jQuery);\n/* ==========================================================\n * bootstrap-affix.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#affix\n * ==========================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n  /* AFFIX CLASS DEFINITION\n   * ====================== */\n\n  var Affix = function(element, options) {\n    this.options = $.extend({}, $.fn.affix.defaults, options)\n    this.$window = $(window)\n      .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.affix.data-api', $.proxy(function() { setTimeout($.proxy(this.checkPosition, this), 1) }, this))\n    this.$element = $(element)\n    this.checkPosition()\n  }\n\n  Affix.prototype.checkPosition = function() {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n      , scrollTop = this.$window.scrollTop()\n      , position = this.$element.offset()\n      , offset = this.options.offset\n      , offsetBottom = offset.bottom\n      , offsetTop = offset.top\n      , reset = 'affix affix-top affix-bottom'\n      , affix\n\n    if (typeof offset != 'object') offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function') offsetTop = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?\n      false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?\n        'bottom' : offsetTop != null && scrollTop <= offsetTop ?\n          'top' : false\n\n    if (this.affixed === affix) return\n\n    this.affixed = affix\n    this.unpin = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))\n  }\n\n\n  /* AFFIX PLUGIN DEFINITION\n   * ======================= */\n\n  var old = $.fn.affix\n\n  $.fn.affix = function(option) {\n    return this.each(function() {\n      var $this = $(this)\n        , data = $this.data('affix')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n  $.fn.affix.defaults = {\n    offset: 0\n  }\n\n\n  /* AFFIX NO CONFLICT\n   * ================= */\n\n  $.fn.affix.noConflict = function() {\n    $.fn.affix = old\n    return this\n  }\n\n\n  /* AFFIX DATA-API\n   * ============== */\n\n  $(window).on('load', function() {\n    $('[data-spy=\"affix\"]').each(function() {\n      var $spy = $(this)\n        , data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      data.offsetBottom && (data.offset.bottom = data.offsetBottom)\n      data.offsetTop && (data.offset.top = data.offsetTop)\n\n      $spy.affix(data)\n    })\n  })\n\n\n}(window.jQuery);\n","(function ($) {\n  \"use strict\";\n\n  var defaultOptions = {\n    tagClass: function(item) {\n      return 'label label-info';\n    },\n    itemValue: function(item) {\n      return item ? item.toString() : item;\n    },\n    itemText: function(item) {\n      return this.itemValue(item);\n    },\n    freeInput: true,\n    maxTags: undefined,\n    confirmKeys: [13],\n    onTagExists: function(item, $tag) {\n      $tag.hide().fadeIn();\n    }\n  };\n\n  /**\n   * Constructor function\n   */\n  function TagsInput(element, options) {\n    this.itemsArray = [];\n\n    this.$element = $(element);\n    this.$element.hide();\n\n    this.widthClass = options.widthClass || 'width-9';\n    this.isSelect = (element.tagName === 'SELECT');\n    this.multiple = (this.isSelect && element.hasAttribute('multiple'));\n    this.objectItems = options && options.itemValue;\n    this.placeholderText = element.hasAttribute('placeholder') ? this.$element.attr('placeholder') : '';\n\n    this.$container = $('<div class=\"bootstrap-tagsinput\"></div>');\n    this.$input = $('<input class=\"gf-form-input ' + this.widthClass + '\" type=\"text\" placeholder=\"' + this.placeholderText + '\"/>').appendTo(this.$container);\n\n    this.$element.after(this.$container);\n\n    this.build(options);\n  }\n\n  TagsInput.prototype = {\n    constructor: TagsInput,\n\n    /**\n     * Adds the given item as a new tag. Pass true to dontPushVal to prevent\n     * updating the elements val()\n     */\n    add: function(item, dontPushVal) {\n      var self = this;\n\n      if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags)\n        return;\n\n      // Ignore falsey values, except false\n      if (item !== false && !item)\n        return;\n\n      // Throw an error when trying to add an object while the itemValue option was not set\n      if (typeof item === \"object\" && !self.objectItems)\n        throw(\"Can't add objects when itemValue option is not set\");\n\n      // Ignore strings only containg whitespace\n      if (item.toString().match(/^\\s*$/))\n        return;\n\n      // If SELECT but not multiple, remove current tag\n      if (self.isSelect && !self.multiple && self.itemsArray.length > 0)\n        self.remove(self.itemsArray[0]);\n\n      if (typeof item === \"string\" && this.$element[0].tagName === 'INPUT') {\n        var items = item.split(',');\n        if (items.length > 1) {\n          for (var i = 0; i < items.length; i++) {\n            this.add(items[i], true);\n          }\n\n          if (!dontPushVal)\n            self.pushVal();\n          return;\n        }\n      }\n\n      var itemValue = self.options.itemValue(item),\n          itemText = self.options.itemText(item),\n          tagClass = self.options.tagClass(item);\n\n      // Ignore items already added\n      var existing = $.grep(self.itemsArray, function(item) { return self.options.itemValue(item) === itemValue; } )[0];\n      if (existing) {\n        // Invoke onTagExists\n        if (self.options.onTagExists) {\n          var $existingTag = $(\".tag\", self.$container).filter(function() { return $(this).data(\"item\") === existing; });\n          self.options.onTagExists(item, $existingTag);\n        }\n        return;\n      }\n\n      // register item in internal array and map\n      self.itemsArray.push(item);\n\n      // add a tag element\n      var $tag = $('<span class=\"tag ' + htmlEncode(tagClass) + '\">' + htmlEncode(itemText) + '<span data-role=\"remove\"></span></span>');\n      $tag.data('item', item);\n      self.findInputWrapper().before($tag);\n      $tag.after(' ');\n\n      // add <option /> if item represents a value not present in one of the <select />'s options\n      if (self.isSelect && !$('option[value=\"' + escape(itemValue) + '\"]',self.$element)[0]) {\n        var $option = $('<option selected>' + htmlEncode(itemText) + '</option>');\n        $option.data('item', item);\n        $option.attr('value', itemValue);\n        self.$element.append($option);\n      }\n\n      if (!dontPushVal)\n        self.pushVal();\n\n      // Add class when reached maxTags\n      if (self.options.maxTags === self.itemsArray.length)\n        self.$container.addClass('bootstrap-tagsinput-max');\n\n      self.$element.trigger($.Event('itemAdded', { item: item }));\n    },\n\n    /**\n     * Removes the given item. Pass true to dontPushVal to prevent updating the\n     * elements val()\n     */\n    remove: function(item, dontPushVal) {\n      var self = this;\n\n      if (self.objectItems) {\n        if (typeof item === \"object\")\n          item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) ==  self.options.itemValue(item); } )[0];\n        else\n          item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) ==  item; } )[0];\n      }\n\n      if (item) {\n        $('.tag', self.$container).filter(function() { return $(this).data('item') === item; }).remove();\n        $('option', self.$element).filter(function() { return $(this).data('item') === item; }).remove();\n        self.itemsArray.splice($.inArray(item, self.itemsArray), 1);\n      }\n\n      if (!dontPushVal)\n        self.pushVal();\n\n      // Remove class when reached maxTags\n      if (self.options.maxTags > self.itemsArray.length)\n        self.$container.removeClass('bootstrap-tagsinput-max');\n\n      self.$element.trigger($.Event('itemRemoved',  { item: item }));\n    },\n\n    /**\n     * Removes all items\n     */\n    removeAll: function() {\n      var self = this;\n\n      $('.tag', self.$container).remove();\n      $('option', self.$element).remove();\n\n      while(self.itemsArray.length > 0)\n        self.itemsArray.pop();\n\n      self.pushVal();\n\n      if (self.options.maxTags && !this.isEnabled())\n        this.enable();\n    },\n\n    /**\n     * Refreshes the tags so they match the text/value of their corresponding\n     * item.\n     */\n    refresh: function() {\n      var self = this;\n      $('.tag', self.$container).each(function() {\n        var $tag = $(this),\n            item = $tag.data('item'),\n            itemValue = self.options.itemValue(item),\n            itemText = self.options.itemText(item),\n            tagClass = self.options.tagClass(item);\n\n          // Update tag's class and inner text\n          $tag.attr('class', null);\n          $tag.addClass('tag ' + htmlEncode(tagClass));\n          $tag.contents().filter(function() {\n            return this.nodeType == 3;\n          })[0].nodeValue = htmlEncode(itemText);\n\n          if (self.isSelect) {\n            var option = $('option', self.$element).filter(function() { return $(this).data('item') === item; });\n            option.attr('value', itemValue);\n          }\n      });\n    },\n\n    /**\n     * Returns the items added as tags\n     */\n    items: function() {\n      return this.itemsArray;\n    },\n\n    /**\n     * Assembly value by retrieving the value of each item, and set it on the\n     * element.\n     */\n    pushVal: function() {\n      var self = this,\n          val = $.map(self.items(), function(item) {\n            return self.options.itemValue(item).toString();\n          });\n\n      self.$element.val(val, true).trigger('change');\n    },\n\n    /**\n     * Initializes the tags input behaviour on the element\n     */\n    build: function(options) {\n      var self = this;\n\n      self.options = $.extend({}, defaultOptions, options);\n      var typeahead = self.options.typeahead || {};\n\n      // When itemValue is set, freeInput should always be false\n      if (self.objectItems)\n        self.options.freeInput = false;\n\n      makeOptionItemFunction(self.options, 'itemValue');\n      makeOptionItemFunction(self.options, 'itemText');\n      makeOptionItemFunction(self.options, 'tagClass');\n\n      // for backwards compatibility, self.options.source is deprecated\n      if (self.options.source)\n        typeahead.source = self.options.source;\n\n      if (typeahead.source && $.fn.typeahead) {\n        makeOptionFunction(typeahead, 'source');\n\n        self.$input.typeahead({\n          source: function (query, process) {\n            function processItems(items) {\n              var texts = [];\n\n              for (var i = 0; i < items.length; i++) {\n                var text = self.options.itemText(items[i]);\n                map[text] = items[i];\n                texts.push(text);\n              }\n              process(texts);\n            }\n\n            this.map = {};\n            var map = this.map,\n                data = typeahead.source(query);\n\n            if ($.isFunction(data.success)) {\n              // support for Angular promises\n              data.success(processItems);\n            } else {\n              // support for functions and jquery promises\n              $.when(data)\n               .then(processItems);\n            }\n          },\n          updater: function (text) {\n            self.add(this.map[text]);\n          },\n          matcher: function (text) {\n            return (text.toLowerCase().indexOf(this.query.trim().toLowerCase()) !== -1);\n          },\n          sorter: function (texts) {\n            return texts.sort();\n          },\n          highlighter: function (text) {\n            var regex = new RegExp( '(' + this.query + ')', 'gi' );\n            return text.replace( regex, \"<strong>$1</strong>\" );\n          }\n        });\n      }\n\n      self.$container.on('click', $.proxy(function(event) {\n        self.$input.focus();\n      }, self));\n\n      self.$container.on('blur', 'input', $.proxy(function(event) {\n        var $input = $(event.target);\n        self.add($input.val());\n        $input.val('');\n        event.preventDefault();\n      }, self));\n\n      self.$container.on('keydown', 'input', $.proxy(function(event) {\n        var $input = $(event.target),\n            $inputWrapper = self.findInputWrapper();\n\n        switch (event.which) {\n          // BACKSPACE\n          case 8:\n            if (doGetCaretPosition($input[0]) === 0) {\n              var prev = $inputWrapper.prev();\n              if (prev) {\n                self.remove(prev.data('item'));\n              }\n            }\n            break;\n\n          // DELETE\n          case 46:\n            if (doGetCaretPosition($input[0]) === 0) {\n              var next = $inputWrapper.next();\n              if (next) {\n                self.remove(next.data('item'));\n              }\n            }\n            break;\n\n          // LEFT ARROW\n          case 37:\n            // Try to move the input before the previous tag\n            var $prevTag = $inputWrapper.prev();\n            if ($input.val().length === 0 && $prevTag[0]) {\n              $prevTag.before($inputWrapper);\n              $input.focus();\n            }\n            break;\n          // RIGHT ARROW\n          case 39:\n            // Try to move the input after the next tag\n            var $nextTag = $inputWrapper.next();\n            if ($input.val().length === 0 && $nextTag[0]) {\n              $nextTag.after($inputWrapper);\n              $input.focus();\n            }\n            break;\n         default:\n            // When key corresponds one of the confirmKeys, add current input\n            // as a new tag\n            if (self.options.freeInput && $.inArray(event.which, self.options.confirmKeys) >= 0) {\n              self.add($input.val());\n              $input.val('');\n              event.preventDefault();\n            }\n        }\n\n        // Reset internal input's size\n        $input.attr('size', Math.max(this.inputSize, $input.val().length));\n      }, self));\n\n      // Remove icon clicked\n      self.$container.on('click', '[data-role=remove]', $.proxy(function(event) {\n        self.remove($(event.target).closest('.tag').data('item'));\n        // Grafana mod, if tags input used in popover the click event will bubble up and hide popover\n        event.stopPropagation();\n      }, self));\n\n      // Only add existing value as tags when using strings as tags\n      if (self.options.itemValue === defaultOptions.itemValue) {\n        if (self.$element[0].tagName === 'INPUT') {\n            self.add(self.$element.val());\n        } else {\n          $('option', self.$element).each(function() {\n            self.add($(this).attr('value'), true);\n          });\n        }\n      }\n    },\n\n    /**\n     * Removes all tagsinput behaviour and unregsiter all event handlers\n     */\n    destroy: function() {\n      var self = this;\n\n      // Unbind events\n      self.$container.off('keypress', 'input');\n      self.$container.off('click', '[role=remove]');\n\n      self.$container.remove();\n      self.$element.removeData('tagsinput');\n      self.$element.show();\n    },\n\n    /**\n     * Sets focus on the tagsinput\n     */\n    focus: function() {\n      this.$input.focus();\n    },\n\n    /**\n     * Returns the internal input element\n     */\n    input: function() {\n      return this.$input;\n    },\n\n    /**\n     * Returns the element which is wrapped around the internal input. This\n     * is normally the $container, but typeahead.js moves the $input element.\n     */\n    findInputWrapper: function() {\n      var elt = this.$input[0],\n          container = this.$container[0];\n      while(elt && elt.parentNode !== container)\n        elt = elt.parentNode;\n\n      return $(elt);\n    }\n  };\n\n  /**\n   * Register JQuery plugin\n   */\n  $.fn.tagsinput = function(arg1, arg2) {\n    var results = [];\n\n    this.each(function() {\n      var tagsinput = $(this).data('tagsinput');\n\n      // Initialize a new tags input\n      if (!tagsinput) {\n        tagsinput = new TagsInput(this, arg1);\n        $(this).data('tagsinput', tagsinput);\n        results.push(tagsinput);\n\n        if (this.tagName === 'SELECT') {\n          $('option', $(this)).attr('selected', 'selected');\n        }\n\n        // Init tags from $(this).val()\n        $(this).val($(this).val());\n      } else {\n        // Invoke function on existing tags input\n        var retVal = tagsinput[arg1](arg2);\n        if (retVal !== undefined)\n          results.push(retVal);\n      }\n    });\n\n    if ( typeof arg1 == 'string') {\n      // Return the results from the invoked function calls\n      return results.length > 1 ? results : results[0];\n    } else {\n      return results;\n    }\n  };\n\n  $.fn.tagsinput.Constructor = TagsInput;\n\n  /**\n   * Most options support both a string or number as well as a function as\n   * option value. This function makes sure that the option with the given\n   * key in the given options is wrapped in a function\n   */\n  function makeOptionItemFunction(options, key) {\n    if (typeof options[key] !== 'function') {\n      var propertyName = options[key];\n      options[key] = function(item) { return item[propertyName]; };\n    }\n  }\n  function makeOptionFunction(options, key) {\n    if (typeof options[key] !== 'function') {\n      var value = options[key];\n      options[key] = function() { return value; };\n    }\n  }\n  /**\n   * HtmlEncodes the given value\n   */\n  var htmlEncodeContainer = $('<div />');\n  function htmlEncode(value) {\n    if (value) {\n      return htmlEncodeContainer.text(value).html();\n    } else {\n      return '';\n    }\n  }\n\n  /**\n   * Returns the position of the caret in the given input field\n   * http://flightschool.acylt.com/devnotes/caret-position-woes/\n   */\n  function doGetCaretPosition(oField) {\n    var iCaretPos = 0;\n    if (document.selection) {\n      oField.focus ();\n      var oSel = document.selection.createRange();\n      oSel.moveStart ('character', -oField.value.length);\n      iCaretPos = oSel.text.length;\n    } else if (oField.selectionStart || oField.selectionStart == '0') {\n      iCaretPos = oField.selectionStart;\n    }\n    return (iCaretPos);\n  }\n\n  /**\n   * Initialize tagsinput behaviour on inputs and selects which have\n   * data-role=tagsinput\n   */\n  $(function() {\n    $(\"input[data-role=tagsinput], select[multiple][data-role=tagsinput]\").tagsinput();\n  });\n})(window.jQuery);\n","(function () {\r\n\t\"use strict\";\r\n\t/**\r\n\t * Bindonce - Zero watches binding for AngularJs\r\n\t * @version v0.3.1\r\n\t * @link https://github.com/Pasvaz/bindonce\r\n\t * @author Pasquale Vazzana <pasqualevazzana@gmail.com>\r\n\t * @license MIT License, http://www.opensource.org/licenses/MIT\r\n\t */\r\n\r\n\tvar bindonceModule = angular.module('pasvaz.bindonce', []);\r\n\r\n\tbindonceModule.directive('bindonce', function ()\r\n\t{\r\n\t\tvar toBoolean = function (value)\r\n\t\t{\r\n\t\t\tif (value && value.length !== 0)\r\n\t\t\t{\r\n\t\t\t\tvar v = angular.lowercase(\"\" + value);\r\n\t\t\t\tvalue = !(v === 'f' || v === '0' || v === 'false' || v === 'no' || v === 'n' || v === '[]');\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tvalue = false;\r\n\t\t\t}\r\n\t\t\treturn value;\r\n\t\t};\r\n\r\n\t\tvar msie = parseInt((/msie (\\d+)/.exec(angular.lowercase(navigator.userAgent)) || [])[1], 10);\r\n\t\tif (isNaN(msie))\r\n\t\t{\r\n\t\t\tmsie = parseInt((/trident\\/.*; rv:(\\d+)/.exec(angular.lowercase(navigator.userAgent)) || [])[1], 10);\r\n\t\t}\r\n\r\n\t\tvar bindonceDirective =\r\n\t\t{\r\n\t\t\trestrict: \"AM\",\r\n\t\t\tcontroller: ['$scope', '$element', '$attrs', '$interpolate', function ($scope, $element, $attrs, $interpolate)\r\n\t\t\t{\r\n\t\t\t\tvar showHideBinder = function (elm, attr, value)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar show = (attr === 'show') ? '' : 'none';\r\n\t\t\t\t\tvar hide = (attr === 'hide') ? '' : 'none';\r\n\t\t\t\t\telm.css('display', toBoolean(value) ? show : hide);\r\n\t\t\t\t};\r\n\t\t\t\tvar classBinder = function (elm, value)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (angular.isObject(value) && !angular.isArray(value))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar results = [];\r\n\t\t\t\t\t\tangular.forEach(value, function (value, index)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (value) results.push(index);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tvalue = results;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (value)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\telm.addClass(angular.isArray(value) ? value.join(' ') : value);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\tvar ctrl =\r\n\t\t\t\t{\r\n\t\t\t\t\twatcherRemover: undefined,\r\n\t\t\t\t\tbinders: [],\r\n\t\t\t\t\tgroup: $attrs.boName,\r\n\t\t\t\t\telement: $element,\r\n\t\t\t\t\tran: false,\r\n\r\n\t\t\t\t\taddBinder: function (binder)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis.binders.push(binder);\r\n\r\n\t\t\t\t\t\t// In case of late binding (when using the directive bo-name/bo-parent)\r\n\t\t\t\t\t\t// it happens only when you use nested bindonce, if the bo-children\r\n\t\t\t\t\t\t// are not dom children the linking can follow another order\r\n\t\t\t\t\t\tif (this.ran)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tthis.runBinders();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tsetupWatcher: function (bindonceValue)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar that = this;\r\n\t\t\t\t\t\tthis.watcherRemover = $scope.$watch(bindonceValue, function (newValue)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (newValue === undefined) return;\r\n\t\t\t\t\t\t\tthat.removeWatcher();\r\n\t\t\t\t\t\t\tthat.runBinders();\r\n\t\t\t\t\t\t}, true);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tremoveWatcher: function ()\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (this.watcherRemover !== undefined)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tthis.watcherRemover();\r\n\t\t\t\t\t\t\tthis.watcherRemover = undefined;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\trunBinders: function ()\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\twhile (this.binders.length > 0)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tvar binder = this.binders.shift();\r\n\t\t\t\t\t\t\tif (this.group && this.group != binder.group) continue;\r\n\t\t\t\t\t\t\tvar value = binder.scope.$eval((binder.interpolate) ? $interpolate(binder.value) : binder.value);\r\n\t\t\t\t\t\t\tswitch (binder.attr)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcase 'boIf':\r\n\t\t\t\t\t\t\t\t\tif (toBoolean(value))\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tbinder.transclude(binder.scope.$new(), function (clone)\r\n\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\tvar parent = binder.element.parent();\r\n\t\t\t\t\t\t\t\t\t\t\tvar afterNode = binder.element && binder.element[binder.element.length - 1];\r\n\t\t\t\t\t\t\t\t\t\t\tvar parentNode = parent && parent[0] || afterNode && afterNode.parentNode;\r\n\t\t\t\t\t\t\t\t\t\t\tvar afterNextSibling = (afterNode && afterNode.nextSibling) || null;\r\n\t\t\t\t\t\t\t\t\t\t\tangular.forEach(clone, function (node)\r\n\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\tparentNode.insertBefore(node, afterNextSibling);\r\n\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tcase 'boSwitch':\r\n\t\t\t\t\t\t\t\t\tvar selectedTranscludes, switchCtrl = binder.controller[0];\r\n\t\t\t\t\t\t\t\t\tif ((selectedTranscludes = switchCtrl.cases['!' + value] || switchCtrl.cases['?']))\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tbinder.scope.$eval(binder.attrs.change);\r\n\t\t\t\t\t\t\t\t\t\tangular.forEach(selectedTranscludes, function (selectedTransclude)\r\n\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\tselectedTransclude.transclude(binder.scope.$new(), function (clone)\r\n\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\tvar parent = selectedTransclude.element.parent();\r\n\t\t\t\t\t\t\t\t\t\t\t\tvar afterNode = selectedTransclude.element && selectedTransclude.element[selectedTransclude.element.length - 1];\r\n\t\t\t\t\t\t\t\t\t\t\t\tvar parentNode = parent && parent[0] || afterNode && afterNode.parentNode;\r\n\t\t\t\t\t\t\t\t\t\t\t\tvar afterNextSibling = (afterNode && afterNode.nextSibling) || null;\r\n\t\t\t\t\t\t\t\t\t\t\t\tangular.forEach(clone, function (node)\r\n\t\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tparentNode.insertBefore(node, afterNextSibling);\r\n\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tcase 'boSwitchWhen':\r\n\t\t\t\t\t\t\t\t\tvar ctrl = binder.controller[0];\r\n\t\t\t\t\t\t\t\t\tctrl.cases['!' + binder.attrs.boSwitchWhen] = (ctrl.cases['!' + binder.attrs.boSwitchWhen] || []);\r\n\t\t\t\t\t\t\t\t\tctrl.cases['!' + binder.attrs.boSwitchWhen].push({ transclude: binder.transclude, element: binder.element });\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tcase 'boSwitchDefault':\r\n\t\t\t\t\t\t\t\t\tvar ctrl = binder.controller[0];\r\n\t\t\t\t\t\t\t\t\tctrl.cases['?'] = (ctrl.cases['?'] || []);\r\n\t\t\t\t\t\t\t\t\tctrl.cases['?'].push({ transclude: binder.transclude, element: binder.element });\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tcase 'hide':\r\n\t\t\t\t\t\t\t\tcase 'show':\r\n\t\t\t\t\t\t\t\t\tshowHideBinder(binder.element, binder.attr, value);\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tcase 'class':\r\n\t\t\t\t\t\t\t\t\tclassBinder(binder.element, value);\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tcase 'text':\r\n\t\t\t\t\t\t\t\t\tbinder.element.text(value);\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tcase 'html':\r\n\t\t\t\t\t\t\t\t\tbinder.element.html(value);\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tcase 'style':\r\n\t\t\t\t\t\t\t\t\tbinder.element.css(value);\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tcase 'src':\r\n\t\t\t\t\t\t\t\t\tbinder.element.attr(binder.attr, value);\r\n\t\t\t\t\t\t\t\t\tif (msie) binder.element.prop('src', value);\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tcase 'attr':\r\n\t\t\t\t\t\t\t\t\tangular.forEach(binder.attrs, function (attrValue, attrKey)\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tvar newAttr, newValue;\r\n\t\t\t\t\t\t\t\t\t\tif (attrKey.match(/^boAttr./) && binder.attrs[attrKey])\r\n\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\tnewAttr = attrKey.replace(/^boAttr/, '').replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\r\n\t\t\t\t\t\t\t\t\t\t\tnewValue = binder.scope.$eval(binder.attrs[attrKey]);\r\n\t\t\t\t\t\t\t\t\t\t\tbinder.element.attr(newAttr, newValue);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tcase 'href':\r\n\t\t\t\t\t\t\t\tcase 'alt':\r\n\t\t\t\t\t\t\t\tcase 'title':\r\n\t\t\t\t\t\t\t\tcase 'id':\r\n\t\t\t\t\t\t\t\tcase 'value':\r\n\t\t\t\t\t\t\t\t\tbinder.element.attr(binder.attr, value);\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthis.ran = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\treturn ctrl;\r\n\t\t\t}],\r\n\r\n\t\t\tlink: function (scope, elm, attrs, bindonceController)\r\n\t\t\t{\r\n\t\t\t\tvar value = (attrs.bindonce) ? scope.$eval(attrs.bindonce) : true;\r\n\t\t\t\tif (value !== undefined)\r\n\t\t\t\t{\r\n\t\t\t\t\tbindonceController.runBinders();\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tbindonceController.setupWatcher(attrs.bindonce);\r\n\t\t\t\t\telm.bind(\"$destroy\", bindonceController.removeWatcher);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn bindonceDirective;\r\n\t});\r\n\r\n\tangular.forEach(\r\n\t[\r\n\t\t{ directiveName: 'boShow', attribute: 'show' },\r\n\t\t{ directiveName: 'boHide', attribute: 'hide' },\r\n\t\t{ directiveName: 'boClass', attribute: 'class' },\r\n\t\t{ directiveName: 'boText', attribute: 'text' },\r\n\t\t{ directiveName: 'boBind', attribute: 'text' },\r\n\t\t{ directiveName: 'boHtml', attribute: 'html' },\r\n\t\t{ directiveName: 'boSrcI', attribute: 'src', interpolate: true },\r\n\t\t{ directiveName: 'boSrc', attribute: 'src' },\r\n\t\t{ directiveName: 'boHrefI', attribute: 'href', interpolate: true },\r\n\t\t{ directiveName: 'boHref', attribute: 'href' },\r\n\t\t{ directiveName: 'boAlt', attribute: 'alt' },\r\n\t\t{ directiveName: 'boTitle', attribute: 'title' },\r\n\t\t{ directiveName: 'boId', attribute: 'id' },\r\n\t\t{ directiveName: 'boStyle', attribute: 'style' },\r\n\t\t{ directiveName: 'boValue', attribute: 'value' },\r\n\t\t{ directiveName: 'boAttr', attribute: 'attr' },\r\n\r\n\t\t{ directiveName: 'boIf', transclude: 'element', terminal: true, priority: 1000 },\r\n\t\t{ directiveName: 'boSwitch', require: 'boSwitch', controller: function () { this.cases = {}; } },\r\n\t\t{ directiveName: 'boSwitchWhen', transclude: 'element', priority: 800, require: '^boSwitch', },\r\n\t\t{ directiveName: 'boSwitchDefault', transclude: 'element', priority: 800, require: '^boSwitch', }\r\n\t],\r\n\tfunction (boDirective)\r\n\t{\r\n\t\tvar childPriority = 200;\r\n\t\treturn bindonceModule.directive(boDirective.directiveName, function ()\r\n\t\t{\r\n\t\t\tvar bindonceDirective =\r\n\t\t\t{\r\n\t\t\t\tpriority: boDirective.priority || childPriority,\r\n\t\t\t\ttransclude: boDirective.transclude || false,\r\n\t\t\t\tterminal: boDirective.terminal || false,\r\n\t\t\t\trequire: ['^bindonce'].concat(boDirective.require || []),\r\n\t\t\t\tcontroller: boDirective.controller,\r\n\t\t\t\tcompile: function (tElement, tAttrs, transclude)\r\n\t\t\t\t{\r\n\t\t\t\t\treturn function (scope, elm, attrs, controllers)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar bindonceController = controllers[0];\r\n\t\t\t\t\t\tvar name = attrs.boParent;\r\n\t\t\t\t\t\tif (name && bindonceController.group !== name)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tvar element = bindonceController.element.parent();\r\n\t\t\t\t\t\t\tbindonceController = undefined;\r\n\t\t\t\t\t\t\tvar parentValue;\r\n\r\n\t\t\t\t\t\t\twhile (element[0].nodeType !== 9 && element.length)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tif ((parentValue = element.data('$bindonceController'))\r\n\t\t\t\t\t\t\t\t\t&& parentValue.group === name)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tbindonceController = parentValue;\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telement = element.parent();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (!bindonceController)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tthrow new Error(\"No bindonce controller: \" + name);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbindonceController.addBinder(\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\telement: elm,\r\n\t\t\t\t\t\t\tattr: boDirective.attribute || boDirective.directiveName,\r\n\t\t\t\t\t\t\tattrs: attrs,\r\n\t\t\t\t\t\t\tvalue: attrs[boDirective.directiveName],\r\n\t\t\t\t\t\t\tinterpolate: boDirective.interpolate,\r\n\t\t\t\t\t\t\tgroup: name,\r\n\t\t\t\t\t\t\ttransclude: transclude,\r\n\t\t\t\t\t\t\tcontroller: controllers.slice(1),\r\n\t\t\t\t\t\t\tscope: scope\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\treturn bindonceDirective;\r\n\t\t});\r\n\t})\r\n})();\r\n","/**\n * @license AngularJS v1.8.2\n * (c) 2010-2020 Google LLC. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/* global shallowCopy: true */\n\n/**\n * Creates a shallow copy of an object, an array or a primitive.\n *\n * Assumes that there are no proto properties for objects.\n */\nfunction shallowCopy(src, dst) {\n  if (isArray(src)) {\n    dst = dst || [];\n\n    for (var i = 0, ii = src.length; i < ii; i++) {\n      dst[i] = src[i];\n    }\n  } else if (isObject(src)) {\n    dst = dst || {};\n\n    for (var key in src) {\n      if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n        dst[key] = src[key];\n      }\n    }\n  }\n\n  return dst || src;\n}\n\n/* global routeToRegExp: true */\n\n/**\n * @param {string} path - The path to parse. (It is assumed to have query and hash stripped off.)\n * @param {Object} opts - Options.\n * @return {Object} - An object containing an array of path parameter names (`keys`) and a regular\n *     expression (`regexp`) that can be used to identify a matching URL and extract the path\n *     parameter values.\n *\n * @description\n * Parses the given path, extracting path parameter names and a regular expression to match URLs.\n *\n * Originally inspired by `pathRexp` in `visionmedia/express/lib/utils.js`.\n */\nfunction routeToRegExp(path, opts) {\n  var keys = [];\n\n  var pattern = path\n    .replace(/([().])/g, '\\\\$1')\n    .replace(/(\\/)?:(\\w+)(\\*\\?|[?*])?/g, function(_, slash, key, option) {\n      var optional = option === '?' || option === '*?';\n      var star = option === '*' || option === '*?';\n      keys.push({name: key, optional: optional});\n      slash = slash || '';\n      return (\n        (optional ? '(?:' + slash : slash + '(?:') +\n        (star ? '(.+?)' : '([^/]+)') +\n        (optional ? '?)?' : ')')\n      );\n    })\n    .replace(/([/$*])/g, '\\\\$1');\n\n  if (opts.ignoreTrailingSlashes) {\n    pattern = pattern.replace(/\\/+$/, '') + '/*';\n  }\n\n  return {\n    keys: keys,\n    regexp: new RegExp(\n      '^' + pattern + '(?:[?#]|$)',\n      opts.caseInsensitiveMatch ? 'i' : ''\n    )\n  };\n}\n\n/* global routeToRegExp: false */\n/* global shallowCopy: false */\n\n// `isArray` and `isObject` are necessary for `shallowCopy()` (included via `src/shallowCopy.js`).\n// They are initialized inside the `$RouteProvider`, to ensure `window.angular` is available.\nvar isArray;\nvar isObject;\nvar isDefined;\nvar noop;\n\n/**\n * @ngdoc module\n * @name ngRoute\n * @description\n *\n * The `ngRoute` module provides routing and deeplinking services and directives for AngularJS apps.\n *\n * ## Example\n * See {@link ngRoute.$route#examples $route} for an example of configuring and using `ngRoute`.\n *\n */\n/* global -ngRouteModule */\nvar ngRouteModule = angular.\n  module('ngRoute', []).\n  info({ angularVersion: '1.8.2' }).\n  provider('$route', $RouteProvider).\n  // Ensure `$route` will be instantiated in time to capture the initial `$locationChangeSuccess`\n  // event (unless explicitly disabled). This is necessary in case `ngView` is included in an\n  // asynchronously loaded template.\n  run(instantiateRoute);\nvar $routeMinErr = angular.$$minErr('ngRoute');\nvar isEagerInstantiationEnabled;\n\n\n/**\n * @ngdoc provider\n * @name $routeProvider\n * @this\n *\n * @description\n *\n * Used for configuring routes.\n *\n * ## Example\n * See {@link ngRoute.$route#examples $route} for an example of configuring and using `ngRoute`.\n *\n * ## Dependencies\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n */\nfunction $RouteProvider() {\n  isArray = angular.isArray;\n  isObject = angular.isObject;\n  isDefined = angular.isDefined;\n  noop = angular.noop;\n\n  function inherit(parent, extra) {\n    return angular.extend(Object.create(parent), extra);\n  }\n\n  var routes = {};\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#when\n   *\n   * @param {string} path Route path (matched against `$location.path`). If `$location.path`\n   *    contains redundant trailing slash or is missing one, the route will still match and the\n   *    `$location.path` will be updated to add or drop the trailing slash to exactly match the\n   *    route definition.\n   *\n   *    * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up\n   *        to the next slash are matched and stored in `$routeParams` under the given `name`\n   *        when the route matches.\n   *    * `path` can contain named groups starting with a colon and ending with a star:\n   *        e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name`\n   *        when the route matches.\n   *    * `path` can contain optional named groups with a question mark: e.g.`:name?`.\n   *\n   *    For example, routes like `/color/:color/largecode/:largecode*\\/edit` will match\n   *    `/color/brown/largecode/code/with/slashes/edit` and extract:\n   *\n   *    * `color: brown`\n   *    * `largecode: code/with/slashes`.\n   *\n   *\n   * @param {Object} route Mapping information to be assigned to `$route.current` on route\n   *    match.\n   *\n   *    Object properties:\n   *\n   *    - `controller` – `{(string|Function)=}` – Controller fn that should be associated with\n   *      newly created scope or the name of a {@link angular.Module#controller registered\n   *      controller} if passed as a string.\n   *    - `controllerAs` – `{string=}` – An identifier name for a reference to the controller.\n   *      If present, the controller will be published to scope under the `controllerAs` name.\n   *    - `template` – `{(string|Function)=}` – html template as a string or a function that\n   *      returns an html template as a string which should be used by {@link\n   *      ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives.\n   *      This property takes precedence over `templateUrl`.\n   *\n   *      If `template` is a function, it will be called with the following parameters:\n   *\n   *      - `{Array.<Object>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route\n   *\n   *      One of `template` or `templateUrl` is required.\n   *\n   *    - `templateUrl` – `{(string|Function)=}` – path or function that returns a path to an html\n   *      template that should be used by {@link ngRoute.directive:ngView ngView}.\n   *\n   *      If `templateUrl` is a function, it will be called with the following parameters:\n   *\n   *      - `{Array.<Object>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route\n   *\n   *      One of `templateUrl` or `template` is required.\n   *\n   *    - `resolve` - `{Object.<string, Function>=}` - An optional map of dependencies which should\n   *      be injected into the controller. If any of these dependencies are promises, the router\n   *      will wait for them all to be resolved or one to be rejected before the controller is\n   *      instantiated.\n   *      If all the promises are resolved successfully, the values of the resolved promises are\n   *      injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is\n   *      fired. If any of the promises are rejected the\n   *      {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired.\n   *      For easier access to the resolved dependencies from the template, the `resolve` map will\n   *      be available on the scope of the route, under `$resolve` (by default) or a custom name\n   *      specified by the `resolveAs` property (see below). This can be particularly useful, when\n   *      working with {@link angular.Module#component components} as route templates.<br />\n   *      <div class=\"alert alert-warning\">\n   *        **Note:** If your scope already contains a property with this name, it will be hidden\n   *        or overwritten. Make sure, you specify an appropriate name for this property, that\n   *        does not collide with other properties on the scope.\n   *      </div>\n   *      The map object is:\n   *\n   *      - `key` – `{string}`: a name of a dependency to be injected into the controller.\n   *      - `factory` - `{string|Function}`: If `string` then it is an alias for a service.\n   *        Otherwise if function, then it is {@link auto.$injector#invoke injected}\n   *        and the return value is treated as the dependency. If the result is a promise, it is\n   *        resolved before its value is injected into the controller. Be aware that\n   *        `ngRoute.$routeParams` will still refer to the previous route within these resolve\n   *        functions.  Use `$route.current.params` to access the new route parameters, instead.\n   *\n   *    - `resolveAs` - `{string=}` - The name under which the `resolve` map will be available on\n   *      the scope of the route. If omitted, defaults to `$resolve`.\n   *\n   *    - `redirectTo` – `{(string|Function)=}` – value to update\n   *      {@link ng.$location $location} path with and trigger route redirection.\n   *\n   *      If `redirectTo` is a function, it will be called with the following parameters:\n   *\n   *      - `{Object.<string>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route templateUrl.\n   *      - `{string}` - current `$location.path()`\n   *      - `{Object}` - current `$location.search()`\n   *\n   *      The custom `redirectTo` function is expected to return a string which will be used\n   *      to update `$location.url()`. If the function throws an error, no further processing will\n   *      take place and the {@link ngRoute.$route#$routeChangeError $routeChangeError} event will\n   *      be fired.\n   *\n   *      Routes that specify `redirectTo` will not have their controllers, template functions\n   *      or resolves called, the `$location` will be changed to the redirect url and route\n   *      processing will stop. The exception to this is if the `redirectTo` is a function that\n   *      returns `undefined`. In this case the route transition occurs as though there was no\n   *      redirection.\n   *\n   *    - `resolveRedirectTo` – `{Function=}` – a function that will (eventually) return the value\n   *      to update {@link ng.$location $location} URL with and trigger route redirection. In\n   *      contrast to `redirectTo`, dependencies can be injected into `resolveRedirectTo` and the\n   *      return value can be either a string or a promise that will be resolved to a string.\n   *\n   *      Similar to `redirectTo`, if the return value is `undefined` (or a promise that gets\n   *      resolved to `undefined`), no redirection takes place and the route transition occurs as\n   *      though there was no redirection.\n   *\n   *      If the function throws an error or the returned promise gets rejected, no further\n   *      processing will take place and the\n   *      {@link ngRoute.$route#$routeChangeError $routeChangeError} event will be fired.\n   *\n   *      `redirectTo` takes precedence over `resolveRedirectTo`, so specifying both on the same\n   *      route definition, will cause the latter to be ignored.\n   *\n   *    - `[reloadOnUrl=true]` - `{boolean=}` - reload route when any part of the URL changes\n   *      (including the path) even if the new URL maps to the same route.\n   *\n   *      If the option is set to `false` and the URL in the browser changes, but the new URL maps\n   *      to the same route, then a `$routeUpdate` event is broadcasted on the root scope (without\n   *      reloading the route).\n   *\n   *    - `[reloadOnSearch=true]` - `{boolean=}` - reload route when only `$location.search()`\n   *      or `$location.hash()` changes.\n   *\n   *      If the option is set to `false` and the URL in the browser changes, then a `$routeUpdate`\n   *      event is broadcasted on the root scope (without reloading the route).\n   *\n   *      <div class=\"alert alert-warning\">\n   *        **Note:** This option has no effect if `reloadOnUrl` is set to `false`.\n   *      </div>\n   *\n   *    - `[caseInsensitiveMatch=false]` - `{boolean=}` - match routes without being case sensitive\n   *\n   *      If the option is set to `true`, then the particular route can be matched without being\n   *      case sensitive\n   *\n   * @returns {Object} self\n   *\n   * @description\n   * Adds a new route definition to the `$route` service.\n   */\n  this.when = function(path, route) {\n    //copy original route object to preserve params inherited from proto chain\n    var routeCopy = shallowCopy(route);\n    if (angular.isUndefined(routeCopy.reloadOnUrl)) {\n      routeCopy.reloadOnUrl = true;\n    }\n    if (angular.isUndefined(routeCopy.reloadOnSearch)) {\n      routeCopy.reloadOnSearch = true;\n    }\n    if (angular.isUndefined(routeCopy.caseInsensitiveMatch)) {\n      routeCopy.caseInsensitiveMatch = this.caseInsensitiveMatch;\n    }\n    routes[path] = angular.extend(\n      routeCopy,\n      {originalPath: path},\n      path && routeToRegExp(path, routeCopy)\n    );\n\n    // create redirection for trailing slashes\n    if (path) {\n      var redirectPath = (path[path.length - 1] === '/')\n            ? path.substr(0, path.length - 1)\n            : path + '/';\n\n      routes[redirectPath] = angular.extend(\n        {originalPath: path, redirectTo: path},\n        routeToRegExp(redirectPath, routeCopy)\n      );\n    }\n\n    return this;\n  };\n\n  /**\n   * @ngdoc property\n   * @name $routeProvider#caseInsensitiveMatch\n   * @description\n   *\n   * A boolean property indicating if routes defined\n   * using this provider should be matched using a case insensitive\n   * algorithm. Defaults to `false`.\n   */\n  this.caseInsensitiveMatch = false;\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#otherwise\n   *\n   * @description\n   * Sets route definition that will be used on route change when no other route definition\n   * is matched.\n   *\n   * @param {Object|string} params Mapping information to be assigned to `$route.current`.\n   * If called with a string, the value maps to `redirectTo`.\n   * @returns {Object} self\n   */\n  this.otherwise = function(params) {\n    if (typeof params === 'string') {\n      params = {redirectTo: params};\n    }\n    this.when(null, params);\n    return this;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#eagerInstantiationEnabled\n   * @kind function\n   *\n   * @description\n   * Call this method as a setter to enable/disable eager instantiation of the\n   * {@link ngRoute.$route $route} service upon application bootstrap. You can also call it as a\n   * getter (i.e. without any arguments) to get the current value of the\n   * `eagerInstantiationEnabled` flag.\n   *\n   * Instantiating `$route` early is necessary for capturing the initial\n   * {@link ng.$location#$locationChangeStart $locationChangeStart} event and navigating to the\n   * appropriate route. Usually, `$route` is instantiated in time by the\n   * {@link ngRoute.ngView ngView} directive. Yet, in cases where `ngView` is included in an\n   * asynchronously loaded template (e.g. in another directive's template), the directive factory\n   * might not be called soon enough for `$route` to be instantiated _before_ the initial\n   * `$locationChangeSuccess` event is fired. Eager instantiation ensures that `$route` is always\n   * instantiated in time, regardless of when `ngView` will be loaded.\n   *\n   * The default value is true.\n   *\n   * **Note**:<br />\n   * You may want to disable the default behavior when unit-testing modules that depend on\n   * `ngRoute`, in order to avoid an unexpected request for the default route's template.\n   *\n   * @param {boolean=} enabled - If provided, update the internal `eagerInstantiationEnabled` flag.\n   *\n   * @returns {*} The current value of the `eagerInstantiationEnabled` flag if used as a getter or\n   *     itself (for chaining) if used as a setter.\n   */\n  isEagerInstantiationEnabled = true;\n  this.eagerInstantiationEnabled = function eagerInstantiationEnabled(enabled) {\n    if (isDefined(enabled)) {\n      isEagerInstantiationEnabled = enabled;\n      return this;\n    }\n\n    return isEagerInstantiationEnabled;\n  };\n\n\n  this.$get = ['$rootScope',\n               '$location',\n               '$routeParams',\n               '$q',\n               '$injector',\n               '$templateRequest',\n               '$sce',\n               '$browser',\n      function($rootScope, $location, $routeParams, $q, $injector, $templateRequest, $sce, $browser) {\n\n    /**\n     * @ngdoc service\n     * @name $route\n     * @requires $location\n     * @requires $routeParams\n     *\n     * @property {Object} current Reference to the current route definition.\n     * The route definition contains:\n     *\n     *   - `controller`: The controller constructor as defined in the route definition.\n     *   - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for\n     *     controller instantiation. The `locals` contain\n     *     the resolved values of the `resolve` map. Additionally the `locals` also contain:\n     *\n     *     - `$scope` - The current route scope.\n     *     - `$template` - The current route template HTML.\n     *\n     *     The `locals` will be assigned to the route scope's `$resolve` property. You can override\n     *     the property name, using `resolveAs` in the route definition. See\n     *     {@link ngRoute.$routeProvider $routeProvider} for more info.\n     *\n     * @property {Object} routes Object with all route configuration Objects as its properties.\n     *\n     * @description\n     * `$route` is used for deep-linking URLs to controllers and views (HTML partials).\n     * It watches `$location.url()` and tries to map the path to an existing route definition.\n     *\n     * Requires the {@link ngRoute `ngRoute`} module to be installed.\n     *\n     * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API.\n     *\n     * The `$route` service is typically used in conjunction with the\n     * {@link ngRoute.directive:ngView `ngView`} directive and the\n     * {@link ngRoute.$routeParams `$routeParams`} service.\n     *\n     * @example\n     * This example shows how changing the URL hash causes the `$route` to match a route against the\n     * URL, and the `ngView` pulls in the partial.\n     *\n     * <example name=\"$route-service\" module=\"ngRouteExample\"\n     *          deps=\"angular-route.js\" fixBase=\"true\">\n     *   <file name=\"index.html\">\n     *     <div ng-controller=\"MainController\">\n     *       Choose:\n     *       <a href=\"Book/Moby\">Moby</a> |\n     *       <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\n     *       <a href=\"Book/Gatsby\">Gatsby</a> |\n     *       <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\n     *       <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\n     *\n     *       <div ng-view></div>\n     *\n     *       <hr />\n     *\n     *       <pre>$location.path() = {{$location.path()}}</pre>\n     *       <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>\n     *       <pre>$route.current.params = {{$route.current.params}}</pre>\n     *       <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>\n     *       <pre>$routeParams = {{$routeParams}}</pre>\n     *     </div>\n     *   </file>\n     *\n     *   <file name=\"book.html\">\n     *     controller: {{name}}<br />\n     *     Book Id: {{params.bookId}}<br />\n     *   </file>\n     *\n     *   <file name=\"chapter.html\">\n     *     controller: {{name}}<br />\n     *     Book Id: {{params.bookId}}<br />\n     *     Chapter Id: {{params.chapterId}}\n     *   </file>\n     *\n     *   <file name=\"script.js\">\n     *     angular.module('ngRouteExample', ['ngRoute'])\n     *\n     *      .controller('MainController', function($scope, $route, $routeParams, $location) {\n     *          $scope.$route = $route;\n     *          $scope.$location = $location;\n     *          $scope.$routeParams = $routeParams;\n     *      })\n     *\n     *      .controller('BookController', function($scope, $routeParams) {\n     *          $scope.name = 'BookController';\n     *          $scope.params = $routeParams;\n     *      })\n     *\n     *      .controller('ChapterController', function($scope, $routeParams) {\n     *          $scope.name = 'ChapterController';\n     *          $scope.params = $routeParams;\n     *      })\n     *\n     *     .config(function($routeProvider, $locationProvider) {\n     *       $routeProvider\n     *        .when('/Book/:bookId', {\n     *         templateUrl: 'book.html',\n     *         controller: 'BookController',\n     *         resolve: {\n     *           // I will cause a 1 second delay\n     *           delay: function($q, $timeout) {\n     *             var delay = $q.defer();\n     *             $timeout(delay.resolve, 1000);\n     *             return delay.promise;\n     *           }\n     *         }\n     *       })\n     *       .when('/Book/:bookId/ch/:chapterId', {\n     *         templateUrl: 'chapter.html',\n     *         controller: 'ChapterController'\n     *       });\n     *\n     *       // configure html5 to get links working on jsfiddle\n     *       $locationProvider.html5Mode(true);\n     *     });\n     *\n     *   </file>\n     *\n     *   <file name=\"protractor.js\" type=\"protractor\">\n     *     it('should load and compile correct template', function() {\n     *       element(by.linkText('Moby: Ch1')).click();\n     *       var content = element(by.css('[ng-view]')).getText();\n     *       expect(content).toMatch(/controller: ChapterController/);\n     *       expect(content).toMatch(/Book Id: Moby/);\n     *       expect(content).toMatch(/Chapter Id: 1/);\n     *\n     *       element(by.partialLinkText('Scarlet')).click();\n     *\n     *       content = element(by.css('[ng-view]')).getText();\n     *       expect(content).toMatch(/controller: BookController/);\n     *       expect(content).toMatch(/Book Id: Scarlet/);\n     *     });\n     *   </file>\n     * </example>\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeStart\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted before a route change. At this  point the route services starts\n     * resolving all of the dependencies needed for the route change to occur.\n     * Typically this involves fetching the view template as well as any dependencies\n     * defined in `resolve` route property. Once  all of the dependencies are resolved\n     * `$routeChangeSuccess` is fired.\n     *\n     * The route change (and the `$location` change that triggered it) can be prevented\n     * by calling `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on}\n     * for more details about event object.\n     *\n     * @param {Object} angularEvent Synthetic event object.\n     * @param {Route} next Future route information.\n     * @param {Route} current Current route information.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeSuccess\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted after a route change has happened successfully.\n     * The `resolve` dependencies are now available in the `current.locals` property.\n     *\n     * {@link ngRoute.directive:ngView ngView} listens for the directive\n     * to instantiate the controller and render the view.\n     *\n     * @param {Object} angularEvent Synthetic event object.\n     * @param {Route} current Current route information.\n     * @param {Route|Undefined} previous Previous route information, or undefined if current is\n     * first route entered.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeError\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted if a redirection function fails or any redirection or resolve promises are\n     * rejected.\n     *\n     * @param {Object} angularEvent Synthetic event object\n     * @param {Route} current Current route information.\n     * @param {Route} previous Previous route information.\n     * @param {Route} rejection The thrown error or the rejection reason of the promise. Usually\n     * the rejection reason is the error that caused the promise to get rejected.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeUpdate\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted if the same instance of a route (including template, controller instance,\n     * resolved dependencies, etc.) is being reused. This can happen if either `reloadOnSearch` or\n     * `reloadOnUrl` has been set to `false`.\n     *\n     * @param {Object} angularEvent Synthetic event object\n     * @param {Route} current Current/previous route information.\n     */\n\n    var forceReload = false,\n        preparedRoute,\n        preparedRouteIsUpdateOnly,\n        $route = {\n          routes: routes,\n\n          /**\n           * @ngdoc method\n           * @name $route#reload\n           *\n           * @description\n           * Causes `$route` service to reload the current route even if\n           * {@link ng.$location $location} hasn't changed.\n           *\n           * As a result of that, {@link ngRoute.directive:ngView ngView}\n           * creates new scope and reinstantiates the controller.\n           */\n          reload: function() {\n            forceReload = true;\n\n            var fakeLocationEvent = {\n              defaultPrevented: false,\n              preventDefault: function fakePreventDefault() {\n                this.defaultPrevented = true;\n                forceReload = false;\n              }\n            };\n\n            $rootScope.$evalAsync(function() {\n              prepareRoute(fakeLocationEvent);\n              if (!fakeLocationEvent.defaultPrevented) commitRoute();\n            });\n          },\n\n          /**\n           * @ngdoc method\n           * @name $route#updateParams\n           *\n           * @description\n           * Causes `$route` service to update the current URL, replacing\n           * current route parameters with those specified in `newParams`.\n           * Provided property names that match the route's path segment\n           * definitions will be interpolated into the location's path, while\n           * remaining properties will be treated as query params.\n           *\n           * @param {!Object<string, string>} newParams mapping of URL parameter names to values\n           */\n          updateParams: function(newParams) {\n            if (this.current && this.current.$$route) {\n              newParams = angular.extend({}, this.current.params, newParams);\n              $location.path(interpolate(this.current.$$route.originalPath, newParams));\n              // interpolate modifies newParams, only query params are left\n              $location.search(newParams);\n            } else {\n              throw $routeMinErr('norout', 'Tried updating route with no current route');\n            }\n          }\n        };\n\n    $rootScope.$on('$locationChangeStart', prepareRoute);\n    $rootScope.$on('$locationChangeSuccess', commitRoute);\n\n    return $route;\n\n    /////////////////////////////////////////////////////\n\n    /**\n     * @param on {string} current url\n     * @param route {Object} route regexp to match the url against\n     * @return {?Object}\n     *\n     * @description\n     * Check if the route matches the current url.\n     *\n     * Inspired by match in\n     * visionmedia/express/lib/router/router.js.\n     */\n    function switchRouteMatcher(on, route) {\n      var keys = route.keys,\n          params = {};\n\n      if (!route.regexp) return null;\n\n      var m = route.regexp.exec(on);\n      if (!m) return null;\n\n      for (var i = 1, len = m.length; i < len; ++i) {\n        var key = keys[i - 1];\n\n        var val = m[i];\n\n        if (key && val) {\n          params[key.name] = val;\n        }\n      }\n      return params;\n    }\n\n    function prepareRoute($locationEvent) {\n      var lastRoute = $route.current;\n\n      preparedRoute = parseRoute();\n      preparedRouteIsUpdateOnly = isNavigationUpdateOnly(preparedRoute, lastRoute);\n\n      if (!preparedRouteIsUpdateOnly && (lastRoute || preparedRoute)) {\n        if ($rootScope.$broadcast('$routeChangeStart', preparedRoute, lastRoute).defaultPrevented) {\n          if ($locationEvent) {\n            $locationEvent.preventDefault();\n          }\n        }\n      }\n    }\n\n    function commitRoute() {\n      var lastRoute = $route.current;\n      var nextRoute = preparedRoute;\n\n      if (preparedRouteIsUpdateOnly) {\n        lastRoute.params = nextRoute.params;\n        angular.copy(lastRoute.params, $routeParams);\n        $rootScope.$broadcast('$routeUpdate', lastRoute);\n      } else if (nextRoute || lastRoute) {\n        forceReload = false;\n        $route.current = nextRoute;\n\n        var nextRoutePromise = $q.resolve(nextRoute);\n\n        $browser.$$incOutstandingRequestCount('$route');\n\n        nextRoutePromise.\n          then(getRedirectionData).\n          then(handlePossibleRedirection).\n          then(function(keepProcessingRoute) {\n            return keepProcessingRoute && nextRoutePromise.\n              then(resolveLocals).\n              then(function(locals) {\n                // after route change\n                if (nextRoute === $route.current) {\n                  if (nextRoute) {\n                    nextRoute.locals = locals;\n                    angular.copy(nextRoute.params, $routeParams);\n                  }\n                  $rootScope.$broadcast('$routeChangeSuccess', nextRoute, lastRoute);\n                }\n              });\n          }).catch(function(error) {\n            if (nextRoute === $route.current) {\n              $rootScope.$broadcast('$routeChangeError', nextRoute, lastRoute, error);\n            }\n          }).finally(function() {\n            // Because `commitRoute()` is called from a `$rootScope.$evalAsync` block (see\n            // `$locationWatch`), this `$$completeOutstandingRequest()` call will not cause\n            // `outstandingRequestCount` to hit zero.  This is important in case we are redirecting\n            // to a new route which also requires some asynchronous work.\n\n            $browser.$$completeOutstandingRequest(noop, '$route');\n          });\n      }\n    }\n\n    function getRedirectionData(route) {\n      var data = {\n        route: route,\n        hasRedirection: false\n      };\n\n      if (route) {\n        if (route.redirectTo) {\n          if (angular.isString(route.redirectTo)) {\n            data.path = interpolate(route.redirectTo, route.params);\n            data.search = route.params;\n            data.hasRedirection = true;\n          } else {\n            var oldPath = $location.path();\n            var oldSearch = $location.search();\n            var newUrl = route.redirectTo(route.pathParams, oldPath, oldSearch);\n\n            if (angular.isDefined(newUrl)) {\n              data.url = newUrl;\n              data.hasRedirection = true;\n            }\n          }\n        } else if (route.resolveRedirectTo) {\n          return $q.\n            resolve($injector.invoke(route.resolveRedirectTo)).\n            then(function(newUrl) {\n              if (angular.isDefined(newUrl)) {\n                data.url = newUrl;\n                data.hasRedirection = true;\n              }\n\n              return data;\n            });\n        }\n      }\n\n      return data;\n    }\n\n    function handlePossibleRedirection(data) {\n      var keepProcessingRoute = true;\n\n      if (data.route !== $route.current) {\n        keepProcessingRoute = false;\n      } else if (data.hasRedirection) {\n        var oldUrl = $location.url();\n        var newUrl = data.url;\n\n        if (newUrl) {\n          $location.\n            url(newUrl).\n            replace();\n        } else {\n          newUrl = $location.\n            path(data.path).\n            search(data.search).\n            replace().\n            url();\n        }\n\n        if (newUrl !== oldUrl) {\n          // Exit out and don't process current next value,\n          // wait for next location change from redirect\n          keepProcessingRoute = false;\n        }\n      }\n\n      return keepProcessingRoute;\n    }\n\n    function resolveLocals(route) {\n      if (route) {\n        var locals = angular.extend({}, route.resolve);\n        angular.forEach(locals, function(value, key) {\n          locals[key] = angular.isString(value) ?\n              $injector.get(value) :\n              $injector.invoke(value, null, null, key);\n        });\n        var template = getTemplateFor(route);\n        if (angular.isDefined(template)) {\n          locals['$template'] = template;\n        }\n        return $q.all(locals);\n      }\n    }\n\n    function getTemplateFor(route) {\n      var template, templateUrl;\n      if (angular.isDefined(template = route.template)) {\n        if (angular.isFunction(template)) {\n          template = template(route.params);\n        }\n      } else if (angular.isDefined(templateUrl = route.templateUrl)) {\n        if (angular.isFunction(templateUrl)) {\n          templateUrl = templateUrl(route.params);\n        }\n        if (angular.isDefined(templateUrl)) {\n          route.loadedTemplateUrl = $sce.valueOf(templateUrl);\n          template = $templateRequest(templateUrl);\n        }\n      }\n      return template;\n    }\n\n    /**\n     * @returns {Object} the current active route, by matching it against the URL\n     */\n    function parseRoute() {\n      // Match a route\n      var params, match;\n      angular.forEach(routes, function(route, path) {\n        if (!match && (params = switchRouteMatcher($location.path(), route))) {\n          match = inherit(route, {\n            params: angular.extend({}, $location.search(), params),\n            pathParams: params});\n          match.$$route = route;\n        }\n      });\n      // No route matched; fallback to \"otherwise\" route\n      return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});\n    }\n\n    /**\n     * @param {Object} newRoute - The new route configuration (as returned by `parseRoute()`).\n     * @param {Object} oldRoute - The previous route configuration (as returned by `parseRoute()`).\n     * @returns {boolean} Whether this is an \"update-only\" navigation, i.e. the URL maps to the same\n     *                    route and it can be reused (based on the config and the type of change).\n     */\n    function isNavigationUpdateOnly(newRoute, oldRoute) {\n      // IF this is not a forced reload\n      return !forceReload\n          // AND both `newRoute`/`oldRoute` are defined\n          && newRoute && oldRoute\n          // AND they map to the same Route Definition Object\n          && (newRoute.$$route === oldRoute.$$route)\n          // AND `reloadOnUrl` is disabled\n          && (!newRoute.reloadOnUrl\n              // OR `reloadOnSearch` is disabled\n              || (!newRoute.reloadOnSearch\n                  // AND both routes have the same path params\n                  && angular.equals(newRoute.pathParams, oldRoute.pathParams)\n              )\n          );\n    }\n\n    /**\n     * @returns {string} interpolation of the redirect path with the parameters\n     */\n    function interpolate(string, params) {\n      var result = [];\n      angular.forEach((string || '').split(':'), function(segment, i) {\n        if (i === 0) {\n          result.push(segment);\n        } else {\n          var segmentMatch = segment.match(/(\\w+)(?:[?*])?(.*)/);\n          var key = segmentMatch[1];\n          result.push(params[key]);\n          result.push(segmentMatch[2] || '');\n          delete params[key];\n        }\n      });\n      return result.join('');\n    }\n  }];\n}\n\ninstantiateRoute.$inject = ['$injector'];\nfunction instantiateRoute($injector) {\n  if (isEagerInstantiationEnabled) {\n    // Instantiate `$route`\n    $injector.get('$route');\n  }\n}\n\nngRouteModule.provider('$routeParams', $RouteParamsProvider);\n\n\n/**\n * @ngdoc service\n * @name $routeParams\n * @requires $route\n * @this\n *\n * @description\n * The `$routeParams` service allows you to retrieve the current set of route parameters.\n *\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n *\n * The route parameters are a combination of {@link ng.$location `$location`}'s\n * {@link ng.$location#search `search()`} and {@link ng.$location#path `path()`}.\n * The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched.\n *\n * In case of parameter name collision, `path` params take precedence over `search` params.\n *\n * The service guarantees that the identity of the `$routeParams` object will remain unchanged\n * (but its properties will likely change) even when a route change occurs.\n *\n * Note that the `$routeParams` are only updated *after* a route change completes successfully.\n * This means that you cannot rely on `$routeParams` being correct in route resolve functions.\n * Instead you can use `$route.current.params` to access the new route's parameters.\n *\n * @example\n * ```js\n *  // Given:\n *  // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby\n *  // Route: /Chapter/:chapterId/Section/:sectionId\n *  //\n *  // Then\n *  $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'}\n * ```\n */\nfunction $RouteParamsProvider() {\n  this.$get = function() { return {}; };\n}\n\nngRouteModule.directive('ngView', ngViewFactory);\nngRouteModule.directive('ngView', ngViewFillContentFactory);\n\n\n/**\n * @ngdoc directive\n * @name ngView\n * @restrict ECA\n *\n * @description\n * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by\n * including the rendered template of the current route into the main layout (`index.html`) file.\n * Every time the current route changes, the included view changes with it according to the\n * configuration of the `$route` service.\n *\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter}  | when the new element is inserted to the DOM |\n * | {@link ng.$animate#leave leave}  | when the old element is removed from to the DOM  |\n *\n * The enter and leave animation occur concurrently.\n *\n * @scope\n * @priority 400\n * @param {string=} onload Expression to evaluate whenever the view updates.\n *\n * @param {string=} autoscroll Whether `ngView` should call {@link ng.$anchorScroll\n *                  $anchorScroll} to scroll the viewport after the view is updated.\n *\n *                  - If the attribute is not set, disable scrolling.\n *                  - If the attribute is set without value, enable scrolling.\n *                  - Otherwise enable scrolling only if the `autoscroll` attribute value evaluated\n *                    as an expression yields a truthy value.\n * @example\n    <example name=\"ngView-directive\" module=\"ngViewExample\"\n             deps=\"angular-route.js;angular-animate.js\"\n             animations=\"true\" fixBase=\"true\">\n      <file name=\"index.html\">\n        <div ng-controller=\"MainCtrl as main\">\n          Choose:\n          <a href=\"Book/Moby\">Moby</a> |\n          <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\n          <a href=\"Book/Gatsby\">Gatsby</a> |\n          <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\n          <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\n\n          <div class=\"view-animate-container\">\n            <div ng-view class=\"view-animate\"></div>\n          </div>\n          <hr />\n\n          <pre>$location.path() = {{main.$location.path()}}</pre>\n          <pre>$route.current.templateUrl = {{main.$route.current.templateUrl}}</pre>\n          <pre>$route.current.params = {{main.$route.current.params}}</pre>\n          <pre>$routeParams = {{main.$routeParams}}</pre>\n        </div>\n      </file>\n\n      <file name=\"book.html\">\n        <div>\n          controller: {{book.name}}<br />\n          Book Id: {{book.params.bookId}}<br />\n        </div>\n      </file>\n\n      <file name=\"chapter.html\">\n        <div>\n          controller: {{chapter.name}}<br />\n          Book Id: {{chapter.params.bookId}}<br />\n          Chapter Id: {{chapter.params.chapterId}}\n        </div>\n      </file>\n\n      <file name=\"animations.css\">\n        .view-animate-container {\n          position:relative;\n          height:100px!important;\n          background:white;\n          border:1px solid black;\n          height:40px;\n          overflow:hidden;\n        }\n\n        .view-animate {\n          padding:10px;\n        }\n\n        .view-animate.ng-enter, .view-animate.ng-leave {\n          transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;\n\n          display:block;\n          width:100%;\n          border-left:1px solid black;\n\n          position:absolute;\n          top:0;\n          left:0;\n          right:0;\n          bottom:0;\n          padding:10px;\n        }\n\n        .view-animate.ng-enter {\n          left:100%;\n        }\n        .view-animate.ng-enter.ng-enter-active {\n          left:0;\n        }\n        .view-animate.ng-leave.ng-leave-active {\n          left:-100%;\n        }\n      </file>\n\n      <file name=\"script.js\">\n        angular.module('ngViewExample', ['ngRoute', 'ngAnimate'])\n          .config(['$routeProvider', '$locationProvider',\n            function($routeProvider, $locationProvider) {\n              $routeProvider\n                .when('/Book/:bookId', {\n                  templateUrl: 'book.html',\n                  controller: 'BookCtrl',\n                  controllerAs: 'book'\n                })\n                .when('/Book/:bookId/ch/:chapterId', {\n                  templateUrl: 'chapter.html',\n                  controller: 'ChapterCtrl',\n                  controllerAs: 'chapter'\n                });\n\n              $locationProvider.html5Mode(true);\n          }])\n          .controller('MainCtrl', ['$route', '$routeParams', '$location',\n            function MainCtrl($route, $routeParams, $location) {\n              this.$route = $route;\n              this.$location = $location;\n              this.$routeParams = $routeParams;\n          }])\n          .controller('BookCtrl', ['$routeParams', function BookCtrl($routeParams) {\n            this.name = 'BookCtrl';\n            this.params = $routeParams;\n          }])\n          .controller('ChapterCtrl', ['$routeParams', function ChapterCtrl($routeParams) {\n            this.name = 'ChapterCtrl';\n            this.params = $routeParams;\n          }]);\n\n      </file>\n\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should load and compile correct template', function() {\n          element(by.linkText('Moby: Ch1')).click();\n          var content = element(by.css('[ng-view]')).getText();\n          expect(content).toMatch(/controller: ChapterCtrl/);\n          expect(content).toMatch(/Book Id: Moby/);\n          expect(content).toMatch(/Chapter Id: 1/);\n\n          element(by.partialLinkText('Scarlet')).click();\n\n          content = element(by.css('[ng-view]')).getText();\n          expect(content).toMatch(/controller: BookCtrl/);\n          expect(content).toMatch(/Book Id: Scarlet/);\n        });\n      </file>\n    </example>\n */\n\n\n/**\n * @ngdoc event\n * @name ngView#$viewContentLoaded\n * @eventType emit on the current ngView scope\n * @description\n * Emitted every time the ngView content is reloaded.\n */\nngViewFactory.$inject = ['$route', '$anchorScroll', '$animate'];\nfunction ngViewFactory($route, $anchorScroll, $animate) {\n  return {\n    restrict: 'ECA',\n    terminal: true,\n    priority: 400,\n    transclude: 'element',\n    link: function(scope, $element, attr, ctrl, $transclude) {\n        var currentScope,\n            currentElement,\n            previousLeaveAnimation,\n            autoScrollExp = attr.autoscroll,\n            onloadExp = attr.onload || '';\n\n        scope.$on('$routeChangeSuccess', update);\n        update();\n\n        function cleanupLastView() {\n          if (previousLeaveAnimation) {\n            $animate.cancel(previousLeaveAnimation);\n            previousLeaveAnimation = null;\n          }\n\n          if (currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n          if (currentElement) {\n            previousLeaveAnimation = $animate.leave(currentElement);\n            previousLeaveAnimation.done(function(response) {\n              if (response !== false) previousLeaveAnimation = null;\n            });\n            currentElement = null;\n          }\n        }\n\n        function update() {\n          var locals = $route.current && $route.current.locals,\n              template = locals && locals.$template;\n\n          if (angular.isDefined(template)) {\n            var newScope = scope.$new();\n            var current = $route.current;\n\n            // Note: This will also link all children of ng-view that were contained in the original\n            // html. If that content contains controllers, ... they could pollute/change the scope.\n            // However, using ng-view on an element with additional content does not make sense...\n            // Note: We can't remove them in the cloneAttchFn of $transclude as that\n            // function is called before linking the content, which would apply child\n            // directives to non existing elements.\n            var clone = $transclude(newScope, function(clone) {\n              $animate.enter(clone, null, currentElement || $element).done(function onNgViewEnter(response) {\n                if (response !== false && angular.isDefined(autoScrollExp)\n                  && (!autoScrollExp || scope.$eval(autoScrollExp))) {\n                  $anchorScroll();\n                }\n              });\n              cleanupLastView();\n            });\n\n            currentElement = clone;\n            currentScope = current.scope = newScope;\n            currentScope.$emit('$viewContentLoaded');\n            currentScope.$eval(onloadExp);\n          } else {\n            cleanupLastView();\n          }\n        }\n    }\n  };\n}\n\n// This directive is called during the $transclude call of the first `ngView` directive.\n// It will replace and compile the content of the element with the loaded template.\n// We need this directive so that the element content is already filled when\n// the link function of another directive on the same element as ngView\n// is called.\nngViewFillContentFactory.$inject = ['$compile', '$controller', '$route'];\nfunction ngViewFillContentFactory($compile, $controller, $route) {\n  return {\n    restrict: 'ECA',\n    priority: -400,\n    link: function(scope, $element) {\n      var current = $route.current,\n          locals = current.locals;\n\n      $element.html(locals.$template);\n\n      var link = $compile($element.contents());\n\n      if (current.controller) {\n        locals.$scope = scope;\n        var controller = $controller(current.controller, locals);\n        if (current.controllerAs) {\n          scope[current.controllerAs] = controller;\n        }\n        $element.data('$ngControllerController', controller);\n        $element.children().data('$ngControllerController', controller);\n      }\n      scope[current.resolveAs || '$resolve'] = locals;\n\n      link(scope);\n    }\n  };\n}\n\n\n})(window, window.angular);\n","require('./angular-route');\nmodule.exports = 'ngRoute';\n","/**\n * @license AngularJS v1.8.2\n * (c) 2010-2020 Google LLC. http://angularjs.org\n * License: MIT\n */\n(function(window, angular) {'use strict';\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\nvar $sanitizeMinErr = angular.$$minErr('$sanitize');\nvar bind;\nvar extend;\nvar forEach;\nvar isArray;\nvar isDefined;\nvar lowercase;\nvar noop;\nvar nodeContains;\nvar htmlParser;\nvar htmlSanitizeWriter;\n\n/**\n * @ngdoc module\n * @name ngSanitize\n * @description\n *\n * The `ngSanitize` module provides functionality to sanitize HTML.\n *\n * See {@link ngSanitize.$sanitize `$sanitize`} for usage.\n */\n\n/**\n * @ngdoc service\n * @name $sanitize\n * @kind function\n *\n * @description\n *   Sanitizes an html string by stripping all potentially dangerous tokens.\n *\n *   The input is sanitized by parsing the HTML into tokens. All safe tokens (from a trusted URI list) are\n *   then serialized back to a properly escaped HTML string. This means that no unsafe input can make\n *   it into the returned string.\n *\n *   The trusted URIs for URL sanitization of attribute values is configured using the functions\n *   `aHrefSanitizationTrustedUrlList` and `imgSrcSanitizationTrustedUrlList` of {@link $compileProvider}.\n *\n *   The input may also contain SVG markup if this is enabled via {@link $sanitizeProvider}.\n *\n * @param {string} html HTML input.\n * @returns {string} Sanitized HTML.\n *\n * @example\n   <example module=\"sanitizeExample\" deps=\"angular-sanitize.js\" name=\"sanitize-service\">\n   <file name=\"index.html\">\n     <script>\n         angular.module('sanitizeExample', ['ngSanitize'])\n           .controller('ExampleController', ['$scope', '$sce', function($scope, $sce) {\n             $scope.snippet =\n               '<p style=\"color:blue\">an html\\n' +\n               '<em onmouseover=\"this.textContent=\\'PWN3D!\\'\">click here</em>\\n' +\n               'snippet</p>';\n             $scope.deliberatelyTrustDangerousSnippet = function() {\n               return $sce.trustAsHtml($scope.snippet);\n             };\n           }]);\n     </script>\n     <div ng-controller=\"ExampleController\">\n        Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\n       <table>\n         <tr>\n           <td>Directive</td>\n           <td>How</td>\n           <td>Source</td>\n           <td>Rendered</td>\n         </tr>\n         <tr id=\"bind-html-with-sanitize\">\n           <td>ng-bind-html</td>\n           <td>Automatically uses $sanitize</td>\n           <td><pre>&lt;div ng-bind-html=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\n           <td><div ng-bind-html=\"snippet\"></div></td>\n         </tr>\n         <tr id=\"bind-html-with-trust\">\n           <td>ng-bind-html</td>\n           <td>Bypass $sanitize by explicitly trusting the dangerous value</td>\n           <td>\n           <pre>&lt;div ng-bind-html=\"deliberatelyTrustDangerousSnippet()\"&gt;\n&lt;/div&gt;</pre>\n           </td>\n           <td><div ng-bind-html=\"deliberatelyTrustDangerousSnippet()\"></div></td>\n         </tr>\n         <tr id=\"bind-default\">\n           <td>ng-bind</td>\n           <td>Automatically escapes</td>\n           <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br/>&lt;/div&gt;</pre></td>\n           <td><div ng-bind=\"snippet\"></div></td>\n         </tr>\n       </table>\n       </div>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n     it('should sanitize the html snippet by default', function() {\n       expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')).\n         toBe('<p>an html\\n<em>click here</em>\\nsnippet</p>');\n     });\n\n     it('should inline raw snippet if bound to a trusted value', function() {\n       expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')).\n         toBe(\"<p style=\\\"color:blue\\\">an html\\n\" +\n              \"<em onmouseover=\\\"this.textContent='PWN3D!'\\\">click here</em>\\n\" +\n              \"snippet</p>\");\n     });\n\n     it('should escape snippet without any filter', function() {\n       expect(element(by.css('#bind-default div')).getAttribute('innerHTML')).\n         toBe(\"&lt;p style=\\\"color:blue\\\"&gt;an html\\n\" +\n              \"&lt;em onmouseover=\\\"this.textContent='PWN3D!'\\\"&gt;click here&lt;/em&gt;\\n\" +\n              \"snippet&lt;/p&gt;\");\n     });\n\n     it('should update', function() {\n       element(by.model('snippet')).clear();\n       element(by.model('snippet')).sendKeys('new <b onclick=\"alert(1)\">text</b>');\n       expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')).\n         toBe('new <b>text</b>');\n       expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')).toBe(\n         'new <b onclick=\"alert(1)\">text</b>');\n       expect(element(by.css('#bind-default div')).getAttribute('innerHTML')).toBe(\n         \"new &lt;b onclick=\\\"alert(1)\\\"&gt;text&lt;/b&gt;\");\n     });\n   </file>\n   </example>\n */\n\n\n/**\n * @ngdoc provider\n * @name $sanitizeProvider\n * @this\n *\n * @description\n * Creates and configures {@link $sanitize} instance.\n */\nfunction $SanitizeProvider() {\n  var hasBeenInstantiated = false;\n  var svgEnabled = false;\n\n  this.$get = ['$$sanitizeUri', function($$sanitizeUri) {\n    hasBeenInstantiated = true;\n    if (svgEnabled) {\n      extend(validElements, svgElements);\n    }\n    return function(html) {\n      var buf = [];\n      htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) {\n        return !/^unsafe:/.test($$sanitizeUri(uri, isImage));\n      }));\n      return buf.join('');\n    };\n  }];\n\n\n  /**\n   * @ngdoc method\n   * @name $sanitizeProvider#enableSvg\n   * @kind function\n   *\n   * @description\n   * Enables a subset of svg to be supported by the sanitizer.\n   *\n   * <div class=\"alert alert-warning\">\n   *   <p>By enabling this setting without taking other precautions, you might expose your\n   *   application to click-hijacking attacks. In these attacks, sanitized svg elements could be positioned\n   *   outside of the containing element and be rendered over other elements on the page (e.g. a login\n   *   link). Such behavior can then result in phishing incidents.</p>\n   *\n   *   <p>To protect against these, explicitly setup `overflow: hidden` css rule for all potential svg\n   *   tags within the sanitized content:</p>\n   *\n   *   <br>\n   *\n   *   <pre><code>\n   *   .rootOfTheIncludedContent svg {\n   *     overflow: hidden !important;\n   *   }\n   *   </code></pre>\n   * </div>\n   *\n   * @param {boolean=} flag Enable or disable SVG support in the sanitizer.\n   * @returns {boolean|$sanitizeProvider} Returns the currently configured value if called\n   *    without an argument or self for chaining otherwise.\n   */\n  this.enableSvg = function(enableSvg) {\n    if (isDefined(enableSvg)) {\n      svgEnabled = enableSvg;\n      return this;\n    } else {\n      return svgEnabled;\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $sanitizeProvider#addValidElements\n   * @kind function\n   *\n   * @description\n   * Extends the built-in lists of valid HTML/SVG elements, i.e. elements that are considered safe\n   * and are not stripped off during sanitization. You can extend the following lists of elements:\n   *\n   * - `htmlElements`: A list of elements (tag names) to extend the current list of safe HTML\n   *   elements. HTML elements considered safe will not be removed during sanitization. All other\n   *   elements will be stripped off.\n   *\n   * - `htmlVoidElements`: This is similar to `htmlElements`, but marks the elements as\n   *   \"void elements\" (similar to HTML\n   *   [void elements](https://rawgit.com/w3c/html/html5.1-2/single-page.html#void-elements)). These\n   *   elements have no end tag and cannot have content.\n   *\n   * - `svgElements`: This is similar to `htmlElements`, but for SVG elements. This list is only\n   *   taken into account if SVG is {@link ngSanitize.$sanitizeProvider#enableSvg enabled} for\n   *   `$sanitize`.\n   *\n   * <div class=\"alert alert-info\">\n   *   This method must be called during the {@link angular.Module#config config} phase. Once the\n   *   `$sanitize` service has been instantiated, this method has no effect.\n   * </div>\n   *\n   * <div class=\"alert alert-warning\">\n   *   Keep in mind that extending the built-in lists of elements may expose your app to XSS or\n   *   other vulnerabilities. Be very mindful of the elements you add.\n   * </div>\n   *\n   * @param {Array<String>|Object} elements - A list of valid HTML elements or an object with one or\n   *   more of the following properties:\n   *   - **htmlElements** - `{Array<String>}` - A list of elements to extend the current list of\n   *     HTML elements.\n   *   - **htmlVoidElements** - `{Array<String>}` - A list of elements to extend the current list of\n   *     void HTML elements; i.e. elements that do not have an end tag.\n   *   - **svgElements** - `{Array<String>}` - A list of elements to extend the current list of SVG\n   *     elements. The list of SVG elements is only taken into account if SVG is\n   *     {@link ngSanitize.$sanitizeProvider#enableSvg enabled} for `$sanitize`.\n   *\n   * Passing an array (`[...]`) is equivalent to passing `{htmlElements: [...]}`.\n   *\n   * @return {$sanitizeProvider} Returns self for chaining.\n   */\n  this.addValidElements = function(elements) {\n    if (!hasBeenInstantiated) {\n      if (isArray(elements)) {\n        elements = {htmlElements: elements};\n      }\n\n      addElementsTo(svgElements, elements.svgElements);\n      addElementsTo(voidElements, elements.htmlVoidElements);\n      addElementsTo(validElements, elements.htmlVoidElements);\n      addElementsTo(validElements, elements.htmlElements);\n    }\n\n    return this;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $sanitizeProvider#addValidAttrs\n   * @kind function\n   *\n   * @description\n   * Extends the built-in list of valid attributes, i.e. attributes that are considered safe and are\n   * not stripped off during sanitization.\n   *\n   * **Note**:\n   * The new attributes will not be treated as URI attributes, which means their values will not be\n   * sanitized as URIs using `$compileProvider`'s\n   * {@link ng.$compileProvider#aHrefSanitizationTrustedUrlList aHrefSanitizationTrustedUrlList} and\n   * {@link ng.$compileProvider#imgSrcSanitizationTrustedUrlList imgSrcSanitizationTrustedUrlList}.\n   *\n   * <div class=\"alert alert-info\">\n   *   This method must be called during the {@link angular.Module#config config} phase. Once the\n   *   `$sanitize` service has been instantiated, this method has no effect.\n   * </div>\n   *\n   * <div class=\"alert alert-warning\">\n   *   Keep in mind that extending the built-in list of attributes may expose your app to XSS or\n   *   other vulnerabilities. Be very mindful of the attributes you add.\n   * </div>\n   *\n   * @param {Array<String>} attrs - A list of valid attributes.\n   *\n   * @returns {$sanitizeProvider} Returns self for chaining.\n   */\n  this.addValidAttrs = function(attrs) {\n    if (!hasBeenInstantiated) {\n      extend(validAttrs, arrayToMap(attrs, true));\n    }\n    return this;\n  };\n\n  //////////////////////////////////////////////////////////////////////////////////////////////////\n  // Private stuff\n  //////////////////////////////////////////////////////////////////////////////////////////////////\n\n  bind = angular.bind;\n  extend = angular.extend;\n  forEach = angular.forEach;\n  isArray = angular.isArray;\n  isDefined = angular.isDefined;\n  lowercase = angular.$$lowercase;\n  noop = angular.noop;\n\n  htmlParser = htmlParserImpl;\n  htmlSanitizeWriter = htmlSanitizeWriterImpl;\n\n  nodeContains = window.Node.prototype.contains || /** @this */ function(arg) {\n    // eslint-disable-next-line no-bitwise\n    return !!(this.compareDocumentPosition(arg) & 16);\n  };\n\n  // Regular Expressions for parsing tags and attributes\n  var SURROGATE_PAIR_REGEXP = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,\n    // Match everything outside of normal chars and \" (quote character)\n    NON_ALPHANUMERIC_REGEXP = /([^#-~ |!])/g;\n\n\n  // Good source of info about elements and attributes\n  // http://dev.w3.org/html5/spec/Overview.html#semantics\n  // http://simon.html5.org/html-elements\n\n  // Safe Void Elements - HTML5\n  // http://dev.w3.org/html5/spec/Overview.html#void-elements\n  var voidElements = stringToMap('area,br,col,hr,img,wbr');\n\n  // Elements that you can, intentionally, leave open (and which close themselves)\n  // http://dev.w3.org/html5/spec/Overview.html#optional-tags\n  var optionalEndTagBlockElements = stringToMap('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr'),\n      optionalEndTagInlineElements = stringToMap('rp,rt'),\n      optionalEndTagElements = extend({},\n                                              optionalEndTagInlineElements,\n                                              optionalEndTagBlockElements);\n\n  // Safe Block Elements - HTML5\n  var blockElements = extend({}, optionalEndTagBlockElements, stringToMap('address,article,' +\n          'aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' +\n          'h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul'));\n\n  // Inline Elements - HTML5\n  var inlineElements = extend({}, optionalEndTagInlineElements, stringToMap('a,abbr,acronym,b,' +\n          'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,' +\n          'samp,small,span,strike,strong,sub,sup,time,tt,u,var'));\n\n  // SVG Elements\n  // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements\n  // Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted.\n  // They can potentially allow for arbitrary javascript to be executed. See #11290\n  var svgElements = stringToMap('circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,' +\n          'hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,' +\n          'radialGradient,rect,stop,svg,switch,text,title,tspan');\n\n  // Blocked Elements (will be stripped)\n  var blockedElements = stringToMap('script,style');\n\n  var validElements = extend({},\n                                     voidElements,\n                                     blockElements,\n                                     inlineElements,\n                                     optionalEndTagElements);\n\n  //Attributes that have href and hence need to be sanitized\n  var uriAttrs = stringToMap('background,cite,href,longdesc,src,xlink:href,xml:base');\n\n  var htmlAttrs = stringToMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' +\n      'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' +\n      'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' +\n      'scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,' +\n      'valign,value,vspace,width');\n\n  // SVG attributes (without \"id\" and \"name\" attributes)\n  // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes\n  var svgAttrs = stringToMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' +\n      'baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,' +\n      'cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,' +\n      'font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,' +\n      'height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,' +\n      'marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,' +\n      'max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,' +\n      'path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,' +\n      'requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,' +\n      'stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,' +\n      'stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,' +\n      'stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,' +\n      'underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,' +\n      'width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,' +\n      'xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan', true);\n\n  var validAttrs = extend({},\n                                  uriAttrs,\n                                  svgAttrs,\n                                  htmlAttrs);\n\n  function stringToMap(str, lowercaseKeys) {\n    return arrayToMap(str.split(','), lowercaseKeys);\n  }\n\n  function arrayToMap(items, lowercaseKeys) {\n    var obj = {}, i;\n    for (i = 0; i < items.length; i++) {\n      obj[lowercaseKeys ? lowercase(items[i]) : items[i]] = true;\n    }\n    return obj;\n  }\n\n  function addElementsTo(elementsMap, newElements) {\n    if (newElements && newElements.length) {\n      extend(elementsMap, arrayToMap(newElements));\n    }\n  }\n\n  /**\n   * Create an inert document that contains the dirty HTML that needs sanitizing.\n   * We use the DOMParser API by default and fall back to createHTMLDocument if DOMParser is not\n   * available.\n   */\n  var getInertBodyElement /* function(html: string): HTMLBodyElement */ = (function(window, document) {\n    if (isDOMParserAvailable()) {\n      return getInertBodyElement_DOMParser;\n    }\n\n    if (!document || !document.implementation) {\n      throw $sanitizeMinErr('noinert', 'Can\\'t create an inert html document');\n    }\n    var inertDocument = document.implementation.createHTMLDocument('inert');\n    var inertBodyElement = (inertDocument.documentElement || inertDocument.getDocumentElement()).querySelector('body');\n    return getInertBodyElement_InertDocument;\n\n    function isDOMParserAvailable() {\n      try {\n        return !!getInertBodyElement_DOMParser('');\n      } catch (e) {\n        return false;\n      }\n    }\n\n    function getInertBodyElement_DOMParser(html) {\n      // We add this dummy element to ensure that the rest of the content is parsed as expected\n      // e.g. leading whitespace is maintained and tags like `<meta>` do not get hoisted to the `<head>` tag.\n      html = '<remove></remove>' + html;\n      try {\n        var body = new window.DOMParser().parseFromString(html, 'text/html').body;\n        body.firstChild.remove();\n        return body;\n      } catch (e) {\n        return undefined;\n      }\n    }\n\n    function getInertBodyElement_InertDocument(html) {\n      inertBodyElement.innerHTML = html;\n\n      // Support: IE 9-11 only\n      // strip custom-namespaced attributes on IE<=11\n      if (document.documentMode) {\n        stripCustomNsAttrs(inertBodyElement);\n      }\n\n      return inertBodyElement;\n    }\n  })(window, window.document);\n\n  /**\n   * @example\n   * htmlParser(htmlString, {\n   *     start: function(tag, attrs) {},\n   *     end: function(tag) {},\n   *     chars: function(text) {},\n   *     comment: function(text) {}\n   * });\n   *\n   * @param {string} html string\n   * @param {object} handler\n   */\n  function htmlParserImpl(html, handler) {\n    if (html === null || html === undefined) {\n      html = '';\n    } else if (typeof html !== 'string') {\n      html = '' + html;\n    }\n\n    var inertBodyElement = getInertBodyElement(html);\n    if (!inertBodyElement) return '';\n\n    //mXSS protection\n    var mXSSAttempts = 5;\n    do {\n      if (mXSSAttempts === 0) {\n        throw $sanitizeMinErr('uinput', 'Failed to sanitize html because the input is unstable');\n      }\n      mXSSAttempts--;\n\n      // trigger mXSS if it is going to happen by reading and writing the innerHTML\n      html = inertBodyElement.innerHTML;\n      inertBodyElement = getInertBodyElement(html);\n    } while (html !== inertBodyElement.innerHTML);\n\n    var node = inertBodyElement.firstChild;\n    while (node) {\n      switch (node.nodeType) {\n        case 1: // ELEMENT_NODE\n          handler.start(node.nodeName.toLowerCase(), attrToMap(node.attributes));\n          break;\n        case 3: // TEXT NODE\n          handler.chars(node.textContent);\n          break;\n      }\n\n      var nextNode;\n      if (!(nextNode = node.firstChild)) {\n        if (node.nodeType === 1) {\n          handler.end(node.nodeName.toLowerCase());\n        }\n        nextNode = getNonDescendant('nextSibling', node);\n        if (!nextNode) {\n          while (nextNode == null) {\n            node = getNonDescendant('parentNode', node);\n            if (node === inertBodyElement) break;\n            nextNode = getNonDescendant('nextSibling', node);\n            if (node.nodeType === 1) {\n              handler.end(node.nodeName.toLowerCase());\n            }\n          }\n        }\n      }\n      node = nextNode;\n    }\n\n    while ((node = inertBodyElement.firstChild)) {\n      inertBodyElement.removeChild(node);\n    }\n  }\n\n  function attrToMap(attrs) {\n    var map = {};\n    for (var i = 0, ii = attrs.length; i < ii; i++) {\n      var attr = attrs[i];\n      map[attr.name] = attr.value;\n    }\n    return map;\n  }\n\n\n  /**\n   * Escapes all potentially dangerous characters, so that the\n   * resulting string can be safely inserted into attribute or\n   * element text.\n   * @param value\n   * @returns {string} escaped text\n   */\n  function encodeEntities(value) {\n    return value.\n      replace(/&/g, '&amp;').\n      replace(SURROGATE_PAIR_REGEXP, function(value) {\n        var hi = value.charCodeAt(0);\n        var low = value.charCodeAt(1);\n        return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n      }).\n      replace(NON_ALPHANUMERIC_REGEXP, function(value) {\n        return '&#' + value.charCodeAt(0) + ';';\n      }).\n      replace(/</g, '&lt;').\n      replace(/>/g, '&gt;');\n  }\n\n  /**\n   * create an HTML/XML writer which writes to buffer\n   * @param {Array} buf use buf.join('') to get out sanitized html string\n   * @returns {object} in the form of {\n   *     start: function(tag, attrs) {},\n   *     end: function(tag) {},\n   *     chars: function(text) {},\n   *     comment: function(text) {}\n   * }\n   */\n  function htmlSanitizeWriterImpl(buf, uriValidator) {\n    var ignoreCurrentElement = false;\n    var out = bind(buf, buf.push);\n    return {\n      start: function(tag, attrs) {\n        tag = lowercase(tag);\n        if (!ignoreCurrentElement && blockedElements[tag]) {\n          ignoreCurrentElement = tag;\n        }\n        if (!ignoreCurrentElement && validElements[tag] === true) {\n          out('<');\n          out(tag);\n          forEach(attrs, function(value, key) {\n            var lkey = lowercase(key);\n            var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background');\n            if (validAttrs[lkey] === true &&\n              (uriAttrs[lkey] !== true || uriValidator(value, isImage))) {\n              out(' ');\n              out(key);\n              out('=\"');\n              out(encodeEntities(value));\n              out('\"');\n            }\n          });\n          out('>');\n        }\n      },\n      end: function(tag) {\n        tag = lowercase(tag);\n        if (!ignoreCurrentElement && validElements[tag] === true && voidElements[tag] !== true) {\n          out('</');\n          out(tag);\n          out('>');\n        }\n        // eslint-disable-next-line eqeqeq\n        if (tag == ignoreCurrentElement) {\n          ignoreCurrentElement = false;\n        }\n      },\n      chars: function(chars) {\n        if (!ignoreCurrentElement) {\n          out(encodeEntities(chars));\n        }\n      }\n    };\n  }\n\n\n  /**\n   * When IE9-11 comes across an unknown namespaced attribute e.g. 'xlink:foo' it adds 'xmlns:ns1' attribute to declare\n   * ns1 namespace and prefixes the attribute with 'ns1' (e.g. 'ns1:xlink:foo'). This is undesirable since we don't want\n   * to allow any of these custom attributes. This method strips them all.\n   *\n   * @param node Root element to process\n   */\n  function stripCustomNsAttrs(node) {\n    while (node) {\n      if (node.nodeType === window.Node.ELEMENT_NODE) {\n        var attrs = node.attributes;\n        for (var i = 0, l = attrs.length; i < l; i++) {\n          var attrNode = attrs[i];\n          var attrName = attrNode.name.toLowerCase();\n          if (attrName === 'xmlns:ns1' || attrName.lastIndexOf('ns1:', 0) === 0) {\n            node.removeAttributeNode(attrNode);\n            i--;\n            l--;\n          }\n        }\n      }\n\n      var nextNode = node.firstChild;\n      if (nextNode) {\n        stripCustomNsAttrs(nextNode);\n      }\n\n      node = getNonDescendant('nextSibling', node);\n    }\n  }\n\n  function getNonDescendant(propName, node) {\n    // An element is clobbered if its `propName` property points to one of its descendants\n    var nextNode = node[propName];\n    if (nextNode && nodeContains.call(node, nextNode)) {\n      throw $sanitizeMinErr('elclob', 'Failed to sanitize html because the element is clobbered: {0}', node.outerHTML || node.outerText);\n    }\n    return nextNode;\n  }\n}\n\nfunction sanitizeText(chars) {\n  var buf = [];\n  var writer = htmlSanitizeWriter(buf, noop);\n  writer.chars(chars);\n  return buf.join('');\n}\n\n\n// define ngSanitize module and register $sanitize service\nangular.module('ngSanitize', [])\n  .provider('$sanitize', $SanitizeProvider)\n  .info({ angularVersion: '1.8.2' });\n\n/**\n * @ngdoc filter\n * @name linky\n * @kind function\n *\n * @description\n * Finds links in text input and turns them into html links. Supports `http/https/ftp/sftp/mailto` and\n * plain email address links.\n *\n * Requires the {@link ngSanitize `ngSanitize`} module to be installed.\n *\n * @param {string} text Input text.\n * @param {string} [target] Window (`_blank|_self|_parent|_top`) or named frame to open links in.\n * @param {object|function(url)} [attributes] Add custom attributes to the link element.\n *\n *    Can be one of:\n *\n *    - `object`: A map of attributes\n *    - `function`: Takes the url as a parameter and returns a map of attributes\n *\n *    If the map of attributes contains a value for `target`, it overrides the value of\n *    the target parameter.\n *\n *\n * @returns {string} Html-linkified and {@link $sanitize sanitized} text.\n *\n * @usage\n   <span ng-bind-html=\"linky_expression | linky\"></span>\n *\n * @example\n   <example module=\"linkyExample\" deps=\"angular-sanitize.js\" name=\"linky-filter\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n       Snippet: <textarea ng-model=\"snippet\" cols=\"60\" rows=\"3\"></textarea>\n       <table>\n         <tr>\n           <th>Filter</th>\n           <th>Source</th>\n           <th>Rendered</th>\n         </tr>\n         <tr id=\"linky-filter\">\n           <td>linky filter</td>\n           <td>\n             <pre>&lt;div ng-bind-html=\"snippet | linky\"&gt;<br>&lt;/div&gt;</pre>\n           </td>\n           <td>\n             <div ng-bind-html=\"snippet | linky\"></div>\n           </td>\n         </tr>\n         <tr id=\"linky-target\">\n          <td>linky target</td>\n          <td>\n            <pre>&lt;div ng-bind-html=\"snippetWithSingleURL | linky:'_blank'\"&gt;<br>&lt;/div&gt;</pre>\n          </td>\n          <td>\n            <div ng-bind-html=\"snippetWithSingleURL | linky:'_blank'\"></div>\n          </td>\n         </tr>\n         <tr id=\"linky-custom-attributes\">\n          <td>linky custom attributes</td>\n          <td>\n            <pre>&lt;div ng-bind-html=\"snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}\"&gt;<br>&lt;/div&gt;</pre>\n          </td>\n          <td>\n            <div ng-bind-html=\"snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}\"></div>\n          </td>\n         </tr>\n         <tr id=\"escaped-html\">\n           <td>no filter</td>\n           <td><pre>&lt;div ng-bind=\"snippet\"&gt;<br>&lt;/div&gt;</pre></td>\n           <td><div ng-bind=\"snippet\"></div></td>\n         </tr>\n       </table>\n     </file>\n     <file name=\"script.js\">\n       angular.module('linkyExample', ['ngSanitize'])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.snippet =\n             'Pretty text with some links:\\n' +\n             'http://angularjs.org/,\\n' +\n             'mailto:us@somewhere.org,\\n' +\n             'another@somewhere.org,\\n' +\n             'and one more: ftp://127.0.0.1/.';\n           $scope.snippetWithSingleURL = 'http://angularjs.org/';\n         }]);\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should linkify the snippet with urls', function() {\n         expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).\n             toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' +\n                  'another@somewhere.org, and one more: ftp://127.0.0.1/.');\n         expect(element.all(by.css('#linky-filter a')).count()).toEqual(4);\n       });\n\n       it('should not linkify snippet without the linky filter', function() {\n         expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()).\n             toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' +\n                  'another@somewhere.org, and one more: ftp://127.0.0.1/.');\n         expect(element.all(by.css('#escaped-html a')).count()).toEqual(0);\n       });\n\n       it('should update', function() {\n         element(by.model('snippet')).clear();\n         element(by.model('snippet')).sendKeys('new http://link.');\n         expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).\n             toBe('new http://link.');\n         expect(element.all(by.css('#linky-filter a')).count()).toEqual(1);\n         expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText())\n             .toBe('new http://link.');\n       });\n\n       it('should work with the target property', function() {\n        expect(element(by.id('linky-target')).\n            element(by.binding(\"snippetWithSingleURL | linky:'_blank'\")).getText()).\n            toBe('http://angularjs.org/');\n        expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank');\n       });\n\n       it('should optionally add custom attributes', function() {\n        expect(element(by.id('linky-custom-attributes')).\n            element(by.binding(\"snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}\")).getText()).\n            toBe('http://angularjs.org/');\n        expect(element(by.css('#linky-custom-attributes a')).getAttribute('rel')).toEqual('nofollow');\n       });\n     </file>\n   </example>\n */\nangular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {\n  var LINKY_URL_REGEXP =\n        /((s?ftp|https?):\\/\\/|(www\\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\\S*[^\\s.;,(){}<>\"\\u201d\\u2019]/i,\n      MAILTO_REGEXP = /^mailto:/i;\n\n  var linkyMinErr = angular.$$minErr('linky');\n  var isDefined = angular.isDefined;\n  var isFunction = angular.isFunction;\n  var isObject = angular.isObject;\n  var isString = angular.isString;\n\n  return function(text, target, attributes) {\n    if (text == null || text === '') return text;\n    if (!isString(text)) throw linkyMinErr('notstring', 'Expected string but received: {0}', text);\n\n    var attributesFn =\n      isFunction(attributes) ? attributes :\n      isObject(attributes) ? function getAttributesObject() {return attributes;} :\n      function getEmptyAttributesObject() {return {};};\n\n    var match;\n    var raw = text;\n    var html = [];\n    var url;\n    var i;\n    while ((match = raw.match(LINKY_URL_REGEXP))) {\n      // We can not end in these as they are sometimes found at the end of the sentence\n      url = match[0];\n      // if we did not match ftp/http/www/mailto then assume mailto\n      if (!match[2] && !match[4]) {\n        url = (match[3] ? 'http://' : 'mailto:') + url;\n      }\n      i = match.index;\n      addText(raw.substr(0, i));\n      addLink(url, match[0].replace(MAILTO_REGEXP, ''));\n      raw = raw.substring(i + match[0].length);\n    }\n    addText(raw);\n    return $sanitize(html.join(''));\n\n    function addText(text) {\n      if (!text) {\n        return;\n      }\n      html.push(sanitizeText(text));\n    }\n\n    function addLink(url, text) {\n      var key, linkAttributes = attributesFn(url);\n      html.push('<a ');\n\n      for (key in linkAttributes) {\n        html.push(key + '=\"' + linkAttributes[key] + '\" ');\n      }\n\n      if (isDefined(target) && !('target' in linkAttributes)) {\n        html.push('target=\"',\n                  target,\n                  '\" ');\n      }\n      html.push('href=\"',\n                url.replace(/\"/g, '&quot;'),\n                '\">');\n      addText(text);\n      html.push('</a>');\n    }\n  };\n}]);\n\n\n})(window, window.angular);\n","require('./angular-sanitize');\nmodule.exports = 'ngSanitize';\n","'use strict'\n\n/* Autoupdate plugin for baron 0.6+ */\n\nfunction autoUpdateOne(MutationObserver) {\n    var self = this\n    var watcher\n\n    if (this._au) {\n        return\n    }\n\n    function actualizeWatcher() {\n        if (!self.root[self.origin.offset]) {\n            startWatch()\n        } else {\n            stopWatch()\n        }\n    }\n\n    // Set interval timeout for watching when root node will be visible\n    function startWatch() {\n        if (watcher) return\n\n        watcher = setInterval(function() {\n            if (self.root[self.origin.offset]) {\n                stopWatch()\n                self.update()\n            }\n        }, 300) // is it good enought for you?)\n    }\n\n    function stopWatch() {\n        clearInterval(watcher)\n        watcher = null\n    }\n\n    var debouncedUpdater = self._debounce(function() {\n        self.update()\n    }, 300)\n\n    this._observer = new MutationObserver(function() {\n        actualizeWatcher()\n        self.update()\n        debouncedUpdater()\n    })\n\n    this.on('init', function() {\n        self._observer.observe(self.root, {\n            childList: true,\n            subtree: true,\n            characterData: true\n            // attributes: true\n            // No reasons to set attributes to true\n            // The case when root/child node with already properly inited baron toggled to hidden and then back to visible,\n            // and the size of parent was changed during that hidden state, is very rare\n            // Other cases are covered by watcher, and you still can do .update by yourself\n        })\n\n        actualizeWatcher()\n    })\n\n    this.on('dispose', function() {\n        self._observer.disconnect()\n        stopWatch()\n        delete self._observer\n    })\n\n    this._au = true\n}\n\nmodule.exports = function autoUpdateCreator(win) {\n    var MutationObserver = win.MutationObserver || win.WebKitMutationObserver || win.MozMutationObserver || null\n\n    return function autoUpdate() {\n        if (!MutationObserver) return this\n\n        autoUpdateOne.call(this, MutationObserver)\n\n        return this\n    }\n}\n","'use strict'\n\n/* Controls plugin for baron */\n\nvar qs = require('./utils').qs\n\nmodule.exports = function controls(params) {\n    var forward, backward, track, screen,\n        self = this,\n        event\n\n    screen = params.screen || 0.9\n\n    if (params.forward) {\n        forward = qs(params.forward, this.clipper)\n\n        event = {\n            element: forward,\n\n            handler: function() {\n                var y = self.pos() + (params.delta || 30)\n\n                self.pos(y)\n            },\n\n            type: 'click'\n        }\n\n        this._eventHandlers.push(event) // For auto-dispose\n        this.event(event.element, event.type, event.handler, 'on')\n    }\n\n    if (params.backward) {\n        backward = qs(params.backward, this.clipper)\n\n        event = {\n            element: backward,\n\n            handler: function() {\n                var y = self.pos() - (params.delta || 30)\n\n                self.pos(y)\n            },\n\n            type: 'click'\n        }\n\n        this._eventHandlers.push(event) // For auto-dispose\n        this.event(event.element, event.type, event.handler, 'on')\n    }\n\n    if (params.track) {\n        if (params.track === true) {\n            track = this.track\n        } else {\n            track = qs(params.track, this.clipper)\n        }\n\n        if (track) {\n            event = {\n                element: track,\n\n                handler: function(e) {\n                    // https://github.com/Diokuz/baron/issues/121\n                    if (e.target != track) return\n\n                    var x = e['offset' + self.origin.x],\n                        xBar = self.bar[self.origin.offsetPos],\n                        sign = 0\n\n                    if (x < xBar) {\n                        sign = -1\n                    } else if (x > xBar + self.bar[self.origin.offset]) {\n                        sign = 1\n                    }\n\n                    var y = self.pos() + sign * screen * self.scroller[self.origin.client]\n\n                    self.pos(y)\n                },\n\n                type: 'mousedown'\n            }\n\n            this._eventHandlers.push(event) // For auto-dispose\n            this.event(event.element, event.type, event.handler, 'on')\n        }\n    }\n}\n","'use strict'\n\nvar g = (function() {\n    return this || (1, eval)('this')\n}())\nvar scopedWindow = g && g.window || g\n\nvar event = require('./utils').event\nvar css = require('./utils').css\nvar add = require('./utils').add\nvar has = require('./utils').has\nvar rm = require('./utils').rm\nvar clone = require('./utils').clone\nvar qs = require('./utils').qs\n\nvar _baron = baron // Stored baron value for noConflict usage\n// var Item = {}\nvar pos = ['left', 'top', 'right', 'bottom', 'width', 'height']\n// Global store for all baron instances (to be able to dispose them on html-nodes)\nvar instances = []\nvar origin = {\n    v: { // Vertical\n        x: 'Y', pos: pos[1], oppos: pos[3], crossPos: pos[0], crossOpPos: pos[2],\n        size: pos[5],\n        crossSize: pos[4], crossMinSize: 'min-' + pos[4], crossMaxSize: 'max-' + pos[4],\n        client: 'clientHeight', crossClient: 'clientWidth',\n        scrollEdge: 'scrollLeft',\n        offset: 'offsetHeight', crossOffset: 'offsetWidth', offsetPos: 'offsetTop',\n        scroll: 'scrollTop', scrollSize: 'scrollHeight'\n    },\n    h: { // Horizontal\n        x: 'X', pos: pos[0], oppos: pos[2], crossPos: pos[1], crossOpPos: pos[3],\n        size: pos[4],\n        crossSize: pos[5], crossMinSize: 'min-' + pos[5], crossMaxSize: 'max-' + pos[5],\n        client: 'clientWidth', crossClient: 'clientHeight',\n        scrollEdge: 'scrollTop',\n        offset: 'offsetWidth', crossOffset: 'offsetHeight', offsetPos: 'offsetLeft',\n        scroll: 'scrollLeft', scrollSize: 'scrollWidth'\n    }\n}\n\n// Some ugly vars\nvar opera12maxScrollbarSize = 17\n// I hate you https://github.com/Diokuz/baron/issues/110\nvar macmsxffScrollbarSize = 15\nvar macosxffRe = /[\\s\\S]*Macintosh[\\s\\S]*\\) Gecko[\\s\\S]*/\nvar isMacFF = macosxffRe.test(scopedWindow.navigator && scopedWindow.navigator.userAgent)\n\nvar log, liveBarons, shownErrors\n\nif (process.env.NODE_ENV !== 'production') {\n    log = require('./log')\n    liveBarons = 0\n    shownErrors = {\n        liveTooMany: false,\n        allTooMany: false\n    }\n}\n\n// window.baron and jQuery.fn.baron points to this function\nfunction baron(user) {\n    var withParams = !!user\n    var tryNode = (user && user[0]) || user\n    var isNode = typeof user == 'string' || tryNode instanceof HTMLElement\n    var params = isNode ? { root: user } : clone(user)\n    var jQueryMode\n    var rootNode\n    var defaultParams = {\n        direction: 'v',\n        barOnCls: '_scrollbar',\n        resizeDebounce: 0,\n        event: event,\n        cssGuru: false,\n        impact: 'scroller',\n        position: 'static'\n    }\n\n    params = params || {}\n\n    // Extending default params by user-defined params\n    for (var key in defaultParams) {\n        if (params[key] == null) { // eslint-disable-line\n            params[key] = defaultParams[key]\n        }\n    }\n\n    if (process.env.NODE_ENV !== 'production') {\n        if (params.position == 'absolute' && params.impact == 'clipper') {\n            log('error', [\n                'Simultaneous use of `absolute` position and `clipper` impact values detected.',\n                'Those values cannot be used together.',\n                'See more https://github.com/Diokuz/baron/issues/138'\n            ].join(' '), params)\n        }\n    }\n\n    // `this` could be a jQuery instance\n    jQueryMode = this && this instanceof scopedWindow.jQuery\n\n    if (params._chain) {\n        rootNode = params.root\n    } else if (jQueryMode) {\n        params.root = rootNode = this[0]\n    } else {\n        rootNode = qs(params.root || params.scroller)\n    }\n\n    if (process.env.NODE_ENV !== 'production') {\n        if (!rootNode) {\n            log('error', [\n                'Baron initialization failed: root node not found.'\n            ].join(', '), params)\n\n            return // or return baron-shell?\n        }\n    }\n\n    var attr = manageAttr(rootNode, params.direction)\n    var id = +attr // Could be NaN\n\n    params.index = id\n\n    // baron() can return existing instances,\n    // @TODO update params on-the-fly\n    // https://github.com/Diokuz/baron/issues/124\n    if (id == id && attr !== null && instances[id]) {\n        if (process.env.NODE_ENV !== 'production') {\n            if (withParams) {\n                log('error', [\n                    'repeated initialization for html-node detected',\n                    'https://github.com/Diokuz/baron/blob/master/docs/logs/repeated.md'\n                ].join(', '), params.root)\n            }\n        }\n\n        return instances[id]\n    }\n\n    // root and scroller can be different nodes\n    if (params.root && params.scroller) {\n        params.scroller = qs(params.scroller, rootNode)\n        if (process.env.NODE_ENV !== 'production') {\n            if (!params.scroller) {\n                log('error', 'Scroller not found!', rootNode, params.scroller)\n            }\n        }\n    } else {\n        params.scroller = rootNode\n    }\n\n    params.root = rootNode\n\n    var instance = init(params)\n\n    if (instance.autoUpdate) {\n        instance.autoUpdate()\n    }\n\n    return instance\n}\n\nfunction arrayEach(_obj, iterator) {\n    var i = 0\n    var obj = _obj\n\n    if (obj.length === undefined || obj === scopedWindow) obj = [obj]\n\n    while (obj[i]) {\n        iterator.call(this, obj[i], i)\n        i++\n    }\n}\n\n// shortcut for getTime\nfunction getTime() {\n    return new Date().getTime()\n}\n\nif (process.env.NODE_ENV !== 'production') {\n    baron._instances = instances\n}\n\nfunction manageEvents(item, eventManager, mode) {\n    // Creating new functions for one baron item only one time\n    item._eventHandlers = item._eventHandlers || [\n        {\n            // onScroll:\n            element: item.scroller,\n\n            handler: function(e) {\n                item.scroll(e)\n            },\n\n            type: 'scroll'\n        }, {\n            // css transitions & animations\n            element: item.root,\n\n            handler: function() {\n                item.update()\n            },\n\n            type: 'transitionend animationend'\n        }, {\n            // onKeyup (textarea):\n            element: item.scroller,\n\n            handler: function() {\n                item.update()\n            },\n\n            type: 'keyup'\n        }, {\n            // onMouseDown:\n            element: item.bar,\n\n            handler: function(e) {\n                e.preventDefault() // Text selection disabling in Opera\n                item.selection() // Disable text selection in ie8\n                item.drag.now = 1 // Save private byte\n                if (item.draggingCls) {\n                    add(item.root, item.draggingCls)\n                }\n            },\n\n            type: 'touchstart mousedown'\n        }, {\n            // onMouseUp:\n            element: document,\n\n            handler: function() {\n                item.selection(1) // Enable text selection\n                item.drag.now = 0\n                if (item.draggingCls) {\n                    rm(item.root, item.draggingCls)\n                }\n            },\n\n            type: 'mouseup blur touchend'\n        }, {\n            // onCoordinateReset:\n            element: document,\n\n            handler: function(e) {\n                if (e.button != 2) { // Not RM\n                    item._pos0(e)\n                }\n            },\n\n            type: 'touchstart mousedown'\n        }, {\n            // onMouseMove:\n            element: document,\n\n            handler: function(e) {\n                if (item.drag.now) {\n                    item.drag(e)\n                }\n            },\n\n            type: 'mousemove touchmove'\n        }, {\n            // @TODO make one global listener\n            // onResize:\n            element: scopedWindow,\n\n            handler: function() {\n                item.update()\n            },\n\n            type: 'resize'\n        }, {\n            // @todo remove\n            // sizeChange:\n            element: item.root,\n\n            handler: function() {\n                item.update()\n            },\n\n            type: 'sizeChange'\n        }, {\n            // Clipper onScroll bug https://github.com/Diokuz/baron/issues/116\n            element: item.clipper,\n\n            handler: function() {\n                item.clipperOnScroll()\n            },\n\n            type: 'scroll'\n        }\n    ]\n\n    arrayEach(item._eventHandlers, function(evt) {\n        if (evt.element) {\n            // workaround for element-elements in `fix` plugin\n            // @todo dispose `fix` in proper way and remove workaround\n            if (evt.element.length && evt.element !== scopedWindow) {\n                for (var i = 0; i < evt.element.length; i++) {\n                    eventManager(evt.element[i], evt.type, evt.handler, mode)\n                }\n            } else {\n                eventManager(evt.element, evt.type, evt.handler, mode)\n            }\n        }\n    })\n\n    // if (item.scroller) {\n    //     event(item.scroller, 'scroll', item._eventHandlers.onScroll, mode)\n    // }\n    // if (item.bar) {\n    //     event(item.bar, 'touchstart mousedown', item._eventHandlers.onMouseDown, mode)\n    // }\n    // event(document, 'mouseup blur touchend', item._eventHandlers.onMouseUp, mode)\n    // event(document, 'touchstart mousedown', item._eventHandlers.onCoordinateReset, mode)\n    // event(document, 'mousemove touchmove', item._eventHandlers.onMouseMove, mode)\n    // event(window, 'resize', item._eventHandlers.onResize, mode)\n    // if (item.root) {\n    //     event(item.root, 'sizeChange', item._eventHandlers.onResize, mode)\n    //     // Custon event for alternate baron update mechanism\n    // }\n}\n\n// set, remove or read baron-specific id-attribute\n// @returns {String|null} - id node value, or null, if there is no attr\nfunction manageAttr(node, direction, mode, id) {\n    var attrName = 'data-baron-' + direction + '-id'\n\n    if (mode == 'on') {\n        node.setAttribute(attrName, id)\n    } else if (mode == 'off') {\n        node.removeAttribute(attrName)\n    }\n\n    return node.getAttribute(attrName)\n}\n\nfunction init(params) {\n    var out = new baron.prototype.constructor(params)\n\n    manageEvents(out, params.event, 'on')\n\n    manageAttr(out.root, params.direction, 'on', instances.length)\n    instances.push(out)\n\n    if (process.env.NODE_ENV !== 'production') {\n        liveBarons++\n        if (liveBarons > 100 && !shownErrors.liveTooMany) {\n            log('warn', [\n                'You have too many live baron instances on page (' + liveBarons + ')!',\n                'Are you forget to dispose some of them?',\n                'All baron instances can be found in baron._instances:'\n            ].join(' '), instances)\n            shownErrors.liveTooMany = true\n        }\n        if (instances.length > 1000 && !shownErrors.allTooMany) {\n            log('warn', [\n                'You have too many inited baron instances on page (' + instances.length + ')!',\n                'Some of them are disposed, and thats good news.',\n                'but baron.init was call too many times, and thats is bad news.',\n                'All baron instances can be found in baron._instances:'\n            ].join(' '), instances)\n            shownErrors.allTooMany = true\n        }\n    }\n\n    out.update()\n\n    return out\n}\n\nfunction fire(eventName) {\n    if (this.events && this.events[eventName]) {\n        for (var i = 0; i < this.events[eventName].length; i++) {\n            var args = Array.prototype.slice.call( arguments, 1 )\n\n            this.events[eventName][i].apply(this, args)\n        }\n    }\n}\n\nbaron.prototype = {\n    // underscore.js realization\n    // used in autoUpdate plugin\n    _debounce: function(func, wait) {\n        var self = this,\n            timeout,\n            // args, // right now there is no need for arguments\n            // context, // and for context\n            timestamp\n            // result // and for result\n\n        var later = function() {\n            if (self._disposed) {\n                clearTimeout(timeout)\n                timeout = self = null\n                return\n            }\n\n            var last = getTime() - timestamp\n\n            if (last < wait && last >= 0) {\n                timeout = setTimeout(later, wait - last)\n            } else {\n                timeout = null\n                // result = func.apply(context, args)\n                func()\n                // context = args = null\n            }\n        }\n\n        return function() {\n            // context = this\n            // args = arguments\n            timestamp = getTime()\n\n            if (!timeout) {\n                timeout = setTimeout(later, wait)\n            }\n\n            // return result\n        }\n    },\n\n    constructor: function(params) {\n        var barPos,\n            scrollerPos0,\n            track,\n            resizePauseTimer,\n            scrollingTimer,\n            resizeLastFire,\n            oldBarSize\n\n        resizeLastFire = getTime()\n\n        this.params = params\n        this.event = params.event\n        this.events = {}\n\n        // DOM elements\n        this.root = params.root // Always html node, not just selector\n        this.scroller = qs(params.scroller)\n        if (process.env.NODE_ENV !== 'production') {\n            if (this.scroller.tagName == 'body') {\n                log('error', [\n                    'Please, do not use BODY as a scroller.',\n                    'https://github.com/Diokuz/baron/blob/master/docs/logs/do-not-use-body.md'\n                ].join(', '), params)\n            }\n        }\n        this.bar = qs(params.bar, this.root)\n        track = this.track = qs(params.track, this.root)\n        if (!this.track && this.bar) {\n            track = this.bar.parentNode\n        }\n        this.clipper = this.scroller.parentNode\n\n        // Parameters\n        this.direction = params.direction\n        this.rtl = params.rtl\n        this.origin = origin[this.direction]\n        this.barOnCls = params.barOnCls\n        this.scrollingCls = params.scrollingCls\n        this.draggingCls = params.draggingCls\n        this.impact = params.impact\n        this.position = params.position\n        this.rtl = params.rtl\n        this.barTopLimit = 0\n        this.resizeDebounce = params.resizeDebounce\n\n        // Updating height or width of bar\n        function setBarSize(_size) {\n            var barMinSize = this.barMinSize || 20\n            var size = _size\n\n            if (size > 0 && size < barMinSize) {\n                size = barMinSize\n            }\n\n            if (this.bar) {\n                css(this.bar, this.origin.size, parseInt(size, 10) + 'px')\n            }\n        }\n\n        // Updating top or left bar position\n        function posBar(_pos) {\n            if (this.bar) {\n                var was = css(this.bar, this.origin.pos),\n                    will = +_pos + 'px'\n\n                if (will && will != was) {\n                    css(this.bar, this.origin.pos, will)\n                }\n            }\n        }\n\n        // Free path for bar\n        function k() {\n            return track[this.origin.client] - this.barTopLimit - this.bar[this.origin.offset]\n        }\n\n        // Relative content top position to bar top position\n        function relToPos(r) {\n            return r * k.call(this) + this.barTopLimit\n        }\n\n        // Bar position to relative content position\n        function posToRel(t) {\n            return (t - this.barTopLimit) / k.call(this)\n        }\n\n        // Cursor position in main direction in px // Now with iOs support\n        this.cursor = function(e) {\n            return e['client' + this.origin.x] ||\n                (((e.originalEvent || e).touches || {})[0] || {})['page' + this.origin.x]\n        }\n\n        // Text selection pos preventing\n        function dontPosSelect() {\n            return false\n        }\n\n        this.pos = function(x) { // Absolute scroller position in px\n            var ie = 'page' + this.origin.x + 'Offset',\n                key = (this.scroller[ie]) ? ie : this.origin.scroll\n\n            if (x !== undefined) this.scroller[key] = x\n\n            return this.scroller[key]\n        }\n\n        this.rpos = function(r) { // Relative scroller position (0..1)\n            var free = this.scroller[this.origin.scrollSize] - this.scroller[this.origin.client],\n                x\n\n            if (r) {\n                x = this.pos(r * free)\n            } else {\n                x = this.pos()\n            }\n\n            return x / (free || 1)\n        }\n\n        // Switch on the bar by adding user-defined CSS classname to scroller\n        this.barOn = function(dispose) {\n            if (this.barOnCls) {\n                var noScroll = this.scroller[this.origin.client] >= this.scroller[this.origin.scrollSize]\n\n                if (dispose || noScroll) {\n                    if (has(this.root, this.barOnCls)) {\n                        rm(this.root, this.barOnCls)\n                    }\n                } else if (!has(this.root, this.barOnCls)) {\n                    add(this.root, this.barOnCls)\n                }\n            }\n        }\n\n        this._pos0 = function(e) {\n            scrollerPos0 = this.cursor(e) - barPos\n        }\n\n        this.drag = function(e) {\n            var rel = posToRel.call(this, this.cursor(e) - scrollerPos0)\n            var sub = (this.scroller[this.origin.scrollSize] - this.scroller[this.origin.client])\n\n            this.scroller[this.origin.scroll] = rel * sub\n        }\n\n        // Text selection preventing on drag\n        this.selection = function(enable) {\n            this.event(document, 'selectpos selectstart', dontPosSelect, enable ? 'off' : 'on')\n        }\n\n        // onResize & DOM modified handler\n        // also fires on init\n        // Note: max/min-size didnt sets if size did not really changed (for example, on init in Chrome)\n        this.resize = function() {\n            var self = this\n            var minPeriod = (self.resizeDebounce === undefined) ? 300 : self.resizeDebounce\n            var delay = 0\n\n            if (getTime() - resizeLastFire < minPeriod) {\n                clearTimeout(resizePauseTimer)\n                delay = minPeriod\n            }\n\n            function upd() {\n                var offset = self.scroller[self.origin.crossOffset]\n                var client = self.scroller[self.origin.crossClient]\n                var padding = 0\n                var was, will\n\n                // https://github.com/Diokuz/baron/issues/110\n                if (isMacFF) {\n                    padding = macmsxffScrollbarSize\n\n                // Opera 12 bug https://github.com/Diokuz/baron/issues/105\n                } else if (client > 0 && offset === 0) {\n                    // Only Opera 12 in some rare nested flexbox cases goes here\n                    // Sorry guys for magic,\n                    // but I dont want to create temporary html-nodes set\n                    // just for measuring scrollbar size in Opera 12.\n                    // 17px for Windows XP-8.1, 15px for Mac (really rare).\n                    offset = client + opera12maxScrollbarSize\n                }\n\n                if (offset) { // if there is no size, css should not be set\n                    self.barOn()\n\n                    if (self.impact == 'scroller') { // scroller\n                        var delta = offset - client + padding\n\n                        // `static` position works only for `scroller` impact\n                        if (self.position == 'static') { // static\n                            was = css(self.scroller, self.origin.crossSize)\n                            will = self.clipper[self.origin.crossClient] + delta + 'px'\n\n                            if (was != will) {\n                                self._setCrossSizes(self.scroller, will)\n                            }\n                        } else { // absolute\n                            var styles = {}\n                            var key = self.rtl ? 'Left' : 'Right'\n\n                            if (self.direction == 'h') {\n                                key = 'Bottom'\n                            }\n\n                            styles['padding' + key] = delta + 'px'\n                            css(self.scroller, styles)\n                        }\n                    } else { // clipper\n                        was = css(self.clipper, self.origin.crossSize)\n                        will = client + 'px'\n\n                        if (was != will) {\n                            self._setCrossSizes(self.clipper, will)\n                        }\n                    }\n                } else {\n                    // do nothing (display: none, or something)\n                }\n\n                Array.prototype.unshift.call(arguments, 'resize')\n                fire.apply(self, arguments)\n\n                resizeLastFire = getTime()\n            }\n\n            if (delay) {\n                resizePauseTimer = setTimeout(upd, delay)\n            } else {\n                upd()\n            }\n        }\n\n        this.updatePositions = function(force) {\n            var newBarSize,\n                self = this\n\n            if (self.bar) {\n                newBarSize = (track[self.origin.client] - self.barTopLimit) *\n                    self.scroller[self.origin.client] / self.scroller[self.origin.scrollSize]\n\n                // Positioning bar\n                if (force || parseInt(oldBarSize, 10) != parseInt(newBarSize, 10)) {\n                    setBarSize.call(self, newBarSize)\n                    oldBarSize = newBarSize\n                }\n\n                barPos = relToPos.call(self, self.rpos())\n\n                posBar.call(self, barPos)\n            }\n\n            Array.prototype.unshift.call( arguments, 'scroll' )\n            fire.apply(self, arguments)\n        }\n\n        // onScroll handler\n        this.scroll = function() {\n            var self = this\n\n            self.updatePositions()\n\n            if (self.scrollingCls) {\n                if (!scrollingTimer) {\n                    add(self.root, self.scrollingCls)\n                }\n                clearTimeout(scrollingTimer)\n                scrollingTimer = setTimeout(function() {\n                    rm(self.root, self.scrollingCls)\n                    scrollingTimer = undefined\n                }, 300)\n            }\n        }\n\n        // https://github.com/Diokuz/baron/issues/116\n        this.clipperOnScroll = function() {\n            // WTF is this line? https://github.com/Diokuz/baron/issues/134\n            // if (this.direction == 'h') return\n\n            // assign `initial scroll position` to `clipper.scrollLeft` (0 for ltr, ~20 for rtl)\n            if (!this.rtl) {\n                this.clipper[this.origin.scrollEdge] = 0\n            } else {\n                this.clipper[this.origin.scrollEdge] = this.clipper[this.origin.scrollSize]\n            }\n        }\n\n        // Flexbox `align-items: stretch` (default) requires to set min-width for vertical\n        // and max-height for horizontal scroll. Just set them all.\n        // http://www.w3.org/TR/css-flexbox-1/#valdef-align-items-stretch\n        this._setCrossSizes = function(node, size) {\n            var styles = {}\n\n            styles[this.origin.crossSize] = size\n            styles[this.origin.crossMinSize] = size\n            styles[this.origin.crossMaxSize] = size\n\n            css(node, styles)\n        }\n\n        // Set common css rules\n        this._dumbCss = function(on) {\n            if (params.cssGuru) return\n\n            var overflow = on ? 'hidden' : null\n            var msOverflowStyle = on ? 'none' : null\n\n            css(this.clipper, {\n                overflow: overflow,\n                msOverflowStyle: msOverflowStyle,\n                position: this.position == 'static' ? '' : 'relative'\n            })\n\n            var scroll = on ? 'scroll' : null\n            var axis = this.direction == 'v' ? 'y' : 'x'\n            var scrollerCss = {}\n\n            scrollerCss['overflow-' + axis] = scroll\n            scrollerCss['box-sizing'] = 'border-box'\n            scrollerCss.margin = '0'\n            scrollerCss.border = '0'\n\n            if (this.position == 'absolute') {\n                scrollerCss.position = 'absolute'\n                scrollerCss.top = '0'\n\n                if (this.direction == 'h') {\n                    scrollerCss.left = scrollerCss.right = '0'\n                } else {\n                    scrollerCss.bottom = '0'\n                    scrollerCss.right = this.rtl ? '0' : ''\n                    scrollerCss.left = this.rtl ? '' : '0'\n                }\n            }\n\n            css(this.scroller, scrollerCss)\n        }\n\n        // onInit actions\n        this._dumbCss(true)\n\n        if (isMacFF) {\n            var padding = 'paddingRight'\n            var styles = {}\n            // getComputedStyle is ie9+, but we here only in f ff\n            var paddingWas = scopedWindow.getComputedStyle(this.scroller)[[padding]]\n\n            if (params.direction == 'h') {\n                padding = 'paddingBottom'\n            } else if (params.rtl) {\n                padding = 'paddingLeft'\n            }\n\n            var numWas = parseInt(paddingWas, 10)\n\n            if (numWas != numWas) numWas = 0\n            styles[padding] = (macmsxffScrollbarSize + numWas) + 'px'\n            css(this.scroller, styles)\n        }\n\n        return this\n    },\n\n    // fires on any update and on init\n    update: function(params) {\n        if (process.env.NODE_ENV !== 'production') {\n            if (this._disposed) {\n                log('error', [\n                    'Update on disposed baron instance detected.',\n                    'You should clear your stored baron value for this instance:',\n                    this\n                ].join(' '), params)\n            }\n        }\n\n        fire.call(this, 'upd', params) // Update all plugins' params\n\n        this.resize(1)\n        this.updatePositions(1)\n\n        return this\n    },\n\n    // One instance\n    dispose: function() {\n        if (process.env.NODE_ENV !== 'production') {\n            if (this._disposed) {\n                log('error', 'Already disposed:', this)\n            }\n\n            liveBarons--\n        }\n\n        manageEvents(this, this.event, 'off')\n        manageAttr(this.root, this.params.direction, 'off')\n        if (this.params.direction == 'v') {\n            this._setCrossSizes(this.scroller, '')\n        } else {\n            this._setCrossSizes(this.clipper, '')\n        }\n        this._dumbCss(false)\n        this.barOn(true)\n        fire.call(this, 'dispose')\n        instances[this.params.index] = null\n        this.params = null\n        this._disposed = true\n    },\n\n    on: function(eventName, func, arg) {\n        var names = eventName.split(' ')\n\n        for (var i = 0; i < names.length; i++) {\n            if (names[i] == 'init') {\n                func.call(this, arg)\n            } else {\n                this.events[names[i]] = this.events[names[i]] || []\n\n                this.events[names[i]].push(function(userArg) {\n                    func.call(this, userArg || arg)\n                })\n            }\n        }\n    },\n\n    baron: function(params) {\n        params.root = this.params.root\n        params.scroller = this.params.scroller\n        params.direction = (this.params.direction == 'v') ? 'h' : 'v'\n        params._chain = true\n\n        return baron(params)\n    }\n}\n\n// baron.fn.constructor.prototype = baron.fn\nbaron.prototype.constructor.prototype = baron.prototype\n\n// Use when you need \"baron\" global var for another purposes\nbaron.noConflict = function() {\n    scopedWindow.baron = _baron // Restoring original value of \"baron\" global var\n\n    return baron\n}\n\nbaron.version = '3.0.1'\n\nbaron.prototype.autoUpdate = require('./autoUpdate')(scopedWindow)\nbaron.prototype.fix = require('./fix')\nbaron.prototype.controls = require('./controls')\n\nmodule.exports = baron\n","'use strict'\n\n/* Fixable elements plugin for baron */\n\nvar log = require('./log')\nvar css = require('./utils').css\nvar add = require('./utils').add\nvar rm = require('./utils').rm\n\nmodule.exports = function fix(userParams) {\n    var elements,\n        viewPortSize,\n        params = { // Default params\n            outside: '',\n            inside: '',\n            before: '',\n            after: '',\n            past: '',\n            future: '',\n            radius: 0,\n            minView: 0\n        },\n        topFixHeights = [], // inline style for element\n        topRealHeights = [], // ? something related to negative margins for fixable elements\n        headerTops = [], // offset positions when not fixed\n        scroller = this.scroller,\n        eventManager = this.event,\n        self = this\n\n    if (process.env.NODE_ENV !== 'production') {\n        if (this.position != 'static') {\n            log('error', [\n                'Fix plugin cannot work properly in non-static baron position.',\n                'See more https://github.com/Diokuz/baron/issues/135'\n            ].join(' '), this.params)\n        }\n    }\n\n    // i - number of fixing element, pos - fix-position in px, flag - 1: top, 2: bottom\n    // Invocation only in case when fix-state changed\n    function fixElement(i, _pos, flag) {\n        var pos = _pos\n        var ori = flag == 1 ? 'pos' : 'oppos'\n\n        if (viewPortSize < (params.minView || 0)) { // No headers fixing when no enought space for viewport\n            pos = undefined\n        }\n\n        // Removing all fixing stuff - we can do this because fixElement triggers only when fixState really changed\n        css(elements[i], this.origin.pos, '')\n        css(elements[i], this.origin.oppos, '')\n        rm(elements[i], params.outside)\n\n        // Fixing if needed\n        if (pos !== undefined) {\n            pos += 'px'\n            css(elements[i], this.origin[ori], pos)\n            add(elements[i], params.outside)\n        }\n    }\n\n    function bubbleWheel(e) {\n        try {\n            var i = document.createEvent('WheelEvent') // i - for extra byte\n\n            // evt.initWebKitWheelEvent(deltaX, deltaY, window, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey)\n            i.initWebKitWheelEvent(e.originalEvent.wheelDeltaX, e.originalEvent.wheelDeltaY)\n            scroller.dispatchEvent(i)\n            e.preventDefault()\n        } catch (ex) {\n            //\n        }\n    }\n\n    function init(_params) {\n        var pos\n\n        for (var key in _params) {\n            params[key] = _params[key]\n        }\n\n        if (params.elements instanceof HTMLElement) {\n            elements = [params.elements]\n        } else if (typeof params.elements == 'string') {\n            elements = this.scroller.querySelectorAll(params.elements)\n        } else if (params.elements && params.elements[0] instanceof HTMLElement) {\n            elements = params.elements\n        }\n\n        if (elements) {\n            viewPortSize = this.scroller[this.origin.client]\n            for (var i = 0; i < elements.length; i++) {\n                // Variable header heights\n                pos = {}\n                pos[this.origin.size] = elements[i][this.origin.offset] + 'px'\n                if (elements[i].parentNode !== this.scroller) {\n                    css(elements[i].parentNode, pos)\n                }\n                pos = {}\n                pos[this.origin.crossSize] = elements[i].parentNode[this.origin.crossClient] + 'px'\n                css(elements[i], pos)\n\n                // Between fixed headers\n                viewPortSize -= elements[i][this.origin.offset]\n\n                headerTops[i] = elements[i].parentNode[this.origin.offsetPos] // No paddings for parentNode\n\n                // Summary elements height above current\n                topFixHeights[i] = (topFixHeights[i - 1] || 0) // Not zero because of negative margins\n                topRealHeights[i] = (topRealHeights[i - 1] || Math.min(headerTops[i], 0))\n\n                if (elements[i - 1]) {\n                    topFixHeights[i] += elements[i - 1][this.origin.offset]\n                    topRealHeights[i] += elements[i - 1][this.origin.offset]\n                }\n\n                if ( !(i == 0 && headerTops[i] == 0)/* && force */) {\n                    this.event(elements[i], 'mousewheel', bubbleWheel, 'off')\n                    this.event(elements[i], 'mousewheel', bubbleWheel)\n                }\n            }\n\n            if (params.limiter && elements[0]) { // Bottom edge of first header as top limit for track\n                if (this.track && this.track != this.scroller) {\n                    pos = {}\n                    pos[this.origin.pos] = elements[0].parentNode[this.origin.offset] + 'px'\n                    css(this.track, pos)\n                } else {\n                    this.barTopLimit = elements[0].parentNode[this.origin.offset]\n                }\n                // this.barTopLimit = elements[0].parentNode[this.origin.offset]\n                this.scroll()\n            }\n\n            if (params.limiter === false) { // undefined (in second fix instance) should have no influence on bar limit\n                this.barTopLimit = 0\n            }\n        }\n\n        var event = {\n            element: elements,\n\n            handler: function() {\n                var parent = this.parentNode,\n                    top = parent.offsetTop,\n                    num\n\n                // finding num -> elements[num] === this\n                for (var j = 0; j < elements.length; j++ ) {\n                    if (elements[j] === this) num = j\n                }\n\n                var locPos = top - topFixHeights[num]\n\n                if (params.scroll) { // User defined callback\n                    params.scroll({\n                        x1: self.scroller.scrollTop,\n                        x2: locPos\n                    })\n                } else {\n                    self.scroller.scrollTop = locPos\n                }\n            },\n\n            type: 'click'\n        }\n\n        if (params.clickable) {\n            this._eventHandlers.push(event) // For auto-dispose\n            // eventManager(event.element, event.type, event.handler, 'off')\n            for (var j = 0; j < event.element.length; j++) {\n                eventManager(event.element[j], event.type, event.handler, 'on')\n            }\n        }\n    }\n\n    this.on('init', init, userParams)\n\n    var fixFlag = [], // 1 - past, 2 - future, 3 - current (not fixed)\n        gradFlag = []\n\n    this.on('init scroll', function() {\n        var fixState, hTop, gradState\n        var i\n\n        if (elements) {\n            var change\n\n            // fixFlag update\n            for (i = 0; i < elements.length; i++) {\n                fixState = 0\n                if (headerTops[i] - this.pos() < topRealHeights[i] + params.radius) {\n                    // Header trying to go up\n                    fixState = 1\n                    hTop = topFixHeights[i]\n                } else if (headerTops[i] - this.pos() > topRealHeights[i] + viewPortSize - params.radius) {\n                    // Header trying to go down\n                    fixState = 2\n                    // console.log('topFixHeights[i] + viewPortSize + topRealHeights[i]', topFixHeights[i], this.scroller[this.origin.client], topRealHeights[i])\n                    hTop = this.scroller[this.origin.client] - elements[i][this.origin.offset] - topFixHeights[i] - viewPortSize\n                    // console.log('hTop', hTop, viewPortSize, elements[this.origin.offset], topFixHeights[i])\n                    // (topFixHeights[i] + viewPortSize + elements[this.origin.offset]) - this.scroller[this.origin.client]\n                } else {\n                    // Header in viewport\n                    fixState = 3\n                    hTop = undefined\n                }\n\n                gradState = false\n                if (headerTops[i] - this.pos() < topRealHeights[i] || headerTops[i] - this.pos() > topRealHeights[i] + viewPortSize) {\n                    gradState = true\n                }\n\n                if (fixState != fixFlag[i] || gradState != gradFlag[i]) {\n                    fixElement.call(this, i, hTop, fixState)\n                    fixFlag[i] = fixState\n                    gradFlag[i] = gradState\n                    change = true\n                }\n            }\n\n            // Adding positioning classes (on last top and first bottom header)\n            if (change) { // At leats one change in elements flag structure occured\n                for (i = 0; i < elements.length; i++) {\n                    if (fixFlag[i] == 1 && params.past) {\n                        add(elements[i], params.past)\n                        rm(elements[i], params.future)\n                    }\n\n                    if (fixFlag[i] == 2 && params.future) {\n                        add(elements[i], params.future)\n                        rm(elements[i], params.past)\n                    }\n\n                    if (fixFlag[i] == 3) {\n                        rm(elements[i], params.past)\n                        rm(elements[i], params.future)\n                        add(elements[i], params.inside)\n                    }\n\n                    if (fixFlag[i] != fixFlag[i + 1] && fixFlag[i] == 1) {\n                        add(elements[i], params.before)\n                        rm(elements[i], params.after) // Last top fixed header\n                    } else if (fixFlag[i] != fixFlag[i - 1] && fixFlag[i] == 2) {\n                        add(elements[i], params.after)\n                        rm(elements[i], params.before) // First bottom fixed header\n                    } else {\n                        rm(elements[i], params.before)\n                        rm(elements[i], params.after)\n                    }\n\n                    if (params.grad) {\n                        if (gradFlag[i]) {\n                            add(elements[i], params.grad)\n                        } else {\n                            rm(elements[i], params.grad)\n                        }\n                    }\n                }\n            }\n        }\n    })\n\n    this.on('resize upd', function(updParams) {\n        init.call(this, updParams && updParams.fix)\n    })\n\n    return this\n}\n","module.exports = function log(level, msg, more) {\n    var func = console[level] || console.log\n    var args = [\n        'Baron: ' + msg,\n        more\n    ]\n\n    Function.prototype.apply.call(func, console, args)\n}\n","'use strict'\n\n// Test via a getter in the options object to see if the passive property is accessed\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\nvar supportsPassive = false\n\ntry {\n    var opts = Object.defineProperty({}, 'passive', {\n        get: function() {\n            supportsPassive = true\n        }\n    })\n\n    window.addEventListener('test', null, opts)\n} catch (e) {\n    // pass\n}\n\nmodule.exports.event = function event(elem, _eventNames, handler, mode) {\n    var eventNames = _eventNames.split(' ')\n    var prefix = mode == 'on' ? 'add' : 'remove'\n\n    eventNames.forEach(function(eventName) {\n        var options = false\n\n        if (['scroll', 'touchstart', 'touchmove'].indexOf(eventName) != -1 && supportsPassive) {\n            options = { passive: true }\n        }\n\n        elem[prefix + 'EventListener'](eventName, handler, options)\n    })\n}\n\nfunction each(obj, handler) {\n    for (var key in obj) {\n        if (obj.hasOwnProperty(key)) {\n            handler(key, obj[key])\n        }\n    }\n}\n\nmodule.exports.css = function css(node, key, value) {\n    var styles\n\n    if (value === undefined) {\n        // Getter mode\n        if (typeof key == 'string') {\n            return node.style[key]\n        }\n\n        styles = key\n    } else {\n        styles = {}\n        styles[key] = value\n    }\n\n    each(styles, function(k, val) {\n        node.style[k] = val\n    })\n}\n\nmodule.exports.add = function add(node, cls) {\n    if (!cls) {\n        return\n    }\n\n    node.classList.add(cls)\n}\n\nmodule.exports.rm = function add(node, cls) {\n    if (!cls) {\n        return\n    }\n\n    node.classList.remove(cls)\n}\n\nmodule.exports.has = function has(node, cls) {\n    if (!cls) {\n        return false\n    }\n\n    return node.classList.contains(cls)\n}\n\nmodule.exports.clone = function clone(_input) {\n    var output = {}\n    var input = _input || {}\n\n    each(input, function(key, value) {\n        output[key] = value\n    })\n\n    return output\n}\n\nmodule.exports.qs = function qs(selector, _ctx) {\n    if (selector instanceof HTMLElement) {\n        return selector\n    }\n\n    var ctx = _ctx || document\n\n    return ctx.querySelector(selector)\n}\n\nmodule.exports.each = each\n"],"names":["DEFAULT_PORTS","http","https","ftp","AngularLocationWrapper","constructor","this","absUrl","wrapInDeprecationWarning","hash","host","path","port","protocol","replace","search","state","url","fn","replacement","self","deprecationWarning","name","apply","arguments","window","location","origin","newHash","navigationLogger","Error","locationService","slice","URL","href","hostname","pathname","parsedPath","String","startsWith","length","parseInt","paramValue","newQuery","locationSearchToObject","key","Object","keys","undefined","updatedUrl","urlUtil","newUrl","trim","coreModule","angular","angularModules","$rootScope","$document","$timeout","restrict","template","transclude","scope","ctrl","link","elem","panel","subs","Subscription","panelScrollbar","updateDimensionsFromParentScope","height","$parent","size","width","events","on","PanelEvents","__proto__","scrollable","scrollRootClass","scrollerClass","scrollBarHTML","scrollRoot","scroller","find","addClass","$","appendTo","baron","root","bar","barOnCls","scrollingCls","scroll","add","subscribe","RefreshEvent","emit","RenderEvent","event","payload","fromAngular","update","publish","$on","off","unsubscribe","removeAllListeners","dispose","PanelDirectiveReadyEvent","directiveModule","directiveCache","panelEditorTab","dynamicDirectiveSrv","create","editorTab","directive","pluginId","tabName","title","toLowerCase","result","directiveFn","QueryRowCtrl","$onInit","panelCtrl","queryCtrl","target","hasTextEditMode","toggleEditorMode","bind","getCollapsedText","controller","bindToController","controllerAs","templateUrl","canCollapse","input","sort","arr","start","end","isUndefined","isObject","isArray","isNull","toString","date","mode","dateTime","fromNow","templateSrv","getTemplateSrv","filterFunc","text","scopedVars","row","replaceWithText","$stateful","AlertSrv","set","console","warn","DynamicDirectiveSrv","$compile","addDirective","element","child","document","createElement","empty","append","attrs","options","directiveInfo","registered","$normalize","watchPath","childScope","$watch","$destroy","$new","getReactComponent","$injector","reactComponent","get","e","split","reduce","current","namePart","applyFunctions","obj","propsConfig","prev","value","config","wrapApply","wrappedInApply","wrapped","args","phase","$root","$$phase","$apply","applied","watchProps","watchDepth","watchExpressions","listener","supportsWatchCollection","$watchCollection","supportsWatchGroup","$watchGroup","watchGroupExpressions","expr","actualExpr","prop","Array","exprWatchDepth","getPropWatchDepth","match","push","renderComponent","component","props","$evalAsync","ReactDOM","React","getPropConfig","findAttribute","propName","attr","kebabCase","defaultWatch","ngModule","uiSegmentSrv","$sce","MetricSegment","html","trustAsHtml","type","expandable","isString","highlightVariablesAsHtml","cssClass","custom","fake","selectMode","getSegmentForValue","fallbackText","newSegment","newSelectMeasurement","newFake","newKey","newKeyValue","newCondition","condition","newOperator","op","newOperators","ops","map","transformToSegments","addTemplateVars","variableTypeFilter","results","segments","segment","each","getVariables","variable","unshift","newSelectMetric","newPlusButton","renderMyComponent","$eval","onScopeDestroy","unmountComponent","factory","reactComponentName","conf","injectableProps","scopeProps","forEach","getPropName","propExpressions","propTypes","popoverSrv","openDrop","close","show","extend","model","drop","dismiss","contentElement","innerHTML","Drop","content","position","classes","classNames","openOn","hoverCloseDelay","tetherOptions","constraints","to","attachment","setTimeout","tether","destroy","onClose","open","Timer","register","promise","timers","cancel","without","cancelAll","t","AngularLoader","load","assign","compiledElem","remove","digest","$digest","getScope","$win","dropdownTypeahead","menuItems","dropdownTypeaheadOnSelect","$scope","$input","$button","linkText","ngModel","newValue","item","submenu","subItem","typeaheadValues","memo","index","subIndex","click","menuItemSelected","menuItem","$item","$subItem","hide","val","focus","removeClass","typeahead","source","minLength","items","updater","submenuItem","trigger","keyup","toggleClass","mousedown","evt","preventDefault","blur","contents","dropdownTypeahead2","buttonTemplateClass","timeoutId","closeDropdownMenu","autofillEventFix","dispatchChangeEvent","Event","dispatchEvent","onAnimationStart","animationName","addEventListener","removeEventListener","metricSegment","getOptions","onChange","debounce","cancelBlur","linkMode","debounceLookup","updateVariableValue","selected","altSegments","switchToLink","fromClick","clearTimeout","inputBlur","query","callback","$query","then","alt","escape","indexOf","unescape","matcher","str","substring","data","lookup","$element","process","leading","keydown","keyCode","css","Math","max","metricSegmentModel","property","pre","cachedOptions","valueToSegment","option","getOptionsInternal","Promise","resolve","onSegmentChange","$$postDigest","tip","_t","icon","m","charCodeAt","replaceWith","compile","editorOptBool","ngchange","change","showIf","editorCheckbox","$interpolate","label","$id","gfDropdown","$parse","buildTemplate","placement","ul","divider","splice","li","method","join","iElement","iAttrs","getter","insertAfter","next","defaults","offset","x","y","opts","$tooltip","body","injector","invoke","tmpScope","scopeData","outerWidth","outerHeight","left","top","onchange","inputValue","priority","require","elm","ngModelCtrl","$setViewValue","$parsers","viewValue","$validators","integer","modelValue","$isEmpty","rangeUtil","invalid","setColor","color","borderColor","getTagColorsFromName","rebuildOnChange","$animate","multiElement","terminal","block","previousElements","cleanUp","nodes","node","endNode","blockNodes","nextSibling","i","call","getBlockNodes","clone","leave","oldValue","showNull","newScope","createComment","enter","parent","tagColorFromName","getItemProperty","onTagsUpdated","select","placeholder","tagsinput","typeaheadSource","widthClass","itemValue","itemvalue","itemText","itemtext","tagClass","tagclass","tagElement","children","filter","idx","stopPropagation","giveFocus","domEl","setSelectionRange","pos","DeltaCtrl","observer","MutationObserver","observe","attributes","attributeFilter","characterData","childList","subtree","$onDestroy","disconnect","LinkJSONCtrl","$anchorScroll","goToLine","line","unbind","switchView","$formatters","react2AngularDirective","reactDirective","provideTheme","Input","LegacyForms","DefaultTarget","editorMode","EditorMode","projectName","projects","metricType","filters","metricKind","MetricKind","valueType","refId","labels","variableOptionGroup","variableOptions","AnnotationQueryEditor","unit","onQueryChange","datasource","setState","getLabels","getDefaultProject","toOption","getProjects","render","templateVariableOptions","metric","onMetricTypeChange","className","regions","regionIsLoading","useRegions","EditorHeader","InlineSelect","v","region","allowCustomValue","isLoading","Space","MetricStatEditor","disableExpressions","editorQuery","onRunQuery","EditorRow","EditorField","tooltip","period","optional","Switch","prefixMatching","currentTarget","checked","disabled","actionPrefix","alarmNamePrefix","Select","MetricSelect","isSearchable","useSelectOptions","useSelectedOption","onChangeValue","useCallback","selectable","menuShouldPortal","isMulti","isClearable","backspaceRemovesValue","maxMenuHeight","noOptionsMessage","variables","useMemo","every","o","flatten","LokiAnnotationsQueryEditor","maxLines","instant","queryWithRefId","LokiQueryField","onBlur","history","ExtraFieldElement","LokiOptionFields","lineLimitValue","resolution","SecretFormField","queryPartEditorDirective","part","handleEvent","partDef","def","$paramsContainer","clickFuncParam","paramIndex","$link","params","updateParam","$event","inputKeyPress","which","inputKeyDown","style","addElementsAndCompile","param","$paramLink","partial","keypress","dynamicLookup","dynamicOptions","addTypeahead","partActions","showActionsMenu","promiseToDigest","res","triggerPartAction","action","typeaheadMatcher","FormDropdownCtrl","inputElement","first","linkElement","labelMode","lookupText","modelChanged","cssClasses","typeaheadUpdater","startOpen","isPromiseLike","updateDisplay","optionCache","optionTexts","allowCustom","updateValue","$option","display","grafanaScrollbar","scrollParams","track","direction","scrollbar","object","startExpanded","rootName","expansionLevel","jsonObject","JsonExplorer","animateOpen","SwitchCtrl","id","internalOnChange","labelClass","switchClass","wide","appendChild","dropOptions","hoverOpenDelay","pin","$applyAsync","onColorChange","async","langMode","showGutter","tabSize","behavioursEnabled","snippetsEnabled","aceElem","default","ace","codeEditor","edit","editorSession","getSession","editorOptions","highlightActiveLine","showPrintMargin","autoScrollEditorIntoView","setOptions","$blockScrolling","Infinity","renderer","setScrollMargin","setPadding","theme","setTheme","setThemeMode","lang","acequire","enableBasicAutocompletion","enableLiveAutocompletion","enableSnippets","getCompleter","anyEditor","completers","aceModeName","setMode","setLangMode","setEditorContent","textarea","setValue","clearSelection","textareaLabel","codeEditorFocus","getValue","editorValue","commands","addCommand","bindKey","win","mac","exec","sqlPartEditorDirective","separator","suggestUrl","noDirectAccess","showForwardOAuthIdentityOption","showAccessOption","datasourceSetting","pluginDirectiveLoader","$http","$templateCache","$location","relativeTemplateUrlToAbs","baseUrl","loadPanelComponentInfo","componentInfo","bindings","dashboard","class","panelInfo","importPanelPlugin","panelPlugin","PanelCtrl","angularPanelCtrl","Component","templatePromise","cached","getTemplate","registerPluginComponent","notFound","message","directiveName","init","$broadcast","appendAndCompile","ds","meta","components","QueryCtrl","currentDatasource","importDataSourcePlugin","dsPlugin","annotation","AnnotationsQueryCtrl","dsMeta","datasourceMeta","angularUrl","onModelChanged","angularConfigCtrl","importAppPlugin","appPlugin","appModel","appEditCtrl","reject","getModule","catch","err","error","GrafanaCtrl","utilSrv","contextSrv","angularLoader","setAngularLoader","setLegacyAngularInjector","setAppEvents","appEvents","initGrafanaLive","appSubUrl","_","colors","onAppEvent","localScope","callerScope","appEvent","$emit","CoreEvents","lastActivity","Date","getTime","activeUser","userActivityDetected","mousemove","capture","passive","setInterval","hasClass","parents","clickAutoHide","closest","clickAutoHideParent","detach","popover","RouteParamsProvider","RouteProvider","$get","initAngularRoutingBridge","$provide","decorator","$delegate","onUrlChange","UtilSrv","$modal","ShowModalEvent","showModal","HideModalEvent","hideModal","modalScope","modal","modalClass","src","templateHtml","persist","keyboard","backdrop","modalEl","AnnotationsSrv","clearPromiseCaches","getAnnotations","annotations","alertState","getAlertStates","getGlobalAnnotations","saveAnnotationEvent","saveAnnotation","updateAnnotationEvent","updateAnnotation","deleteAnnotationEvent","deleteAnnotation","translateQueryResult","snapshotData","cloneDeep","iconColor","isRegion","timeEnd","time","AngularApp","preBootModules","ngModuleDependencies","registerFunctions","$controllerProvider","$compileProvider","$filterProvider","$httpProvider","debugInfoEnabled","useApplyAsync","service","useModule","DashboardLoaderSrv","getTimeSrv","Footer","Icon","Spinner","HelpModal","PageHeader","EmptyListCTA","SearchField","SearchResults","SearchResultsFilter","TagFilter","ColorPicker","SeriesColorPickerPopoverWithTheme","UnitPicker","CloudMonitoringQueryEditor","CloudMonitoringAnnotationQueryEditor","CloudWatchAnnotationQueryEditor","GraphContextMenu","DataLinksInlineEditor","DataSourceHttpSettings","FolderPicker","TimePickerSettings","QueryEditor","ClipboardButton","getBackendSrv","getDashboardSrv","getDataSourceSrv","getLinkSrv","validationSrv","exposeToPlugin","__esModule","sdk","animation","module","bootstrap","getElementById","oldInvoke","locals","serviceName","parentScope","currentAnnotation","isAppConfigCtrl","monkeyPatchInjectorWithPreAssignedBindings","MetricsPanelCtrl","super","panelData","LoadingState","loading","processDataError","angularDirtyCheck","request","timeInfo","timeRange","range","useDataFrames","handleDataFrames","series","legacy","toLegacyResponseData","handleQueryResult","datasourceSrv","timeSrv","onMetricsPanelRefresh","onPanelTearDown","onMetricsPanelMounted","queryRunner","getQueryRunner","querySubscription","getData","withTransforms","withFieldConfig","panelDataObserver","otherPanelInFullscreenMode","updateTimeRange","issueQueries","cancelled","log","newTimeData","applyPanelTimeOverrides","run","queries","targets","panelId","dashboardId","timezone","getTimezone","maxDataPoints","minInterval","interval","cacheTimeout","transformations","snapshot","frame","toDataFrameDTO","plugin","editorTabs","EventBusSrv","timing","pluginName","panelDidMount","panelInitialized","renderingCompleted","profiler","refresh","publishAppEvent","initEditMode","editModeInitiated","addEditorTab","getExtendedMenu","menu","otherPanelInFullscreen","isLastQuery","templates","finally","queryTypeOptions","LokiQueryType","description","DEFAULT_RESOLUTION","RESOLUTION_OPTIONS","concat","runOnBlur","queryType","onQueryTypeChange","rest","cx","InlineFormLabel","RadioButtonGroup","InlineField","min","preprocessMaxLines","nextQuery","onChangeQueryLimit","onKeyDown","NaN","isNaN","LokiResultType","makeClassES5Compatible","PanelCtrlES6","MetricsPanelCtrlES6","QueryCtrlES6","$q","$strapConfig","when","cache","ev","bsTooltip","$this","is","isFunction","container","r","Constructor","prototype","_tooltip","bsTypeahead","shown","proxy","matchAll","transitionEnd","support","transition","el","transEndEventNames","jQuery","toggle","Dropdown","$el","clearMenus","getParent","selector","test","isActive","documentElement","insertBefore","$items","eq","old","dropdown","noConflict","Modal","delegate","remote","isShown","that","isDefaultPrevented","offsetWidth","enforceFocus","one","hideWithTransition","has","timeout","removeBackdrop","$backdrop","animate","doAnimate","$target","Tooltip","eventIn","eventOut","triggers","enabled","_options","fixTitle","delay","hoverState","$tip","actualWidth","actualHeight","tp","hasContent","setContent","getPosition","offsetHeight","applyPlacement","delta","replaceArrow","dimension","arrow","getTitle","$e","getBoundingClientRect","$arrow","validate","parentNode","enable","disable","toggleEnabled","removeData","Tab","previous","$ul","relatedTarget","activate","$active","tab","Typeahead","sorter","highlighter","$menu","listen","grep","beginswith","caseSensitive","caseInsensitive","shift","RegExp","$1","last","eventSupported","mouseenter","mouseleave","eventName","isSupported","setAttribute","move","shiftKey","suppressKeyPressRepeat","inArray","submit","focused","mousedover","Affix","affix","$window","checkPosition","scrollHeight","scrollTop","offsetBottom","bottom","offsetTop","unpin","affixed","$spy","defaultOptions","freeInput","maxTags","confirmKeys","onTagExists","$tag","fadeIn","TagsInput","itemsArray","isSelect","tagName","multiple","hasAttribute","objectItems","placeholderText","$container","after","build","makeOptionItemFunction","propertyName","dontPushVal","pushVal","existing","$existingTag","htmlEncode","findInputWrapper","before","other","removeAll","pop","isEnabled","nodeType","nodeValue","makeOptionFunction","processItems","texts","success","regex","$inputWrapper","doGetCaretPosition","$prevTag","$nextTag","inputSize","elt","arg1","arg2","retVal","htmlEncodeContainer","oField","iCaretPos","selection","oSel","createRange","moveStart","selectionStart","bindonceModule","toBoolean","lowercase","msie","navigator","userAgent","$attrs","showHideBinder","classBinder","watcherRemover","binders","group","boName","ran","addBinder","binder","runBinders","setupWatcher","bindonceValue","removeWatcher","afterNode","afterNextSibling","selectedTranscludes","switchCtrl","cases","selectedTransclude","boSwitchWhen","attrValue","attrKey","newAttr","bindonceController","bindonce","attribute","interpolate","boDirective","tElement","tAttrs","controllers","boParent","parentValue","routeToRegExp","pattern","slash","star","ignoreTrailingSlashes","regexp","caseInsensitiveMatch","isDefined","noop","isEagerInstantiationEnabled","ngRouteModule","info","angularVersion","provider","inherit","extra","routes","route","routeCopy","dst","ii","charAt","shallowCopy","reloadOnUrl","reloadOnSearch","originalPath","redirectPath","substr","redirectTo","otherwise","eagerInstantiationEnabled","$routeParams","$templateRequest","$browser","preparedRoute","preparedRouteIsUpdateOnly","forceReload","$route","reload","fakeLocationEvent","defaultPrevented","prepareRoute","commitRoute","updateParams","newParams","$$route","$routeMinErr","$locationEvent","newRoute","oldRoute","lastRoute","len","switchRouteMatcher","pathParams","equals","nextRoute","copy","nextRoutePromise","$$incOutstandingRequestCount","getRedirectionData","handlePossibleRedirection","keepProcessingRoute","resolveLocals","$$completeOutstandingRequest","hasRedirection","oldPath","oldSearch","resolveRedirectTo","oldUrl","loadedTemplateUrl","valueOf","getTemplateFor","all","string","segmentMatch","instantiateRoute","$$minErr","ngViewFactory","$transclude","currentScope","currentElement","previousLeaveAnimation","autoScrollExp","autoscroll","onloadExp","onload","cleanupLastView","done","response","$template","ngViewFillContentFactory","$controller","resolveAs","$inject","exports","nodeContains","htmlParser","htmlSanitizeWriter","$sanitizeMinErr","hasBeenInstantiated","svgEnabled","$$sanitizeUri","validElements","svgElements","buf","uri","isImage","enableSvg","addValidElements","elements","htmlElements","addElementsTo","voidElements","htmlVoidElements","addValidAttrs","validAttrs","arrayToMap","$$lowercase","handler","inertBodyElement","getInertBodyElement","mXSSAttempts","firstChild","nodeName","attrToMap","chars","textContent","nextNode","getNonDescendant","removeChild","uriValidator","ignoreCurrentElement","out","tag","blockedElements","lkey","uriAttrs","encodeEntities","Node","contains","arg","compareDocumentPosition","SURROGATE_PAIR_REGEXP","NON_ALPHANUMERIC_REGEXP","stringToMap","optionalEndTagBlockElements","optionalEndTagInlineElements","optionalEndTagElements","blockElements","inlineElements","htmlAttrs","svgAttrs","lowercaseKeys","elementsMap","newElements","getInertBodyElement_DOMParser","isDOMParserAvailable","implementation","inertDocument","createHTMLDocument","getDocumentElement","querySelector","documentMode","stripCustomNsAttrs","DOMParser","parseFromString","ELEMENT_NODE","l","attrNode","attrName","lastIndexOf","removeAttributeNode","outerHTML","outerText","$sanitize","LINKY_URL_REGEXP","MAILTO_REGEXP","linkyMinErr","attributesFn","raw","addText","addLink","linkAttributes","autoUpdateOne","watcher","_au","debouncedUpdater","_debounce","_observer","actualizeWatcher","stopWatch","startWatch","clearInterval","WebKitMutationObserver","MozMutationObserver","qs","screen","forward","clipper","_eventHandlers","backward","xBar","offsetPos","sign","client","g","eval","scopedWindow","rm","_baron","instances","oppos","crossPos","crossOpPos","crossSize","crossMinSize","crossMaxSize","crossClient","scrollEdge","crossOffset","scrollSize","h","isMacFF","user","jQueryMode","rootNode","tryNode","HTMLElement","defaultParams","resizeDebounce","cssGuru","impact","_chain","manageAttr","instance","manageEvents","autoUpdate","eventManager","drag","now","draggingCls","button","_pos0","clipperOnScroll","_obj","iterator","arrayEach","removeAttribute","getAttribute","fire","func","wait","timestamp","later","_disposed","barPos","scrollerPos0","resizePauseTimer","scrollingTimer","resizeLastFire","oldBarSize","setBarSize","_size","barMinSize","posBar","_pos","was","will","k","barTopLimit","relToPos","posToRel","dontPosSelect","rtl","cursor","originalEvent","touches","ie","rpos","free","barOn","noScroll","rel","sub","resize","minPeriod","upd","padding","_setCrossSizes","styles","updatePositions","force","newBarSize","_dumbCss","overflow","msOverflowStyle","scrollerCss","margin","border","right","paddingWas","getComputedStyle","numWas","names","userArg","version","fix","controls","userParams","viewPortSize","outside","inside","past","future","radius","minView","topFixHeights","topRealHeights","headerTops","fixElement","flag","ori","bubbleWheel","createEvent","initWebKitWheelEvent","wheelDeltaX","wheelDeltaY","ex","_params","querySelectorAll","limiter","num","j","locPos","x1","x2","clickable","fixFlag","gradFlag","fixState","hTop","gradState","grad","updParams","level","msg","more","Function","supportsPassive","defineProperty","hasOwnProperty","_eventNames","eventNames","prefix","cls","classList","_input","output","_ctx"],"sourceRoot":""}