{"version":3,"sources":["node_modules/@angular/cdk/fesm2022/shadow-dom-B0oHn41l.mjs","node_modules/@angular/cdk/fesm2022/backwards-compatibility-DHR38MsD.mjs","node_modules/@angular/cdk/fesm2022/platform-DmdVEw_C.mjs","node_modules/@angular/cdk/fesm2022/passive-listeners-esHZRgIN.mjs","node_modules/@angular/cdk/fesm2022/element-x4z00URv.mjs","node_modules/@angular/cdk/fesm2022/fake-event-detection-DWOdFTFz.mjs","node_modules/@angular/cdk/fesm2022/focus-monitor-e2l_RpN3.mjs","node_modules/@angular/cdk/fesm2022/style-loader-Cu9AvjH9.mjs","node_modules/@angular/cdk/fesm2022/private.mjs","node_modules/@angular/cdk/fesm2022/observers.mjs","node_modules/@angular/cdk/fesm2022/array-I1yfCXUO.mjs","node_modules/@angular/cdk/fesm2022/breakpoints-observer-CljOfYGy.mjs","node_modules/@angular/cdk/fesm2022/a11y-module-BYox5gpI.mjs","node_modules/@angular/cdk/fesm2022/id-generator-Dw_9dSDu.mjs","node_modules/@angular/cdk/fesm2022/keycodes.mjs","node_modules/@angular/cdk/fesm2022/typeahead-9ZW4Dtsf.mjs","node_modules/@angular/cdk/fesm2022/list-key-manager-CyOIXo8P.mjs","node_modules/@angular/cdk/fesm2022/focus-key-manager-C1rAQJ5z.mjs","node_modules/@angular/cdk/fesm2022/a11y.mjs","node_modules/@angular/cdk/fesm2022/directionality-CBXD4hga.mjs","node_modules/@angular/cdk/fesm2022/bidi.mjs","node_modules/@angular/material/fesm2022/common-module-WayjW0Pb.mjs","node_modules/@angular/cdk/fesm2022/scrolling-BkvA05C8.mjs","node_modules/@angular/cdk/fesm2022/scrolling.mjs","node_modules/@angular/cdk/fesm2022/portal-directives-Bw5woq8I.mjs","node_modules/@angular/cdk/fesm2022/boolean-property-DaaVhX5A.mjs","node_modules/@angular/cdk/fesm2022/css-pixel-value-C_HEqLhI.mjs","node_modules/@angular/cdk/fesm2022/test-environment-CT0XxPyp.mjs","node_modules/@angular/material/fesm2022/ripple-BT3tzh6F.mjs","node_modules/@angular/material/fesm2022/structural-styles-BQUT6wsL.mjs"],"sourcesContent":["let shadowDomIsSupported;\n/** Checks whether the user's browser support Shadow DOM. */\nfunction _supportsShadowDom() {\n  if (shadowDomIsSupported == null) {\n    const head = typeof document !== 'undefined' ? document.head : null;\n    shadowDomIsSupported = !!(head && (head.createShadowRoot || head.attachShadow));\n  }\n  return shadowDomIsSupported;\n}\n/** Gets the shadow root of an element, if supported and the element is inside the Shadow DOM. */\nfunction _getShadowRoot(element) {\n  if (_supportsShadowDom()) {\n    const rootNode = element.getRootNode ? element.getRootNode() : null;\n    // Note that this should be caught by `_supportsShadowDom`, but some\n    // teams have been able to hit this code path on unsupported browsers.\n    if (typeof ShadowRoot !== 'undefined' && ShadowRoot && rootNode instanceof ShadowRoot) {\n      return rootNode;\n    }\n  }\n  return null;\n}\n/**\n * Gets the currently-focused element on the page while\n * also piercing through Shadow DOM boundaries.\n */\nfunction _getFocusedElementPierceShadowDom() {\n  let activeElement = typeof document !== 'undefined' && document ? document.activeElement : null;\n  while (activeElement && activeElement.shadowRoot) {\n    const newActiveElement = activeElement.shadowRoot.activeElement;\n    if (newActiveElement === activeElement) {\n      break;\n    } else {\n      activeElement = newActiveElement;\n    }\n  }\n  return activeElement;\n}\n/** Gets the target of an event while accounting for Shadow DOM. */\nfunction _getEventTarget(event) {\n  // If an event is bound outside the Shadow DOM, the `event.target` will\n  // point to the shadow root so we have to use `composedPath` instead.\n  return event.composedPath ? event.composedPath()[0] : event.target;\n}\nexport { _getEventTarget as _, _getShadowRoot as a, _supportsShadowDom as b, _getFocusedElementPierceShadowDom as c };\n","import { VERSION } from '@angular/core';\n\n// TODO(crisbeto): remove this function when making breaking changes for v20.\n/**\n * Binds an event listener with specific options in a backwards-compatible way.\n * This function is necessary, because `Renderer2.listen` only supports listener options\n * after 19.1 and during the v19 period we support any 19.x version.\n * @docs-private\n */\nfunction _bindEventWithOptions(renderer, target, eventName, callback, options) {\n  const major = parseInt(VERSION.major);\n  const minor = parseInt(VERSION.minor);\n  // Event options in `listen` are only supported in 19.1 and beyond.\n  // We also allow 0.0.x, because that indicates a build at HEAD.\n  if (major > 19 || major === 19 && minor > 0 || major === 0 && minor === 0) {\n    return renderer.listen(target, eventName, callback, options);\n  }\n  target.addEventListener(eventName, callback, options);\n  return () => {\n    target.removeEventListener(eventName, callback, options);\n  };\n}\nexport { _bindEventWithOptions as _ };\n","import * as i0 from '@angular/core';\nimport { inject, PLATFORM_ID, Injectable } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n// Whether the current platform supports the V8 Break Iterator. The V8 check\n// is necessary to detect all Blink based browsers.\nlet hasV8BreakIterator;\n// We need a try/catch around the reference to `Intl`, because accessing it in some cases can\n// cause IE to throw. These cases are tied to particular versions of Windows and can happen if\n// the consumer is providing a polyfilled `Map`. See:\n// https://github.com/Microsoft/ChakraCore/issues/3189\n// https://github.com/angular/components/issues/15687\ntry {\n  hasV8BreakIterator = typeof Intl !== 'undefined' && Intl.v8BreakIterator;\n} catch {\n  hasV8BreakIterator = false;\n}\n/**\n * Service to detect the current platform by comparing the userAgent strings and\n * checking browser-specific global properties.\n */\nlet Platform = /*#__PURE__*/(() => {\n  class Platform {\n    _platformId = inject(PLATFORM_ID);\n    // We want to use the Angular platform check because if the Document is shimmed\n    // without the navigator, the following checks will fail. This is preferred because\n    // sometimes the Document may be shimmed without the user's knowledge or intention\n    /** Whether the Angular application is being rendered in the browser. */\n    isBrowser = this._platformId ? isPlatformBrowser(this._platformId) : typeof document === 'object' && !!document;\n    /** Whether the current browser is Microsoft Edge. */\n    EDGE = this.isBrowser && /(edge)/i.test(navigator.userAgent);\n    /** Whether the current rendering engine is Microsoft Trident. */\n    TRIDENT = this.isBrowser && /(msie|trident)/i.test(navigator.userAgent);\n    // EdgeHTML and Trident mock Blink specific things and need to be excluded from this check.\n    /** Whether the current rendering engine is Blink. */\n    BLINK = this.isBrowser && !!(window.chrome || hasV8BreakIterator) && typeof CSS !== 'undefined' && !this.EDGE && !this.TRIDENT;\n    // Webkit is part of the userAgent in EdgeHTML, Blink and Trident. Therefore we need to\n    // ensure that Webkit runs standalone and is not used as another engine's base.\n    /** Whether the current rendering engine is WebKit. */\n    WEBKIT = this.isBrowser && /AppleWebKit/i.test(navigator.userAgent) && !this.BLINK && !this.EDGE && !this.TRIDENT;\n    /** Whether the current platform is Apple iOS. */\n    IOS = this.isBrowser && /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window);\n    // It's difficult to detect the plain Gecko engine, because most of the browsers identify\n    // them self as Gecko-like browsers and modify the userAgent's according to that.\n    // Since we only cover one explicit Firefox case, we can simply check for Firefox\n    // instead of having an unstable check for Gecko.\n    /** Whether the current browser is Firefox. */\n    FIREFOX = this.isBrowser && /(firefox|minefield)/i.test(navigator.userAgent);\n    /** Whether the current platform is Android. */\n    // Trident on mobile adds the android platform to the userAgent to trick detections.\n    ANDROID = this.isBrowser && /android/i.test(navigator.userAgent) && !this.TRIDENT;\n    // Safari browsers will include the Safari keyword in their userAgent. Some browsers may fake\n    // this and just place the Safari keyword in the userAgent. To be more safe about Safari every\n    // Safari browser should also use Webkit as its layout engine.\n    /** Whether the current browser is Safari. */\n    SAFARI = this.isBrowser && /safari/i.test(navigator.userAgent) && this.WEBKIT;\n    constructor() {}\n    static ɵfac = function Platform_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || Platform)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: Platform,\n      factory: Platform.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return Platform;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { Platform as P };\n","/** Cached result of whether the user's browser supports passive event listeners. */\nlet supportsPassiveEvents;\n/**\n * Checks whether the user's browser supports passive event listeners.\n * See: https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n */\nfunction supportsPassiveEventListeners() {\n  if (supportsPassiveEvents == null && typeof window !== 'undefined') {\n    try {\n      window.addEventListener('test', null, Object.defineProperty({}, 'passive', {\n        get: () => supportsPassiveEvents = true\n      }));\n    } finally {\n      supportsPassiveEvents = supportsPassiveEvents || false;\n    }\n  }\n  return supportsPassiveEvents;\n}\n/**\n * Normalizes an `AddEventListener` object to something that can be passed\n * to `addEventListener` on any browser, no matter whether it supports the\n * `options` parameter.\n * @param options Object to be normalized.\n */\nfunction normalizePassiveListenerOptions(options) {\n  return supportsPassiveEventListeners() ? options : !!options.capture;\n}\nexport { normalizePassiveListenerOptions as n, supportsPassiveEventListeners as s };\n","import { ElementRef } from '@angular/core';\nfunction coerceNumberProperty(value, fallbackValue = 0) {\n  if (_isNumberValue(value)) {\n    return Number(value);\n  }\n  return arguments.length === 2 ? fallbackValue : 0;\n}\n/**\n * Whether the provided value is considered a number.\n * @docs-private\n */\nfunction _isNumberValue(value) {\n  // parseFloat(value) handles most of the cases we're interested in (it treats null, empty string,\n  // and other non-number values as NaN, where Number just uses 0) but it considers the string\n  // '123hello' to be a valid number. Therefore we also check if Number(value) is NaN.\n  return !isNaN(parseFloat(value)) && !isNaN(Number(value));\n}\n\n/**\n * Coerces an ElementRef or an Element into an element.\n * Useful for APIs that can accept either a ref or the native element itself.\n */\nfunction coerceElement(elementOrRef) {\n  return elementOrRef instanceof ElementRef ? elementOrRef.nativeElement : elementOrRef;\n}\nexport { _isNumberValue as _, coerceElement as a, coerceNumberProperty as c };\n","/** Gets whether an event could be a faked `mousedown` event dispatched by a screen reader. */\nfunction isFakeMousedownFromScreenReader(event) {\n  // Some screen readers will dispatch a fake `mousedown` event when pressing enter or space on\n  // a clickable element. We can distinguish these events when `event.buttons` is zero, or\n  // `event.detail` is zero depending on the browser:\n  // - `event.buttons` works on Firefox, but fails on Chrome.\n  // - `detail` works on Chrome, but fails on Firefox.\n  return event.buttons === 0 || event.detail === 0;\n}\n/** Gets whether an event could be a faked `touchstart` event dispatched by a screen reader. */\nfunction isFakeTouchstartFromScreenReader(event) {\n  const touch = event.touches && event.touches[0] || event.changedTouches && event.changedTouches[0];\n  // A fake `touchstart` can be distinguished from a real one by looking at the `identifier`\n  // which is typically >= 0 on a real device versus -1 from a screen reader. Just to be safe,\n  // we can also look at `radiusX` and `radiusY`. This behavior was observed against a Windows 10\n  // device with a touch screen running NVDA v2020.4 and Firefox 85 or Chrome 88.\n  return !!touch && touch.identifier === -1 && (touch.radiusX == null || touch.radiusX === 1) && (touch.radiusY == null || touch.radiusY === 1);\n}\nexport { isFakeTouchstartFromScreenReader as a, isFakeMousedownFromScreenReader as i };\n","import * as i0 from '@angular/core';\nimport { InjectionToken, inject, NgZone, RendererFactory2, Injectable, ElementRef, EventEmitter, Directive, Output } from '@angular/core';\nimport { BehaviorSubject, Subject, of } from 'rxjs';\nimport { skip, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { DOCUMENT } from '@angular/common';\nimport { i as isFakeMousedownFromScreenReader, a as isFakeTouchstartFromScreenReader } from './fake-event-detection-DWOdFTFz.mjs';\nimport { d as ALT, C as CONTROL, M as MAC_META, e as META, f as SHIFT } from './keycodes-CpHkExLC.mjs';\nimport { _ as _getEventTarget, a as _getShadowRoot } from './shadow-dom-B0oHn41l.mjs';\nimport { _ as _bindEventWithOptions } from './backwards-compatibility-DHR38MsD.mjs';\nimport { P as Platform } from './platform-DmdVEw_C.mjs';\nimport { n as normalizePassiveListenerOptions } from './passive-listeners-esHZRgIN.mjs';\nimport { a as coerceElement } from './element-x4z00URv.mjs';\n\n/**\n * Injectable options for the InputModalityDetector. These are shallowly merged with the default\n * options.\n */\nconst INPUT_MODALITY_DETECTOR_OPTIONS = /*#__PURE__*/new InjectionToken('cdk-input-modality-detector-options');\n/**\n * Default options for the InputModalityDetector.\n *\n * Modifier keys are ignored by default (i.e. when pressed won't cause the service to detect\n * keyboard input modality) for two reasons:\n *\n * 1. Modifier keys are commonly used with mouse to perform actions such as 'right click' or 'open\n *    in new tab', and are thus less representative of actual keyboard interaction.\n * 2. VoiceOver triggers some keyboard events when linearly navigating with Control + Option (but\n *    confusingly not with Caps Lock). Thus, to have parity with other screen readers, we ignore\n *    these keys so as to not update the input modality.\n *\n * Note that we do not by default ignore the right Meta key on Safari because it has the same key\n * code as the ContextMenu key on other browsers. When we switch to using event.key, we can\n * distinguish between the two.\n */\nconst INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS = {\n  ignoreKeys: [ALT, CONTROL, MAC_META, META, SHIFT]\n};\n/**\n * The amount of time needed to pass after a touchstart event in order for a subsequent mousedown\n * event to be attributed as mouse and not touch.\n *\n * This is the value used by AngularJS Material. Through trial and error (on iPhone 6S) they found\n * that a value of around 650ms seems appropriate.\n */\nconst TOUCH_BUFFER_MS = 650;\n/**\n * Event listener options that enable capturing and also mark the listener as passive if the browser\n * supports it.\n */\nconst modalityEventListenerOptions = {\n  passive: true,\n  capture: true\n};\n/**\n * Service that detects the user's input modality.\n *\n * This service does not update the input modality when a user navigates with a screen reader\n * (e.g. linear navigation with VoiceOver, object navigation / browse mode with NVDA, virtual PC\n * cursor mode with JAWS). This is in part due to technical limitations (i.e. keyboard events do not\n * fire as expected in these modes) but is also arguably the correct behavior. Navigating with a\n * screen reader is akin to visually scanning a page, and should not be interpreted as actual user\n * input interaction.\n *\n * When a user is not navigating but *interacting* with a screen reader, this service attempts to\n * update the input modality to keyboard, but in general this service's behavior is largely\n * undefined.\n */\nlet InputModalityDetector = /*#__PURE__*/(() => {\n  class InputModalityDetector {\n    _platform = inject(Platform);\n    _listenerCleanups;\n    /** Emits whenever an input modality is detected. */\n    modalityDetected;\n    /** Emits when the input modality changes. */\n    modalityChanged;\n    /** The most recently detected input modality. */\n    get mostRecentModality() {\n      return this._modality.value;\n    }\n    /**\n     * The most recently detected input modality event target. Is null if no input modality has been\n     * detected or if the associated event target is null for some unknown reason.\n     */\n    _mostRecentTarget = null;\n    /** The underlying BehaviorSubject that emits whenever an input modality is detected. */\n    _modality = new BehaviorSubject(null);\n    /** Options for this InputModalityDetector. */\n    _options;\n    /**\n     * The timestamp of the last touch input modality. Used to determine whether mousedown events\n     * should be attributed to mouse or touch.\n     */\n    _lastTouchMs = 0;\n    /**\n     * Handles keydown events. Must be an arrow function in order to preserve the context when it gets\n     * bound.\n     */\n    _onKeydown = event => {\n      // If this is one of the keys we should ignore, then ignore it and don't update the input\n      // modality to keyboard.\n      if (this._options?.ignoreKeys?.some(keyCode => keyCode === event.keyCode)) {\n        return;\n      }\n      this._modality.next('keyboard');\n      this._mostRecentTarget = _getEventTarget(event);\n    };\n    /**\n     * Handles mousedown events. Must be an arrow function in order to preserve the context when it\n     * gets bound.\n     */\n    _onMousedown = event => {\n      // Touches trigger both touch and mouse events, so we need to distinguish between mouse events\n      // that were triggered via mouse vs touch. To do so, check if the mouse event occurs closely\n      // after the previous touch event.\n      if (Date.now() - this._lastTouchMs < TOUCH_BUFFER_MS) {\n        return;\n      }\n      // Fake mousedown events are fired by some screen readers when controls are activated by the\n      // screen reader. Attribute them to keyboard input modality.\n      this._modality.next(isFakeMousedownFromScreenReader(event) ? 'keyboard' : 'mouse');\n      this._mostRecentTarget = _getEventTarget(event);\n    };\n    /**\n     * Handles touchstart events. Must be an arrow function in order to preserve the context when it\n     * gets bound.\n     */\n    _onTouchstart = event => {\n      // Same scenario as mentioned in _onMousedown, but on touch screen devices, fake touchstart\n      // events are fired. Again, attribute to keyboard input modality.\n      if (isFakeTouchstartFromScreenReader(event)) {\n        this._modality.next('keyboard');\n        return;\n      }\n      // Store the timestamp of this touch event, as it's used to distinguish between mouse events\n      // triggered via mouse vs touch.\n      this._lastTouchMs = Date.now();\n      this._modality.next('touch');\n      this._mostRecentTarget = _getEventTarget(event);\n    };\n    constructor() {\n      const ngZone = inject(NgZone);\n      const document = inject(DOCUMENT);\n      const options = inject(INPUT_MODALITY_DETECTOR_OPTIONS, {\n        optional: true\n      });\n      this._options = {\n        ...INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS,\n        ...options\n      };\n      // Skip the first emission as it's null.\n      this.modalityDetected = this._modality.pipe(skip(1));\n      this.modalityChanged = this.modalityDetected.pipe(distinctUntilChanged());\n      // If we're not in a browser, this service should do nothing, as there's no relevant input\n      // modality to detect.\n      if (this._platform.isBrowser) {\n        const renderer = inject(RendererFactory2).createRenderer(null, null);\n        this._listenerCleanups = ngZone.runOutsideAngular(() => {\n          return [_bindEventWithOptions(renderer, document, 'keydown', this._onKeydown, modalityEventListenerOptions), _bindEventWithOptions(renderer, document, 'mousedown', this._onMousedown, modalityEventListenerOptions), _bindEventWithOptions(renderer, document, 'touchstart', this._onTouchstart, modalityEventListenerOptions)];\n        });\n      }\n    }\n    ngOnDestroy() {\n      this._modality.complete();\n      this._listenerCleanups?.forEach(cleanup => cleanup());\n    }\n    static ɵfac = function InputModalityDetector_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || InputModalityDetector)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: InputModalityDetector,\n      factory: InputModalityDetector.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return InputModalityDetector;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Detection mode used for attributing the origin of a focus event. */\nvar FocusMonitorDetectionMode = /*#__PURE__*/function (FocusMonitorDetectionMode) {\n  /**\n   * Any mousedown, keydown, or touchstart event that happened in the previous\n   * tick or the current tick will be used to assign a focus event's origin (to\n   * either mouse, keyboard, or touch). This is the default option.\n   */\n  FocusMonitorDetectionMode[FocusMonitorDetectionMode[\"IMMEDIATE\"] = 0] = \"IMMEDIATE\";\n  /**\n   * A focus event's origin is always attributed to the last corresponding\n   * mousedown, keydown, or touchstart event, no matter how long ago it occurred.\n   */\n  FocusMonitorDetectionMode[FocusMonitorDetectionMode[\"EVENTUAL\"] = 1] = \"EVENTUAL\";\n  return FocusMonitorDetectionMode;\n}(FocusMonitorDetectionMode || {});\n/** InjectionToken for FocusMonitorOptions. */\nconst FOCUS_MONITOR_DEFAULT_OPTIONS = /*#__PURE__*/new InjectionToken('cdk-focus-monitor-default-options');\n/**\n * Event listener options that enable capturing and also\n * mark the listener as passive if the browser supports it.\n */\nconst captureEventListenerOptions = /*#__PURE__*/normalizePassiveListenerOptions({\n  passive: true,\n  capture: true\n});\n/** Monitors mouse and keyboard events to determine the cause of focus events. */\nlet FocusMonitor = /*#__PURE__*/(() => {\n  class FocusMonitor {\n    _ngZone = inject(NgZone);\n    _platform = inject(Platform);\n    _inputModalityDetector = inject(InputModalityDetector);\n    /** The focus origin that the next focus event is a result of. */\n    _origin = null;\n    /** The FocusOrigin of the last focus event tracked by the FocusMonitor. */\n    _lastFocusOrigin;\n    /** Whether the window has just been focused. */\n    _windowFocused = false;\n    /** The timeout id of the window focus timeout. */\n    _windowFocusTimeoutId;\n    /** The timeout id of the origin clearing timeout. */\n    _originTimeoutId;\n    /**\n     * Whether the origin was determined via a touch interaction. Necessary as properly attributing\n     * focus events to touch interactions requires special logic.\n     */\n    _originFromTouchInteraction = false;\n    /** Map of elements being monitored to their info. */\n    _elementInfo = new Map();\n    /** The number of elements currently being monitored. */\n    _monitoredElementCount = 0;\n    /**\n     * Keeps track of the root nodes to which we've currently bound a focus/blur handler,\n     * as well as the number of monitored elements that they contain. We have to treat focus/blur\n     * handlers differently from the rest of the events, because the browser won't emit events\n     * to the document when focus moves inside of a shadow root.\n     */\n    _rootNodeFocusListenerCount = new Map();\n    /**\n     * The specified detection mode, used for attributing the origin of a focus\n     * event.\n     */\n    _detectionMode;\n    /**\n     * Event listener for `focus` events on the window.\n     * Needs to be an arrow function in order to preserve the context when it gets bound.\n     */\n    _windowFocusListener = () => {\n      // Make a note of when the window regains focus, so we can\n      // restore the origin info for the focused element.\n      this._windowFocused = true;\n      this._windowFocusTimeoutId = setTimeout(() => this._windowFocused = false);\n    };\n    /** Used to reference correct document/window */\n    _document = inject(DOCUMENT, {\n      optional: true\n    });\n    /** Subject for stopping our InputModalityDetector subscription. */\n    _stopInputModalityDetector = new Subject();\n    constructor() {\n      const options = inject(FOCUS_MONITOR_DEFAULT_OPTIONS, {\n        optional: true\n      });\n      this._detectionMode = options?.detectionMode || FocusMonitorDetectionMode.IMMEDIATE;\n    }\n    /**\n     * Event listener for `focus` and 'blur' events on the document.\n     * Needs to be an arrow function in order to preserve the context when it gets bound.\n     */\n    _rootNodeFocusAndBlurListener = event => {\n      const target = _getEventTarget(event);\n      // We need to walk up the ancestor chain in order to support `checkChildren`.\n      for (let element = target; element; element = element.parentElement) {\n        if (event.type === 'focus') {\n          this._onFocus(event, element);\n        } else {\n          this._onBlur(event, element);\n        }\n      }\n    };\n    monitor(element, checkChildren = false) {\n      const nativeElement = coerceElement(element);\n      // Do nothing if we're not on the browser platform or the passed in node isn't an element.\n      if (!this._platform.isBrowser || nativeElement.nodeType !== 1) {\n        // Note: we don't want the observable to emit at all so we don't pass any parameters.\n        return of();\n      }\n      // If the element is inside the shadow DOM, we need to bind our focus/blur listeners to\n      // the shadow root, rather than the `document`, because the browser won't emit focus events\n      // to the `document`, if focus is moving within the same shadow root.\n      const rootNode = _getShadowRoot(nativeElement) || this._getDocument();\n      const cachedInfo = this._elementInfo.get(nativeElement);\n      // Check if we're already monitoring this element.\n      if (cachedInfo) {\n        if (checkChildren) {\n          // TODO(COMP-318): this can be problematic, because it'll turn all non-checkChildren\n          // observers into ones that behave as if `checkChildren` was turned on. We need a more\n          // robust solution.\n          cachedInfo.checkChildren = true;\n        }\n        return cachedInfo.subject;\n      }\n      // Create monitored element info.\n      const info = {\n        checkChildren: checkChildren,\n        subject: new Subject(),\n        rootNode\n      };\n      this._elementInfo.set(nativeElement, info);\n      this._registerGlobalListeners(info);\n      return info.subject;\n    }\n    stopMonitoring(element) {\n      const nativeElement = coerceElement(element);\n      const elementInfo = this._elementInfo.get(nativeElement);\n      if (elementInfo) {\n        elementInfo.subject.complete();\n        this._setClasses(nativeElement);\n        this._elementInfo.delete(nativeElement);\n        this._removeGlobalListeners(elementInfo);\n      }\n    }\n    focusVia(element, origin, options) {\n      const nativeElement = coerceElement(element);\n      const focusedElement = this._getDocument().activeElement;\n      // If the element is focused already, calling `focus` again won't trigger the event listener\n      // which means that the focus classes won't be updated. If that's the case, update the classes\n      // directly without waiting for an event.\n      if (nativeElement === focusedElement) {\n        this._getClosestElementsInfo(nativeElement).forEach(([currentElement, info]) => this._originChanged(currentElement, origin, info));\n      } else {\n        this._setOrigin(origin);\n        // `focus` isn't available on the server\n        if (typeof nativeElement.focus === 'function') {\n          nativeElement.focus(options);\n        }\n      }\n    }\n    ngOnDestroy() {\n      this._elementInfo.forEach((_info, element) => this.stopMonitoring(element));\n    }\n    /** Access injected document if available or fallback to global document reference */\n    _getDocument() {\n      return this._document || document;\n    }\n    /** Use defaultView of injected document if available or fallback to global window reference */\n    _getWindow() {\n      const doc = this._getDocument();\n      return doc.defaultView || window;\n    }\n    _getFocusOrigin(focusEventTarget) {\n      if (this._origin) {\n        // If the origin was realized via a touch interaction, we need to perform additional checks\n        // to determine whether the focus origin should be attributed to touch or program.\n        if (this._originFromTouchInteraction) {\n          return this._shouldBeAttributedToTouch(focusEventTarget) ? 'touch' : 'program';\n        } else {\n          return this._origin;\n        }\n      }\n      // If the window has just regained focus, we can restore the most recent origin from before the\n      // window blurred. Otherwise, we've reached the point where we can't identify the source of the\n      // focus. This typically means one of two things happened:\n      //\n      // 1) The element was programmatically focused, or\n      // 2) The element was focused via screen reader navigation (which generally doesn't fire\n      //    events).\n      //\n      // Because we can't distinguish between these two cases, we default to setting `program`.\n      if (this._windowFocused && this._lastFocusOrigin) {\n        return this._lastFocusOrigin;\n      }\n      // If the interaction is coming from an input label, we consider it a mouse interactions.\n      // This is a special case where focus moves on `click`, rather than `mousedown` which breaks\n      // our detection, because all our assumptions are for `mousedown`. We need to handle this\n      // special case, because it's very common for checkboxes and radio buttons.\n      if (focusEventTarget && this._isLastInteractionFromInputLabel(focusEventTarget)) {\n        return 'mouse';\n      }\n      return 'program';\n    }\n    /**\n     * Returns whether the focus event should be attributed to touch. Recall that in IMMEDIATE mode, a\n     * touch origin isn't immediately reset at the next tick (see _setOrigin). This means that when we\n     * handle a focus event following a touch interaction, we need to determine whether (1) the focus\n     * event was directly caused by the touch interaction or (2) the focus event was caused by a\n     * subsequent programmatic focus call triggered by the touch interaction.\n     * @param focusEventTarget The target of the focus event under examination.\n     */\n    _shouldBeAttributedToTouch(focusEventTarget) {\n      // Please note that this check is not perfect. Consider the following edge case:\n      //\n      // <div #parent tabindex=\"0\">\n      //   <div #child tabindex=\"0\" (click)=\"#parent.focus()\"></div>\n      // </div>\n      //\n      // Suppose there is a FocusMonitor in IMMEDIATE mode attached to #parent. When the user touches\n      // #child, #parent is programmatically focused. This code will attribute the focus to touch\n      // instead of program. This is a relatively minor edge-case that can be worked around by using\n      // focusVia(parent, 'program') to focus #parent.\n      return this._detectionMode === FocusMonitorDetectionMode.EVENTUAL || !!focusEventTarget?.contains(this._inputModalityDetector._mostRecentTarget);\n    }\n    /**\n     * Sets the focus classes on the element based on the given focus origin.\n     * @param element The element to update the classes on.\n     * @param origin The focus origin.\n     */\n    _setClasses(element, origin) {\n      element.classList.toggle('cdk-focused', !!origin);\n      element.classList.toggle('cdk-touch-focused', origin === 'touch');\n      element.classList.toggle('cdk-keyboard-focused', origin === 'keyboard');\n      element.classList.toggle('cdk-mouse-focused', origin === 'mouse');\n      element.classList.toggle('cdk-program-focused', origin === 'program');\n    }\n    /**\n     * Updates the focus origin. If we're using immediate detection mode, we schedule an async\n     * function to clear the origin at the end of a timeout. The duration of the timeout depends on\n     * the origin being set.\n     * @param origin The origin to set.\n     * @param isFromInteraction Whether we are setting the origin from an interaction event.\n     */\n    _setOrigin(origin, isFromInteraction = false) {\n      this._ngZone.runOutsideAngular(() => {\n        this._origin = origin;\n        this._originFromTouchInteraction = origin === 'touch' && isFromInteraction;\n        // If we're in IMMEDIATE mode, reset the origin at the next tick (or in `TOUCH_BUFFER_MS` ms\n        // for a touch event). We reset the origin at the next tick because Firefox focuses one tick\n        // after the interaction event. We wait `TOUCH_BUFFER_MS` ms before resetting the origin for\n        // a touch event because when a touch event is fired, the associated focus event isn't yet in\n        // the event queue. Before doing so, clear any pending timeouts.\n        if (this._detectionMode === FocusMonitorDetectionMode.IMMEDIATE) {\n          clearTimeout(this._originTimeoutId);\n          const ms = this._originFromTouchInteraction ? TOUCH_BUFFER_MS : 1;\n          this._originTimeoutId = setTimeout(() => this._origin = null, ms);\n        }\n      });\n    }\n    /**\n     * Handles focus events on a registered element.\n     * @param event The focus event.\n     * @param element The monitored element.\n     */\n    _onFocus(event, element) {\n      // NOTE(mmalerba): We currently set the classes based on the focus origin of the most recent\n      // focus event affecting the monitored element. If we want to use the origin of the first event\n      // instead we should check for the cdk-focused class here and return if the element already has\n      // it. (This only matters for elements that have includesChildren = true).\n      // If we are not counting child-element-focus as focused, make sure that the event target is the\n      // monitored element itself.\n      const elementInfo = this._elementInfo.get(element);\n      const focusEventTarget = _getEventTarget(event);\n      if (!elementInfo || !elementInfo.checkChildren && element !== focusEventTarget) {\n        return;\n      }\n      this._originChanged(element, this._getFocusOrigin(focusEventTarget), elementInfo);\n    }\n    /**\n     * Handles blur events on a registered element.\n     * @param event The blur event.\n     * @param element The monitored element.\n     */\n    _onBlur(event, element) {\n      // If we are counting child-element-focus as focused, make sure that we aren't just blurring in\n      // order to focus another child of the monitored element.\n      const elementInfo = this._elementInfo.get(element);\n      if (!elementInfo || elementInfo.checkChildren && event.relatedTarget instanceof Node && element.contains(event.relatedTarget)) {\n        return;\n      }\n      this._setClasses(element);\n      this._emitOrigin(elementInfo, null);\n    }\n    _emitOrigin(info, origin) {\n      if (info.subject.observers.length) {\n        this._ngZone.run(() => info.subject.next(origin));\n      }\n    }\n    _registerGlobalListeners(elementInfo) {\n      if (!this._platform.isBrowser) {\n        return;\n      }\n      const rootNode = elementInfo.rootNode;\n      const rootNodeFocusListeners = this._rootNodeFocusListenerCount.get(rootNode) || 0;\n      if (!rootNodeFocusListeners) {\n        this._ngZone.runOutsideAngular(() => {\n          rootNode.addEventListener('focus', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);\n          rootNode.addEventListener('blur', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);\n        });\n      }\n      this._rootNodeFocusListenerCount.set(rootNode, rootNodeFocusListeners + 1);\n      // Register global listeners when first element is monitored.\n      if (++this._monitoredElementCount === 1) {\n        // Note: we listen to events in the capture phase so we\n        // can detect them even if the user stops propagation.\n        this._ngZone.runOutsideAngular(() => {\n          const window = this._getWindow();\n          window.addEventListener('focus', this._windowFocusListener);\n        });\n        // The InputModalityDetector is also just a collection of global listeners.\n        this._inputModalityDetector.modalityDetected.pipe(takeUntil(this._stopInputModalityDetector)).subscribe(modality => {\n          this._setOrigin(modality, true /* isFromInteraction */);\n        });\n      }\n    }\n    _removeGlobalListeners(elementInfo) {\n      const rootNode = elementInfo.rootNode;\n      if (this._rootNodeFocusListenerCount.has(rootNode)) {\n        const rootNodeFocusListeners = this._rootNodeFocusListenerCount.get(rootNode);\n        if (rootNodeFocusListeners > 1) {\n          this._rootNodeFocusListenerCount.set(rootNode, rootNodeFocusListeners - 1);\n        } else {\n          rootNode.removeEventListener('focus', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);\n          rootNode.removeEventListener('blur', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);\n          this._rootNodeFocusListenerCount.delete(rootNode);\n        }\n      }\n      // Unregister global listeners when last element is unmonitored.\n      if (! --this._monitoredElementCount) {\n        const window = this._getWindow();\n        window.removeEventListener('focus', this._windowFocusListener);\n        // Equivalently, stop our InputModalityDetector subscription.\n        this._stopInputModalityDetector.next();\n        // Clear timeouts for all potentially pending timeouts to prevent the leaks.\n        clearTimeout(this._windowFocusTimeoutId);\n        clearTimeout(this._originTimeoutId);\n      }\n    }\n    /** Updates all the state on an element once its focus origin has changed. */\n    _originChanged(element, origin, elementInfo) {\n      this._setClasses(element, origin);\n      this._emitOrigin(elementInfo, origin);\n      this._lastFocusOrigin = origin;\n    }\n    /**\n     * Collects the `MonitoredElementInfo` of a particular element and\n     * all of its ancestors that have enabled `checkChildren`.\n     * @param element Element from which to start the search.\n     */\n    _getClosestElementsInfo(element) {\n      const results = [];\n      this._elementInfo.forEach((info, currentElement) => {\n        if (currentElement === element || info.checkChildren && currentElement.contains(element)) {\n          results.push([currentElement, info]);\n        }\n      });\n      return results;\n    }\n    /**\n     * Returns whether an interaction is likely to have come from the user clicking the `label` of\n     * an `input` or `textarea` in order to focus it.\n     * @param focusEventTarget Target currently receiving focus.\n     */\n    _isLastInteractionFromInputLabel(focusEventTarget) {\n      const {\n        _mostRecentTarget: mostRecentTarget,\n        mostRecentModality\n      } = this._inputModalityDetector;\n      // If the last interaction used the mouse on an element contained by one of the labels\n      // of an `input`/`textarea` that is currently focused, it is very likely that the\n      // user redirected focus using the label.\n      if (mostRecentModality !== 'mouse' || !mostRecentTarget || mostRecentTarget === focusEventTarget || focusEventTarget.nodeName !== 'INPUT' && focusEventTarget.nodeName !== 'TEXTAREA' || focusEventTarget.disabled) {\n        return false;\n      }\n      const labels = focusEventTarget.labels;\n      if (labels) {\n        for (let i = 0; i < labels.length; i++) {\n          if (labels[i].contains(mostRecentTarget)) {\n            return true;\n          }\n        }\n      }\n      return false;\n    }\n    static ɵfac = function FocusMonitor_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || FocusMonitor)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: FocusMonitor,\n      factory: FocusMonitor.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return FocusMonitor;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Directive that determines how a particular element was focused (via keyboard, mouse, touch, or\n * programmatically) and adds corresponding classes to the element.\n *\n * There are two variants of this directive:\n * 1) cdkMonitorElementFocus: does not consider an element to be focused if one of its children is\n *    focused.\n * 2) cdkMonitorSubtreeFocus: considers an element focused if it or any of its children are focused.\n */\nlet CdkMonitorFocus = /*#__PURE__*/(() => {\n  class CdkMonitorFocus {\n    _elementRef = inject(ElementRef);\n    _focusMonitor = inject(FocusMonitor);\n    _monitorSubscription;\n    _focusOrigin = null;\n    cdkFocusChange = new EventEmitter();\n    constructor() {}\n    get focusOrigin() {\n      return this._focusOrigin;\n    }\n    ngAfterViewInit() {\n      const element = this._elementRef.nativeElement;\n      this._monitorSubscription = this._focusMonitor.monitor(element, element.nodeType === 1 && element.hasAttribute('cdkMonitorSubtreeFocus')).subscribe(origin => {\n        this._focusOrigin = origin;\n        this.cdkFocusChange.emit(origin);\n      });\n    }\n    ngOnDestroy() {\n      this._focusMonitor.stopMonitoring(this._elementRef);\n      if (this._monitorSubscription) {\n        this._monitorSubscription.unsubscribe();\n      }\n    }\n    static ɵfac = function CdkMonitorFocus_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkMonitorFocus)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkMonitorFocus,\n      selectors: [[\"\", \"cdkMonitorElementFocus\", \"\"], [\"\", \"cdkMonitorSubtreeFocus\", \"\"]],\n      outputs: {\n        cdkFocusChange: \"cdkFocusChange\"\n      },\n      exportAs: [\"cdkMonitorFocus\"]\n    });\n  }\n  return CdkMonitorFocus;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { CdkMonitorFocus as C, FocusMonitor as F, InputModalityDetector as I, INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS as a, INPUT_MODALITY_DETECTOR_OPTIONS as b, FocusMonitorDetectionMode as c, FOCUS_MONITOR_DEFAULT_OPTIONS as d };\n","import * as i0 from '@angular/core';\nimport { inject, Injector, EnvironmentInjector, ApplicationRef, createComponent, Injectable } from '@angular/core';\n\n/** Apps in which we've loaded styles. */\nconst appsWithLoaders = /*#__PURE__*/new WeakMap();\n/**\n * Service that loads structural styles dynamically\n * and ensures that they're only loaded once per app.\n */\nlet _CdkPrivateStyleLoader = /*#__PURE__*/(() => {\n  class _CdkPrivateStyleLoader {\n    _appRef;\n    _injector = inject(Injector);\n    _environmentInjector = inject(EnvironmentInjector);\n    /**\n     * Loads a set of styles.\n     * @param loader Component which will be instantiated to load the styles.\n     */\n    load(loader) {\n      // Resolve the app ref lazily to avoid circular dependency errors if this is called too early.\n      const appRef = this._appRef = this._appRef || this._injector.get(ApplicationRef);\n      let data = appsWithLoaders.get(appRef);\n      // If we haven't loaded for this app before, we have to initialize it.\n      if (!data) {\n        data = {\n          loaders: new Set(),\n          refs: []\n        };\n        appsWithLoaders.set(appRef, data);\n        // When the app is destroyed, we need to clean up all the related loaders.\n        appRef.onDestroy(() => {\n          appsWithLoaders.get(appRef)?.refs.forEach(ref => ref.destroy());\n          appsWithLoaders.delete(appRef);\n        });\n      }\n      // If the loader hasn't been loaded before, we need to instatiate it.\n      if (!data.loaders.has(loader)) {\n        data.loaders.add(loader);\n        data.refs.push(createComponent(loader, {\n          environmentInjector: this._environmentInjector\n        }));\n      }\n    }\n    static ɵfac = function _CdkPrivateStyleLoader_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || _CdkPrivateStyleLoader)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: _CdkPrivateStyleLoader,\n      factory: _CdkPrivateStyleLoader.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return _CdkPrivateStyleLoader;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { _CdkPrivateStyleLoader as _ };\n","export { _ as _CdkPrivateStyleLoader } from './style-loader-Cu9AvjH9.mjs';\nimport * as i0 from '@angular/core';\nimport { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n/**\n * Component used to load the .cdk-visually-hidden styles.\n * @docs-private\n */\nlet _VisuallyHiddenLoader = /*#__PURE__*/(() => {\n  class _VisuallyHiddenLoader {\n    static ɵfac = function _VisuallyHiddenLoader_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || _VisuallyHiddenLoader)();\n    };\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: _VisuallyHiddenLoader,\n      selectors: [[\"ng-component\"]],\n      exportAs: [\"cdkVisuallyHidden\"],\n      decls: 0,\n      vars: 0,\n      template: function _VisuallyHiddenLoader_Template(rf, ctx) {},\n      styles: [\".cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0}\\n\"],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return _VisuallyHiddenLoader;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { _VisuallyHiddenLoader };\n","import * as i0 from '@angular/core';\nimport { Injectable, inject, NgZone, ElementRef, EventEmitter, booleanAttribute, Directive, Output, Input, NgModule } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { map, filter, debounceTime } from 'rxjs/operators';\nimport { c as coerceNumberProperty, a as coerceElement } from './element-x4z00URv.mjs';\n\n// Angular may add, remove, or edit comment nodes during change detection. We don't care about\n// these changes because they don't affect the user-preceived content, and worse it can cause\n// infinite change detection cycles where the change detection updates a comment, triggering the\n// MutationObserver, triggering another change detection and kicking the cycle off again.\nfunction shouldIgnoreRecord(record) {\n  // Ignore changes to comment text.\n  if (record.type === 'characterData' && record.target instanceof Comment) {\n    return true;\n  }\n  // Ignore addition / removal of comments.\n  if (record.type === 'childList') {\n    for (let i = 0; i < record.addedNodes.length; i++) {\n      if (!(record.addedNodes[i] instanceof Comment)) {\n        return false;\n      }\n    }\n    for (let i = 0; i < record.removedNodes.length; i++) {\n      if (!(record.removedNodes[i] instanceof Comment)) {\n        return false;\n      }\n    }\n    return true;\n  }\n  // Observe everything else.\n  return false;\n}\n/**\n * Factory that creates a new MutationObserver and allows us to stub it out in unit tests.\n * @docs-private\n */\nlet MutationObserverFactory = /*#__PURE__*/(() => {\n  class MutationObserverFactory {\n    create(callback) {\n      return typeof MutationObserver === 'undefined' ? null : new MutationObserver(callback);\n    }\n    static ɵfac = function MutationObserverFactory_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MutationObserverFactory)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: MutationObserverFactory,\n      factory: MutationObserverFactory.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return MutationObserverFactory;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** An injectable service that allows watching elements for changes to their content. */\nlet ContentObserver = /*#__PURE__*/(() => {\n  class ContentObserver {\n    _mutationObserverFactory = inject(MutationObserverFactory);\n    /** Keeps track of the existing MutationObservers so they can be reused. */\n    _observedElements = new Map();\n    _ngZone = inject(NgZone);\n    constructor() {}\n    ngOnDestroy() {\n      this._observedElements.forEach((_, element) => this._cleanupObserver(element));\n    }\n    observe(elementOrRef) {\n      const element = coerceElement(elementOrRef);\n      return new Observable(observer => {\n        const stream = this._observeElement(element);\n        const subscription = stream.pipe(map(records => records.filter(record => !shouldIgnoreRecord(record))), filter(records => !!records.length)).subscribe(records => {\n          this._ngZone.run(() => {\n            observer.next(records);\n          });\n        });\n        return () => {\n          subscription.unsubscribe();\n          this._unobserveElement(element);\n        };\n      });\n    }\n    /**\n     * Observes the given element by using the existing MutationObserver if available, or creating a\n     * new one if not.\n     */\n    _observeElement(element) {\n      return this._ngZone.runOutsideAngular(() => {\n        if (!this._observedElements.has(element)) {\n          const stream = new Subject();\n          const observer = this._mutationObserverFactory.create(mutations => stream.next(mutations));\n          if (observer) {\n            observer.observe(element, {\n              characterData: true,\n              childList: true,\n              subtree: true\n            });\n          }\n          this._observedElements.set(element, {\n            observer,\n            stream,\n            count: 1\n          });\n        } else {\n          this._observedElements.get(element).count++;\n        }\n        return this._observedElements.get(element).stream;\n      });\n    }\n    /**\n     * Un-observes the given element and cleans up the underlying MutationObserver if nobody else is\n     * observing this element.\n     */\n    _unobserveElement(element) {\n      if (this._observedElements.has(element)) {\n        this._observedElements.get(element).count--;\n        if (!this._observedElements.get(element).count) {\n          this._cleanupObserver(element);\n        }\n      }\n    }\n    /** Clean up the underlying MutationObserver for the specified element. */\n    _cleanupObserver(element) {\n      if (this._observedElements.has(element)) {\n        const {\n          observer,\n          stream\n        } = this._observedElements.get(element);\n        if (observer) {\n          observer.disconnect();\n        }\n        stream.complete();\n        this._observedElements.delete(element);\n      }\n    }\n    static ɵfac = function ContentObserver_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || ContentObserver)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: ContentObserver,\n      factory: ContentObserver.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return ContentObserver;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Directive that triggers a callback whenever the content of\n * its associated element has changed.\n */\nlet CdkObserveContent = /*#__PURE__*/(() => {\n  class CdkObserveContent {\n    _contentObserver = inject(ContentObserver);\n    _elementRef = inject(ElementRef);\n    /** Event emitted for each change in the element's content. */\n    event = new EventEmitter();\n    /**\n     * Whether observing content is disabled. This option can be used\n     * to disconnect the underlying MutationObserver until it is needed.\n     */\n    get disabled() {\n      return this._disabled;\n    }\n    set disabled(value) {\n      this._disabled = value;\n      this._disabled ? this._unsubscribe() : this._subscribe();\n    }\n    _disabled = false;\n    /** Debounce interval for emitting the changes. */\n    get debounce() {\n      return this._debounce;\n    }\n    set debounce(value) {\n      this._debounce = coerceNumberProperty(value);\n      this._subscribe();\n    }\n    _debounce;\n    _currentSubscription = null;\n    constructor() {}\n    ngAfterContentInit() {\n      if (!this._currentSubscription && !this.disabled) {\n        this._subscribe();\n      }\n    }\n    ngOnDestroy() {\n      this._unsubscribe();\n    }\n    _subscribe() {\n      this._unsubscribe();\n      const stream = this._contentObserver.observe(this._elementRef);\n      this._currentSubscription = (this.debounce ? stream.pipe(debounceTime(this.debounce)) : stream).subscribe(this.event);\n    }\n    _unsubscribe() {\n      this._currentSubscription?.unsubscribe();\n    }\n    static ɵfac = function CdkObserveContent_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkObserveContent)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkObserveContent,\n      selectors: [[\"\", \"cdkObserveContent\", \"\"]],\n      inputs: {\n        disabled: [2, \"cdkObserveContentDisabled\", \"disabled\", booleanAttribute],\n        debounce: \"debounce\"\n      },\n      outputs: {\n        event: \"cdkObserveContent\"\n      },\n      exportAs: [\"cdkObserveContent\"]\n    });\n  }\n  return CdkObserveContent;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet ObserversModule = /*#__PURE__*/(() => {\n  class ObserversModule {\n    static ɵfac = function ObserversModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || ObserversModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: ObserversModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      providers: [MutationObserverFactory]\n    });\n  }\n  return ObserversModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { CdkObserveContent, ContentObserver, MutationObserverFactory, ObserversModule };\n","function coerceArray(value) {\n  return Array.isArray(value) ? value : [value];\n}\nexport { coerceArray as c };\n","import * as i0 from '@angular/core';\nimport { inject, CSP_NONCE, Injectable, NgZone } from '@angular/core';\nimport { Subject, combineLatest, concat, Observable } from 'rxjs';\nimport { take, skip, debounceTime, map, startWith, takeUntil } from 'rxjs/operators';\nimport { P as Platform } from './platform-DmdVEw_C.mjs';\nimport { c as coerceArray } from './array-I1yfCXUO.mjs';\n\n/** Global registry for all dynamically-created, injected media queries. */\nconst mediaQueriesForWebkitCompatibility = /*#__PURE__*/new Set();\n/** Style tag that holds all of the dynamically-created media queries. */\nlet mediaQueryStyleNode;\n/** A utility for calling matchMedia queries. */\nlet MediaMatcher = /*#__PURE__*/(() => {\n  class MediaMatcher {\n    _platform = inject(Platform);\n    _nonce = inject(CSP_NONCE, {\n      optional: true\n    });\n    /** The internal matchMedia method to return back a MediaQueryList like object. */\n    _matchMedia;\n    constructor() {\n      this._matchMedia = this._platform.isBrowser && window.matchMedia ?\n      // matchMedia is bound to the window scope intentionally as it is an illegal invocation to\n      // call it from a different scope.\n      window.matchMedia.bind(window) : noopMatchMedia;\n    }\n    /**\n     * Evaluates the given media query and returns the native MediaQueryList from which results\n     * can be retrieved.\n     * Confirms the layout engine will trigger for the selector query provided and returns the\n     * MediaQueryList for the query provided.\n     */\n    matchMedia(query) {\n      if (this._platform.WEBKIT || this._platform.BLINK) {\n        createEmptyStyleRule(query, this._nonce);\n      }\n      return this._matchMedia(query);\n    }\n    static ɵfac = function MediaMatcher_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MediaMatcher)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: MediaMatcher,\n      factory: MediaMatcher.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return MediaMatcher;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Creates an empty stylesheet that is used to work around browser inconsistencies related to\n * `matchMedia`. At the time of writing, it handles the following cases:\n * 1. On WebKit browsers, a media query has to have at least one rule in order for `matchMedia`\n * to fire. We work around it by declaring a dummy stylesheet with a `@media` declaration.\n * 2. In some cases Blink browsers will stop firing the `matchMedia` listener if none of the rules\n * inside the `@media` match existing elements on the page. We work around it by having one rule\n * targeting the `body`. See https://github.com/angular/components/issues/23546.\n */\nfunction createEmptyStyleRule(query, nonce) {\n  if (mediaQueriesForWebkitCompatibility.has(query)) {\n    return;\n  }\n  try {\n    if (!mediaQueryStyleNode) {\n      mediaQueryStyleNode = document.createElement('style');\n      if (nonce) {\n        mediaQueryStyleNode.setAttribute('nonce', nonce);\n      }\n      mediaQueryStyleNode.setAttribute('type', 'text/css');\n      document.head.appendChild(mediaQueryStyleNode);\n    }\n    if (mediaQueryStyleNode.sheet) {\n      mediaQueryStyleNode.sheet.insertRule(`@media ${query} {body{ }}`, 0);\n      mediaQueriesForWebkitCompatibility.add(query);\n    }\n  } catch (e) {\n    console.error(e);\n  }\n}\n/** No-op matchMedia replacement for non-browser platforms. */\nfunction noopMatchMedia(query) {\n  // Use `as any` here to avoid adding additional necessary properties for\n  // the noop matcher.\n  return {\n    matches: query === 'all' || query === '',\n    media: query,\n    addListener: () => {},\n    removeListener: () => {}\n  };\n}\n\n/** Utility for checking the matching state of `@media` queries. */\nlet BreakpointObserver = /*#__PURE__*/(() => {\n  class BreakpointObserver {\n    _mediaMatcher = inject(MediaMatcher);\n    _zone = inject(NgZone);\n    /**  A map of all media queries currently being listened for. */\n    _queries = new Map();\n    /** A subject for all other observables to takeUntil based on. */\n    _destroySubject = new Subject();\n    constructor() {}\n    /** Completes the active subject, signalling to all other observables to complete. */\n    ngOnDestroy() {\n      this._destroySubject.next();\n      this._destroySubject.complete();\n    }\n    /**\n     * Whether one or more media queries match the current viewport size.\n     * @param value One or more media queries to check.\n     * @returns Whether any of the media queries match.\n     */\n    isMatched(value) {\n      const queries = splitQueries(coerceArray(value));\n      return queries.some(mediaQuery => this._registerQuery(mediaQuery).mql.matches);\n    }\n    /**\n     * Gets an observable of results for the given queries that will emit new results for any changes\n     * in matching of the given queries.\n     * @param value One or more media queries to check.\n     * @returns A stream of matches for the given queries.\n     */\n    observe(value) {\n      const queries = splitQueries(coerceArray(value));\n      const observables = queries.map(query => this._registerQuery(query).observable);\n      let stateObservable = combineLatest(observables);\n      // Emit the first state immediately, and then debounce the subsequent emissions.\n      stateObservable = concat(stateObservable.pipe(take(1)), stateObservable.pipe(skip(1), debounceTime(0)));\n      return stateObservable.pipe(map(breakpointStates => {\n        const response = {\n          matches: false,\n          breakpoints: {}\n        };\n        breakpointStates.forEach(({\n          matches,\n          query\n        }) => {\n          response.matches = response.matches || matches;\n          response.breakpoints[query] = matches;\n        });\n        return response;\n      }));\n    }\n    /** Registers a specific query to be listened for. */\n    _registerQuery(query) {\n      // Only set up a new MediaQueryList if it is not already being listened for.\n      if (this._queries.has(query)) {\n        return this._queries.get(query);\n      }\n      const mql = this._mediaMatcher.matchMedia(query);\n      // Create callback for match changes and add it is as a listener.\n      const queryObservable = new Observable(observer => {\n        // Listener callback methods are wrapped to be placed back in ngZone. Callbacks must be placed\n        // back into the zone because matchMedia is only included in Zone.js by loading the\n        // webapis-media-query.js file alongside the zone.js file.  Additionally, some browsers do not\n        // have MediaQueryList inherit from EventTarget, which causes inconsistencies in how Zone.js\n        // patches it.\n        const handler = e => this._zone.run(() => observer.next(e));\n        mql.addListener(handler);\n        return () => {\n          mql.removeListener(handler);\n        };\n      }).pipe(startWith(mql), map(({\n        matches\n      }) => ({\n        query,\n        matches\n      })), takeUntil(this._destroySubject));\n      // Add the MediaQueryList to the set of queries.\n      const output = {\n        observable: queryObservable,\n        mql\n      };\n      this._queries.set(query, output);\n      return output;\n    }\n    static ɵfac = function BreakpointObserver_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || BreakpointObserver)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: BreakpointObserver,\n      factory: BreakpointObserver.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return BreakpointObserver;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Split each query string into separate query strings if two queries are provided as comma\n * separated.\n */\nfunction splitQueries(queries) {\n  return queries.map(query => query.split(',')).reduce((a1, a2) => a1.concat(a2)).map(query => query.trim());\n}\nexport { BreakpointObserver as B, MediaMatcher as M };\n","import * as i0 from '@angular/core';\nimport { inject, Injectable, afterNextRender, NgZone, Injector, ElementRef, booleanAttribute, Directive, Input, InjectionToken, NgModule } from '@angular/core';\nimport { C as CdkMonitorFocus } from './focus-monitor-e2l_RpN3.mjs';\nimport { DOCUMENT } from '@angular/common';\nimport { P as Platform } from './platform-DmdVEw_C.mjs';\nimport { c as _getFocusedElementPierceShadowDom } from './shadow-dom-B0oHn41l.mjs';\nimport { _ as _CdkPrivateStyleLoader } from './style-loader-Cu9AvjH9.mjs';\nimport { _VisuallyHiddenLoader } from './private.mjs';\nimport { B as BreakpointObserver } from './breakpoints-observer-CljOfYGy.mjs';\nimport { ContentObserver, ObserversModule } from './observers.mjs';\n\n/**\n * Configuration for the isFocusable method.\n */\nclass IsFocusableConfig {\n  /**\n   * Whether to count an element as focusable even if it is not currently visible.\n   */\n  ignoreVisibility = false;\n}\n// The InteractivityChecker leans heavily on the ally.js accessibility utilities.\n// Methods like `isTabbable` are only covering specific edge-cases for the browsers which are\n// supported.\n/**\n * Utility for checking the interactivity of an element, such as whether it is focusable or\n * tabbable.\n */\nlet InteractivityChecker = /*#__PURE__*/(() => {\n  class InteractivityChecker {\n    _platform = inject(Platform);\n    constructor() {}\n    /**\n     * Gets whether an element is disabled.\n     *\n     * @param element Element to be checked.\n     * @returns Whether the element is disabled.\n     */\n    isDisabled(element) {\n      // This does not capture some cases, such as a non-form control with a disabled attribute or\n      // a form control inside of a disabled form, but should capture the most common cases.\n      return element.hasAttribute('disabled');\n    }\n    /**\n     * Gets whether an element is visible for the purposes of interactivity.\n     *\n     * This will capture states like `display: none` and `visibility: hidden`, but not things like\n     * being clipped by an `overflow: hidden` parent or being outside the viewport.\n     *\n     * @returns Whether the element is visible.\n     */\n    isVisible(element) {\n      return hasGeometry(element) && getComputedStyle(element).visibility === 'visible';\n    }\n    /**\n     * Gets whether an element can be reached via Tab key.\n     * Assumes that the element has already been checked with isFocusable.\n     *\n     * @param element Element to be checked.\n     * @returns Whether the element is tabbable.\n     */\n    isTabbable(element) {\n      // Nothing is tabbable on the server 😎\n      if (!this._platform.isBrowser) {\n        return false;\n      }\n      const frameElement = getFrameElement(getWindow(element));\n      if (frameElement) {\n        // Frame elements inherit their tabindex onto all child elements.\n        if (getTabIndexValue(frameElement) === -1) {\n          return false;\n        }\n        // Browsers disable tabbing to an element inside of an invisible frame.\n        if (!this.isVisible(frameElement)) {\n          return false;\n        }\n      }\n      let nodeName = element.nodeName.toLowerCase();\n      let tabIndexValue = getTabIndexValue(element);\n      if (element.hasAttribute('contenteditable')) {\n        return tabIndexValue !== -1;\n      }\n      if (nodeName === 'iframe' || nodeName === 'object') {\n        // The frame or object's content may be tabbable depending on the content, but it's\n        // not possibly to reliably detect the content of the frames. We always consider such\n        // elements as non-tabbable.\n        return false;\n      }\n      // In iOS, the browser only considers some specific elements as tabbable.\n      if (this._platform.WEBKIT && this._platform.IOS && !isPotentiallyTabbableIOS(element)) {\n        return false;\n      }\n      if (nodeName === 'audio') {\n        // Audio elements without controls enabled are never tabbable, regardless\n        // of the tabindex attribute explicitly being set.\n        if (!element.hasAttribute('controls')) {\n          return false;\n        }\n        // Audio elements with controls are by default tabbable unless the\n        // tabindex attribute is set to `-1` explicitly.\n        return tabIndexValue !== -1;\n      }\n      if (nodeName === 'video') {\n        // For all video elements, if the tabindex attribute is set to `-1`, the video\n        // is not tabbable. Note: We cannot rely on the default `HTMLElement.tabIndex`\n        // property as that one is set to `-1` in Chrome, Edge and Safari v13.1. The\n        // tabindex attribute is the source of truth here.\n        if (tabIndexValue === -1) {\n          return false;\n        }\n        // If the tabindex is explicitly set, and not `-1` (as per check before), the\n        // video element is always tabbable (regardless of whether it has controls or not).\n        if (tabIndexValue !== null) {\n          return true;\n        }\n        // Otherwise (when no explicit tabindex is set), a video is only tabbable if it\n        // has controls enabled. Firefox is special as videos are always tabbable regardless\n        // of whether there are controls or not.\n        return this._platform.FIREFOX || element.hasAttribute('controls');\n      }\n      return element.tabIndex >= 0;\n    }\n    /**\n     * Gets whether an element can be focused by the user.\n     *\n     * @param element Element to be checked.\n     * @param config The config object with options to customize this method's behavior\n     * @returns Whether the element is focusable.\n     */\n    isFocusable(element, config) {\n      // Perform checks in order of left to most expensive.\n      // Again, naive approach that does not capture many edge cases and browser quirks.\n      return isPotentiallyFocusable(element) && !this.isDisabled(element) && (config?.ignoreVisibility || this.isVisible(element));\n    }\n    static ɵfac = function InteractivityChecker_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || InteractivityChecker)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: InteractivityChecker,\n      factory: InteractivityChecker.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return InteractivityChecker;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Returns the frame element from a window object. Since browsers like MS Edge throw errors if\n * the frameElement property is being accessed from a different host address, this property\n * should be accessed carefully.\n */\nfunction getFrameElement(window) {\n  try {\n    return window.frameElement;\n  } catch {\n    return null;\n  }\n}\n/** Checks whether the specified element has any geometry / rectangles. */\nfunction hasGeometry(element) {\n  // Use logic from jQuery to check for an invisible element.\n  // See https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js#L12\n  return !!(element.offsetWidth || element.offsetHeight || typeof element.getClientRects === 'function' && element.getClientRects().length);\n}\n/** Gets whether an element's  */\nfunction isNativeFormElement(element) {\n  let nodeName = element.nodeName.toLowerCase();\n  return nodeName === 'input' || nodeName === 'select' || nodeName === 'button' || nodeName === 'textarea';\n}\n/** Gets whether an element is an `<input type=\"hidden\">`. */\nfunction isHiddenInput(element) {\n  return isInputElement(element) && element.type == 'hidden';\n}\n/** Gets whether an element is an anchor that has an href attribute. */\nfunction isAnchorWithHref(element) {\n  return isAnchorElement(element) && element.hasAttribute('href');\n}\n/** Gets whether an element is an input element. */\nfunction isInputElement(element) {\n  return element.nodeName.toLowerCase() == 'input';\n}\n/** Gets whether an element is an anchor element. */\nfunction isAnchorElement(element) {\n  return element.nodeName.toLowerCase() == 'a';\n}\n/** Gets whether an element has a valid tabindex. */\nfunction hasValidTabIndex(element) {\n  if (!element.hasAttribute('tabindex') || element.tabIndex === undefined) {\n    return false;\n  }\n  let tabIndex = element.getAttribute('tabindex');\n  return !!(tabIndex && !isNaN(parseInt(tabIndex, 10)));\n}\n/**\n * Returns the parsed tabindex from the element attributes instead of returning the\n * evaluated tabindex from the browsers defaults.\n */\nfunction getTabIndexValue(element) {\n  if (!hasValidTabIndex(element)) {\n    return null;\n  }\n  // See browser issue in Gecko https://bugzilla.mozilla.org/show_bug.cgi?id=1128054\n  const tabIndex = parseInt(element.getAttribute('tabindex') || '', 10);\n  return isNaN(tabIndex) ? -1 : tabIndex;\n}\n/** Checks whether the specified element is potentially tabbable on iOS */\nfunction isPotentiallyTabbableIOS(element) {\n  let nodeName = element.nodeName.toLowerCase();\n  let inputType = nodeName === 'input' && element.type;\n  return inputType === 'text' || inputType === 'password' || nodeName === 'select' || nodeName === 'textarea';\n}\n/**\n * Gets whether an element is potentially focusable without taking current visible/disabled state\n * into account.\n */\nfunction isPotentiallyFocusable(element) {\n  // Inputs are potentially focusable *unless* they're type=\"hidden\".\n  if (isHiddenInput(element)) {\n    return false;\n  }\n  return isNativeFormElement(element) || isAnchorWithHref(element) || element.hasAttribute('contenteditable') || hasValidTabIndex(element);\n}\n/** Gets the parent window of a DOM node with regards of being inside of an iframe. */\nfunction getWindow(node) {\n  // ownerDocument is null if `node` itself *is* a document.\n  return node.ownerDocument && node.ownerDocument.defaultView || window;\n}\n\n/**\n * Class that allows for trapping focus within a DOM element.\n *\n * This class currently uses a relatively simple approach to focus trapping.\n * It assumes that the tab order is the same as DOM order, which is not necessarily true.\n * Things like `tabIndex > 0`, flex `order`, and shadow roots can cause the two to be misaligned.\n */\nclass FocusTrap {\n  _element;\n  _checker;\n  _ngZone;\n  _document;\n  _injector;\n  _startAnchor;\n  _endAnchor;\n  _hasAttached = false;\n  // Event listeners for the anchors. Need to be regular functions so that we can unbind them later.\n  startAnchorListener = () => this.focusLastTabbableElement();\n  endAnchorListener = () => this.focusFirstTabbableElement();\n  /** Whether the focus trap is active. */\n  get enabled() {\n    return this._enabled;\n  }\n  set enabled(value) {\n    this._enabled = value;\n    if (this._startAnchor && this._endAnchor) {\n      this._toggleAnchorTabIndex(value, this._startAnchor);\n      this._toggleAnchorTabIndex(value, this._endAnchor);\n    }\n  }\n  _enabled = true;\n  constructor(_element, _checker, _ngZone, _document, deferAnchors = false, /** @breaking-change 20.0.0 param to become required */\n  _injector) {\n    this._element = _element;\n    this._checker = _checker;\n    this._ngZone = _ngZone;\n    this._document = _document;\n    this._injector = _injector;\n    if (!deferAnchors) {\n      this.attachAnchors();\n    }\n  }\n  /** Destroys the focus trap by cleaning up the anchors. */\n  destroy() {\n    const startAnchor = this._startAnchor;\n    const endAnchor = this._endAnchor;\n    if (startAnchor) {\n      startAnchor.removeEventListener('focus', this.startAnchorListener);\n      startAnchor.remove();\n    }\n    if (endAnchor) {\n      endAnchor.removeEventListener('focus', this.endAnchorListener);\n      endAnchor.remove();\n    }\n    this._startAnchor = this._endAnchor = null;\n    this._hasAttached = false;\n  }\n  /**\n   * Inserts the anchors into the DOM. This is usually done automatically\n   * in the constructor, but can be deferred for cases like directives with `*ngIf`.\n   * @returns Whether the focus trap managed to attach successfully. This may not be the case\n   * if the target element isn't currently in the DOM.\n   */\n  attachAnchors() {\n    // If we're not on the browser, there can be no focus to trap.\n    if (this._hasAttached) {\n      return true;\n    }\n    this._ngZone.runOutsideAngular(() => {\n      if (!this._startAnchor) {\n        this._startAnchor = this._createAnchor();\n        this._startAnchor.addEventListener('focus', this.startAnchorListener);\n      }\n      if (!this._endAnchor) {\n        this._endAnchor = this._createAnchor();\n        this._endAnchor.addEventListener('focus', this.endAnchorListener);\n      }\n    });\n    if (this._element.parentNode) {\n      this._element.parentNode.insertBefore(this._startAnchor, this._element);\n      this._element.parentNode.insertBefore(this._endAnchor, this._element.nextSibling);\n      this._hasAttached = true;\n    }\n    return this._hasAttached;\n  }\n  /**\n   * Waits for the zone to stabilize, then focuses the first tabbable element.\n   * @returns Returns a promise that resolves with a boolean, depending\n   * on whether focus was moved successfully.\n   */\n  focusInitialElementWhenReady(options) {\n    return new Promise(resolve => {\n      this._executeOnStable(() => resolve(this.focusInitialElement(options)));\n    });\n  }\n  /**\n   * Waits for the zone to stabilize, then focuses\n   * the first tabbable element within the focus trap region.\n   * @returns Returns a promise that resolves with a boolean, depending\n   * on whether focus was moved successfully.\n   */\n  focusFirstTabbableElementWhenReady(options) {\n    return new Promise(resolve => {\n      this._executeOnStable(() => resolve(this.focusFirstTabbableElement(options)));\n    });\n  }\n  /**\n   * Waits for the zone to stabilize, then focuses\n   * the last tabbable element within the focus trap region.\n   * @returns Returns a promise that resolves with a boolean, depending\n   * on whether focus was moved successfully.\n   */\n  focusLastTabbableElementWhenReady(options) {\n    return new Promise(resolve => {\n      this._executeOnStable(() => resolve(this.focusLastTabbableElement(options)));\n    });\n  }\n  /**\n   * Get the specified boundary element of the trapped region.\n   * @param bound The boundary to get (start or end of trapped region).\n   * @returns The boundary element.\n   */\n  _getRegionBoundary(bound) {\n    // Contains the deprecated version of selector, for temporary backwards comparability.\n    const markers = this._element.querySelectorAll(`[cdk-focus-region-${bound}], ` + `[cdkFocusRegion${bound}], ` + `[cdk-focus-${bound}]`);\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      for (let i = 0; i < markers.length; i++) {\n        // @breaking-change 8.0.0\n        if (markers[i].hasAttribute(`cdk-focus-${bound}`)) {\n          console.warn(`Found use of deprecated attribute 'cdk-focus-${bound}', ` + `use 'cdkFocusRegion${bound}' instead. The deprecated ` + `attribute will be removed in 8.0.0.`, markers[i]);\n        } else if (markers[i].hasAttribute(`cdk-focus-region-${bound}`)) {\n          console.warn(`Found use of deprecated attribute 'cdk-focus-region-${bound}', ` + `use 'cdkFocusRegion${bound}' instead. The deprecated attribute ` + `will be removed in 8.0.0.`, markers[i]);\n        }\n      }\n    }\n    if (bound == 'start') {\n      return markers.length ? markers[0] : this._getFirstTabbableElement(this._element);\n    }\n    return markers.length ? markers[markers.length - 1] : this._getLastTabbableElement(this._element);\n  }\n  /**\n   * Focuses the element that should be focused when the focus trap is initialized.\n   * @returns Whether focus was moved successfully.\n   */\n  focusInitialElement(options) {\n    // Contains the deprecated version of selector, for temporary backwards comparability.\n    const redirectToElement = this._element.querySelector(`[cdk-focus-initial], ` + `[cdkFocusInitial]`);\n    if (redirectToElement) {\n      // @breaking-change 8.0.0\n      if ((typeof ngDevMode === 'undefined' || ngDevMode) && redirectToElement.hasAttribute(`cdk-focus-initial`)) {\n        console.warn(`Found use of deprecated attribute 'cdk-focus-initial', ` + `use 'cdkFocusInitial' instead. The deprecated attribute ` + `will be removed in 8.0.0`, redirectToElement);\n      }\n      // Warn the consumer if the element they've pointed to\n      // isn't focusable, when not in production mode.\n      if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this._checker.isFocusable(redirectToElement)) {\n        console.warn(`Element matching '[cdkFocusInitial]' is not focusable.`, redirectToElement);\n      }\n      if (!this._checker.isFocusable(redirectToElement)) {\n        const focusableChild = this._getFirstTabbableElement(redirectToElement);\n        focusableChild?.focus(options);\n        return !!focusableChild;\n      }\n      redirectToElement.focus(options);\n      return true;\n    }\n    return this.focusFirstTabbableElement(options);\n  }\n  /**\n   * Focuses the first tabbable element within the focus trap region.\n   * @returns Whether focus was moved successfully.\n   */\n  focusFirstTabbableElement(options) {\n    const redirectToElement = this._getRegionBoundary('start');\n    if (redirectToElement) {\n      redirectToElement.focus(options);\n    }\n    return !!redirectToElement;\n  }\n  /**\n   * Focuses the last tabbable element within the focus trap region.\n   * @returns Whether focus was moved successfully.\n   */\n  focusLastTabbableElement(options) {\n    const redirectToElement = this._getRegionBoundary('end');\n    if (redirectToElement) {\n      redirectToElement.focus(options);\n    }\n    return !!redirectToElement;\n  }\n  /**\n   * Checks whether the focus trap has successfully been attached.\n   */\n  hasAttached() {\n    return this._hasAttached;\n  }\n  /** Get the first tabbable element from a DOM subtree (inclusive). */\n  _getFirstTabbableElement(root) {\n    if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {\n      return root;\n    }\n    const children = root.children;\n    for (let i = 0; i < children.length; i++) {\n      const tabbableChild = children[i].nodeType === this._document.ELEMENT_NODE ? this._getFirstTabbableElement(children[i]) : null;\n      if (tabbableChild) {\n        return tabbableChild;\n      }\n    }\n    return null;\n  }\n  /** Get the last tabbable element from a DOM subtree (inclusive). */\n  _getLastTabbableElement(root) {\n    if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {\n      return root;\n    }\n    // Iterate in reverse DOM order.\n    const children = root.children;\n    for (let i = children.length - 1; i >= 0; i--) {\n      const tabbableChild = children[i].nodeType === this._document.ELEMENT_NODE ? this._getLastTabbableElement(children[i]) : null;\n      if (tabbableChild) {\n        return tabbableChild;\n      }\n    }\n    return null;\n  }\n  /** Creates an anchor element. */\n  _createAnchor() {\n    const anchor = this._document.createElement('div');\n    this._toggleAnchorTabIndex(this._enabled, anchor);\n    anchor.classList.add('cdk-visually-hidden');\n    anchor.classList.add('cdk-focus-trap-anchor');\n    anchor.setAttribute('aria-hidden', 'true');\n    return anchor;\n  }\n  /**\n   * Toggles the `tabindex` of an anchor, based on the enabled state of the focus trap.\n   * @param isEnabled Whether the focus trap is enabled.\n   * @param anchor Anchor on which to toggle the tabindex.\n   */\n  _toggleAnchorTabIndex(isEnabled, anchor) {\n    // Remove the tabindex completely, rather than setting it to -1, because if the\n    // element has a tabindex, the user might still hit it when navigating with the arrow keys.\n    isEnabled ? anchor.setAttribute('tabindex', '0') : anchor.removeAttribute('tabindex');\n  }\n  /**\n   * Toggles the`tabindex` of both anchors to either trap Tab focus or allow it to escape.\n   * @param enabled: Whether the anchors should trap Tab.\n   */\n  toggleAnchors(enabled) {\n    if (this._startAnchor && this._endAnchor) {\n      this._toggleAnchorTabIndex(enabled, this._startAnchor);\n      this._toggleAnchorTabIndex(enabled, this._endAnchor);\n    }\n  }\n  /** Executes a function when the zone is stable. */\n  _executeOnStable(fn) {\n    // TODO: remove this conditional when injector is required in the constructor.\n    if (this._injector) {\n      afterNextRender(fn, {\n        injector: this._injector\n      });\n    } else {\n      setTimeout(fn);\n    }\n  }\n}\n/**\n * Factory that allows easy instantiation of focus traps.\n */\nlet FocusTrapFactory = /*#__PURE__*/(() => {\n  class FocusTrapFactory {\n    _checker = inject(InteractivityChecker);\n    _ngZone = inject(NgZone);\n    _document = inject(DOCUMENT);\n    _injector = inject(Injector);\n    constructor() {\n      inject(_CdkPrivateStyleLoader).load(_VisuallyHiddenLoader);\n    }\n    /**\n     * Creates a focus-trapped region around the given element.\n     * @param element The element around which focus will be trapped.\n     * @param deferCaptureElements Defers the creation of focus-capturing elements to be done\n     *     manually by the user.\n     * @returns The created focus trap instance.\n     */\n    create(element, deferCaptureElements = false) {\n      return new FocusTrap(element, this._checker, this._ngZone, this._document, deferCaptureElements, this._injector);\n    }\n    static ɵfac = function FocusTrapFactory_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || FocusTrapFactory)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: FocusTrapFactory,\n      factory: FocusTrapFactory.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return FocusTrapFactory;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Directive for trapping focus within a region. */\nlet CdkTrapFocus = /*#__PURE__*/(() => {\n  class CdkTrapFocus {\n    _elementRef = inject(ElementRef);\n    _focusTrapFactory = inject(FocusTrapFactory);\n    /** Underlying FocusTrap instance. */\n    focusTrap;\n    /** Previously focused element to restore focus to upon destroy when using autoCapture. */\n    _previouslyFocusedElement = null;\n    /** Whether the focus trap is active. */\n    get enabled() {\n      return this.focusTrap?.enabled || false;\n    }\n    set enabled(value) {\n      if (this.focusTrap) {\n        this.focusTrap.enabled = value;\n      }\n    }\n    /**\n     * Whether the directive should automatically move focus into the trapped region upon\n     * initialization and return focus to the previous activeElement upon destruction.\n     */\n    autoCapture;\n    constructor() {\n      const platform = inject(Platform);\n      if (platform.isBrowser) {\n        this.focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement, true);\n      }\n    }\n    ngOnDestroy() {\n      this.focusTrap?.destroy();\n      // If we stored a previously focused element when using autoCapture, return focus to that\n      // element now that the trapped region is being destroyed.\n      if (this._previouslyFocusedElement) {\n        this._previouslyFocusedElement.focus();\n        this._previouslyFocusedElement = null;\n      }\n    }\n    ngAfterContentInit() {\n      this.focusTrap?.attachAnchors();\n      if (this.autoCapture) {\n        this._captureFocus();\n      }\n    }\n    ngDoCheck() {\n      if (this.focusTrap && !this.focusTrap.hasAttached()) {\n        this.focusTrap.attachAnchors();\n      }\n    }\n    ngOnChanges(changes) {\n      const autoCaptureChange = changes['autoCapture'];\n      if (autoCaptureChange && !autoCaptureChange.firstChange && this.autoCapture && this.focusTrap?.hasAttached()) {\n        this._captureFocus();\n      }\n    }\n    _captureFocus() {\n      this._previouslyFocusedElement = _getFocusedElementPierceShadowDom();\n      this.focusTrap?.focusInitialElementWhenReady();\n    }\n    static ɵfac = function CdkTrapFocus_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkTrapFocus)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkTrapFocus,\n      selectors: [[\"\", \"cdkTrapFocus\", \"\"]],\n      inputs: {\n        enabled: [2, \"cdkTrapFocus\", \"enabled\", booleanAttribute],\n        autoCapture: [2, \"cdkTrapFocusAutoCapture\", \"autoCapture\", booleanAttribute]\n      },\n      exportAs: [\"cdkTrapFocus\"],\n      features: [i0.ɵɵNgOnChangesFeature]\n    });\n  }\n  return CdkTrapFocus;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst LIVE_ANNOUNCER_ELEMENT_TOKEN = /*#__PURE__*/new InjectionToken('liveAnnouncerElement', {\n  providedIn: 'root',\n  factory: LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY\n});\n/**\n * @docs-private\n * @deprecated No longer used, will be removed.\n * @breaking-change 21.0.0\n */\nfunction LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY() {\n  return null;\n}\n/** Injection token that can be used to configure the default options for the LiveAnnouncer. */\nconst LIVE_ANNOUNCER_DEFAULT_OPTIONS = /*#__PURE__*/new InjectionToken('LIVE_ANNOUNCER_DEFAULT_OPTIONS');\nlet uniqueIds = 0;\nlet LiveAnnouncer = /*#__PURE__*/(() => {\n  class LiveAnnouncer {\n    _ngZone = inject(NgZone);\n    _defaultOptions = inject(LIVE_ANNOUNCER_DEFAULT_OPTIONS, {\n      optional: true\n    });\n    _liveElement;\n    _document = inject(DOCUMENT);\n    _previousTimeout;\n    _currentPromise;\n    _currentResolve;\n    constructor() {\n      const elementToken = inject(LIVE_ANNOUNCER_ELEMENT_TOKEN, {\n        optional: true\n      });\n      this._liveElement = elementToken || this._createLiveElement();\n    }\n    announce(message, ...args) {\n      const defaultOptions = this._defaultOptions;\n      let politeness;\n      let duration;\n      if (args.length === 1 && typeof args[0] === 'number') {\n        duration = args[0];\n      } else {\n        [politeness, duration] = args;\n      }\n      this.clear();\n      clearTimeout(this._previousTimeout);\n      if (!politeness) {\n        politeness = defaultOptions && defaultOptions.politeness ? defaultOptions.politeness : 'polite';\n      }\n      if (duration == null && defaultOptions) {\n        duration = defaultOptions.duration;\n      }\n      // TODO: ensure changing the politeness works on all environments we support.\n      this._liveElement.setAttribute('aria-live', politeness);\n      if (this._liveElement.id) {\n        this._exposeAnnouncerToModals(this._liveElement.id);\n      }\n      // This 100ms timeout is necessary for some browser + screen-reader combinations:\n      // - Both JAWS and NVDA over IE11 will not announce anything without a non-zero timeout.\n      // - With Chrome and IE11 with NVDA or JAWS, a repeated (identical) message won't be read a\n      //   second time without clearing and then using a non-zero delay.\n      // (using JAWS 17 at time of this writing).\n      return this._ngZone.runOutsideAngular(() => {\n        if (!this._currentPromise) {\n          this._currentPromise = new Promise(resolve => this._currentResolve = resolve);\n        }\n        clearTimeout(this._previousTimeout);\n        this._previousTimeout = setTimeout(() => {\n          this._liveElement.textContent = message;\n          if (typeof duration === 'number') {\n            this._previousTimeout = setTimeout(() => this.clear(), duration);\n          }\n          // For some reason in tests this can be undefined\n          // Probably related to ZoneJS and every other thing that patches browser APIs in tests\n          this._currentResolve?.();\n          this._currentPromise = this._currentResolve = undefined;\n        }, 100);\n        return this._currentPromise;\n      });\n    }\n    /**\n     * Clears the current text from the announcer element. Can be used to prevent\n     * screen readers from reading the text out again while the user is going\n     * through the page landmarks.\n     */\n    clear() {\n      if (this._liveElement) {\n        this._liveElement.textContent = '';\n      }\n    }\n    ngOnDestroy() {\n      clearTimeout(this._previousTimeout);\n      this._liveElement?.remove();\n      this._liveElement = null;\n      this._currentResolve?.();\n      this._currentPromise = this._currentResolve = undefined;\n    }\n    _createLiveElement() {\n      const elementClass = 'cdk-live-announcer-element';\n      const previousElements = this._document.getElementsByClassName(elementClass);\n      const liveEl = this._document.createElement('div');\n      // Remove any old containers. This can happen when coming in from a server-side-rendered page.\n      for (let i = 0; i < previousElements.length; i++) {\n        previousElements[i].remove();\n      }\n      liveEl.classList.add(elementClass);\n      liveEl.classList.add('cdk-visually-hidden');\n      liveEl.setAttribute('aria-atomic', 'true');\n      liveEl.setAttribute('aria-live', 'polite');\n      liveEl.id = `cdk-live-announcer-${uniqueIds++}`;\n      this._document.body.appendChild(liveEl);\n      return liveEl;\n    }\n    /**\n     * Some browsers won't expose the accessibility node of the live announcer element if there is an\n     * `aria-modal` and the live announcer is outside of it. This method works around the issue by\n     * pointing the `aria-owns` of all modals to the live announcer element.\n     */\n    _exposeAnnouncerToModals(id) {\n      // TODO(http://github.com/angular/components/issues/26853): consider de-duplicating this with\n      // the `SnakBarContainer` and other usages.\n      //\n      // Note that the selector here is limited to CDK overlays at the moment in order to reduce the\n      // section of the DOM we need to look through. This should cover all the cases we support, but\n      // the selector can be expanded if it turns out to be too narrow.\n      const modals = this._document.querySelectorAll('body > .cdk-overlay-container [aria-modal=\"true\"]');\n      for (let i = 0; i < modals.length; i++) {\n        const modal = modals[i];\n        const ariaOwns = modal.getAttribute('aria-owns');\n        if (!ariaOwns) {\n          modal.setAttribute('aria-owns', id);\n        } else if (ariaOwns.indexOf(id) === -1) {\n          modal.setAttribute('aria-owns', ariaOwns + ' ' + id);\n        }\n      }\n    }\n    static ɵfac = function LiveAnnouncer_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || LiveAnnouncer)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: LiveAnnouncer,\n      factory: LiveAnnouncer.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return LiveAnnouncer;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * A directive that works similarly to aria-live, but uses the LiveAnnouncer to ensure compatibility\n * with a wider range of browsers and screen readers.\n */\nlet CdkAriaLive = /*#__PURE__*/(() => {\n  class CdkAriaLive {\n    _elementRef = inject(ElementRef);\n    _liveAnnouncer = inject(LiveAnnouncer);\n    _contentObserver = inject(ContentObserver);\n    _ngZone = inject(NgZone);\n    /** The aria-live politeness level to use when announcing messages. */\n    get politeness() {\n      return this._politeness;\n    }\n    set politeness(value) {\n      this._politeness = value === 'off' || value === 'assertive' ? value : 'polite';\n      if (this._politeness === 'off') {\n        if (this._subscription) {\n          this._subscription.unsubscribe();\n          this._subscription = null;\n        }\n      } else if (!this._subscription) {\n        this._subscription = this._ngZone.runOutsideAngular(() => {\n          return this._contentObserver.observe(this._elementRef).subscribe(() => {\n            // Note that we use textContent here, rather than innerText, in order to avoid a reflow.\n            const elementText = this._elementRef.nativeElement.textContent;\n            // The `MutationObserver` fires also for attribute\n            // changes which we don't want to announce.\n            if (elementText !== this._previousAnnouncedText) {\n              this._liveAnnouncer.announce(elementText, this._politeness, this.duration);\n              this._previousAnnouncedText = elementText;\n            }\n          });\n        });\n      }\n    }\n    _politeness = 'polite';\n    /** Time in milliseconds after which to clear out the announcer element. */\n    duration;\n    _previousAnnouncedText;\n    _subscription;\n    constructor() {\n      inject(_CdkPrivateStyleLoader).load(_VisuallyHiddenLoader);\n    }\n    ngOnDestroy() {\n      if (this._subscription) {\n        this._subscription.unsubscribe();\n      }\n    }\n    static ɵfac = function CdkAriaLive_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkAriaLive)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkAriaLive,\n      selectors: [[\"\", \"cdkAriaLive\", \"\"]],\n      inputs: {\n        politeness: [0, \"cdkAriaLive\", \"politeness\"],\n        duration: [0, \"cdkAriaLiveDuration\", \"duration\"]\n      },\n      exportAs: [\"cdkAriaLive\"]\n    });\n  }\n  return CdkAriaLive;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Set of possible high-contrast mode backgrounds. */\nvar HighContrastMode = /*#__PURE__*/function (HighContrastMode) {\n  HighContrastMode[HighContrastMode[\"NONE\"] = 0] = \"NONE\";\n  HighContrastMode[HighContrastMode[\"BLACK_ON_WHITE\"] = 1] = \"BLACK_ON_WHITE\";\n  HighContrastMode[HighContrastMode[\"WHITE_ON_BLACK\"] = 2] = \"WHITE_ON_BLACK\";\n  return HighContrastMode;\n}(HighContrastMode || {});\n/** CSS class applied to the document body when in black-on-white high-contrast mode. */\nconst BLACK_ON_WHITE_CSS_CLASS = 'cdk-high-contrast-black-on-white';\n/** CSS class applied to the document body when in white-on-black high-contrast mode. */\nconst WHITE_ON_BLACK_CSS_CLASS = 'cdk-high-contrast-white-on-black';\n/** CSS class applied to the document body when in high-contrast mode. */\nconst HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS = 'cdk-high-contrast-active';\n/**\n * Service to determine whether the browser is currently in a high-contrast-mode environment.\n *\n * Microsoft Windows supports an accessibility feature called \"High Contrast Mode\". This mode\n * changes the appearance of all applications, including web applications, to dramatically increase\n * contrast.\n *\n * IE, Edge, and Firefox currently support this mode. Chrome does not support Windows High Contrast\n * Mode. This service does not detect high-contrast mode as added by the Chrome \"High Contrast\"\n * browser extension.\n */\nlet HighContrastModeDetector = /*#__PURE__*/(() => {\n  class HighContrastModeDetector {\n    _platform = inject(Platform);\n    /**\n     * Figuring out the high contrast mode and adding the body classes can cause\n     * some expensive layouts. This flag is used to ensure that we only do it once.\n     */\n    _hasCheckedHighContrastMode;\n    _document = inject(DOCUMENT);\n    _breakpointSubscription;\n    constructor() {\n      this._breakpointSubscription = inject(BreakpointObserver).observe('(forced-colors: active)').subscribe(() => {\n        if (this._hasCheckedHighContrastMode) {\n          this._hasCheckedHighContrastMode = false;\n          this._applyBodyHighContrastModeCssClasses();\n        }\n      });\n    }\n    /** Gets the current high-contrast-mode for the page. */\n    getHighContrastMode() {\n      if (!this._platform.isBrowser) {\n        return HighContrastMode.NONE;\n      }\n      // Create a test element with an arbitrary background-color that is neither black nor\n      // white; high-contrast mode will coerce the color to either black or white. Also ensure that\n      // appending the test element to the DOM does not affect layout by absolutely positioning it\n      const testElement = this._document.createElement('div');\n      testElement.style.backgroundColor = 'rgb(1,2,3)';\n      testElement.style.position = 'absolute';\n      this._document.body.appendChild(testElement);\n      // Get the computed style for the background color, collapsing spaces to normalize between\n      // browsers. Once we get this color, we no longer need the test element. Access the `window`\n      // via the document so we can fake it in tests. Note that we have extra null checks, because\n      // this logic will likely run during app bootstrap and throwing can break the entire app.\n      const documentWindow = this._document.defaultView || window;\n      const computedStyle = documentWindow && documentWindow.getComputedStyle ? documentWindow.getComputedStyle(testElement) : null;\n      const computedColor = (computedStyle && computedStyle.backgroundColor || '').replace(/ /g, '');\n      testElement.remove();\n      switch (computedColor) {\n        // Pre Windows 11 dark theme.\n        case 'rgb(0,0,0)':\n        // Windows 11 dark themes.\n        case 'rgb(45,50,54)':\n        case 'rgb(32,32,32)':\n          return HighContrastMode.WHITE_ON_BLACK;\n        // Pre Windows 11 light theme.\n        case 'rgb(255,255,255)':\n        // Windows 11 light theme.\n        case 'rgb(255,250,239)':\n          return HighContrastMode.BLACK_ON_WHITE;\n      }\n      return HighContrastMode.NONE;\n    }\n    ngOnDestroy() {\n      this._breakpointSubscription.unsubscribe();\n    }\n    /** Applies CSS classes indicating high-contrast mode to document body (browser-only). */\n    _applyBodyHighContrastModeCssClasses() {\n      if (!this._hasCheckedHighContrastMode && this._platform.isBrowser && this._document.body) {\n        const bodyClasses = this._document.body.classList;\n        bodyClasses.remove(HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS, BLACK_ON_WHITE_CSS_CLASS, WHITE_ON_BLACK_CSS_CLASS);\n        this._hasCheckedHighContrastMode = true;\n        const mode = this.getHighContrastMode();\n        if (mode === HighContrastMode.BLACK_ON_WHITE) {\n          bodyClasses.add(HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS, BLACK_ON_WHITE_CSS_CLASS);\n        } else if (mode === HighContrastMode.WHITE_ON_BLACK) {\n          bodyClasses.add(HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS, WHITE_ON_BLACK_CSS_CLASS);\n        }\n      }\n    }\n    static ɵfac = function HighContrastModeDetector_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || HighContrastModeDetector)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: HighContrastModeDetector,\n      factory: HighContrastModeDetector.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return HighContrastModeDetector;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet A11yModule = /*#__PURE__*/(() => {\n  class A11yModule {\n    constructor() {\n      inject(HighContrastModeDetector)._applyBodyHighContrastModeCssClasses();\n    }\n    static ɵfac = function A11yModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || A11yModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: A11yModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      imports: [ObserversModule]\n    });\n  }\n  return A11yModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { A11yModule as A, CdkTrapFocus as C, FocusTrapFactory as F, HighContrastModeDetector as H, InteractivityChecker as I, LiveAnnouncer as L, FocusTrap as a, HighContrastMode as b, IsFocusableConfig as c, CdkAriaLive as d, LIVE_ANNOUNCER_ELEMENT_TOKEN as e, LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY as f, LIVE_ANNOUNCER_DEFAULT_OPTIONS as g };\n","import * as i0 from '@angular/core';\nimport { inject, APP_ID, Injectable } from '@angular/core';\n\n/**\n * Keeps track of the ID count per prefix. This helps us make the IDs a bit more deterministic\n * like they were before the service was introduced. Note that ideally we wouldn't have to do\n * this, but there are some internal tests that rely on the IDs.\n */\nconst counters = {};\n/** Service that generates unique IDs for DOM nodes. */\nlet _IdGenerator = /*#__PURE__*/(() => {\n  class _IdGenerator {\n    _appId = inject(APP_ID);\n    /**\n     * Generates a unique ID with a specific prefix.\n     * @param prefix Prefix to add to the ID.\n     */\n    getId(prefix) {\n      // Omit the app ID if it's the default `ng`. Since the vast majority of pages have one\n      // Angular app on them, we can reduce the amount of breakages by not adding it.\n      if (this._appId !== 'ng') {\n        prefix += this._appId;\n      }\n      if (!counters.hasOwnProperty(prefix)) {\n        counters[prefix] = 0;\n      }\n      return `${prefix}${counters[prefix]++}`;\n    }\n    static ɵfac = function _IdGenerator_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || _IdGenerator)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: _IdGenerator,\n      factory: _IdGenerator.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return _IdGenerator;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { _IdGenerator as _ };\n","export { A, d as ALT, aX as APOSTROPHE, a1 as AT_SIGN, a2 as B, a_ as BACKSLASH, B as BACKSPACE, a3 as C, y as CAPS_LOCK, a$ as CLOSE_SQUARE_BRACKET, u as COMMA, as as CONTEXT_MENU, C as CONTROL, a4 as D, aV as DASH, i as DELETE, D as DOWN_ARROW, a5 as E, Y as EIGHT, E as END, c as ENTER, aU as EQUALS, g as ESCAPE, a6 as F, F as F1, r as F10, s as F11, t as F12, j as F2, k as F3, l as F4, m as F5, n as F6, o as F7, p as F8, q as F9, $ as FF_EQUALS, aL as FF_MINUS, aP as FF_MUTE, _ as FF_SEMICOLON, aQ as FF_VOLUME_DOWN, aS as FF_VOLUME_UP, aK as FIRST_MEDIA, V as FIVE, Q as FOUR, a7 as G, a8 as H, H as HOME, a9 as I, I as INSERT, aa as J, ab as K, ac as L, aR as LAST_MEDIA, L as LEFT_ARROW, ad as M, v as MAC_ENTER, M as MAC_META, aq as MAC_WK_CMD_LEFT, ar as MAC_WK_CMD_RIGHT, e as META, aM as MUTE, ae as N, N as NINE, aH as NUMPAD_DIVIDE, aB as NUMPAD_EIGHT, ay as NUMPAD_FIVE, ax as NUMPAD_FOUR, aF as NUMPAD_MINUS, aD as NUMPAD_MULTIPLY, aC as NUMPAD_NINE, au as NUMPAD_ONE, aG as NUMPAD_PERIOD, aE as NUMPAD_PLUS, aA as NUMPAD_SEVEN, az as NUMPAD_SIX, aw as NUMPAD_THREE, av as NUMPAD_TWO, at as NUMPAD_ZERO, w as NUM_CENTER, aI as NUM_LOCK, af as O, O as ONE, aZ as OPEN_SQUARE_BRACKET, ag as P, P as PAGE_DOWN, a as PAGE_UP, x as PAUSE, h as PERIOD, z as PLUS_SIGN, G as PRINT_SCREEN, ah as Q, a0 as QUESTION_MARK, ai as R, R as RIGHT_ARROW, aj as S, aJ as SCROLL_LOCK, aT as SEMICOLON, X as SEVEN, f as SHIFT, b0 as SINGLE_QUOTE, W as SIX, aW as SLASH, S as SPACE, ak as T, T as TAB, K as THREE, aY as TILDE, J as TWO, al as U, U as UP_ARROW, am as V, aN as VOLUME_DOWN, aO as VOLUME_UP, an as W, ao as X, ap as Y, Z, b as ZERO } from './keycodes-CpHkExLC.mjs';\n\n/**\n * Checks whether a modifier key is pressed.\n * @param event Event to be checked.\n */\nfunction hasModifierKey(event, ...modifiers) {\n  if (modifiers.length) {\n    return modifiers.some(modifier => event[modifier]);\n  }\n  return event.altKey || event.shiftKey || event.ctrlKey || event.metaKey;\n}\nexport { hasModifierKey };\n","import { Subject } from 'rxjs';\nimport { tap, debounceTime, filter, map } from 'rxjs/operators';\nimport { A, Z, b as ZERO, N as NINE } from './keycodes-CpHkExLC.mjs';\nconst DEFAULT_TYPEAHEAD_DEBOUNCE_INTERVAL_MS = 200;\n/**\n * Selects items based on keyboard inputs. Implements the typeahead functionality of\n * `role=\"listbox\"` or `role=\"tree\"` and other related roles.\n */\nclass Typeahead {\n  _letterKeyStream = /*#__PURE__*/new Subject();\n  _items = [];\n  _selectedItemIndex = -1;\n  /** Buffer for the letters that the user has pressed */\n  _pressedLetters = [];\n  _skipPredicateFn;\n  _selectedItem = /*#__PURE__*/new Subject();\n  selectedItem = this._selectedItem;\n  constructor(initialItems, config) {\n    const typeAheadInterval = typeof config?.debounceInterval === 'number' ? config.debounceInterval : DEFAULT_TYPEAHEAD_DEBOUNCE_INTERVAL_MS;\n    if (config?.skipPredicate) {\n      this._skipPredicateFn = config.skipPredicate;\n    }\n    if ((typeof ngDevMode === 'undefined' || ngDevMode) && initialItems.length && initialItems.some(item => typeof item.getLabel !== 'function')) {\n      throw new Error('KeyManager items in typeahead mode must implement the `getLabel` method.');\n    }\n    this.setItems(initialItems);\n    this._setupKeyHandler(typeAheadInterval);\n  }\n  destroy() {\n    this._pressedLetters = [];\n    this._letterKeyStream.complete();\n    this._selectedItem.complete();\n  }\n  setCurrentSelectedItemIndex(index) {\n    this._selectedItemIndex = index;\n  }\n  setItems(items) {\n    this._items = items;\n  }\n  handleKey(event) {\n    const keyCode = event.keyCode;\n    // Attempt to use the `event.key` which also maps it to the user's keyboard language,\n    // otherwise fall back to resolving alphanumeric characters via the keyCode.\n    if (event.key && event.key.length === 1) {\n      this._letterKeyStream.next(event.key.toLocaleUpperCase());\n    } else if (keyCode >= A && keyCode <= Z || keyCode >= ZERO && keyCode <= NINE) {\n      this._letterKeyStream.next(String.fromCharCode(keyCode));\n    }\n  }\n  /** Gets whether the user is currently typing into the manager using the typeahead feature. */\n  isTyping() {\n    return this._pressedLetters.length > 0;\n  }\n  /** Resets the currently stored sequence of typed letters. */\n  reset() {\n    this._pressedLetters = [];\n  }\n  _setupKeyHandler(typeAheadInterval) {\n    // Debounce the presses of non-navigational keys, collect the ones that correspond to letters\n    // and convert those letters back into a string. Afterwards find the first item that starts\n    // with that string and select it.\n    this._letterKeyStream.pipe(tap(letter => this._pressedLetters.push(letter)), debounceTime(typeAheadInterval), filter(() => this._pressedLetters.length > 0), map(() => this._pressedLetters.join('').toLocaleUpperCase())).subscribe(inputString => {\n      // Start at 1 because we want to start searching at the item immediately\n      // following the current active item.\n      for (let i = 1; i < this._items.length + 1; i++) {\n        const index = (this._selectedItemIndex + i) % this._items.length;\n        const item = this._items[index];\n        if (!this._skipPredicateFn?.(item) && item.getLabel?.().toLocaleUpperCase().trim().indexOf(inputString) === 0) {\n          this._selectedItem.next(item);\n          break;\n        }\n      }\n      this._pressedLetters = [];\n    });\n  }\n}\nexport { Typeahead as T };\n","import { signal, QueryList, isSignal, effect } from '@angular/core';\nimport { Subscription, Subject } from 'rxjs';\nimport { T as Typeahead } from './typeahead-9ZW4Dtsf.mjs';\nimport { hasModifierKey } from './keycodes.mjs';\nimport { P as PAGE_DOWN, a as PAGE_UP, E as END, H as HOME, L as LEFT_ARROW, R as RIGHT_ARROW, U as UP_ARROW, D as DOWN_ARROW, T as TAB } from './keycodes-CpHkExLC.mjs';\n\n/**\n * This class manages keyboard events for selectable lists. If you pass it a query list\n * of items, it will set the active item correctly when arrow events occur.\n */\nclass ListKeyManager {\n  _items;\n  _activeItemIndex = -1;\n  _activeItem = /*#__PURE__*/signal(null);\n  _wrap = false;\n  _typeaheadSubscription = Subscription.EMPTY;\n  _itemChangesSubscription;\n  _vertical = true;\n  _horizontal;\n  _allowedModifierKeys = [];\n  _homeAndEnd = false;\n  _pageUpAndDown = {\n    enabled: false,\n    delta: 10\n  };\n  _effectRef;\n  _typeahead;\n  /**\n   * Predicate function that can be used to check whether an item should be skipped\n   * by the key manager. By default, disabled items are skipped.\n   */\n  _skipPredicateFn = item => item.disabled;\n  constructor(_items, injector) {\n    this._items = _items;\n    // We allow for the items to be an array because, in some cases, the consumer may\n    // not have access to a QueryList of the items they want to manage (e.g. when the\n    // items aren't being collected via `ViewChildren` or `ContentChildren`).\n    if (_items instanceof QueryList) {\n      this._itemChangesSubscription = _items.changes.subscribe(newItems => this._itemsChanged(newItems.toArray()));\n    } else if (isSignal(_items)) {\n      if (!injector && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw new Error('ListKeyManager constructed with a signal must receive an injector');\n      }\n      this._effectRef = effect(() => this._itemsChanged(_items()), {\n        injector\n      });\n    }\n  }\n  /**\n   * Stream that emits any time the TAB key is pressed, so components can react\n   * when focus is shifted off of the list.\n   */\n  tabOut = /*#__PURE__*/new Subject();\n  /** Stream that emits whenever the active item of the list manager changes. */\n  change = /*#__PURE__*/new Subject();\n  /**\n   * Sets the predicate function that determines which items should be skipped by the\n   * list key manager.\n   * @param predicate Function that determines whether the given item should be skipped.\n   */\n  skipPredicate(predicate) {\n    this._skipPredicateFn = predicate;\n    return this;\n  }\n  /**\n   * Configures wrapping mode, which determines whether the active item will wrap to\n   * the other end of list when there are no more items in the given direction.\n   * @param shouldWrap Whether the list should wrap when reaching the end.\n   */\n  withWrap(shouldWrap = true) {\n    this._wrap = shouldWrap;\n    return this;\n  }\n  /**\n   * Configures whether the key manager should be able to move the selection vertically.\n   * @param enabled Whether vertical selection should be enabled.\n   */\n  withVerticalOrientation(enabled = true) {\n    this._vertical = enabled;\n    return this;\n  }\n  /**\n   * Configures the key manager to move the selection horizontally.\n   * Passing in `null` will disable horizontal movement.\n   * @param direction Direction in which the selection can be moved.\n   */\n  withHorizontalOrientation(direction) {\n    this._horizontal = direction;\n    return this;\n  }\n  /**\n   * Modifier keys which are allowed to be held down and whose default actions will be prevented\n   * as the user is pressing the arrow keys. Defaults to not allowing any modifier keys.\n   */\n  withAllowedModifierKeys(keys) {\n    this._allowedModifierKeys = keys;\n    return this;\n  }\n  /**\n   * Turns on typeahead mode which allows users to set the active item by typing.\n   * @param debounceInterval Time to wait after the last keystroke before setting the active item.\n   */\n  withTypeAhead(debounceInterval = 200) {\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      const items = this._getItemsArray();\n      if (items.length > 0 && items.some(item => typeof item.getLabel !== 'function')) {\n        throw Error('ListKeyManager items in typeahead mode must implement the `getLabel` method.');\n      }\n    }\n    this._typeaheadSubscription.unsubscribe();\n    const items = this._getItemsArray();\n    this._typeahead = new Typeahead(items, {\n      debounceInterval: typeof debounceInterval === 'number' ? debounceInterval : undefined,\n      skipPredicate: item => this._skipPredicateFn(item)\n    });\n    this._typeaheadSubscription = this._typeahead.selectedItem.subscribe(item => {\n      this.setActiveItem(item);\n    });\n    return this;\n  }\n  /** Cancels the current typeahead sequence. */\n  cancelTypeahead() {\n    this._typeahead?.reset();\n    return this;\n  }\n  /**\n   * Configures the key manager to activate the first and last items\n   * respectively when the Home or End key is pressed.\n   * @param enabled Whether pressing the Home or End key activates the first/last item.\n   */\n  withHomeAndEnd(enabled = true) {\n    this._homeAndEnd = enabled;\n    return this;\n  }\n  /**\n   * Configures the key manager to activate every 10th, configured or first/last element in up/down direction\n   * respectively when the Page-Up or Page-Down key is pressed.\n   * @param enabled Whether pressing the Page-Up or Page-Down key activates the first/last item.\n   * @param delta Whether pressing the Home or End key activates the first/last item.\n   */\n  withPageUpDown(enabled = true, delta = 10) {\n    this._pageUpAndDown = {\n      enabled,\n      delta\n    };\n    return this;\n  }\n  setActiveItem(item) {\n    const previousActiveItem = this._activeItem();\n    this.updateActiveItem(item);\n    if (this._activeItem() !== previousActiveItem) {\n      this.change.next(this._activeItemIndex);\n    }\n  }\n  /**\n   * Sets the active item depending on the key event passed in.\n   * @param event Keyboard event to be used for determining which element should be active.\n   */\n  onKeydown(event) {\n    const keyCode = event.keyCode;\n    const modifiers = ['altKey', 'ctrlKey', 'metaKey', 'shiftKey'];\n    const isModifierAllowed = modifiers.every(modifier => {\n      return !event[modifier] || this._allowedModifierKeys.indexOf(modifier) > -1;\n    });\n    switch (keyCode) {\n      case TAB:\n        this.tabOut.next();\n        return;\n      case DOWN_ARROW:\n        if (this._vertical && isModifierAllowed) {\n          this.setNextItemActive();\n          break;\n        } else {\n          return;\n        }\n      case UP_ARROW:\n        if (this._vertical && isModifierAllowed) {\n          this.setPreviousItemActive();\n          break;\n        } else {\n          return;\n        }\n      case RIGHT_ARROW:\n        if (this._horizontal && isModifierAllowed) {\n          this._horizontal === 'rtl' ? this.setPreviousItemActive() : this.setNextItemActive();\n          break;\n        } else {\n          return;\n        }\n      case LEFT_ARROW:\n        if (this._horizontal && isModifierAllowed) {\n          this._horizontal === 'rtl' ? this.setNextItemActive() : this.setPreviousItemActive();\n          break;\n        } else {\n          return;\n        }\n      case HOME:\n        if (this._homeAndEnd && isModifierAllowed) {\n          this.setFirstItemActive();\n          break;\n        } else {\n          return;\n        }\n      case END:\n        if (this._homeAndEnd && isModifierAllowed) {\n          this.setLastItemActive();\n          break;\n        } else {\n          return;\n        }\n      case PAGE_UP:\n        if (this._pageUpAndDown.enabled && isModifierAllowed) {\n          const targetIndex = this._activeItemIndex - this._pageUpAndDown.delta;\n          this._setActiveItemByIndex(targetIndex > 0 ? targetIndex : 0, 1);\n          break;\n        } else {\n          return;\n        }\n      case PAGE_DOWN:\n        if (this._pageUpAndDown.enabled && isModifierAllowed) {\n          const targetIndex = this._activeItemIndex + this._pageUpAndDown.delta;\n          const itemsLength = this._getItemsArray().length;\n          this._setActiveItemByIndex(targetIndex < itemsLength ? targetIndex : itemsLength - 1, -1);\n          break;\n        } else {\n          return;\n        }\n      default:\n        if (isModifierAllowed || hasModifierKey(event, 'shiftKey')) {\n          this._typeahead?.handleKey(event);\n        }\n        // Note that we return here, in order to avoid preventing\n        // the default action of non-navigational keys.\n        return;\n    }\n    this._typeahead?.reset();\n    event.preventDefault();\n  }\n  /** Index of the currently active item. */\n  get activeItemIndex() {\n    return this._activeItemIndex;\n  }\n  /** The active item. */\n  get activeItem() {\n    return this._activeItem();\n  }\n  /** Gets whether the user is currently typing into the manager using the typeahead feature. */\n  isTyping() {\n    return !!this._typeahead && this._typeahead.isTyping();\n  }\n  /** Sets the active item to the first enabled item in the list. */\n  setFirstItemActive() {\n    this._setActiveItemByIndex(0, 1);\n  }\n  /** Sets the active item to the last enabled item in the list. */\n  setLastItemActive() {\n    this._setActiveItemByIndex(this._getItemsArray().length - 1, -1);\n  }\n  /** Sets the active item to the next enabled item in the list. */\n  setNextItemActive() {\n    this._activeItemIndex < 0 ? this.setFirstItemActive() : this._setActiveItemByDelta(1);\n  }\n  /** Sets the active item to a previous enabled item in the list. */\n  setPreviousItemActive() {\n    this._activeItemIndex < 0 && this._wrap ? this.setLastItemActive() : this._setActiveItemByDelta(-1);\n  }\n  updateActiveItem(item) {\n    const itemArray = this._getItemsArray();\n    const index = typeof item === 'number' ? item : itemArray.indexOf(item);\n    const activeItem = itemArray[index];\n    // Explicitly check for `null` and `undefined` because other falsy values are valid.\n    this._activeItem.set(activeItem == null ? null : activeItem);\n    this._activeItemIndex = index;\n    this._typeahead?.setCurrentSelectedItemIndex(index);\n  }\n  /** Cleans up the key manager. */\n  destroy() {\n    this._typeaheadSubscription.unsubscribe();\n    this._itemChangesSubscription?.unsubscribe();\n    this._effectRef?.destroy();\n    this._typeahead?.destroy();\n    this.tabOut.complete();\n    this.change.complete();\n  }\n  /**\n   * This method sets the active item, given a list of items and the delta between the\n   * currently active item and the new active item. It will calculate differently\n   * depending on whether wrap mode is turned on.\n   */\n  _setActiveItemByDelta(delta) {\n    this._wrap ? this._setActiveInWrapMode(delta) : this._setActiveInDefaultMode(delta);\n  }\n  /**\n   * Sets the active item properly given \"wrap\" mode. In other words, it will continue to move\n   * down the list until it finds an item that is not disabled, and it will wrap if it\n   * encounters either end of the list.\n   */\n  _setActiveInWrapMode(delta) {\n    const items = this._getItemsArray();\n    for (let i = 1; i <= items.length; i++) {\n      const index = (this._activeItemIndex + delta * i + items.length) % items.length;\n      const item = items[index];\n      if (!this._skipPredicateFn(item)) {\n        this.setActiveItem(index);\n        return;\n      }\n    }\n  }\n  /**\n   * Sets the active item properly given the default mode. In other words, it will\n   * continue to move down the list until it finds an item that is not disabled. If\n   * it encounters either end of the list, it will stop and not wrap.\n   */\n  _setActiveInDefaultMode(delta) {\n    this._setActiveItemByIndex(this._activeItemIndex + delta, delta);\n  }\n  /**\n   * Sets the active item to the first enabled item starting at the index specified. If the\n   * item is disabled, it will move in the fallbackDelta direction until it either\n   * finds an enabled item or encounters the end of the list.\n   */\n  _setActiveItemByIndex(index, fallbackDelta) {\n    const items = this._getItemsArray();\n    if (!items[index]) {\n      return;\n    }\n    while (this._skipPredicateFn(items[index])) {\n      index += fallbackDelta;\n      if (!items[index]) {\n        return;\n      }\n    }\n    this.setActiveItem(index);\n  }\n  /** Returns the items as an array. */\n  _getItemsArray() {\n    if (isSignal(this._items)) {\n      return this._items();\n    }\n    return this._items instanceof QueryList ? this._items.toArray() : this._items;\n  }\n  /** Callback for when the items have changed. */\n  _itemsChanged(newItems) {\n    this._typeahead?.setItems(newItems);\n    const activeItem = this._activeItem();\n    if (activeItem) {\n      const newIndex = newItems.indexOf(activeItem);\n      if (newIndex > -1 && newIndex !== this._activeItemIndex) {\n        this._activeItemIndex = newIndex;\n        this._typeahead?.setCurrentSelectedItemIndex(newIndex);\n      }\n    }\n  }\n}\nexport { ListKeyManager as L };\n","import { L as ListKeyManager } from './list-key-manager-CyOIXo8P.mjs';\nclass FocusKeyManager extends ListKeyManager {\n  _origin = 'program';\n  /**\n   * Sets the focus origin that will be passed in to the items for any subsequent `focus` calls.\n   * @param origin Focus origin to be used when focusing items.\n   */\n  setFocusOrigin(origin) {\n    this._origin = origin;\n    return this;\n  }\n  setActiveItem(item) {\n    super.setActiveItem(item);\n    if (this.activeItem) {\n      this.activeItem.focus(this._origin);\n    }\n  }\n}\nexport { FocusKeyManager as F };\n","export { C as CdkMonitorFocus, d as FOCUS_MONITOR_DEFAULT_OPTIONS, F as FocusMonitor, c as FocusMonitorDetectionMode, a as INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS, b as INPUT_MODALITY_DETECTOR_OPTIONS, I as InputModalityDetector } from './focus-monitor-e2l_RpN3.mjs';\nimport { a as FocusTrap, I as InteractivityChecker } from './a11y-module-BYox5gpI.mjs';\nexport { A as A11yModule, d as CdkAriaLive, C as CdkTrapFocus, F as FocusTrapFactory, b as HighContrastMode, H as HighContrastModeDetector, c as IsFocusableConfig, g as LIVE_ANNOUNCER_DEFAULT_OPTIONS, e as LIVE_ANNOUNCER_ELEMENT_TOKEN, f as LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY, L as LiveAnnouncer } from './a11y-module-BYox5gpI.mjs';\nexport { _ as _IdGenerator } from './id-generator-Dw_9dSDu.mjs';\nimport { DOCUMENT } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { inject, APP_ID, Injectable, InjectionToken, NgZone, Injector } from '@angular/core';\nimport { P as Platform } from './platform-DmdVEw_C.mjs';\nimport { _ as _CdkPrivateStyleLoader } from './style-loader-Cu9AvjH9.mjs';\nimport { _VisuallyHiddenLoader } from './private.mjs';\nexport { A as ActiveDescendantKeyManager } from './activedescendant-key-manager-DC3-fwQI.mjs';\nexport { F as FocusKeyManager } from './focus-key-manager-C1rAQJ5z.mjs';\nexport { L as ListKeyManager } from './list-key-manager-CyOIXo8P.mjs';\nimport { Subject } from 'rxjs';\nimport { T as TREE_KEY_MANAGER } from './tree-key-manager-KnCoIkIC.mjs';\nexport { b as TREE_KEY_MANAGER_FACTORY, c as TREE_KEY_MANAGER_FACTORY_PROVIDER, a as TreeKeyManager } from './tree-key-manager-KnCoIkIC.mjs';\nexport { i as isFakeMousedownFromScreenReader, a as isFakeTouchstartFromScreenReader } from './fake-event-detection-DWOdFTFz.mjs';\nimport 'rxjs/operators';\nimport './keycodes-CpHkExLC.mjs';\nimport './shadow-dom-B0oHn41l.mjs';\nimport './backwards-compatibility-DHR38MsD.mjs';\nimport './passive-listeners-esHZRgIN.mjs';\nimport './element-x4z00URv.mjs';\nimport './breakpoints-observer-CljOfYGy.mjs';\nimport './array-I1yfCXUO.mjs';\nimport './observers.mjs';\nimport './typeahead-9ZW4Dtsf.mjs';\nimport './keycodes.mjs';\nimport './coercion/private.mjs';\n\n/** IDs are delimited by an empty space, as per the spec. */\nconst ID_DELIMITER = ' ';\n/**\n * Adds the given ID to the specified ARIA attribute on an element.\n * Used for attributes such as aria-labelledby, aria-owns, etc.\n */\nfunction addAriaReferencedId(el, attr, id) {\n  const ids = getAriaReferenceIds(el, attr);\n  id = id.trim();\n  if (ids.some(existingId => existingId.trim() === id)) {\n    return;\n  }\n  ids.push(id);\n  el.setAttribute(attr, ids.join(ID_DELIMITER));\n}\n/**\n * Removes the given ID from the specified ARIA attribute on an element.\n * Used for attributes such as aria-labelledby, aria-owns, etc.\n */\nfunction removeAriaReferencedId(el, attr, id) {\n  const ids = getAriaReferenceIds(el, attr);\n  id = id.trim();\n  const filteredIds = ids.filter(val => val !== id);\n  if (filteredIds.length) {\n    el.setAttribute(attr, filteredIds.join(ID_DELIMITER));\n  } else {\n    el.removeAttribute(attr);\n  }\n}\n/**\n * Gets the list of IDs referenced by the given ARIA attribute on an element.\n * Used for attributes such as aria-labelledby, aria-owns, etc.\n */\nfunction getAriaReferenceIds(el, attr) {\n  // Get string array of all individual ids (whitespace delimited) in the attribute value\n  const attrValue = el.getAttribute(attr);\n  return attrValue?.match(/\\S+/g) ?? [];\n}\n\n/**\n * ID used for the body container where all messages are appended.\n * @deprecated No longer being used. To be removed.\n * @breaking-change 14.0.0\n */\nconst MESSAGES_CONTAINER_ID = 'cdk-describedby-message-container';\n/**\n * ID prefix used for each created message element.\n * @deprecated To be turned into a private variable.\n * @breaking-change 14.0.0\n */\nconst CDK_DESCRIBEDBY_ID_PREFIX = 'cdk-describedby-message';\n/**\n * Attribute given to each host element that is described by a message element.\n * @deprecated To be turned into a private variable.\n * @breaking-change 14.0.0\n */\nconst CDK_DESCRIBEDBY_HOST_ATTRIBUTE = 'cdk-describedby-host';\n/** Global incremental identifier for each registered message element. */\nlet nextId = 0;\n/**\n * Utility that creates visually hidden elements with a message content. Useful for elements that\n * want to use aria-describedby to further describe themselves without adding additional visual\n * content.\n */\nlet AriaDescriber = /*#__PURE__*/(() => {\n  class AriaDescriber {\n    _platform = inject(Platform);\n    _document = inject(DOCUMENT);\n    /** Map of all registered message elements that have been placed into the document. */\n    _messageRegistry = new Map();\n    /** Container for all registered messages. */\n    _messagesContainer = null;\n    /** Unique ID for the service. */\n    _id = `${nextId++}`;\n    constructor() {\n      inject(_CdkPrivateStyleLoader).load(_VisuallyHiddenLoader);\n      this._id = inject(APP_ID) + '-' + nextId++;\n    }\n    describe(hostElement, message, role) {\n      if (!this._canBeDescribed(hostElement, message)) {\n        return;\n      }\n      const key = getKey(message, role);\n      if (typeof message !== 'string') {\n        // We need to ensure that the element has an ID.\n        setMessageId(message, this._id);\n        this._messageRegistry.set(key, {\n          messageElement: message,\n          referenceCount: 0\n        });\n      } else if (!this._messageRegistry.has(key)) {\n        this._createMessageElement(message, role);\n      }\n      if (!this._isElementDescribedByMessage(hostElement, key)) {\n        this._addMessageReference(hostElement, key);\n      }\n    }\n    removeDescription(hostElement, message, role) {\n      if (!message || !this._isElementNode(hostElement)) {\n        return;\n      }\n      const key = getKey(message, role);\n      if (this._isElementDescribedByMessage(hostElement, key)) {\n        this._removeMessageReference(hostElement, key);\n      }\n      // If the message is a string, it means that it's one that we created for the\n      // consumer so we can remove it safely, otherwise we should leave it in place.\n      if (typeof message === 'string') {\n        const registeredMessage = this._messageRegistry.get(key);\n        if (registeredMessage && registeredMessage.referenceCount === 0) {\n          this._deleteMessageElement(key);\n        }\n      }\n      if (this._messagesContainer?.childNodes.length === 0) {\n        this._messagesContainer.remove();\n        this._messagesContainer = null;\n      }\n    }\n    /** Unregisters all created message elements and removes the message container. */\n    ngOnDestroy() {\n      const describedElements = this._document.querySelectorAll(`[${CDK_DESCRIBEDBY_HOST_ATTRIBUTE}=\"${this._id}\"]`);\n      for (let i = 0; i < describedElements.length; i++) {\n        this._removeCdkDescribedByReferenceIds(describedElements[i]);\n        describedElements[i].removeAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE);\n      }\n      this._messagesContainer?.remove();\n      this._messagesContainer = null;\n      this._messageRegistry.clear();\n    }\n    /**\n     * Creates a new element in the visually hidden message container element with the message\n     * as its content and adds it to the message registry.\n     */\n    _createMessageElement(message, role) {\n      const messageElement = this._document.createElement('div');\n      setMessageId(messageElement, this._id);\n      messageElement.textContent = message;\n      if (role) {\n        messageElement.setAttribute('role', role);\n      }\n      this._createMessagesContainer();\n      this._messagesContainer.appendChild(messageElement);\n      this._messageRegistry.set(getKey(message, role), {\n        messageElement,\n        referenceCount: 0\n      });\n    }\n    /** Deletes the message element from the global messages container. */\n    _deleteMessageElement(key) {\n      this._messageRegistry.get(key)?.messageElement?.remove();\n      this._messageRegistry.delete(key);\n    }\n    /** Creates the global container for all aria-describedby messages. */\n    _createMessagesContainer() {\n      if (this._messagesContainer) {\n        return;\n      }\n      const containerClassName = 'cdk-describedby-message-container';\n      const serverContainers = this._document.querySelectorAll(`.${containerClassName}[platform=\"server\"]`);\n      for (let i = 0; i < serverContainers.length; i++) {\n        // When going from the server to the client, we may end up in a situation where there's\n        // already a container on the page, but we don't have a reference to it. Clear the\n        // old container so we don't get duplicates. Doing this, instead of emptying the previous\n        // container, should be slightly faster.\n        serverContainers[i].remove();\n      }\n      const messagesContainer = this._document.createElement('div');\n      // We add `visibility: hidden` in order to prevent text in this container from\n      // being searchable by the browser's Ctrl + F functionality.\n      // Screen-readers will still read the description for elements with aria-describedby even\n      // when the description element is not visible.\n      messagesContainer.style.visibility = 'hidden';\n      // Even though we use `visibility: hidden`, we still apply `cdk-visually-hidden` so that\n      // the description element doesn't impact page layout.\n      messagesContainer.classList.add(containerClassName);\n      messagesContainer.classList.add('cdk-visually-hidden');\n      if (!this._platform.isBrowser) {\n        messagesContainer.setAttribute('platform', 'server');\n      }\n      this._document.body.appendChild(messagesContainer);\n      this._messagesContainer = messagesContainer;\n    }\n    /** Removes all cdk-describedby messages that are hosted through the element. */\n    _removeCdkDescribedByReferenceIds(element) {\n      // Remove all aria-describedby reference IDs that are prefixed by CDK_DESCRIBEDBY_ID_PREFIX\n      const originalReferenceIds = getAriaReferenceIds(element, 'aria-describedby').filter(id => id.indexOf(CDK_DESCRIBEDBY_ID_PREFIX) != 0);\n      element.setAttribute('aria-describedby', originalReferenceIds.join(' '));\n    }\n    /**\n     * Adds a message reference to the element using aria-describedby and increments the registered\n     * message's reference count.\n     */\n    _addMessageReference(element, key) {\n      const registeredMessage = this._messageRegistry.get(key);\n      // Add the aria-describedby reference and set the\n      // describedby_host attribute to mark the element.\n      addAriaReferencedId(element, 'aria-describedby', registeredMessage.messageElement.id);\n      element.setAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE, this._id);\n      registeredMessage.referenceCount++;\n    }\n    /**\n     * Removes a message reference from the element using aria-describedby\n     * and decrements the registered message's reference count.\n     */\n    _removeMessageReference(element, key) {\n      const registeredMessage = this._messageRegistry.get(key);\n      registeredMessage.referenceCount--;\n      removeAriaReferencedId(element, 'aria-describedby', registeredMessage.messageElement.id);\n      element.removeAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE);\n    }\n    /** Returns true if the element has been described by the provided message ID. */\n    _isElementDescribedByMessage(element, key) {\n      const referenceIds = getAriaReferenceIds(element, 'aria-describedby');\n      const registeredMessage = this._messageRegistry.get(key);\n      const messageId = registeredMessage && registeredMessage.messageElement.id;\n      return !!messageId && referenceIds.indexOf(messageId) != -1;\n    }\n    /** Determines whether a message can be described on a particular element. */\n    _canBeDescribed(element, message) {\n      if (!this._isElementNode(element)) {\n        return false;\n      }\n      if (message && typeof message === 'object') {\n        // We'd have to make some assumptions about the description element's text, if the consumer\n        // passed in an element. Assume that if an element is passed in, the consumer has verified\n        // that it can be used as a description.\n        return true;\n      }\n      const trimmedMessage = message == null ? '' : `${message}`.trim();\n      const ariaLabel = element.getAttribute('aria-label');\n      // We shouldn't set descriptions if they're exactly the same as the `aria-label` of the\n      // element, because screen readers will end up reading out the same text twice in a row.\n      return trimmedMessage ? !ariaLabel || ariaLabel.trim() !== trimmedMessage : false;\n    }\n    /** Checks whether a node is an Element node. */\n    _isElementNode(element) {\n      return element.nodeType === this._document.ELEMENT_NODE;\n    }\n    static ɵfac = function AriaDescriber_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || AriaDescriber)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: AriaDescriber,\n      factory: AriaDescriber.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return AriaDescriber;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Gets a key that can be used to look messages up in the registry. */\nfunction getKey(message, role) {\n  return typeof message === 'string' ? `${role || ''}/${message}` : message;\n}\n/** Assigns a unique ID to an element, if it doesn't have one already. */\nfunction setMessageId(element, serviceId) {\n  if (!element.id) {\n    element.id = `${CDK_DESCRIBEDBY_ID_PREFIX}-${serviceId}-${nextId++}`;\n  }\n}\n\n// NoopTreeKeyManager is a \"noop\" implementation of TreeKeyMangerStrategy. Methods are noops. Does\n// not emit to streams.\n//\n// Used for applications built before TreeKeyManager to opt-out of TreeKeyManager and revert to\n// legacy behavior.\n/**\n * @docs-private\n *\n * Opt-out of Tree of key manager behavior.\n *\n * When provided, Tree has same focus management behavior as before TreeKeyManager was introduced.\n *  - Tree does not respond to keyboard interaction\n *  - Tree node allows tabindex to be set by Input binding\n *  - Tree node allows tabindex to be set by attribute binding\n *\n * @deprecated NoopTreeKeyManager deprecated. Use TreeKeyManager or inject a\n * TreeKeyManagerStrategy instead. To be removed in a future version.\n *\n * @breaking-change 21.0.0\n */\nclass NoopTreeKeyManager {\n  _isNoopTreeKeyManager = true;\n  // Provide change as required by TreeKeyManagerStrategy. NoopTreeKeyManager is a \"noop\"\n  // implementation that does not emit to streams.\n  change = /*#__PURE__*/new Subject();\n  destroy() {\n    this.change.complete();\n  }\n  onKeydown() {\n    // noop\n  }\n  getActiveItemIndex() {\n    // Always return null. NoopTreeKeyManager is a \"noop\" implementation that does not maintain\n    // the active item.\n    return null;\n  }\n  getActiveItem() {\n    // Always return null. NoopTreeKeyManager is a \"noop\" implementation that does not maintain\n    // the active item.\n    return null;\n  }\n  focusItem() {\n    // noop\n  }\n}\n/**\n * @docs-private\n *\n * Opt-out of Tree of key manager behavior.\n *\n * When provided, Tree has same focus management behavior as before TreeKeyManager was introduced.\n *  - Tree does not respond to keyboard interaction\n *  - Tree node allows tabindex to be set by Input binding\n *  - Tree node allows tabindex to be set by attribute binding\n *\n * @deprecated NoopTreeKeyManager deprecated. Use TreeKeyManager or inject a\n * TreeKeyManagerStrategy instead. To be removed in a future version.\n *\n * @breaking-change 21.0.0\n */\nfunction NOOP_TREE_KEY_MANAGER_FACTORY() {\n  return () => new NoopTreeKeyManager();\n}\n/**\n * @docs-private\n *\n * Opt-out of Tree of key manager behavior.\n *\n * When provided, Tree has same focus management behavior as before TreeKeyManager was introduced.\n *  - Tree does not respond to keyboard interaction\n *  - Tree node allows tabindex to be set by Input binding\n *  - Tree node allows tabindex to be set by attribute binding\n *\n * @deprecated NoopTreeKeyManager deprecated. Use TreeKeyManager or inject a\n * TreeKeyManagerStrategy instead. To be removed in a future version.\n *\n * @breaking-change 21.0.0\n */\nconst NOOP_TREE_KEY_MANAGER_FACTORY_PROVIDER = {\n  provide: TREE_KEY_MANAGER,\n  useFactory: NOOP_TREE_KEY_MANAGER_FACTORY\n};\n\n/**\n * Class that allows for trapping focus within a DOM element.\n *\n * This class uses a strategy pattern that determines how it traps focus.\n * See FocusTrapInertStrategy.\n */\nclass ConfigurableFocusTrap extends FocusTrap {\n  _focusTrapManager;\n  _inertStrategy;\n  /** Whether the FocusTrap is enabled. */\n  get enabled() {\n    return this._enabled;\n  }\n  set enabled(value) {\n    this._enabled = value;\n    if (this._enabled) {\n      this._focusTrapManager.register(this);\n    } else {\n      this._focusTrapManager.deregister(this);\n    }\n  }\n  constructor(_element, _checker, _ngZone, _document, _focusTrapManager, _inertStrategy, config, injector) {\n    super(_element, _checker, _ngZone, _document, config.defer, injector);\n    this._focusTrapManager = _focusTrapManager;\n    this._inertStrategy = _inertStrategy;\n    this._focusTrapManager.register(this);\n  }\n  /** Notifies the FocusTrapManager that this FocusTrap will be destroyed. */\n  destroy() {\n    this._focusTrapManager.deregister(this);\n    super.destroy();\n  }\n  /** @docs-private Implemented as part of ManagedFocusTrap. */\n  _enable() {\n    this._inertStrategy.preventFocus(this);\n    this.toggleAnchors(true);\n  }\n  /** @docs-private Implemented as part of ManagedFocusTrap. */\n  _disable() {\n    this._inertStrategy.allowFocus(this);\n    this.toggleAnchors(false);\n  }\n}\n\n/**\n * Lightweight FocusTrapInertStrategy that adds a document focus event\n * listener to redirect focus back inside the FocusTrap.\n */\nclass EventListenerFocusTrapInertStrategy {\n  /** Focus event handler. */\n  _listener = null;\n  /** Adds a document event listener that keeps focus inside the FocusTrap. */\n  preventFocus(focusTrap) {\n    // Ensure there's only one listener per document\n    if (this._listener) {\n      focusTrap._document.removeEventListener('focus', this._listener, true);\n    }\n    this._listener = e => this._trapFocus(focusTrap, e);\n    focusTrap._ngZone.runOutsideAngular(() => {\n      focusTrap._document.addEventListener('focus', this._listener, true);\n    });\n  }\n  /** Removes the event listener added in preventFocus. */\n  allowFocus(focusTrap) {\n    if (!this._listener) {\n      return;\n    }\n    focusTrap._document.removeEventListener('focus', this._listener, true);\n    this._listener = null;\n  }\n  /**\n   * Refocuses the first element in the FocusTrap if the focus event target was outside\n   * the FocusTrap.\n   *\n   * This is an event listener callback. The event listener is added in runOutsideAngular,\n   * so all this code runs outside Angular as well.\n   */\n  _trapFocus(focusTrap, event) {\n    const target = event.target;\n    const focusTrapRoot = focusTrap._element;\n    // Don't refocus if target was in an overlay, because the overlay might be associated\n    // with an element inside the FocusTrap, ex. mat-select.\n    if (target && !focusTrapRoot.contains(target) && !target.closest?.('div.cdk-overlay-pane')) {\n      // Some legacy FocusTrap usages have logic that focuses some element on the page\n      // just before FocusTrap is destroyed. For backwards compatibility, wait\n      // to be sure FocusTrap is still enabled before refocusing.\n      setTimeout(() => {\n        // Check whether focus wasn't put back into the focus trap while the timeout was pending.\n        if (focusTrap.enabled && !focusTrapRoot.contains(focusTrap._document.activeElement)) {\n          focusTrap.focusFirstTabbableElement();\n        }\n      });\n    }\n  }\n}\n\n/** The injection token used to specify the inert strategy. */\nconst FOCUS_TRAP_INERT_STRATEGY = /*#__PURE__*/new InjectionToken('FOCUS_TRAP_INERT_STRATEGY');\n\n/** Injectable that ensures only the most recently enabled FocusTrap is active. */\nlet FocusTrapManager = /*#__PURE__*/(() => {\n  class FocusTrapManager {\n    // A stack of the FocusTraps on the page. Only the FocusTrap at the\n    // top of the stack is active.\n    _focusTrapStack = [];\n    /**\n     * Disables the FocusTrap at the top of the stack, and then pushes\n     * the new FocusTrap onto the stack.\n     */\n    register(focusTrap) {\n      // Dedupe focusTraps that register multiple times.\n      this._focusTrapStack = this._focusTrapStack.filter(ft => ft !== focusTrap);\n      let stack = this._focusTrapStack;\n      if (stack.length) {\n        stack[stack.length - 1]._disable();\n      }\n      stack.push(focusTrap);\n      focusTrap._enable();\n    }\n    /**\n     * Removes the FocusTrap from the stack, and activates the\n     * FocusTrap that is the new top of the stack.\n     */\n    deregister(focusTrap) {\n      focusTrap._disable();\n      const stack = this._focusTrapStack;\n      const i = stack.indexOf(focusTrap);\n      if (i !== -1) {\n        stack.splice(i, 1);\n        if (stack.length) {\n          stack[stack.length - 1]._enable();\n        }\n      }\n    }\n    static ɵfac = function FocusTrapManager_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || FocusTrapManager)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: FocusTrapManager,\n      factory: FocusTrapManager.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return FocusTrapManager;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Factory that allows easy instantiation of configurable focus traps. */\nlet ConfigurableFocusTrapFactory = /*#__PURE__*/(() => {\n  class ConfigurableFocusTrapFactory {\n    _checker = inject(InteractivityChecker);\n    _ngZone = inject(NgZone);\n    _focusTrapManager = inject(FocusTrapManager);\n    _document = inject(DOCUMENT);\n    _inertStrategy;\n    _injector = inject(Injector);\n    constructor() {\n      const inertStrategy = inject(FOCUS_TRAP_INERT_STRATEGY, {\n        optional: true\n      });\n      // TODO split up the strategies into different modules, similar to DateAdapter.\n      this._inertStrategy = inertStrategy || new EventListenerFocusTrapInertStrategy();\n    }\n    create(element, config = {\n      defer: false\n    }) {\n      let configObject;\n      if (typeof config === 'boolean') {\n        configObject = {\n          defer: config\n        };\n      } else {\n        configObject = config;\n      }\n      return new ConfigurableFocusTrap(element, this._checker, this._ngZone, this._document, this._focusTrapManager, this._inertStrategy, configObject, this._injector);\n    }\n    static ɵfac = function ConfigurableFocusTrapFactory_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || ConfigurableFocusTrapFactory)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: ConfigurableFocusTrapFactory,\n      factory: ConfigurableFocusTrapFactory.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return ConfigurableFocusTrapFactory;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { AriaDescriber, CDK_DESCRIBEDBY_HOST_ATTRIBUTE, CDK_DESCRIBEDBY_ID_PREFIX, ConfigurableFocusTrap, ConfigurableFocusTrapFactory, EventListenerFocusTrapInertStrategy, FOCUS_TRAP_INERT_STRATEGY, FocusTrap, InteractivityChecker, MESSAGES_CONTAINER_ID, NOOP_TREE_KEY_MANAGER_FACTORY, NOOP_TREE_KEY_MANAGER_FACTORY_PROVIDER, NoopTreeKeyManager, TREE_KEY_MANAGER, addAriaReferencedId, getAriaReferenceIds, removeAriaReferencedId };\n","import * as i0 from '@angular/core';\nimport { InjectionToken, inject, EventEmitter, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n/**\n * Injection token used to inject the document into Directionality.\n * This is used so that the value can be faked in tests.\n *\n * We can't use the real document in tests because changing the real `dir` causes geometry-based\n * tests in Safari to fail.\n *\n * We also can't re-provide the DOCUMENT token from platform-browser because the unit tests\n * themselves use things like `querySelector` in test code.\n *\n * This token is defined in a separate file from Directionality as a workaround for\n * https://github.com/angular/angular/issues/22559\n *\n * @docs-private\n */\nconst DIR_DOCUMENT = /*#__PURE__*/new InjectionToken('cdk-dir-doc', {\n  providedIn: 'root',\n  factory: DIR_DOCUMENT_FACTORY\n});\n/**\n * @docs-private\n * @deprecated No longer used, will be removed.\n * @breaking-change 21.0.0\n */\nfunction DIR_DOCUMENT_FACTORY() {\n  return inject(DOCUMENT);\n}\n\n/** Regex that matches locales with an RTL script. Taken from `goog.i18n.bidi.isRtlLanguage`. */\nconst RTL_LOCALE_PATTERN = /^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;\n/** Resolves a string value to a specific direction. */\nfunction _resolveDirectionality(rawValue) {\n  const value = rawValue?.toLowerCase() || '';\n  if (value === 'auto' && typeof navigator !== 'undefined' && navigator?.language) {\n    return RTL_LOCALE_PATTERN.test(navigator.language) ? 'rtl' : 'ltr';\n  }\n  return value === 'rtl' ? 'rtl' : 'ltr';\n}\n/**\n * The directionality (LTR / RTL) context for the application (or a subtree of it).\n * Exposes the current direction and a stream of direction changes.\n */\nlet Directionality = /*#__PURE__*/(() => {\n  class Directionality {\n    /** The current 'ltr' or 'rtl' value. */\n    value = 'ltr';\n    /** Stream that emits whenever the 'ltr' / 'rtl' state changes. */\n    change = new EventEmitter();\n    constructor() {\n      const _document = inject(DIR_DOCUMENT, {\n        optional: true\n      });\n      if (_document) {\n        const bodyDir = _document.body ? _document.body.dir : null;\n        const htmlDir = _document.documentElement ? _document.documentElement.dir : null;\n        this.value = _resolveDirectionality(bodyDir || htmlDir || 'ltr');\n      }\n    }\n    ngOnDestroy() {\n      this.change.complete();\n    }\n    static ɵfac = function Directionality_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || Directionality)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: Directionality,\n      factory: Directionality.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return Directionality;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { Directionality as D, _resolveDirectionality as _, DIR_DOCUMENT as a };\n","import { _ as _resolveDirectionality, D as Directionality } from './directionality-CBXD4hga.mjs';\nexport { a as DIR_DOCUMENT } from './directionality-CBXD4hga.mjs';\nimport * as i0 from '@angular/core';\nimport { EventEmitter, Directive, Output, Input, NgModule } from '@angular/core';\nimport '@angular/common';\n\n/**\n * Directive to listen for changes of direction of part of the DOM.\n *\n * Provides itself as Directionality such that descendant directives only need to ever inject\n * Directionality to get the closest direction.\n */\nlet Dir = /*#__PURE__*/(() => {\n  class Dir {\n    /** Normalized direction that accounts for invalid/unsupported values. */\n    _dir = 'ltr';\n    /** Whether the `value` has been set to its initial value. */\n    _isInitialized = false;\n    /** Direction as passed in by the consumer. */\n    _rawDir;\n    /** Event emitted when the direction changes. */\n    change = new EventEmitter();\n    /** @docs-private */\n    get dir() {\n      return this._dir;\n    }\n    set dir(value) {\n      const previousValue = this._dir;\n      // Note: `_resolveDirectionality` resolves the language based on the browser's language,\n      // whereas the browser does it based on the content of the element. Since doing so based\n      // on the content can be expensive, for now we're doing the simpler matching.\n      this._dir = _resolveDirectionality(value);\n      this._rawDir = value;\n      if (previousValue !== this._dir && this._isInitialized) {\n        this.change.emit(this._dir);\n      }\n    }\n    /** Current layout direction of the element. */\n    get value() {\n      return this.dir;\n    }\n    /** Initialize once default value has been set. */\n    ngAfterContentInit() {\n      this._isInitialized = true;\n    }\n    ngOnDestroy() {\n      this.change.complete();\n    }\n    static ɵfac = function Dir_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || Dir)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: Dir,\n      selectors: [[\"\", \"dir\", \"\"]],\n      hostVars: 1,\n      hostBindings: function Dir_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵattribute(\"dir\", ctx._rawDir);\n        }\n      },\n      inputs: {\n        dir: \"dir\"\n      },\n      outputs: {\n        change: \"dirChange\"\n      },\n      exportAs: [\"dir\"],\n      features: [i0.ɵɵProvidersFeature([{\n        provide: Directionality,\n        useExisting: Dir\n      }])]\n    });\n  }\n  return Dir;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet BidiModule = /*#__PURE__*/(() => {\n  class BidiModule {\n    static ɵfac = function BidiModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || BidiModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: BidiModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n  }\n  return BidiModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { BidiModule, Dir, Directionality };\n","import { HighContrastModeDetector } from '@angular/cdk/a11y';\nimport { BidiModule } from '@angular/cdk/bidi';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, inject, NgModule } from '@angular/core';\n\n/**\n * Injection token that configures whether the Material sanity checks are enabled.\n * @deprecated No longer used and will be removed.\n * @breaking-change 21.0.0\n */\nconst MATERIAL_SANITY_CHECKS = /*#__PURE__*/new InjectionToken('mat-sanity-checks', {\n  providedIn: 'root',\n  factory: () => true\n});\n/**\n * Module that captures anything that should be loaded and/or run for *all* Angular Material\n * components. This includes Bidi, etc.\n *\n * This module should be imported to each top-level component module (e.g., MatTabsModule).\n * @deprecated No longer used and will be removed.\n * @breaking-change 21.0.0\n */\nlet MatCommonModule = /*#__PURE__*/(() => {\n  class MatCommonModule {\n    constructor() {\n      // While A11yModule also does this, we repeat it here to avoid importing A11yModule\n      // in MatCommonModule.\n      inject(HighContrastModeDetector)._applyBodyHighContrastModeCssClasses();\n    }\n    static ɵfac = function MatCommonModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatCommonModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: MatCommonModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      imports: [BidiModule, BidiModule]\n    });\n  }\n  return MatCommonModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { MatCommonModule as M, MATERIAL_SANITY_CHECKS as a };\n","/** The possible ways the browser may handle the horizontal scroll axis in RTL languages. */\nvar RtlScrollAxisType = /*#__PURE__*/function (RtlScrollAxisType) {\n  /**\n   * scrollLeft is 0 when scrolled all the way left and (scrollWidth - clientWidth) when scrolled\n   * all the way right.\n   */\n  RtlScrollAxisType[RtlScrollAxisType[\"NORMAL\"] = 0] = \"NORMAL\";\n  /**\n   * scrollLeft is -(scrollWidth - clientWidth) when scrolled all the way left and 0 when scrolled\n   * all the way right.\n   */\n  RtlScrollAxisType[RtlScrollAxisType[\"NEGATED\"] = 1] = \"NEGATED\";\n  /**\n   * scrollLeft is (scrollWidth - clientWidth) when scrolled all the way left and 0 when scrolled\n   * all the way right.\n   */\n  RtlScrollAxisType[RtlScrollAxisType[\"INVERTED\"] = 2] = \"INVERTED\";\n  return RtlScrollAxisType;\n}(RtlScrollAxisType || {});\n/** Cached result of the way the browser handles the horizontal scroll axis in RTL mode. */\nlet rtlScrollAxisType;\n/** Cached result of the check that indicates whether the browser supports scroll behaviors. */\nlet scrollBehaviorSupported;\n/** Check whether the browser supports scroll behaviors. */\nfunction supportsScrollBehavior() {\n  if (scrollBehaviorSupported == null) {\n    // If we're not in the browser, it can't be supported. Also check for `Element`, because\n    // some projects stub out the global `document` during SSR which can throw us off.\n    if (typeof document !== 'object' || !document || typeof Element !== 'function' || !Element) {\n      scrollBehaviorSupported = false;\n      return scrollBehaviorSupported;\n    }\n    // If the element can have a `scrollBehavior` style, we can be sure that it's supported.\n    if ('scrollBehavior' in document.documentElement.style) {\n      scrollBehaviorSupported = true;\n    } else {\n      // At this point we have 3 possibilities: `scrollTo` isn't supported at all, it's\n      // supported but it doesn't handle scroll behavior, or it has been polyfilled.\n      const scrollToFunction = Element.prototype.scrollTo;\n      if (scrollToFunction) {\n        // We can detect if the function has been polyfilled by calling `toString` on it. Native\n        // functions are obfuscated using `[native code]`, whereas if it was overwritten we'd get\n        // the actual function source. Via https://davidwalsh.name/detect-native-function. Consider\n        // polyfilled functions as supporting scroll behavior.\n        scrollBehaviorSupported = !/\\{\\s*\\[native code\\]\\s*\\}/.test(scrollToFunction.toString());\n      } else {\n        scrollBehaviorSupported = false;\n      }\n    }\n  }\n  return scrollBehaviorSupported;\n}\n/**\n * Checks the type of RTL scroll axis used by this browser. As of time of writing, Chrome is NORMAL,\n * Firefox & Safari are NEGATED, and IE & Edge are INVERTED.\n */\nfunction getRtlScrollAxisType() {\n  // We can't check unless we're on the browser. Just assume 'normal' if we're not.\n  if (typeof document !== 'object' || !document) {\n    return RtlScrollAxisType.NORMAL;\n  }\n  if (rtlScrollAxisType == null) {\n    // Create a 1px wide scrolling container and a 2px wide content element.\n    const scrollContainer = document.createElement('div');\n    const containerStyle = scrollContainer.style;\n    scrollContainer.dir = 'rtl';\n    containerStyle.width = '1px';\n    containerStyle.overflow = 'auto';\n    containerStyle.visibility = 'hidden';\n    containerStyle.pointerEvents = 'none';\n    containerStyle.position = 'absolute';\n    const content = document.createElement('div');\n    const contentStyle = content.style;\n    contentStyle.width = '2px';\n    contentStyle.height = '1px';\n    scrollContainer.appendChild(content);\n    document.body.appendChild(scrollContainer);\n    rtlScrollAxisType = RtlScrollAxisType.NORMAL;\n    // The viewport starts scrolled all the way to the right in RTL mode. If we are in a NORMAL\n    // browser this would mean that the scrollLeft should be 1. If it's zero instead we know we're\n    // dealing with one of the other two types of browsers.\n    if (scrollContainer.scrollLeft === 0) {\n      // In a NEGATED browser the scrollLeft is always somewhere in [-maxScrollAmount, 0]. For an\n      // INVERTED browser it is always somewhere in [0, maxScrollAmount]. We can determine which by\n      // setting to the scrollLeft to 1. This is past the max for a NEGATED browser, so it will\n      // return 0 when we read it again.\n      scrollContainer.scrollLeft = 1;\n      rtlScrollAxisType = scrollContainer.scrollLeft === 0 ? RtlScrollAxisType.NEGATED : RtlScrollAxisType.INVERTED;\n    }\n    scrollContainer.remove();\n  }\n  return rtlScrollAxisType;\n}\nexport { RtlScrollAxisType as R, getRtlScrollAxisType as g, supportsScrollBehavior as s };\n","import * as i0 from '@angular/core';\nimport { InjectionToken, forwardRef, Directive, Input, inject, NgZone, RendererFactory2, Injectable, ElementRef, Renderer2, ChangeDetectorRef, Injector, afterNextRender, booleanAttribute, Optional, Inject, Component, ViewEncapsulation, ChangeDetectionStrategy, Output, ViewChild, ViewContainerRef, TemplateRef, IterableDiffers, NgModule } from '@angular/core';\nimport { Subject, of, Observable, Subscription, animationFrameScheduler, asapScheduler, isObservable } from 'rxjs';\nimport { distinctUntilChanged, auditTime, filter, startWith, takeUntil, pairwise, switchMap, shareReplay } from 'rxjs/operators';\nimport { c as coerceNumberProperty, a as coerceElement } from './element-x4z00URv.mjs';\nimport { P as Platform } from './platform-DmdVEw_C.mjs';\nimport { D as Directionality } from './directionality-CBXD4hga.mjs';\nimport { g as getRtlScrollAxisType, R as RtlScrollAxisType, s as supportsScrollBehavior } from './scrolling-BkvA05C8.mjs';\nimport { BidiModule } from './bidi.mjs';\nconst _c0 = [\"contentWrapper\"];\nconst _c1 = [\"*\"];\nexport { Dir as ɵɵDir } from './bidi.mjs';\nimport { DOCUMENT } from '@angular/common';\nimport { b as _VIEW_REPEATER_STRATEGY, A as ArrayDataSource, _ as _RecycleViewRepeaterStrategy } from './recycle-view-repeater-strategy-DoWdPqVw.mjs';\nimport { i as isDataSource } from './data-source-D34wiQZj.mjs';\n\n/** The injection token used to specify the virtual scrolling strategy. */\nconst VIRTUAL_SCROLL_STRATEGY = /*#__PURE__*/new InjectionToken('VIRTUAL_SCROLL_STRATEGY');\n\n/** Virtual scrolling strategy for lists with items of known fixed size. */\nclass FixedSizeVirtualScrollStrategy {\n  _scrolledIndexChange = /*#__PURE__*/new Subject();\n  /** @docs-private Implemented as part of VirtualScrollStrategy. */\n  scrolledIndexChange = /*#__PURE__*/this._scrolledIndexChange.pipe(/*#__PURE__*/distinctUntilChanged());\n  /** The attached viewport. */\n  _viewport = null;\n  /** The size of the items in the virtually scrolling list. */\n  _itemSize;\n  /** The minimum amount of buffer rendered beyond the viewport (in pixels). */\n  _minBufferPx;\n  /** The number of buffer items to render beyond the edge of the viewport (in pixels). */\n  _maxBufferPx;\n  /**\n   * @param itemSize The size of the items in the virtually scrolling list.\n   * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more\n   * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.\n   */\n  constructor(itemSize, minBufferPx, maxBufferPx) {\n    this._itemSize = itemSize;\n    this._minBufferPx = minBufferPx;\n    this._maxBufferPx = maxBufferPx;\n  }\n  /**\n   * Attaches this scroll strategy to a viewport.\n   * @param viewport The viewport to attach this strategy to.\n   */\n  attach(viewport) {\n    this._viewport = viewport;\n    this._updateTotalContentSize();\n    this._updateRenderedRange();\n  }\n  /** Detaches this scroll strategy from the currently attached viewport. */\n  detach() {\n    this._scrolledIndexChange.complete();\n    this._viewport = null;\n  }\n  /**\n   * Update the item size and buffer size.\n   * @param itemSize The size of the items in the virtually scrolling list.\n   * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more\n   * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.\n   */\n  updateItemAndBufferSize(itemSize, minBufferPx, maxBufferPx) {\n    if (maxBufferPx < minBufferPx && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n      throw Error('CDK virtual scroll: maxBufferPx must be greater than or equal to minBufferPx');\n    }\n    this._itemSize = itemSize;\n    this._minBufferPx = minBufferPx;\n    this._maxBufferPx = maxBufferPx;\n    this._updateTotalContentSize();\n    this._updateRenderedRange();\n  }\n  /** @docs-private Implemented as part of VirtualScrollStrategy. */\n  onContentScrolled() {\n    this._updateRenderedRange();\n  }\n  /** @docs-private Implemented as part of VirtualScrollStrategy. */\n  onDataLengthChanged() {\n    this._updateTotalContentSize();\n    this._updateRenderedRange();\n  }\n  /** @docs-private Implemented as part of VirtualScrollStrategy. */\n  onContentRendered() {\n    /* no-op */\n  }\n  /** @docs-private Implemented as part of VirtualScrollStrategy. */\n  onRenderedOffsetChanged() {\n    /* no-op */\n  }\n  /**\n   * Scroll to the offset for the given index.\n   * @param index The index of the element to scroll to.\n   * @param behavior The ScrollBehavior to use when scrolling.\n   */\n  scrollToIndex(index, behavior) {\n    if (this._viewport) {\n      this._viewport.scrollToOffset(index * this._itemSize, behavior);\n    }\n  }\n  /** Update the viewport's total content size. */\n  _updateTotalContentSize() {\n    if (!this._viewport) {\n      return;\n    }\n    this._viewport.setTotalContentSize(this._viewport.getDataLength() * this._itemSize);\n  }\n  /** Update the viewport's rendered range. */\n  _updateRenderedRange() {\n    if (!this._viewport) {\n      return;\n    }\n    const renderedRange = this._viewport.getRenderedRange();\n    const newRange = {\n      start: renderedRange.start,\n      end: renderedRange.end\n    };\n    const viewportSize = this._viewport.getViewportSize();\n    const dataLength = this._viewport.getDataLength();\n    let scrollOffset = this._viewport.measureScrollOffset();\n    // Prevent NaN as result when dividing by zero.\n    let firstVisibleIndex = this._itemSize > 0 ? scrollOffset / this._itemSize : 0;\n    // If user scrolls to the bottom of the list and data changes to a smaller list\n    if (newRange.end > dataLength) {\n      // We have to recalculate the first visible index based on new data length and viewport size.\n      const maxVisibleItems = Math.ceil(viewportSize / this._itemSize);\n      const newVisibleIndex = Math.max(0, Math.min(firstVisibleIndex, dataLength - maxVisibleItems));\n      // If first visible index changed we must update scroll offset to handle start/end buffers\n      // Current range must also be adjusted to cover the new position (bottom of new list).\n      if (firstVisibleIndex != newVisibleIndex) {\n        firstVisibleIndex = newVisibleIndex;\n        scrollOffset = newVisibleIndex * this._itemSize;\n        newRange.start = Math.floor(firstVisibleIndex);\n      }\n      newRange.end = Math.max(0, Math.min(dataLength, newRange.start + maxVisibleItems));\n    }\n    const startBuffer = scrollOffset - newRange.start * this._itemSize;\n    if (startBuffer < this._minBufferPx && newRange.start != 0) {\n      const expandStart = Math.ceil((this._maxBufferPx - startBuffer) / this._itemSize);\n      newRange.start = Math.max(0, newRange.start - expandStart);\n      newRange.end = Math.min(dataLength, Math.ceil(firstVisibleIndex + (viewportSize + this._minBufferPx) / this._itemSize));\n    } else {\n      const endBuffer = newRange.end * this._itemSize - (scrollOffset + viewportSize);\n      if (endBuffer < this._minBufferPx && newRange.end != dataLength) {\n        const expandEnd = Math.ceil((this._maxBufferPx - endBuffer) / this._itemSize);\n        if (expandEnd > 0) {\n          newRange.end = Math.min(dataLength, newRange.end + expandEnd);\n          newRange.start = Math.max(0, Math.floor(firstVisibleIndex - this._minBufferPx / this._itemSize));\n        }\n      }\n    }\n    this._viewport.setRenderedRange(newRange);\n    this._viewport.setRenderedContentOffset(this._itemSize * newRange.start);\n    this._scrolledIndexChange.next(Math.floor(firstVisibleIndex));\n  }\n}\n/**\n * Provider factory for `FixedSizeVirtualScrollStrategy` that simply extracts the already created\n * `FixedSizeVirtualScrollStrategy` from the given directive.\n * @param fixedSizeDir The instance of `CdkFixedSizeVirtualScroll` to extract the\n *     `FixedSizeVirtualScrollStrategy` from.\n */\nfunction _fixedSizeVirtualScrollStrategyFactory(fixedSizeDir) {\n  return fixedSizeDir._scrollStrategy;\n}\n/** A virtual scroll strategy that supports fixed-size items. */\nlet CdkFixedSizeVirtualScroll = /*#__PURE__*/(() => {\n  class CdkFixedSizeVirtualScroll {\n    /** The size of the items in the list (in pixels). */\n    get itemSize() {\n      return this._itemSize;\n    }\n    set itemSize(value) {\n      this._itemSize = coerceNumberProperty(value);\n    }\n    _itemSize = 20;\n    /**\n     * The minimum amount of buffer rendered beyond the viewport (in pixels).\n     * If the amount of buffer dips below this number, more items will be rendered. Defaults to 100px.\n     */\n    get minBufferPx() {\n      return this._minBufferPx;\n    }\n    set minBufferPx(value) {\n      this._minBufferPx = coerceNumberProperty(value);\n    }\n    _minBufferPx = 100;\n    /**\n     * The number of pixels worth of buffer to render for when rendering new items. Defaults to 200px.\n     */\n    get maxBufferPx() {\n      return this._maxBufferPx;\n    }\n    set maxBufferPx(value) {\n      this._maxBufferPx = coerceNumberProperty(value);\n    }\n    _maxBufferPx = 200;\n    /** The scroll strategy used by this directive. */\n    _scrollStrategy = new FixedSizeVirtualScrollStrategy(this.itemSize, this.minBufferPx, this.maxBufferPx);\n    ngOnChanges() {\n      this._scrollStrategy.updateItemAndBufferSize(this.itemSize, this.minBufferPx, this.maxBufferPx);\n    }\n    static ɵfac = function CdkFixedSizeVirtualScroll_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkFixedSizeVirtualScroll)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkFixedSizeVirtualScroll,\n      selectors: [[\"cdk-virtual-scroll-viewport\", \"itemSize\", \"\"]],\n      inputs: {\n        itemSize: \"itemSize\",\n        minBufferPx: \"minBufferPx\",\n        maxBufferPx: \"maxBufferPx\"\n      },\n      features: [i0.ɵɵProvidersFeature([{\n        provide: VIRTUAL_SCROLL_STRATEGY,\n        useFactory: _fixedSizeVirtualScrollStrategyFactory,\n        deps: [forwardRef(() => CdkFixedSizeVirtualScroll)]\n      }]), i0.ɵɵNgOnChangesFeature]\n    });\n  }\n  return CdkFixedSizeVirtualScroll;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Time in ms to throttle the scrolling events by default. */\nconst DEFAULT_SCROLL_TIME = 20;\n/**\n * Service contained all registered Scrollable references and emits an event when any one of the\n * Scrollable references emit a scrolled event.\n */\nlet ScrollDispatcher = /*#__PURE__*/(() => {\n  class ScrollDispatcher {\n    _ngZone = inject(NgZone);\n    _platform = inject(Platform);\n    _renderer = inject(RendererFactory2).createRenderer(null, null);\n    _cleanupGlobalListener;\n    constructor() {}\n    /** Subject for notifying that a registered scrollable reference element has been scrolled. */\n    _scrolled = new Subject();\n    /** Keeps track of the amount of subscriptions to `scrolled`. Used for cleaning up afterwards. */\n    _scrolledCount = 0;\n    /**\n     * Map of all the scrollable references that are registered with the service and their\n     * scroll event subscriptions.\n     */\n    scrollContainers = new Map();\n    /**\n     * Registers a scrollable instance with the service and listens for its scrolled events. When the\n     * scrollable is scrolled, the service emits the event to its scrolled observable.\n     * @param scrollable Scrollable instance to be registered.\n     */\n    register(scrollable) {\n      if (!this.scrollContainers.has(scrollable)) {\n        this.scrollContainers.set(scrollable, scrollable.elementScrolled().subscribe(() => this._scrolled.next(scrollable)));\n      }\n    }\n    /**\n     * De-registers a Scrollable reference and unsubscribes from its scroll event observable.\n     * @param scrollable Scrollable instance to be deregistered.\n     */\n    deregister(scrollable) {\n      const scrollableReference = this.scrollContainers.get(scrollable);\n      if (scrollableReference) {\n        scrollableReference.unsubscribe();\n        this.scrollContainers.delete(scrollable);\n      }\n    }\n    /**\n     * Returns an observable that emits an event whenever any of the registered Scrollable\n     * references (or window, document, or body) fire a scrolled event. Can provide a time in ms\n     * to override the default \"throttle\" time.\n     *\n     * **Note:** in order to avoid hitting change detection for every scroll event,\n     * all of the events emitted from this stream will be run outside the Angular zone.\n     * If you need to update any data bindings as a result of a scroll event, you have\n     * to run the callback using `NgZone.run`.\n     */\n    scrolled(auditTimeInMs = DEFAULT_SCROLL_TIME) {\n      if (!this._platform.isBrowser) {\n        return of();\n      }\n      return new Observable(observer => {\n        if (!this._cleanupGlobalListener) {\n          this._cleanupGlobalListener = this._ngZone.runOutsideAngular(() => this._renderer.listen('document', 'scroll', () => this._scrolled.next()));\n        }\n        // In the case of a 0ms delay, use an observable without auditTime\n        // since it does add a perceptible delay in processing overhead.\n        const subscription = auditTimeInMs > 0 ? this._scrolled.pipe(auditTime(auditTimeInMs)).subscribe(observer) : this._scrolled.subscribe(observer);\n        this._scrolledCount++;\n        return () => {\n          subscription.unsubscribe();\n          this._scrolledCount--;\n          if (!this._scrolledCount) {\n            this._cleanupGlobalListener?.();\n            this._cleanupGlobalListener = undefined;\n          }\n        };\n      });\n    }\n    ngOnDestroy() {\n      this._cleanupGlobalListener?.();\n      this._cleanupGlobalListener = undefined;\n      this.scrollContainers.forEach((_, container) => this.deregister(container));\n      this._scrolled.complete();\n    }\n    /**\n     * Returns an observable that emits whenever any of the\n     * scrollable ancestors of an element are scrolled.\n     * @param elementOrElementRef Element whose ancestors to listen for.\n     * @param auditTimeInMs Time to throttle the scroll events.\n     */\n    ancestorScrolled(elementOrElementRef, auditTimeInMs) {\n      const ancestors = this.getAncestorScrollContainers(elementOrElementRef);\n      return this.scrolled(auditTimeInMs).pipe(filter(target => !target || ancestors.indexOf(target) > -1));\n    }\n    /** Returns all registered Scrollables that contain the provided element. */\n    getAncestorScrollContainers(elementOrElementRef) {\n      const scrollingContainers = [];\n      this.scrollContainers.forEach((_subscription, scrollable) => {\n        if (this._scrollableContainsElement(scrollable, elementOrElementRef)) {\n          scrollingContainers.push(scrollable);\n        }\n      });\n      return scrollingContainers;\n    }\n    /** Returns true if the element is contained within the provided Scrollable. */\n    _scrollableContainsElement(scrollable, elementOrElementRef) {\n      let element = coerceElement(elementOrElementRef);\n      let scrollableElement = scrollable.getElementRef().nativeElement;\n      // Traverse through the element parents until we reach null, checking if any of the elements\n      // are the scrollable's element.\n      do {\n        if (element == scrollableElement) {\n          return true;\n        }\n      } while (element = element.parentElement);\n      return false;\n    }\n    static ɵfac = function ScrollDispatcher_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || ScrollDispatcher)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: ScrollDispatcher,\n      factory: ScrollDispatcher.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return ScrollDispatcher;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Sends an event when the directive's element is scrolled. Registers itself with the\n * ScrollDispatcher service to include itself as part of its collection of scrolling events that it\n * can be listened to through the service.\n */\nlet CdkScrollable = /*#__PURE__*/(() => {\n  class CdkScrollable {\n    elementRef = inject(ElementRef);\n    scrollDispatcher = inject(ScrollDispatcher);\n    ngZone = inject(NgZone);\n    dir = inject(Directionality, {\n      optional: true\n    });\n    _scrollElement = this.elementRef.nativeElement;\n    _destroyed = new Subject();\n    _renderer = inject(Renderer2);\n    _cleanupScroll;\n    _elementScrolled = new Subject();\n    constructor() {}\n    ngOnInit() {\n      this._cleanupScroll = this.ngZone.runOutsideAngular(() => this._renderer.listen(this._scrollElement, 'scroll', event => this._elementScrolled.next(event)));\n      this.scrollDispatcher.register(this);\n    }\n    ngOnDestroy() {\n      this._cleanupScroll?.();\n      this._elementScrolled.complete();\n      this.scrollDispatcher.deregister(this);\n      this._destroyed.next();\n      this._destroyed.complete();\n    }\n    /** Returns observable that emits when a scroll event is fired on the host element. */\n    elementScrolled() {\n      return this._elementScrolled;\n    }\n    /** Gets the ElementRef for the viewport. */\n    getElementRef() {\n      return this.elementRef;\n    }\n    /**\n     * Scrolls to the specified offsets. This is a normalized version of the browser's native scrollTo\n     * method, since browsers are not consistent about what scrollLeft means in RTL. For this method\n     * left and right always refer to the left and right side of the scrolling container irrespective\n     * of the layout direction. start and end refer to left and right in an LTR context and vice-versa\n     * in an RTL context.\n     * @param options specified the offsets to scroll to.\n     */\n    scrollTo(options) {\n      const el = this.elementRef.nativeElement;\n      const isRtl = this.dir && this.dir.value == 'rtl';\n      // Rewrite start & end offsets as right or left offsets.\n      if (options.left == null) {\n        options.left = isRtl ? options.end : options.start;\n      }\n      if (options.right == null) {\n        options.right = isRtl ? options.start : options.end;\n      }\n      // Rewrite the bottom offset as a top offset.\n      if (options.bottom != null) {\n        options.top = el.scrollHeight - el.clientHeight - options.bottom;\n      }\n      // Rewrite the right offset as a left offset.\n      if (isRtl && getRtlScrollAxisType() != RtlScrollAxisType.NORMAL) {\n        if (options.left != null) {\n          options.right = el.scrollWidth - el.clientWidth - options.left;\n        }\n        if (getRtlScrollAxisType() == RtlScrollAxisType.INVERTED) {\n          options.left = options.right;\n        } else if (getRtlScrollAxisType() == RtlScrollAxisType.NEGATED) {\n          options.left = options.right ? -options.right : options.right;\n        }\n      } else {\n        if (options.right != null) {\n          options.left = el.scrollWidth - el.clientWidth - options.right;\n        }\n      }\n      this._applyScrollToOptions(options);\n    }\n    _applyScrollToOptions(options) {\n      const el = this.elementRef.nativeElement;\n      if (supportsScrollBehavior()) {\n        el.scrollTo(options);\n      } else {\n        if (options.top != null) {\n          el.scrollTop = options.top;\n        }\n        if (options.left != null) {\n          el.scrollLeft = options.left;\n        }\n      }\n    }\n    /**\n     * Measures the scroll offset relative to the specified edge of the viewport. This method can be\n     * used instead of directly checking scrollLeft or scrollTop, since browsers are not consistent\n     * about what scrollLeft means in RTL. The values returned by this method are normalized such that\n     * left and right always refer to the left and right side of the scrolling container irrespective\n     * of the layout direction. start and end refer to left and right in an LTR context and vice-versa\n     * in an RTL context.\n     * @param from The edge to measure from.\n     */\n    measureScrollOffset(from) {\n      const LEFT = 'left';\n      const RIGHT = 'right';\n      const el = this.elementRef.nativeElement;\n      if (from == 'top') {\n        return el.scrollTop;\n      }\n      if (from == 'bottom') {\n        return el.scrollHeight - el.clientHeight - el.scrollTop;\n      }\n      // Rewrite start & end as left or right offsets.\n      const isRtl = this.dir && this.dir.value == 'rtl';\n      if (from == 'start') {\n        from = isRtl ? RIGHT : LEFT;\n      } else if (from == 'end') {\n        from = isRtl ? LEFT : RIGHT;\n      }\n      if (isRtl && getRtlScrollAxisType() == RtlScrollAxisType.INVERTED) {\n        // For INVERTED, scrollLeft is (scrollWidth - clientWidth) when scrolled all the way left and\n        // 0 when scrolled all the way right.\n        if (from == LEFT) {\n          return el.scrollWidth - el.clientWidth - el.scrollLeft;\n        } else {\n          return el.scrollLeft;\n        }\n      } else if (isRtl && getRtlScrollAxisType() == RtlScrollAxisType.NEGATED) {\n        // For NEGATED, scrollLeft is -(scrollWidth - clientWidth) when scrolled all the way left and\n        // 0 when scrolled all the way right.\n        if (from == LEFT) {\n          return el.scrollLeft + el.scrollWidth - el.clientWidth;\n        } else {\n          return -el.scrollLeft;\n        }\n      } else {\n        // For NORMAL, as well as non-RTL contexts, scrollLeft is 0 when scrolled all the way left and\n        // (scrollWidth - clientWidth) when scrolled all the way right.\n        if (from == LEFT) {\n          return el.scrollLeft;\n        } else {\n          return el.scrollWidth - el.clientWidth - el.scrollLeft;\n        }\n      }\n    }\n    static ɵfac = function CdkScrollable_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkScrollable)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkScrollable,\n      selectors: [[\"\", \"cdk-scrollable\", \"\"], [\"\", \"cdkScrollable\", \"\"]]\n    });\n  }\n  return CdkScrollable;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Time in ms to throttle the resize events by default. */\nconst DEFAULT_RESIZE_TIME = 20;\n/**\n * Simple utility for getting the bounds of the browser viewport.\n * @docs-private\n */\nlet ViewportRuler = /*#__PURE__*/(() => {\n  class ViewportRuler {\n    _platform = inject(Platform);\n    _listeners;\n    /** Cached viewport dimensions. */\n    _viewportSize;\n    /** Stream of viewport change events. */\n    _change = new Subject();\n    /** Used to reference correct document/window */\n    _document = inject(DOCUMENT, {\n      optional: true\n    });\n    constructor() {\n      const ngZone = inject(NgZone);\n      const renderer = inject(RendererFactory2).createRenderer(null, null);\n      ngZone.runOutsideAngular(() => {\n        if (this._platform.isBrowser) {\n          const changeListener = event => this._change.next(event);\n          this._listeners = [renderer.listen('window', 'resize', changeListener), renderer.listen('window', 'orientationchange', changeListener)];\n        }\n        // Clear the cached position so that the viewport is re-measured next time it is required.\n        // We don't need to keep track of the subscription, because it is completed on destroy.\n        this.change().subscribe(() => this._viewportSize = null);\n      });\n    }\n    ngOnDestroy() {\n      this._listeners?.forEach(cleanup => cleanup());\n      this._change.complete();\n    }\n    /** Returns the viewport's width and height. */\n    getViewportSize() {\n      if (!this._viewportSize) {\n        this._updateViewportSize();\n      }\n      const output = {\n        width: this._viewportSize.width,\n        height: this._viewportSize.height\n      };\n      // If we're not on a browser, don't cache the size since it'll be mocked out anyway.\n      if (!this._platform.isBrowser) {\n        this._viewportSize = null;\n      }\n      return output;\n    }\n    /** Gets a DOMRect for the viewport's bounds. */\n    getViewportRect() {\n      // Use the document element's bounding rect rather than the window scroll properties\n      // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll\n      // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different\n      // conceptual viewports. Under most circumstances these viewports are equivalent, but they\n      // can disagree when the page is pinch-zoomed (on devices that support touch).\n      // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4\n      // We use the documentElement instead of the body because, by default (without a css reset)\n      // browsers typically give the document body an 8px margin, which is not included in\n      // getBoundingClientRect().\n      const scrollPosition = this.getViewportScrollPosition();\n      const {\n        width,\n        height\n      } = this.getViewportSize();\n      return {\n        top: scrollPosition.top,\n        left: scrollPosition.left,\n        bottom: scrollPosition.top + height,\n        right: scrollPosition.left + width,\n        height,\n        width\n      };\n    }\n    /** Gets the (top, left) scroll position of the viewport. */\n    getViewportScrollPosition() {\n      // While we can get a reference to the fake document\n      // during SSR, it doesn't have getBoundingClientRect.\n      if (!this._platform.isBrowser) {\n        return {\n          top: 0,\n          left: 0\n        };\n      }\n      // The top-left-corner of the viewport is determined by the scroll position of the document\n      // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about\n      // whether `document.body` or `document.documentElement` is the scrolled element, so reading\n      // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of\n      // `document.documentElement` works consistently, where the `top` and `left` values will\n      // equal negative the scroll position.\n      const document = this._document;\n      const window = this._getWindow();\n      const documentElement = document.documentElement;\n      const documentRect = documentElement.getBoundingClientRect();\n      const top = -documentRect.top || document.body.scrollTop || window.scrollY || documentElement.scrollTop || 0;\n      const left = -documentRect.left || document.body.scrollLeft || window.scrollX || documentElement.scrollLeft || 0;\n      return {\n        top,\n        left\n      };\n    }\n    /**\n     * Returns a stream that emits whenever the size of the viewport changes.\n     * This stream emits outside of the Angular zone.\n     * @param throttleTime Time in milliseconds to throttle the stream.\n     */\n    change(throttleTime = DEFAULT_RESIZE_TIME) {\n      return throttleTime > 0 ? this._change.pipe(auditTime(throttleTime)) : this._change;\n    }\n    /** Use defaultView of injected document if available or fallback to global window reference */\n    _getWindow() {\n      return this._document.defaultView || window;\n    }\n    /** Updates the cached viewport size. */\n    _updateViewportSize() {\n      const window = this._getWindow();\n      this._viewportSize = this._platform.isBrowser ? {\n        width: window.innerWidth,\n        height: window.innerHeight\n      } : {\n        width: 0,\n        height: 0\n      };\n    }\n    static ɵfac = function ViewportRuler_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || ViewportRuler)();\n    };\n    static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n      token: ViewportRuler,\n      factory: ViewportRuler.ɵfac,\n      providedIn: 'root'\n    });\n  }\n  return ViewportRuler;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst VIRTUAL_SCROLLABLE = /*#__PURE__*/new InjectionToken('VIRTUAL_SCROLLABLE');\n/**\n * Extending the {@link CdkScrollable} to be used as scrolling container for virtual scrolling.\n */\nlet CdkVirtualScrollable = /*#__PURE__*/(() => {\n  class CdkVirtualScrollable extends CdkScrollable {\n    constructor() {\n      super();\n    }\n    /**\n     * Measure the viewport size for the provided orientation.\n     *\n     * @param orientation The orientation to measure the size from.\n     */\n    measureViewportSize(orientation) {\n      const viewportEl = this.elementRef.nativeElement;\n      return orientation === 'horizontal' ? viewportEl.clientWidth : viewportEl.clientHeight;\n    }\n    static ɵfac = function CdkVirtualScrollable_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkVirtualScrollable)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkVirtualScrollable,\n      features: [i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return CdkVirtualScrollable;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Checks if the given ranges are equal. */\nfunction rangesEqual(r1, r2) {\n  return r1.start == r2.start && r1.end == r2.end;\n}\n/**\n * Scheduler to be used for scroll events. Needs to fall back to\n * something that doesn't rely on requestAnimationFrame on environments\n * that don't support it (e.g. server-side rendering).\n */\nconst SCROLL_SCHEDULER = typeof requestAnimationFrame !== 'undefined' ? animationFrameScheduler : asapScheduler;\n/** A viewport that virtualizes its scrolling with the help of `CdkVirtualForOf`. */\nlet CdkVirtualScrollViewport = /*#__PURE__*/(() => {\n  class CdkVirtualScrollViewport extends CdkVirtualScrollable {\n    elementRef = inject(ElementRef);\n    _changeDetectorRef = inject(ChangeDetectorRef);\n    _scrollStrategy = inject(VIRTUAL_SCROLL_STRATEGY, {\n      optional: true\n    });\n    scrollable = inject(VIRTUAL_SCROLLABLE, {\n      optional: true\n    });\n    _platform = inject(Platform);\n    /** Emits when the viewport is detached from a CdkVirtualForOf. */\n    _detachedSubject = new Subject();\n    /** Emits when the rendered range changes. */\n    _renderedRangeSubject = new Subject();\n    /** The direction the viewport scrolls. */\n    get orientation() {\n      return this._orientation;\n    }\n    set orientation(orientation) {\n      if (this._orientation !== orientation) {\n        this._orientation = orientation;\n        this._calculateSpacerSize();\n      }\n    }\n    _orientation = 'vertical';\n    /**\n     * Whether rendered items should persist in the DOM after scrolling out of view. By default, items\n     * will be removed.\n     */\n    appendOnly = false;\n    // Note: we don't use the typical EventEmitter here because we need to subscribe to the scroll\n    // strategy lazily (i.e. only if the user is actually listening to the events). We do this because\n    // depending on how the strategy calculates the scrolled index, it may come at a cost to\n    // performance.\n    /** Emits when the index of the first element visible in the viewport changes. */\n    scrolledIndexChange = new Observable(observer => this._scrollStrategy.scrolledIndexChange.subscribe(index => Promise.resolve().then(() => this.ngZone.run(() => observer.next(index)))));\n    /** The element that wraps the rendered content. */\n    _contentWrapper;\n    /** A stream that emits whenever the rendered range changes. */\n    renderedRangeStream = this._renderedRangeSubject;\n    /**\n     * The total size of all content (in pixels), including content that is not currently rendered.\n     */\n    _totalContentSize = 0;\n    /** A string representing the `style.width` property value to be used for the spacer element. */\n    _totalContentWidth = '';\n    /** A string representing the `style.height` property value to be used for the spacer element. */\n    _totalContentHeight = '';\n    /**\n     * The CSS transform applied to the rendered subset of items so that they appear within the bounds\n     * of the visible viewport.\n     */\n    _renderedContentTransform;\n    /** The currently rendered range of indices. */\n    _renderedRange = {\n      start: 0,\n      end: 0\n    };\n    /** The length of the data bound to this viewport (in number of items). */\n    _dataLength = 0;\n    /** The size of the viewport (in pixels). */\n    _viewportSize = 0;\n    /** the currently attached CdkVirtualScrollRepeater. */\n    _forOf;\n    /** The last rendered content offset that was set. */\n    _renderedContentOffset = 0;\n    /**\n     * Whether the last rendered content offset was to the end of the content (and therefore needs to\n     * be rewritten as an offset to the start of the content).\n     */\n    _renderedContentOffsetNeedsRewrite = false;\n    /** Whether there is a pending change detection cycle. */\n    _isChangeDetectionPending = false;\n    /** A list of functions to run after the next change detection cycle. */\n    _runAfterChangeDetection = [];\n    /** Subscription to changes in the viewport size. */\n    _viewportChanges = Subscription.EMPTY;\n    _injector = inject(Injector);\n    _isDestroyed = false;\n    constructor() {\n      super();\n      const viewportRuler = inject(ViewportRuler);\n      if (!this._scrollStrategy && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw Error('Error: cdk-virtual-scroll-viewport requires the \"itemSize\" property to be set.');\n      }\n      this._viewportChanges = viewportRuler.change().subscribe(() => {\n        this.checkViewportSize();\n      });\n      if (!this.scrollable) {\n        // No scrollable is provided, so the virtual-scroll-viewport needs to become a scrollable\n        this.elementRef.nativeElement.classList.add('cdk-virtual-scrollable');\n        this.scrollable = this;\n      }\n    }\n    ngOnInit() {\n      // Scrolling depends on the element dimensions which we can't get during SSR.\n      if (!this._platform.isBrowser) {\n        return;\n      }\n      if (this.scrollable === this) {\n        super.ngOnInit();\n      }\n      // It's still too early to measure the viewport at this point. Deferring with a promise allows\n      // the Viewport to be rendered with the correct size before we measure. We run this outside the\n      // zone to avoid causing more change detection cycles. We handle the change detection loop\n      // ourselves instead.\n      this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {\n        this._measureViewportSize();\n        this._scrollStrategy.attach(this);\n        this.scrollable.elementScrolled().pipe(\n        // Start off with a fake scroll event so we properly detect our initial position.\n        startWith(null),\n        // Collect multiple events into one until the next animation frame. This way if\n        // there are multiple scroll events in the same frame we only need to recheck\n        // our layout once.\n        auditTime(0, SCROLL_SCHEDULER),\n        // Usually `elementScrolled` is completed when the scrollable is destroyed, but\n        // that may not be the case if a `CdkVirtualScrollableElement` is used so we have\n        // to unsubscribe here just in case.\n        takeUntil(this._destroyed)).subscribe(() => this._scrollStrategy.onContentScrolled());\n        this._markChangeDetectionNeeded();\n      }));\n    }\n    ngOnDestroy() {\n      this.detach();\n      this._scrollStrategy.detach();\n      // Complete all subjects\n      this._renderedRangeSubject.complete();\n      this._detachedSubject.complete();\n      this._viewportChanges.unsubscribe();\n      this._isDestroyed = true;\n      super.ngOnDestroy();\n    }\n    /** Attaches a `CdkVirtualScrollRepeater` to this viewport. */\n    attach(forOf) {\n      if (this._forOf && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw Error('CdkVirtualScrollViewport is already attached.');\n      }\n      // Subscribe to the data stream of the CdkVirtualForOf to keep track of when the data length\n      // changes. Run outside the zone to avoid triggering change detection, since we're managing the\n      // change detection loop ourselves.\n      this.ngZone.runOutsideAngular(() => {\n        this._forOf = forOf;\n        this._forOf.dataStream.pipe(takeUntil(this._detachedSubject)).subscribe(data => {\n          const newLength = data.length;\n          if (newLength !== this._dataLength) {\n            this._dataLength = newLength;\n            this._scrollStrategy.onDataLengthChanged();\n          }\n          this._doChangeDetection();\n        });\n      });\n    }\n    /** Detaches the current `CdkVirtualForOf`. */\n    detach() {\n      this._forOf = null;\n      this._detachedSubject.next();\n    }\n    /** Gets the length of the data bound to this viewport (in number of items). */\n    getDataLength() {\n      return this._dataLength;\n    }\n    /** Gets the size of the viewport (in pixels). */\n    getViewportSize() {\n      return this._viewportSize;\n    }\n    // TODO(mmalerba): This is technically out of sync with what's really rendered until a render\n    // cycle happens. I'm being careful to only call it after the render cycle is complete and before\n    // setting it to something else, but its error prone and should probably be split into\n    // `pendingRange` and `renderedRange`, the latter reflecting whats actually in the DOM.\n    /** Get the current rendered range of items. */\n    getRenderedRange() {\n      return this._renderedRange;\n    }\n    measureBoundingClientRectWithScrollOffset(from) {\n      return this.getElementRef().nativeElement.getBoundingClientRect()[from];\n    }\n    /**\n     * Sets the total size of all content (in pixels), including content that is not currently\n     * rendered.\n     */\n    setTotalContentSize(size) {\n      if (this._totalContentSize !== size) {\n        this._totalContentSize = size;\n        this._calculateSpacerSize();\n        this._markChangeDetectionNeeded();\n      }\n    }\n    /** Sets the currently rendered range of indices. */\n    setRenderedRange(range) {\n      if (!rangesEqual(this._renderedRange, range)) {\n        if (this.appendOnly) {\n          range = {\n            start: 0,\n            end: Math.max(this._renderedRange.end, range.end)\n          };\n        }\n        this._renderedRangeSubject.next(this._renderedRange = range);\n        this._markChangeDetectionNeeded(() => this._scrollStrategy.onContentRendered());\n      }\n    }\n    /**\n     * Gets the offset from the start of the viewport to the start of the rendered data (in pixels).\n     */\n    getOffsetToRenderedContentStart() {\n      return this._renderedContentOffsetNeedsRewrite ? null : this._renderedContentOffset;\n    }\n    /**\n     * Sets the offset from the start of the viewport to either the start or end of the rendered data\n     * (in pixels).\n     */\n    setRenderedContentOffset(offset, to = 'to-start') {\n      // In appendOnly, we always start from the top\n      offset = this.appendOnly && to === 'to-start' ? 0 : offset;\n      // For a horizontal viewport in a right-to-left language we need to translate along the x-axis\n      // in the negative direction.\n      const isRtl = this.dir && this.dir.value == 'rtl';\n      const isHorizontal = this.orientation == 'horizontal';\n      const axis = isHorizontal ? 'X' : 'Y';\n      const axisDirection = isHorizontal && isRtl ? -1 : 1;\n      let transform = `translate${axis}(${Number(axisDirection * offset)}px)`;\n      this._renderedContentOffset = offset;\n      if (to === 'to-end') {\n        transform += ` translate${axis}(-100%)`;\n        // The viewport should rewrite this as a `to-start` offset on the next render cycle. Otherwise\n        // elements will appear to expand in the wrong direction (e.g. `mat-expansion-panel` would\n        // expand upward).\n        this._renderedContentOffsetNeedsRewrite = true;\n      }\n      if (this._renderedContentTransform != transform) {\n        // We know this value is safe because we parse `offset` with `Number()` before passing it\n        // into the string.\n        this._renderedContentTransform = transform;\n        this._markChangeDetectionNeeded(() => {\n          if (this._renderedContentOffsetNeedsRewrite) {\n            this._renderedContentOffset -= this.measureRenderedContentSize();\n            this._renderedContentOffsetNeedsRewrite = false;\n            this.setRenderedContentOffset(this._renderedContentOffset);\n          } else {\n            this._scrollStrategy.onRenderedOffsetChanged();\n          }\n        });\n      }\n    }\n    /**\n     * Scrolls to the given offset from the start of the viewport. Please note that this is not always\n     * the same as setting `scrollTop` or `scrollLeft`. In a horizontal viewport with right-to-left\n     * direction, this would be the equivalent of setting a fictional `scrollRight` property.\n     * @param offset The offset to scroll to.\n     * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.\n     */\n    scrollToOffset(offset, behavior = 'auto') {\n      const options = {\n        behavior\n      };\n      if (this.orientation === 'horizontal') {\n        options.start = offset;\n      } else {\n        options.top = offset;\n      }\n      this.scrollable.scrollTo(options);\n    }\n    /**\n     * Scrolls to the offset for the given index.\n     * @param index The index of the element to scroll to.\n     * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.\n     */\n    scrollToIndex(index, behavior = 'auto') {\n      this._scrollStrategy.scrollToIndex(index, behavior);\n    }\n    /**\n     * Gets the current scroll offset from the start of the scrollable (in pixels).\n     * @param from The edge to measure the offset from. Defaults to 'top' in vertical mode and 'start'\n     *     in horizontal mode.\n     */\n    measureScrollOffset(from) {\n      // This is to break the call cycle\n      let measureScrollOffset;\n      if (this.scrollable == this) {\n        measureScrollOffset = _from => super.measureScrollOffset(_from);\n      } else {\n        measureScrollOffset = _from => this.scrollable.measureScrollOffset(_from);\n      }\n      return Math.max(0, measureScrollOffset(from ?? (this.orientation === 'horizontal' ? 'start' : 'top')) - this.measureViewportOffset());\n    }\n    /**\n     * Measures the offset of the viewport from the scrolling container\n     * @param from The edge to measure from.\n     */\n    measureViewportOffset(from) {\n      let fromRect;\n      const LEFT = 'left';\n      const RIGHT = 'right';\n      const isRtl = this.dir?.value == 'rtl';\n      if (from == 'start') {\n        fromRect = isRtl ? RIGHT : LEFT;\n      } else if (from == 'end') {\n        fromRect = isRtl ? LEFT : RIGHT;\n      } else if (from) {\n        fromRect = from;\n      } else {\n        fromRect = this.orientation === 'horizontal' ? 'left' : 'top';\n      }\n      const scrollerClientRect = this.scrollable.measureBoundingClientRectWithScrollOffset(fromRect);\n      const viewportClientRect = this.elementRef.nativeElement.getBoundingClientRect()[fromRect];\n      return viewportClientRect - scrollerClientRect;\n    }\n    /** Measure the combined size of all of the rendered items. */\n    measureRenderedContentSize() {\n      const contentEl = this._contentWrapper.nativeElement;\n      return this.orientation === 'horizontal' ? contentEl.offsetWidth : contentEl.offsetHeight;\n    }\n    /**\n     * Measure the total combined size of the given range. Throws if the range includes items that are\n     * not rendered.\n     */\n    measureRangeSize(range) {\n      if (!this._forOf) {\n        return 0;\n      }\n      return this._forOf.measureRangeSize(range, this.orientation);\n    }\n    /** Update the viewport dimensions and re-render. */\n    checkViewportSize() {\n      // TODO: Cleanup later when add logic for handling content resize\n      this._measureViewportSize();\n      this._scrollStrategy.onDataLengthChanged();\n    }\n    /** Measure the viewport size. */\n    _measureViewportSize() {\n      this._viewportSize = this.scrollable.measureViewportSize(this.orientation);\n    }\n    /** Queue up change detection to run. */\n    _markChangeDetectionNeeded(runAfter) {\n      if (runAfter) {\n        this._runAfterChangeDetection.push(runAfter);\n      }\n      // Use a Promise to batch together calls to `_doChangeDetection`. This way if we set a bunch of\n      // properties sequentially we only have to run `_doChangeDetection` once at the end.\n      if (!this._isChangeDetectionPending) {\n        this._isChangeDetectionPending = true;\n        this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {\n          this._doChangeDetection();\n        }));\n      }\n    }\n    /** Run change detection. */\n    _doChangeDetection() {\n      if (this._isDestroyed) {\n        return;\n      }\n      this.ngZone.run(() => {\n        // Apply changes to Angular bindings. Note: We must call `markForCheck` to run change detection\n        // from the root, since the repeated items are content projected in. Calling `detectChanges`\n        // instead does not properly check the projected content.\n        this._changeDetectorRef.markForCheck();\n        // Apply the content transform. The transform can't be set via an Angular binding because\n        // bypassSecurityTrustStyle is banned in Google. However the value is safe, it's composed of\n        // string literals, a variable that can only be 'X' or 'Y', and user input that is run through\n        // the `Number` function first to coerce it to a numeric value.\n        this._contentWrapper.nativeElement.style.transform = this._renderedContentTransform;\n        afterNextRender(() => {\n          this._isChangeDetectionPending = false;\n          const runAfterChangeDetection = this._runAfterChangeDetection;\n          this._runAfterChangeDetection = [];\n          for (const fn of runAfterChangeDetection) {\n            fn();\n          }\n        }, {\n          injector: this._injector\n        });\n      });\n    }\n    /** Calculates the `style.width` and `style.height` for the spacer element. */\n    _calculateSpacerSize() {\n      this._totalContentHeight = this.orientation === 'horizontal' ? '' : `${this._totalContentSize}px`;\n      this._totalContentWidth = this.orientation === 'horizontal' ? `${this._totalContentSize}px` : '';\n    }\n    static ɵfac = function CdkVirtualScrollViewport_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkVirtualScrollViewport)();\n    };\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: CdkVirtualScrollViewport,\n      selectors: [[\"cdk-virtual-scroll-viewport\"]],\n      viewQuery: function CdkVirtualScrollViewport_Query(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵviewQuery(_c0, 7);\n        }\n        if (rf & 2) {\n          let _t;\n          i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._contentWrapper = _t.first);\n        }\n      },\n      hostAttrs: [1, \"cdk-virtual-scroll-viewport\"],\n      hostVars: 4,\n      hostBindings: function CdkVirtualScrollViewport_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵclassProp(\"cdk-virtual-scroll-orientation-horizontal\", ctx.orientation === \"horizontal\")(\"cdk-virtual-scroll-orientation-vertical\", ctx.orientation !== \"horizontal\");\n        }\n      },\n      inputs: {\n        orientation: \"orientation\",\n        appendOnly: [2, \"appendOnly\", \"appendOnly\", booleanAttribute]\n      },\n      outputs: {\n        scrolledIndexChange: \"scrolledIndexChange\"\n      },\n      features: [i0.ɵɵProvidersFeature([{\n        provide: CdkScrollable,\n        useFactory: (virtualScrollable, viewport) => virtualScrollable || viewport,\n        deps: [[new Optional(), new Inject(VIRTUAL_SCROLLABLE)], CdkVirtualScrollViewport]\n      }]), i0.ɵɵInheritDefinitionFeature],\n      ngContentSelectors: _c1,\n      decls: 4,\n      vars: 4,\n      consts: [[\"contentWrapper\", \"\"], [1, \"cdk-virtual-scroll-content-wrapper\"], [1, \"cdk-virtual-scroll-spacer\"]],\n      template: function CdkVirtualScrollViewport_Template(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵprojectionDef();\n          i0.ɵɵelementStart(0, \"div\", 1, 0);\n          i0.ɵɵprojection(2);\n          i0.ɵɵelementEnd();\n          i0.ɵɵelement(3, \"div\", 2);\n        }\n        if (rf & 2) {\n          i0.ɵɵadvance(3);\n          i0.ɵɵstyleProp(\"width\", ctx._totalContentWidth)(\"height\", ctx._totalContentHeight);\n        }\n      },\n      styles: [\"cdk-virtual-scroll-viewport{display:block;position:relative;transform:translateZ(0)}.cdk-virtual-scrollable{overflow:auto;will-change:scroll-position;contain:strict}.cdk-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .cdk-virtual-scroll-content-wrapper{right:0;left:auto}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper{min-height:100%}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{min-width:100%}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.cdk-virtual-scroll-spacer{height:1px;transform-origin:0 0;flex:0 0 auto}[dir=rtl] .cdk-virtual-scroll-spacer{transform-origin:100% 0}\\n\"],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return CdkVirtualScrollViewport;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Helper to extract the offset of a DOM Node in a certain direction. */\nfunction getOffset(orientation, direction, node) {\n  const el = node;\n  if (!el.getBoundingClientRect) {\n    return 0;\n  }\n  const rect = el.getBoundingClientRect();\n  if (orientation === 'horizontal') {\n    return direction === 'start' ? rect.left : rect.right;\n  }\n  return direction === 'start' ? rect.top : rect.bottom;\n}\n/**\n * A directive similar to `ngForOf` to be used for rendering data inside a virtual scrolling\n * container.\n */\nlet CdkVirtualForOf = /*#__PURE__*/(() => {\n  class CdkVirtualForOf {\n    _viewContainerRef = inject(ViewContainerRef);\n    _template = inject(TemplateRef);\n    _differs = inject(IterableDiffers);\n    _viewRepeater = inject(_VIEW_REPEATER_STRATEGY);\n    _viewport = inject(CdkVirtualScrollViewport, {\n      skipSelf: true\n    });\n    /** Emits when the rendered view of the data changes. */\n    viewChange = new Subject();\n    /** Subject that emits when a new DataSource instance is given. */\n    _dataSourceChanges = new Subject();\n    /** The DataSource to display. */\n    get cdkVirtualForOf() {\n      return this._cdkVirtualForOf;\n    }\n    set cdkVirtualForOf(value) {\n      this._cdkVirtualForOf = value;\n      if (isDataSource(value)) {\n        this._dataSourceChanges.next(value);\n      } else {\n        // If value is an an NgIterable, convert it to an array.\n        this._dataSourceChanges.next(new ArrayDataSource(isObservable(value) ? value : Array.from(value || [])));\n      }\n    }\n    _cdkVirtualForOf;\n    /**\n     * The `TrackByFunction` to use for tracking changes. The `TrackByFunction` takes the index and\n     * the item and produces a value to be used as the item's identity when tracking changes.\n     */\n    get cdkVirtualForTrackBy() {\n      return this._cdkVirtualForTrackBy;\n    }\n    set cdkVirtualForTrackBy(fn) {\n      this._needsUpdate = true;\n      this._cdkVirtualForTrackBy = fn ? (index, item) => fn(index + (this._renderedRange ? this._renderedRange.start : 0), item) : undefined;\n    }\n    _cdkVirtualForTrackBy;\n    /** The template used to stamp out new elements. */\n    set cdkVirtualForTemplate(value) {\n      if (value) {\n        this._needsUpdate = true;\n        this._template = value;\n      }\n    }\n    /**\n     * The size of the cache used to store templates that are not being used for re-use later.\n     * Setting the cache size to `0` will disable caching. Defaults to 20 templates.\n     */\n    get cdkVirtualForTemplateCacheSize() {\n      return this._viewRepeater.viewCacheSize;\n    }\n    set cdkVirtualForTemplateCacheSize(size) {\n      this._viewRepeater.viewCacheSize = coerceNumberProperty(size);\n    }\n    /** Emits whenever the data in the current DataSource changes. */\n    dataStream = this._dataSourceChanges.pipe(\n    // Start off with null `DataSource`.\n    startWith(null),\n    // Bundle up the previous and current data sources so we can work with both.\n    pairwise(),\n    // Use `_changeDataSource` to disconnect from the previous data source and connect to the\n    // new one, passing back a stream of data changes which we run through `switchMap` to give\n    // us a data stream that emits the latest data from whatever the current `DataSource` is.\n    switchMap(([prev, cur]) => this._changeDataSource(prev, cur)),\n    // Replay the last emitted data when someone subscribes.\n    shareReplay(1));\n    /** The differ used to calculate changes to the data. */\n    _differ = null;\n    /** The most recent data emitted from the DataSource. */\n    _data;\n    /** The currently rendered items. */\n    _renderedItems;\n    /** The currently rendered range of indices. */\n    _renderedRange;\n    /** Whether the rendered data should be updated during the next ngDoCheck cycle. */\n    _needsUpdate = false;\n    _destroyed = new Subject();\n    constructor() {\n      const ngZone = inject(NgZone);\n      this.dataStream.subscribe(data => {\n        this._data = data;\n        this._onRenderedDataChange();\n      });\n      this._viewport.renderedRangeStream.pipe(takeUntil(this._destroyed)).subscribe(range => {\n        this._renderedRange = range;\n        if (this.viewChange.observers.length) {\n          ngZone.run(() => this.viewChange.next(this._renderedRange));\n        }\n        this._onRenderedDataChange();\n      });\n      this._viewport.attach(this);\n    }\n    /**\n     * Measures the combined size (width for horizontal orientation, height for vertical) of all items\n     * in the specified range. Throws an error if the range includes items that are not currently\n     * rendered.\n     */\n    measureRangeSize(range, orientation) {\n      if (range.start >= range.end) {\n        return 0;\n      }\n      if ((range.start < this._renderedRange.start || range.end > this._renderedRange.end) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw Error(`Error: attempted to measure an item that isn't rendered.`);\n      }\n      // The index into the list of rendered views for the first item in the range.\n      const renderedStartIndex = range.start - this._renderedRange.start;\n      // The length of the range we're measuring.\n      const rangeLen = range.end - range.start;\n      // Loop over all the views, find the first and land node and compute the size by subtracting\n      // the top of the first node from the bottom of the last one.\n      let firstNode;\n      let lastNode;\n      // Find the first node by starting from the beginning and going forwards.\n      for (let i = 0; i < rangeLen; i++) {\n        const view = this._viewContainerRef.get(i + renderedStartIndex);\n        if (view && view.rootNodes.length) {\n          firstNode = lastNode = view.rootNodes[0];\n          break;\n        }\n      }\n      // Find the last node by starting from the end and going backwards.\n      for (let i = rangeLen - 1; i > -1; i--) {\n        const view = this._viewContainerRef.get(i + renderedStartIndex);\n        if (view && view.rootNodes.length) {\n          lastNode = view.rootNodes[view.rootNodes.length - 1];\n          break;\n        }\n      }\n      return firstNode && lastNode ? getOffset(orientation, 'end', lastNode) - getOffset(orientation, 'start', firstNode) : 0;\n    }\n    ngDoCheck() {\n      if (this._differ && this._needsUpdate) {\n        // TODO(mmalerba): We should differentiate needs update due to scrolling and a new portion of\n        // this list being rendered (can use simpler algorithm) vs needs update due to data actually\n        // changing (need to do this diff).\n        const changes = this._differ.diff(this._renderedItems);\n        if (!changes) {\n          this._updateContext();\n        } else {\n          this._applyChanges(changes);\n        }\n        this._needsUpdate = false;\n      }\n    }\n    ngOnDestroy() {\n      this._viewport.detach();\n      this._dataSourceChanges.next(undefined);\n      this._dataSourceChanges.complete();\n      this.viewChange.complete();\n      this._destroyed.next();\n      this._destroyed.complete();\n      this._viewRepeater.detach();\n    }\n    /** React to scroll state changes in the viewport. */\n    _onRenderedDataChange() {\n      if (!this._renderedRange) {\n        return;\n      }\n      this._renderedItems = this._data.slice(this._renderedRange.start, this._renderedRange.end);\n      if (!this._differ) {\n        // Use a wrapper function for the `trackBy` so any new values are\n        // picked up automatically without having to recreate the differ.\n        this._differ = this._differs.find(this._renderedItems).create((index, item) => {\n          return this.cdkVirtualForTrackBy ? this.cdkVirtualForTrackBy(index, item) : item;\n        });\n      }\n      this._needsUpdate = true;\n    }\n    /** Swap out one `DataSource` for another. */\n    _changeDataSource(oldDs, newDs) {\n      if (oldDs) {\n        oldDs.disconnect(this);\n      }\n      this._needsUpdate = true;\n      return newDs ? newDs.connect(this) : of();\n    }\n    /** Update the `CdkVirtualForOfContext` for all views. */\n    _updateContext() {\n      const count = this._data.length;\n      let i = this._viewContainerRef.length;\n      while (i--) {\n        const view = this._viewContainerRef.get(i);\n        view.context.index = this._renderedRange.start + i;\n        view.context.count = count;\n        this._updateComputedContextProperties(view.context);\n        view.detectChanges();\n      }\n    }\n    /** Apply changes to the DOM. */\n    _applyChanges(changes) {\n      this._viewRepeater.applyChanges(changes, this._viewContainerRef, (record, _adjustedPreviousIndex, currentIndex) => this._getEmbeddedViewArgs(record, currentIndex), record => record.item);\n      // Update $implicit for any items that had an identity change.\n      changes.forEachIdentityChange(record => {\n        const view = this._viewContainerRef.get(record.currentIndex);\n        view.context.$implicit = record.item;\n      });\n      // Update the context variables on all items.\n      const count = this._data.length;\n      let i = this._viewContainerRef.length;\n      while (i--) {\n        const view = this._viewContainerRef.get(i);\n        view.context.index = this._renderedRange.start + i;\n        view.context.count = count;\n        this._updateComputedContextProperties(view.context);\n      }\n    }\n    /** Update the computed properties on the `CdkVirtualForOfContext`. */\n    _updateComputedContextProperties(context) {\n      context.first = context.index === 0;\n      context.last = context.index === context.count - 1;\n      context.even = context.index % 2 === 0;\n      context.odd = !context.even;\n    }\n    _getEmbeddedViewArgs(record, index) {\n      // Note that it's important that we insert the item directly at the proper index,\n      // rather than inserting it and the moving it in place, because if there's a directive\n      // on the same node that injects the `ViewContainerRef`, Angular will insert another\n      // comment node which can throw off the move when it's being repeated for all items.\n      return {\n        templateRef: this._template,\n        context: {\n          $implicit: record.item,\n          // It's guaranteed that the iterable is not \"undefined\" or \"null\" because we only\n          // generate views for elements if the \"cdkVirtualForOf\" iterable has elements.\n          cdkVirtualForOf: this._cdkVirtualForOf,\n          index: -1,\n          count: -1,\n          first: false,\n          last: false,\n          odd: false,\n          even: false\n        },\n        index\n      };\n    }\n    static ngTemplateContextGuard(directive, context) {\n      return true;\n    }\n    static ɵfac = function CdkVirtualForOf_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkVirtualForOf)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkVirtualForOf,\n      selectors: [[\"\", \"cdkVirtualFor\", \"\", \"cdkVirtualForOf\", \"\"]],\n      inputs: {\n        cdkVirtualForOf: \"cdkVirtualForOf\",\n        cdkVirtualForTrackBy: \"cdkVirtualForTrackBy\",\n        cdkVirtualForTemplate: \"cdkVirtualForTemplate\",\n        cdkVirtualForTemplateCacheSize: \"cdkVirtualForTemplateCacheSize\"\n      },\n      features: [i0.ɵɵProvidersFeature([{\n        provide: _VIEW_REPEATER_STRATEGY,\n        useClass: _RecycleViewRepeaterStrategy\n      }])]\n    });\n  }\n  return CdkVirtualForOf;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Provides a virtual scrollable for the element it is attached to.\n */\nlet CdkVirtualScrollableElement = /*#__PURE__*/(() => {\n  class CdkVirtualScrollableElement extends CdkVirtualScrollable {\n    constructor() {\n      super();\n    }\n    measureBoundingClientRectWithScrollOffset(from) {\n      return this.getElementRef().nativeElement.getBoundingClientRect()[from] - this.measureScrollOffset(from);\n    }\n    static ɵfac = function CdkVirtualScrollableElement_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkVirtualScrollableElement)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkVirtualScrollableElement,\n      selectors: [[\"\", \"cdkVirtualScrollingElement\", \"\"]],\n      hostAttrs: [1, \"cdk-virtual-scrollable\"],\n      features: [i0.ɵɵProvidersFeature([{\n        provide: VIRTUAL_SCROLLABLE,\n        useExisting: CdkVirtualScrollableElement\n      }]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return CdkVirtualScrollableElement;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Provides as virtual scrollable for the global / window scrollbar.\n */\nlet CdkVirtualScrollableWindow = /*#__PURE__*/(() => {\n  class CdkVirtualScrollableWindow extends CdkVirtualScrollable {\n    constructor() {\n      super();\n      const document = inject(DOCUMENT);\n      this.elementRef = new ElementRef(document.documentElement);\n      this._scrollElement = document;\n    }\n    measureBoundingClientRectWithScrollOffset(from) {\n      return this.getElementRef().nativeElement.getBoundingClientRect()[from];\n    }\n    static ɵfac = function CdkVirtualScrollableWindow_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkVirtualScrollableWindow)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkVirtualScrollableWindow,\n      selectors: [[\"cdk-virtual-scroll-viewport\", \"scrollWindow\", \"\"]],\n      features: [i0.ɵɵProvidersFeature([{\n        provide: VIRTUAL_SCROLLABLE,\n        useExisting: CdkVirtualScrollableWindow\n      }]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return CdkVirtualScrollableWindow;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet CdkScrollableModule = /*#__PURE__*/(() => {\n  class CdkScrollableModule {\n    static ɵfac = function CdkScrollableModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkScrollableModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: CdkScrollableModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n  }\n  return CdkScrollableModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @docs-primary-export\n */\nlet ScrollingModule = /*#__PURE__*/(() => {\n  class ScrollingModule {\n    static ɵfac = function ScrollingModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || ScrollingModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: ScrollingModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n      imports: [BidiModule, CdkScrollableModule, BidiModule, CdkScrollableModule]\n    });\n  }\n  return ScrollingModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { CdkFixedSizeVirtualScroll, CdkScrollable, CdkScrollableModule, CdkVirtualForOf, CdkVirtualScrollViewport, CdkVirtualScrollable, CdkVirtualScrollableElement, CdkVirtualScrollableWindow, DEFAULT_RESIZE_TIME, DEFAULT_SCROLL_TIME, FixedSizeVirtualScrollStrategy, ScrollDispatcher, ScrollingModule, VIRTUAL_SCROLLABLE, VIRTUAL_SCROLL_STRATEGY, ViewportRuler, _fixedSizeVirtualScrollStrategyFactory };\n","import * as i0 from '@angular/core';\nimport { ElementRef, NgModuleRef, EnvironmentInjector, createComponent, Injector, inject, TemplateRef, ViewContainerRef, Directive, EventEmitter, Input, Output, NgModule } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n/**\n * Throws an exception when attempting to attach a null portal to a host.\n * @docs-private\n */\nfunction throwNullPortalError() {\n  throw Error('Must provide a portal to attach');\n}\n/**\n * Throws an exception when attempting to attach a portal to a host that is already attached.\n * @docs-private\n */\nfunction throwPortalAlreadyAttachedError() {\n  throw Error('Host already has a portal attached');\n}\n/**\n * Throws an exception when attempting to attach a portal to an already-disposed host.\n * @docs-private\n */\nfunction throwPortalOutletAlreadyDisposedError() {\n  throw Error('This PortalOutlet has already been disposed');\n}\n/**\n * Throws an exception when attempting to attach an unknown portal type.\n * @docs-private\n */\nfunction throwUnknownPortalTypeError() {\n  throw Error('Attempting to attach an unknown Portal type. BasePortalOutlet accepts either ' + 'a ComponentPortal or a TemplatePortal.');\n}\n/**\n * Throws an exception when attempting to attach a portal to a null host.\n * @docs-private\n */\nfunction throwNullPortalOutletError() {\n  throw Error('Attempting to attach a portal to a null PortalOutlet');\n}\n/**\n * Throws an exception when attempting to detach a portal that is not attached.\n * @docs-private\n */\nfunction throwNoPortalAttachedError() {\n  throw Error('Attempting to detach a portal that is not attached to a host');\n}\n\n/**\n * A `Portal` is something that you want to render somewhere else.\n * It can be attach to / detached from a `PortalOutlet`.\n */\nclass Portal {\n  _attachedHost;\n  /** Attach this portal to a host. */\n  attach(host) {\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      if (host == null) {\n        throwNullPortalOutletError();\n      }\n      if (host.hasAttached()) {\n        throwPortalAlreadyAttachedError();\n      }\n    }\n    this._attachedHost = host;\n    return host.attach(this);\n  }\n  /** Detach this portal from its host */\n  detach() {\n    let host = this._attachedHost;\n    if (host != null) {\n      this._attachedHost = null;\n      host.detach();\n    } else if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      throwNoPortalAttachedError();\n    }\n  }\n  /** Whether this portal is attached to a host. */\n  get isAttached() {\n    return this._attachedHost != null;\n  }\n  /**\n   * Sets the PortalOutlet reference without performing `attach()`. This is used directly by\n   * the PortalOutlet when it is performing an `attach()` or `detach()`.\n   */\n  setAttachedHost(host) {\n    this._attachedHost = host;\n  }\n}\n/**\n * A `ComponentPortal` is a portal that instantiates some Component upon attachment.\n */\nclass ComponentPortal extends Portal {\n  /** The type of the component that will be instantiated for attachment. */\n  component;\n  /**\n   * Where the attached component should live in Angular's *logical* component tree.\n   * This is different from where the component *renders*, which is determined by the PortalOutlet.\n   * The origin is necessary when the host is outside of the Angular application context.\n   */\n  viewContainerRef;\n  /** Injector used for the instantiation of the component. */\n  injector;\n  /**\n   * @deprecated No longer in use. To be removed.\n   * @breaking-change 18.0.0\n   */\n  componentFactoryResolver;\n  /**\n   * List of DOM nodes that should be projected through `<ng-content>` of the attached component.\n   */\n  projectableNodes;\n  constructor(component, viewContainerRef, injector,\n  /**\n   * @deprecated No longer in use. To be removed.\n   * @breaking-change 18.0.0\n   */\n  _componentFactoryResolver, projectableNodes) {\n    super();\n    this.component = component;\n    this.viewContainerRef = viewContainerRef;\n    this.injector = injector;\n    this.projectableNodes = projectableNodes;\n  }\n}\n/**\n * A `TemplatePortal` is a portal that represents some embedded template (TemplateRef).\n */\nclass TemplatePortal extends Portal {\n  templateRef;\n  viewContainerRef;\n  context;\n  injector;\n  constructor(/** The embedded template that will be used to instantiate an embedded View in the host. */\n  templateRef, /** Reference to the ViewContainer into which the template will be stamped out. */\n  viewContainerRef, /** Contextual data to be passed in to the embedded view. */\n  context, /** The injector to use for the embedded view. */\n  injector) {\n    super();\n    this.templateRef = templateRef;\n    this.viewContainerRef = viewContainerRef;\n    this.context = context;\n    this.injector = injector;\n  }\n  get origin() {\n    return this.templateRef.elementRef;\n  }\n  /**\n   * Attach the portal to the provided `PortalOutlet`.\n   * When a context is provided it will override the `context` property of the `TemplatePortal`\n   * instance.\n   */\n  attach(host, context = this.context) {\n    this.context = context;\n    return super.attach(host);\n  }\n  detach() {\n    this.context = undefined;\n    return super.detach();\n  }\n}\n/**\n * A `DomPortal` is a portal whose DOM element will be taken from its current position\n * in the DOM and moved into a portal outlet, when it is attached. On detach, the content\n * will be restored to its original position.\n */\nclass DomPortal extends Portal {\n  /** DOM node hosting the portal's content. */\n  element;\n  constructor(element) {\n    super();\n    this.element = element instanceof ElementRef ? element.nativeElement : element;\n  }\n}\n/**\n * Partial implementation of PortalOutlet that handles attaching\n * ComponentPortal and TemplatePortal.\n */\nclass BasePortalOutlet {\n  /** The portal currently attached to the host. */\n  _attachedPortal;\n  /** A function that will permanently dispose this host. */\n  _disposeFn;\n  /** Whether this host has already been permanently disposed. */\n  _isDisposed = false;\n  /** Whether this host has an attached portal. */\n  hasAttached() {\n    return !!this._attachedPortal;\n  }\n  /** Attaches a portal. */\n  attach(portal) {\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      if (!portal) {\n        throwNullPortalError();\n      }\n      if (this.hasAttached()) {\n        throwPortalAlreadyAttachedError();\n      }\n      if (this._isDisposed) {\n        throwPortalOutletAlreadyDisposedError();\n      }\n    }\n    if (portal instanceof ComponentPortal) {\n      this._attachedPortal = portal;\n      return this.attachComponentPortal(portal);\n    } else if (portal instanceof TemplatePortal) {\n      this._attachedPortal = portal;\n      return this.attachTemplatePortal(portal);\n      // @breaking-change 10.0.0 remove null check for `this.attachDomPortal`.\n    } else if (this.attachDomPortal && portal instanceof DomPortal) {\n      this._attachedPortal = portal;\n      return this.attachDomPortal(portal);\n    }\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      throwUnknownPortalTypeError();\n    }\n  }\n  // @breaking-change 10.0.0 `attachDomPortal` to become a required abstract method.\n  attachDomPortal = null;\n  /** Detaches a previously attached portal. */\n  detach() {\n    if (this._attachedPortal) {\n      this._attachedPortal.setAttachedHost(null);\n      this._attachedPortal = null;\n    }\n    this._invokeDisposeFn();\n  }\n  /** Permanently dispose of this portal host. */\n  dispose() {\n    if (this.hasAttached()) {\n      this.detach();\n    }\n    this._invokeDisposeFn();\n    this._isDisposed = true;\n  }\n  /** @docs-private */\n  setDisposeFn(fn) {\n    this._disposeFn = fn;\n  }\n  _invokeDisposeFn() {\n    if (this._disposeFn) {\n      this._disposeFn();\n      this._disposeFn = null;\n    }\n  }\n}\n/**\n * @deprecated Use `BasePortalOutlet` instead.\n * @breaking-change 9.0.0\n */\nclass BasePortalHost extends BasePortalOutlet {}\n\n/**\n * A PortalOutlet for attaching portals to an arbitrary DOM element outside of the Angular\n * application context.\n */\nclass DomPortalOutlet extends BasePortalOutlet {\n  outletElement;\n  _appRef;\n  _defaultInjector;\n  _document;\n  /**\n   * @param outletElement Element into which the content is projected.\n   * @param _unusedComponentFactoryResolver Used to resolve the component factory.\n   *   Only required when attaching component portals.\n   * @param _appRef Reference to the application. Only used in component portals when there\n   *   is no `ViewContainerRef` available.\n   * @param _defaultInjector Injector to use as a fallback when the portal being attached doesn't\n   *   have one. Only used for component portals.\n   * @param _document Reference to the document. Used when attaching a DOM portal. Will eventually\n   *   become a required parameter.\n   */\n  constructor(/** Element into which the content is projected. */\n  outletElement,\n  /**\n   * @deprecated No longer in use. To be removed.\n   * @breaking-change 18.0.0\n   */\n  _unusedComponentFactoryResolver, _appRef, _defaultInjector,\n  /**\n   * @deprecated `_document` Parameter to be made required.\n   * @breaking-change 10.0.0\n   */\n  _document) {\n    super();\n    this.outletElement = outletElement;\n    this._appRef = _appRef;\n    this._defaultInjector = _defaultInjector;\n    this._document = _document;\n  }\n  /**\n   * Attach the given ComponentPortal to DOM element.\n   * @param portal Portal to be attached\n   * @returns Reference to the created component.\n   */\n  attachComponentPortal(portal) {\n    let componentRef;\n    // If the portal specifies a ViewContainerRef, we will use that as the attachment point\n    // for the component (in terms of Angular's component tree, not rendering).\n    // When the ViewContainerRef is missing, we use the factory to create the component directly\n    // and then manually attach the view to the application.\n    if (portal.viewContainerRef) {\n      const injector = portal.injector || portal.viewContainerRef.injector;\n      const ngModuleRef = injector.get(NgModuleRef, null, {\n        optional: true\n      }) || undefined;\n      componentRef = portal.viewContainerRef.createComponent(portal.component, {\n        index: portal.viewContainerRef.length,\n        injector,\n        ngModuleRef,\n        projectableNodes: portal.projectableNodes || undefined\n      });\n      this.setDisposeFn(() => componentRef.destroy());\n    } else {\n      if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this._appRef) {\n        throw Error('Cannot attach component portal to outlet without an ApplicationRef.');\n      }\n      const appRef = this._appRef;\n      const elementInjector = portal.injector || this._defaultInjector || Injector.NULL;\n      const environmentInjector = elementInjector.get(EnvironmentInjector, appRef.injector);\n      componentRef = createComponent(portal.component, {\n        elementInjector,\n        environmentInjector,\n        projectableNodes: portal.projectableNodes || undefined\n      });\n      appRef.attachView(componentRef.hostView);\n      this.setDisposeFn(() => {\n        // Verify that the ApplicationRef has registered views before trying to detach a host view.\n        // This check also protects the `detachView` from being called on a destroyed ApplicationRef.\n        if (appRef.viewCount > 0) {\n          appRef.detachView(componentRef.hostView);\n        }\n        componentRef.destroy();\n      });\n    }\n    // At this point the component has been instantiated, so we move it to the location in the DOM\n    // where we want it to be rendered.\n    this.outletElement.appendChild(this._getComponentRootNode(componentRef));\n    this._attachedPortal = portal;\n    return componentRef;\n  }\n  /**\n   * Attaches a template portal to the DOM as an embedded view.\n   * @param portal Portal to be attached.\n   * @returns Reference to the created embedded view.\n   */\n  attachTemplatePortal(portal) {\n    let viewContainer = portal.viewContainerRef;\n    let viewRef = viewContainer.createEmbeddedView(portal.templateRef, portal.context, {\n      injector: portal.injector\n    });\n    // The method `createEmbeddedView` will add the view as a child of the viewContainer.\n    // But for the DomPortalOutlet the view can be added everywhere in the DOM\n    // (e.g Overlay Container) To move the view to the specified host element. We just\n    // re-append the existing root nodes.\n    viewRef.rootNodes.forEach(rootNode => this.outletElement.appendChild(rootNode));\n    // Note that we want to detect changes after the nodes have been moved so that\n    // any directives inside the portal that are looking at the DOM inside a lifecycle\n    // hook won't be invoked too early.\n    viewRef.detectChanges();\n    this.setDisposeFn(() => {\n      let index = viewContainer.indexOf(viewRef);\n      if (index !== -1) {\n        viewContainer.remove(index);\n      }\n    });\n    this._attachedPortal = portal;\n    // TODO(jelbourn): Return locals from view.\n    return viewRef;\n  }\n  /**\n   * Attaches a DOM portal by transferring its content into the outlet.\n   * @param portal Portal to be attached.\n   * @deprecated To be turned into a method.\n   * @breaking-change 10.0.0\n   */\n  attachDomPortal = portal => {\n    const element = portal.element;\n    if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n      throw Error('DOM portal content must be attached to a parent node.');\n    }\n    // Anchor used to save the element's previous position so\n    // that we can restore it when the portal is detached.\n    const anchorNode = this._document.createComment('dom-portal');\n    element.parentNode.insertBefore(anchorNode, element);\n    this.outletElement.appendChild(element);\n    this._attachedPortal = portal;\n    super.setDisposeFn(() => {\n      // We can't use `replaceWith` here because IE doesn't support it.\n      if (anchorNode.parentNode) {\n        anchorNode.parentNode.replaceChild(element, anchorNode);\n      }\n    });\n  };\n  /**\n   * Clears out a portal from the DOM.\n   */\n  dispose() {\n    super.dispose();\n    this.outletElement.remove();\n  }\n  /** Gets the root HTMLElement for an instantiated component. */\n  _getComponentRootNode(componentRef) {\n    return componentRef.hostView.rootNodes[0];\n  }\n}\n/**\n * @deprecated Use `DomPortalOutlet` instead.\n * @breaking-change 9.0.0\n */\nclass DomPortalHost extends DomPortalOutlet {}\n\n/**\n * Directive version of a `TemplatePortal`. Because the directive *is* a TemplatePortal,\n * the directive instance itself can be attached to a host, enabling declarative use of portals.\n */\nlet CdkPortal = /*#__PURE__*/(() => {\n  class CdkPortal extends TemplatePortal {\n    constructor() {\n      const templateRef = inject(TemplateRef);\n      const viewContainerRef = inject(ViewContainerRef);\n      super(templateRef, viewContainerRef);\n    }\n    static ɵfac = function CdkPortal_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkPortal)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkPortal,\n      selectors: [[\"\", \"cdkPortal\", \"\"]],\n      exportAs: [\"cdkPortal\"],\n      features: [i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return CdkPortal;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @deprecated Use `CdkPortal` instead.\n * @breaking-change 9.0.0\n */\nlet TemplatePortalDirective = /*#__PURE__*/(() => {\n  class TemplatePortalDirective extends CdkPortal {\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵTemplatePortalDirective_BaseFactory;\n      return function TemplatePortalDirective_Factory(__ngFactoryType__) {\n        return (ɵTemplatePortalDirective_BaseFactory || (ɵTemplatePortalDirective_BaseFactory = i0.ɵɵgetInheritedFactory(TemplatePortalDirective)))(__ngFactoryType__ || TemplatePortalDirective);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: TemplatePortalDirective,\n      selectors: [[\"\", \"cdk-portal\", \"\"], [\"\", \"portal\", \"\"]],\n      exportAs: [\"cdkPortal\"],\n      features: [i0.ɵɵProvidersFeature([{\n        provide: CdkPortal,\n        useExisting: TemplatePortalDirective\n      }]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return TemplatePortalDirective;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Directive version of a PortalOutlet. Because the directive *is* a PortalOutlet, portals can be\n * directly attached to it, enabling declarative use.\n *\n * Usage:\n * `<ng-template [cdkPortalOutlet]=\"greeting\"></ng-template>`\n */\nlet CdkPortalOutlet = /*#__PURE__*/(() => {\n  class CdkPortalOutlet extends BasePortalOutlet {\n    _moduleRef = inject(NgModuleRef, {\n      optional: true\n    });\n    _document = inject(DOCUMENT);\n    _viewContainerRef = inject(ViewContainerRef);\n    /** Whether the portal component is initialized. */\n    _isInitialized = false;\n    /** Reference to the currently-attached component/view ref. */\n    _attachedRef;\n    constructor() {\n      super();\n    }\n    /** Portal associated with the Portal outlet. */\n    get portal() {\n      return this._attachedPortal;\n    }\n    set portal(portal) {\n      // Ignore the cases where the `portal` is set to a falsy value before the lifecycle hooks have\n      // run. This handles the cases where the user might do something like `<div cdkPortalOutlet>`\n      // and attach a portal programmatically in the parent component. When Angular does the first CD\n      // round, it will fire the setter with empty string, causing the user's content to be cleared.\n      if (this.hasAttached() && !portal && !this._isInitialized) {\n        return;\n      }\n      if (this.hasAttached()) {\n        super.detach();\n      }\n      if (portal) {\n        super.attach(portal);\n      }\n      this._attachedPortal = portal || null;\n    }\n    /** Emits when a portal is attached to the outlet. */\n    attached = new EventEmitter();\n    /** Component or view reference that is attached to the portal. */\n    get attachedRef() {\n      return this._attachedRef;\n    }\n    ngOnInit() {\n      this._isInitialized = true;\n    }\n    ngOnDestroy() {\n      super.dispose();\n      this._attachedRef = this._attachedPortal = null;\n    }\n    /**\n     * Attach the given ComponentPortal to this PortalOutlet.\n     *\n     * @param portal Portal to be attached to the portal outlet.\n     * @returns Reference to the created component.\n     */\n    attachComponentPortal(portal) {\n      portal.setAttachedHost(this);\n      // If the portal specifies an origin, use that as the logical location of the component\n      // in the application tree. Otherwise use the location of this PortalOutlet.\n      const viewContainerRef = portal.viewContainerRef != null ? portal.viewContainerRef : this._viewContainerRef;\n      const ref = viewContainerRef.createComponent(portal.component, {\n        index: viewContainerRef.length,\n        injector: portal.injector || viewContainerRef.injector,\n        projectableNodes: portal.projectableNodes || undefined,\n        ngModuleRef: this._moduleRef || undefined\n      });\n      // If we're using a view container that's different from the injected one (e.g. when the portal\n      // specifies its own) we need to move the component into the outlet, otherwise it'll be rendered\n      // inside of the alternate view container.\n      if (viewContainerRef !== this._viewContainerRef) {\n        this._getRootNode().appendChild(ref.hostView.rootNodes[0]);\n      }\n      super.setDisposeFn(() => ref.destroy());\n      this._attachedPortal = portal;\n      this._attachedRef = ref;\n      this.attached.emit(ref);\n      return ref;\n    }\n    /**\n     * Attach the given TemplatePortal to this PortalHost as an embedded View.\n     * @param portal Portal to be attached.\n     * @returns Reference to the created embedded view.\n     */\n    attachTemplatePortal(portal) {\n      portal.setAttachedHost(this);\n      const viewRef = this._viewContainerRef.createEmbeddedView(portal.templateRef, portal.context, {\n        injector: portal.injector\n      });\n      super.setDisposeFn(() => this._viewContainerRef.clear());\n      this._attachedPortal = portal;\n      this._attachedRef = viewRef;\n      this.attached.emit(viewRef);\n      return viewRef;\n    }\n    /**\n     * Attaches the given DomPortal to this PortalHost by moving all of the portal content into it.\n     * @param portal Portal to be attached.\n     * @deprecated To be turned into a method.\n     * @breaking-change 10.0.0\n     */\n    attachDomPortal = portal => {\n      const element = portal.element;\n      if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n        throw Error('DOM portal content must be attached to a parent node.');\n      }\n      // Anchor used to save the element's previous position so\n      // that we can restore it when the portal is detached.\n      const anchorNode = this._document.createComment('dom-portal');\n      portal.setAttachedHost(this);\n      element.parentNode.insertBefore(anchorNode, element);\n      this._getRootNode().appendChild(element);\n      this._attachedPortal = portal;\n      super.setDisposeFn(() => {\n        if (anchorNode.parentNode) {\n          anchorNode.parentNode.replaceChild(element, anchorNode);\n        }\n      });\n    };\n    /** Gets the root node of the portal outlet. */\n    _getRootNode() {\n      const nativeElement = this._viewContainerRef.element.nativeElement;\n      // The directive could be set on a template which will result in a comment\n      // node being the root. Use the comment's parent node if that is the case.\n      return nativeElement.nodeType === nativeElement.ELEMENT_NODE ? nativeElement : nativeElement.parentNode;\n    }\n    static ɵfac = function CdkPortalOutlet_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || CdkPortalOutlet)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: CdkPortalOutlet,\n      selectors: [[\"\", \"cdkPortalOutlet\", \"\"]],\n      inputs: {\n        portal: [0, \"cdkPortalOutlet\", \"portal\"]\n      },\n      outputs: {\n        attached: \"attached\"\n      },\n      exportAs: [\"cdkPortalOutlet\"],\n      features: [i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return CdkPortalOutlet;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @deprecated Use `CdkPortalOutlet` instead.\n * @breaking-change 9.0.0\n */\nlet PortalHostDirective = /*#__PURE__*/(() => {\n  class PortalHostDirective extends CdkPortalOutlet {\n    static ɵfac = /* @__PURE__ */(() => {\n      let ɵPortalHostDirective_BaseFactory;\n      return function PortalHostDirective_Factory(__ngFactoryType__) {\n        return (ɵPortalHostDirective_BaseFactory || (ɵPortalHostDirective_BaseFactory = i0.ɵɵgetInheritedFactory(PortalHostDirective)))(__ngFactoryType__ || PortalHostDirective);\n      };\n    })();\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: PortalHostDirective,\n      selectors: [[\"\", \"cdkPortalHost\", \"\"], [\"\", \"portalHost\", \"\"]],\n      inputs: {\n        portal: [0, \"cdkPortalHost\", \"portal\"]\n      },\n      exportAs: [\"cdkPortalHost\"],\n      features: [i0.ɵɵProvidersFeature([{\n        provide: CdkPortalOutlet,\n        useExisting: PortalHostDirective\n      }]), i0.ɵɵInheritDefinitionFeature]\n    });\n  }\n  return PortalHostDirective;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet PortalModule = /*#__PURE__*/(() => {\n  class PortalModule {\n    static ɵfac = function PortalModule_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || PortalModule)();\n    };\n    static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n      type: PortalModule\n    });\n    static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n  }\n  return PortalModule;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { BasePortalOutlet as B, ComponentPortal as C, DomPortal as D, Portal as P, TemplatePortal as T, BasePortalHost as a, DomPortalOutlet as b, DomPortalHost as c, CdkPortal as d, TemplatePortalDirective as e, CdkPortalOutlet as f, PortalHostDirective as g, PortalModule as h };\n","/** Coerces a data-bound value (typically a string) to a boolean. */\nfunction coerceBooleanProperty(value) {\n  return value != null && `${value}` !== 'false';\n}\nexport { coerceBooleanProperty as c };\n","/** Coerces a value to a CSS pixel value. */\nfunction coerceCssPixelValue(value) {\n  if (value == null) {\n    return '';\n  }\n  return typeof value === 'string' ? value : `${value}px`;\n}\nexport { coerceCssPixelValue as c };\n","/** Gets whether the code is currently running in a test environment. */\nfunction _isTestEnvironment() {\n  // We can't use `declare const` because it causes conflicts inside Google with the real typings\n  // for these symbols and we can't read them off the global object, because they don't appear to\n  // be attached there for some runners like Jest.\n  // (see: https://github.com/angular/components/issues/23365#issuecomment-938146643)\n  return (\n    // @ts-ignore\n    typeof __karma__ !== 'undefined' && !!__karma__ ||\n    // @ts-ignore\n    typeof jasmine !== 'undefined' && !!jasmine ||\n    // @ts-ignore\n    typeof jest !== 'undefined' && !!jest ||\n    // @ts-ignore\n    typeof Mocha !== 'undefined' && !!Mocha\n  );\n}\nexport { _isTestEnvironment as _ };\n","import { normalizePassiveListenerOptions, _getEventTarget, Platform } from '@angular/cdk/platform';\nimport * as i0 from '@angular/core';\nimport { Component, ChangeDetectionStrategy, ViewEncapsulation, InjectionToken, inject, ElementRef, ANIMATION_MODULE_TYPE, NgZone, Injector, Directive, Input } from '@angular/core';\nimport { isFakeMousedownFromScreenReader, isFakeTouchstartFromScreenReader } from '@angular/cdk/a11y';\nimport { coerceElement } from '@angular/cdk/coercion';\nimport { _CdkPrivateStyleLoader } from '@angular/cdk/private';\n\n/** Possible states for a ripple element. */\nvar RippleState = /*#__PURE__*/function (RippleState) {\n  RippleState[RippleState[\"FADING_IN\"] = 0] = \"FADING_IN\";\n  RippleState[RippleState[\"VISIBLE\"] = 1] = \"VISIBLE\";\n  RippleState[RippleState[\"FADING_OUT\"] = 2] = \"FADING_OUT\";\n  RippleState[RippleState[\"HIDDEN\"] = 3] = \"HIDDEN\";\n  return RippleState;\n}(RippleState || {});\n/**\n * Reference to a previously launched ripple element.\n */\nclass RippleRef {\n  _renderer;\n  element;\n  config;\n  _animationForciblyDisabledThroughCss;\n  /** Current state of the ripple. */\n  state = RippleState.HIDDEN;\n  constructor(_renderer, /** Reference to the ripple HTML element. */\n  element, /** Ripple configuration used for the ripple. */\n  config, /* Whether animations are forcibly disabled for ripples through CSS. */\n  _animationForciblyDisabledThroughCss = false) {\n    this._renderer = _renderer;\n    this.element = element;\n    this.config = config;\n    this._animationForciblyDisabledThroughCss = _animationForciblyDisabledThroughCss;\n  }\n  /** Fades out the ripple element. */\n  fadeOut() {\n    this._renderer.fadeOutRipple(this);\n  }\n}\n\n/** Options used to bind a passive capturing event. */\nconst passiveCapturingEventOptions$1 = /*#__PURE__*/normalizePassiveListenerOptions({\n  passive: true,\n  capture: true\n});\n/** Manages events through delegation so that as few event handlers as possible are bound. */\nclass RippleEventManager {\n  _events = /*#__PURE__*/new Map();\n  /** Adds an event handler. */\n  addHandler(ngZone, name, element, handler) {\n    const handlersForEvent = this._events.get(name);\n    if (handlersForEvent) {\n      const handlersForElement = handlersForEvent.get(element);\n      if (handlersForElement) {\n        handlersForElement.add(handler);\n      } else {\n        handlersForEvent.set(element, new Set([handler]));\n      }\n    } else {\n      this._events.set(name, new Map([[element, new Set([handler])]]));\n      ngZone.runOutsideAngular(() => {\n        document.addEventListener(name, this._delegateEventHandler, passiveCapturingEventOptions$1);\n      });\n    }\n  }\n  /** Removes an event handler. */\n  removeHandler(name, element, handler) {\n    const handlersForEvent = this._events.get(name);\n    if (!handlersForEvent) {\n      return;\n    }\n    const handlersForElement = handlersForEvent.get(element);\n    if (!handlersForElement) {\n      return;\n    }\n    handlersForElement.delete(handler);\n    if (handlersForElement.size === 0) {\n      handlersForEvent.delete(element);\n    }\n    if (handlersForEvent.size === 0) {\n      this._events.delete(name);\n      document.removeEventListener(name, this._delegateEventHandler, passiveCapturingEventOptions$1);\n    }\n  }\n  /** Event handler that is bound and which dispatches the events to the different targets. */\n  _delegateEventHandler = event => {\n    const target = _getEventTarget(event);\n    if (target) {\n      this._events.get(event.type)?.forEach((handlers, element) => {\n        if (element === target || element.contains(target)) {\n          handlers.forEach(handler => handler.handleEvent(event));\n        }\n      });\n    }\n  };\n}\n\n/**\n * Default ripple animation configuration for ripples without an explicit\n * animation config specified.\n */\nconst defaultRippleAnimationConfig = {\n  enterDuration: 225,\n  exitDuration: 150\n};\n/**\n * Timeout for ignoring mouse events. Mouse events will be temporary ignored after touch\n * events to avoid synthetic mouse events.\n */\nconst ignoreMouseEventsTimeout = 800;\n/** Options used to bind a passive capturing event. */\nconst passiveCapturingEventOptions = /*#__PURE__*/normalizePassiveListenerOptions({\n  passive: true,\n  capture: true\n});\n/** Events that signal that the pointer is down. */\nconst pointerDownEvents = ['mousedown', 'touchstart'];\n/** Events that signal that the pointer is up. */\nconst pointerUpEvents = ['mouseup', 'mouseleave', 'touchend', 'touchcancel'];\nlet _MatRippleStylesLoader = /*#__PURE__*/(() => {\n  class _MatRippleStylesLoader {\n    static ɵfac = function _MatRippleStylesLoader_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || _MatRippleStylesLoader)();\n    };\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: _MatRippleStylesLoader,\n      selectors: [[\"ng-component\"]],\n      hostAttrs: [\"mat-ripple-style-loader\", \"\"],\n      decls: 0,\n      vars: 0,\n      template: function _MatRippleStylesLoader_Template(rf, ctx) {},\n      styles: [\".mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale3d(0, 0, 0);background-color:var(--mat-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface) 10%, transparent))}@media(forced-colors: active){.mat-ripple-element{display:none}}.cdk-drag-preview .mat-ripple-element,.cdk-drag-placeholder .mat-ripple-element{display:none}\\n\"],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return _MatRippleStylesLoader;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Helper service that performs DOM manipulations. Not intended to be used outside this module.\n * The constructor takes a reference to the ripple directive's host element and a map of DOM\n * event handlers to be installed on the element that triggers ripple animations.\n * This will eventually become a custom renderer once Angular support exists.\n * @docs-private\n */\nclass RippleRenderer {\n  _target;\n  _ngZone;\n  _platform;\n  /** Element where the ripples are being added to. */\n  _containerElement;\n  /** Element which triggers the ripple elements on mouse events. */\n  _triggerElement;\n  /** Whether the pointer is currently down or not. */\n  _isPointerDown = false;\n  /**\n   * Map of currently active ripple references.\n   * The ripple reference is mapped to its element event listeners.\n   * The reason why `| null` is used is that event listeners are added only\n   * when the condition is truthy (see the `_startFadeOutTransition` method).\n   */\n  _activeRipples = /*#__PURE__*/new Map();\n  /** Latest non-persistent ripple that was triggered. */\n  _mostRecentTransientRipple;\n  /** Time in milliseconds when the last touchstart event happened. */\n  _lastTouchStartEvent;\n  /** Whether pointer-up event listeners have been registered. */\n  _pointerUpEventsRegistered = false;\n  /**\n   * Cached dimensions of the ripple container. Set when the first\n   * ripple is shown and cleared once no more ripples are visible.\n   */\n  _containerRect;\n  static _eventManager = /*#__PURE__*/new RippleEventManager();\n  constructor(_target, _ngZone, elementOrElementRef, _platform, injector) {\n    this._target = _target;\n    this._ngZone = _ngZone;\n    this._platform = _platform;\n    // Only do anything if we're on the browser.\n    if (_platform.isBrowser) {\n      this._containerElement = coerceElement(elementOrElementRef);\n    }\n    if (injector) {\n      injector.get(_CdkPrivateStyleLoader).load(_MatRippleStylesLoader);\n    }\n  }\n  /**\n   * Fades in a ripple at the given coordinates.\n   * @param x Coordinate within the element, along the X axis at which to start the ripple.\n   * @param y Coordinate within the element, along the Y axis at which to start the ripple.\n   * @param config Extra ripple options.\n   */\n  fadeInRipple(x, y, config = {}) {\n    const containerRect = this._containerRect = this._containerRect || this._containerElement.getBoundingClientRect();\n    const animationConfig = {\n      ...defaultRippleAnimationConfig,\n      ...config.animation\n    };\n    if (config.centered) {\n      x = containerRect.left + containerRect.width / 2;\n      y = containerRect.top + containerRect.height / 2;\n    }\n    const radius = config.radius || distanceToFurthestCorner(x, y, containerRect);\n    const offsetX = x - containerRect.left;\n    const offsetY = y - containerRect.top;\n    const enterDuration = animationConfig.enterDuration;\n    const ripple = document.createElement('div');\n    ripple.classList.add('mat-ripple-element');\n    ripple.style.left = `${offsetX - radius}px`;\n    ripple.style.top = `${offsetY - radius}px`;\n    ripple.style.height = `${radius * 2}px`;\n    ripple.style.width = `${radius * 2}px`;\n    // If a custom color has been specified, set it as inline style. If no color is\n    // set, the default color will be applied through the ripple theme styles.\n    if (config.color != null) {\n      ripple.style.backgroundColor = config.color;\n    }\n    ripple.style.transitionDuration = `${enterDuration}ms`;\n    this._containerElement.appendChild(ripple);\n    // By default the browser does not recalculate the styles of dynamically created\n    // ripple elements. This is critical to ensure that the `scale` animates properly.\n    // We enforce a style recalculation by calling `getComputedStyle` and *accessing* a property.\n    // See: https://gist.github.com/paulirish/5d52fb081b3570c81e3a\n    const computedStyles = window.getComputedStyle(ripple);\n    const userTransitionProperty = computedStyles.transitionProperty;\n    const userTransitionDuration = computedStyles.transitionDuration;\n    // Note: We detect whether animation is forcibly disabled through CSS (e.g. through\n    // `transition: none` or `display: none`). This is technically unexpected since animations are\n    // controlled through the animation config, but this exists for backwards compatibility. This\n    // logic does not need to be super accurate since it covers some edge cases which can be easily\n    // avoided by users.\n    const animationForciblyDisabledThroughCss = userTransitionProperty === 'none' ||\n    // Note: The canonical unit for serialized CSS `<time>` properties is seconds. Additionally\n    // some browsers expand the duration for every property (in our case `opacity` and `transform`).\n    userTransitionDuration === '0s' || userTransitionDuration === '0s, 0s' ||\n    // If the container is 0x0, it's likely `display: none`.\n    containerRect.width === 0 && containerRect.height === 0;\n    // Exposed reference to the ripple that will be returned.\n    const rippleRef = new RippleRef(this, ripple, config, animationForciblyDisabledThroughCss);\n    // Start the enter animation by setting the transform/scale to 100%. The animation will\n    // execute as part of this statement because we forced a style recalculation before.\n    // Note: We use a 3d transform here in order to avoid an issue in Safari where\n    // the ripples aren't clipped when inside the shadow DOM (see #24028).\n    ripple.style.transform = 'scale3d(1, 1, 1)';\n    rippleRef.state = RippleState.FADING_IN;\n    if (!config.persistent) {\n      this._mostRecentTransientRipple = rippleRef;\n    }\n    let eventListeners = null;\n    // Do not register the `transition` event listener if fade-in and fade-out duration\n    // are set to zero. The events won't fire anyway and we can save resources here.\n    if (!animationForciblyDisabledThroughCss && (enterDuration || animationConfig.exitDuration)) {\n      this._ngZone.runOutsideAngular(() => {\n        const onTransitionEnd = () => {\n          // Clear the fallback timer since the transition fired correctly.\n          if (eventListeners) {\n            eventListeners.fallbackTimer = null;\n          }\n          clearTimeout(fallbackTimer);\n          this._finishRippleTransition(rippleRef);\n        };\n        const onTransitionCancel = () => this._destroyRipple(rippleRef);\n        // In some cases where there's a higher load on the browser, it can choose not to dispatch\n        // neither `transitionend` nor `transitioncancel` (see b/227356674). This timer serves as a\n        // fallback for such cases so that the ripple doesn't become stuck. We add a 100ms buffer\n        // because timers aren't precise. Note that another approach can be to transition the ripple\n        // to the `VISIBLE` state immediately above and to `FADING_IN` afterwards inside\n        // `transitionstart`. We go with the timer because it's one less event listener and\n        // it's less likely to break existing tests.\n        const fallbackTimer = setTimeout(onTransitionCancel, enterDuration + 100);\n        ripple.addEventListener('transitionend', onTransitionEnd);\n        // If the transition is cancelled (e.g. due to DOM removal), we destroy the ripple\n        // directly as otherwise we would keep it part of the ripple container forever.\n        // https://www.w3.org/TR/css-transitions-1/#:~:text=no%20longer%20in%20the%20document.\n        ripple.addEventListener('transitioncancel', onTransitionCancel);\n        eventListeners = {\n          onTransitionEnd,\n          onTransitionCancel,\n          fallbackTimer\n        };\n      });\n    }\n    // Add the ripple reference to the list of all active ripples.\n    this._activeRipples.set(rippleRef, eventListeners);\n    // In case there is no fade-in transition duration, we need to manually call the transition\n    // end listener because `transitionend` doesn't fire if there is no transition.\n    if (animationForciblyDisabledThroughCss || !enterDuration) {\n      this._finishRippleTransition(rippleRef);\n    }\n    return rippleRef;\n  }\n  /** Fades out a ripple reference. */\n  fadeOutRipple(rippleRef) {\n    // For ripples already fading out or hidden, this should be a noop.\n    if (rippleRef.state === RippleState.FADING_OUT || rippleRef.state === RippleState.HIDDEN) {\n      return;\n    }\n    const rippleEl = rippleRef.element;\n    const animationConfig = {\n      ...defaultRippleAnimationConfig,\n      ...rippleRef.config.animation\n    };\n    // This starts the fade-out transition and will fire the transition end listener that\n    // removes the ripple element from the DOM.\n    rippleEl.style.transitionDuration = `${animationConfig.exitDuration}ms`;\n    rippleEl.style.opacity = '0';\n    rippleRef.state = RippleState.FADING_OUT;\n    // In case there is no fade-out transition duration, we need to manually call the\n    // transition end listener because `transitionend` doesn't fire if there is no transition.\n    if (rippleRef._animationForciblyDisabledThroughCss || !animationConfig.exitDuration) {\n      this._finishRippleTransition(rippleRef);\n    }\n  }\n  /** Fades out all currently active ripples. */\n  fadeOutAll() {\n    this._getActiveRipples().forEach(ripple => ripple.fadeOut());\n  }\n  /** Fades out all currently active non-persistent ripples. */\n  fadeOutAllNonPersistent() {\n    this._getActiveRipples().forEach(ripple => {\n      if (!ripple.config.persistent) {\n        ripple.fadeOut();\n      }\n    });\n  }\n  /** Sets up the trigger event listeners */\n  setupTriggerEvents(elementOrElementRef) {\n    const element = coerceElement(elementOrElementRef);\n    if (!this._platform.isBrowser || !element || element === this._triggerElement) {\n      return;\n    }\n    // Remove all previously registered event listeners from the trigger element.\n    this._removeTriggerEvents();\n    this._triggerElement = element;\n    // Use event delegation for the trigger events since they're\n    // set up during creation and are performance-sensitive.\n    pointerDownEvents.forEach(type => {\n      RippleRenderer._eventManager.addHandler(this._ngZone, type, element, this);\n    });\n  }\n  /**\n   * Handles all registered events.\n   * @docs-private\n   */\n  handleEvent(event) {\n    if (event.type === 'mousedown') {\n      this._onMousedown(event);\n    } else if (event.type === 'touchstart') {\n      this._onTouchStart(event);\n    } else {\n      this._onPointerUp();\n    }\n    // If pointer-up events haven't been registered yet, do so now.\n    // We do this on-demand in order to reduce the total number of event listeners\n    // registered by the ripples, which speeds up the rendering time for large UIs.\n    if (!this._pointerUpEventsRegistered) {\n      // The events for hiding the ripple are bound directly on the trigger, because:\n      // 1. Some of them occur frequently (e.g. `mouseleave`) and any advantage we get from\n      // delegation will be diminished by having to look through all the data structures often.\n      // 2. They aren't as performance-sensitive, because they're bound only after the user\n      // has interacted with an element.\n      this._ngZone.runOutsideAngular(() => {\n        pointerUpEvents.forEach(type => {\n          this._triggerElement.addEventListener(type, this, passiveCapturingEventOptions);\n        });\n      });\n      this._pointerUpEventsRegistered = true;\n    }\n  }\n  /** Method that will be called if the fade-in or fade-in transition completed. */\n  _finishRippleTransition(rippleRef) {\n    if (rippleRef.state === RippleState.FADING_IN) {\n      this._startFadeOutTransition(rippleRef);\n    } else if (rippleRef.state === RippleState.FADING_OUT) {\n      this._destroyRipple(rippleRef);\n    }\n  }\n  /**\n   * Starts the fade-out transition of the given ripple if it's not persistent and the pointer\n   * is not held down anymore.\n   */\n  _startFadeOutTransition(rippleRef) {\n    const isMostRecentTransientRipple = rippleRef === this._mostRecentTransientRipple;\n    const {\n      persistent\n    } = rippleRef.config;\n    rippleRef.state = RippleState.VISIBLE;\n    // When the timer runs out while the user has kept their pointer down, we want to\n    // keep only the persistent ripples and the latest transient ripple. We do this,\n    // because we don't want stacked transient ripples to appear after their enter\n    // animation has finished.\n    if (!persistent && (!isMostRecentTransientRipple || !this._isPointerDown)) {\n      rippleRef.fadeOut();\n    }\n  }\n  /** Destroys the given ripple by removing it from the DOM and updating its state. */\n  _destroyRipple(rippleRef) {\n    const eventListeners = this._activeRipples.get(rippleRef) ?? null;\n    this._activeRipples.delete(rippleRef);\n    // Clear out the cached bounding rect if we have no more ripples.\n    if (!this._activeRipples.size) {\n      this._containerRect = null;\n    }\n    // If the current ref is the most recent transient ripple, unset it\n    // avoid memory leaks.\n    if (rippleRef === this._mostRecentTransientRipple) {\n      this._mostRecentTransientRipple = null;\n    }\n    rippleRef.state = RippleState.HIDDEN;\n    if (eventListeners !== null) {\n      rippleRef.element.removeEventListener('transitionend', eventListeners.onTransitionEnd);\n      rippleRef.element.removeEventListener('transitioncancel', eventListeners.onTransitionCancel);\n      if (eventListeners.fallbackTimer !== null) {\n        clearTimeout(eventListeners.fallbackTimer);\n      }\n    }\n    rippleRef.element.remove();\n  }\n  /** Function being called whenever the trigger is being pressed using mouse. */\n  _onMousedown(event) {\n    // Screen readers will fire fake mouse events for space/enter. Skip launching a\n    // ripple in this case for consistency with the non-screen-reader experience.\n    const isFakeMousedown = isFakeMousedownFromScreenReader(event);\n    const isSyntheticEvent = this._lastTouchStartEvent && Date.now() < this._lastTouchStartEvent + ignoreMouseEventsTimeout;\n    if (!this._target.rippleDisabled && !isFakeMousedown && !isSyntheticEvent) {\n      this._isPointerDown = true;\n      this.fadeInRipple(event.clientX, event.clientY, this._target.rippleConfig);\n    }\n  }\n  /** Function being called whenever the trigger is being pressed using touch. */\n  _onTouchStart(event) {\n    if (!this._target.rippleDisabled && !isFakeTouchstartFromScreenReader(event)) {\n      // Some browsers fire mouse events after a `touchstart` event. Those synthetic mouse\n      // events will launch a second ripple if we don't ignore mouse events for a specific\n      // time after a touchstart event.\n      this._lastTouchStartEvent = Date.now();\n      this._isPointerDown = true;\n      // Use `changedTouches` so we skip any touches where the user put\n      // their finger down, but used another finger to tap the element again.\n      const touches = event.changedTouches;\n      // According to the typings the touches should always be defined, but in some cases\n      // the browser appears to not assign them in tests which leads to flakes.\n      if (touches) {\n        for (let i = 0; i < touches.length; i++) {\n          this.fadeInRipple(touches[i].clientX, touches[i].clientY, this._target.rippleConfig);\n        }\n      }\n    }\n  }\n  /** Function being called whenever the trigger is being released. */\n  _onPointerUp() {\n    if (!this._isPointerDown) {\n      return;\n    }\n    this._isPointerDown = false;\n    // Fade-out all ripples that are visible and not persistent.\n    this._getActiveRipples().forEach(ripple => {\n      // By default, only ripples that are completely visible will fade out on pointer release.\n      // If the `terminateOnPointerUp` option is set, ripples that still fade in will also fade out.\n      const isVisible = ripple.state === RippleState.VISIBLE || ripple.config.terminateOnPointerUp && ripple.state === RippleState.FADING_IN;\n      if (!ripple.config.persistent && isVisible) {\n        ripple.fadeOut();\n      }\n    });\n  }\n  _getActiveRipples() {\n    return Array.from(this._activeRipples.keys());\n  }\n  /** Removes previously registered event listeners from the trigger element. */\n  _removeTriggerEvents() {\n    const trigger = this._triggerElement;\n    if (trigger) {\n      pointerDownEvents.forEach(type => RippleRenderer._eventManager.removeHandler(type, trigger, this));\n      if (this._pointerUpEventsRegistered) {\n        pointerUpEvents.forEach(type => trigger.removeEventListener(type, this, passiveCapturingEventOptions));\n        this._pointerUpEventsRegistered = false;\n      }\n    }\n  }\n}\n/**\n * Returns the distance from the point (x, y) to the furthest corner of a rectangle.\n */\nfunction distanceToFurthestCorner(x, y, rect) {\n  const distX = Math.max(Math.abs(x - rect.left), Math.abs(x - rect.right));\n  const distY = Math.max(Math.abs(y - rect.top), Math.abs(y - rect.bottom));\n  return Math.sqrt(distX * distX + distY * distY);\n}\n\n/** Injection token that can be used to specify the global ripple options. */\nconst MAT_RIPPLE_GLOBAL_OPTIONS = /*#__PURE__*/new InjectionToken('mat-ripple-global-options');\nlet MatRipple = /*#__PURE__*/(() => {\n  class MatRipple {\n    _elementRef = inject(ElementRef);\n    _animationMode = inject(ANIMATION_MODULE_TYPE, {\n      optional: true\n    });\n    /** Custom color for all ripples. */\n    color;\n    /** Whether the ripples should be visible outside the component's bounds. */\n    unbounded;\n    /**\n     * Whether the ripple always originates from the center of the host element's bounds, rather\n     * than originating from the location of the click event.\n     */\n    centered;\n    /**\n     * If set, the radius in pixels of foreground ripples when fully expanded. If unset, the radius\n     * will be the distance from the center of the ripple to the furthest corner of the host element's\n     * bounding rectangle.\n     */\n    radius = 0;\n    /**\n     * Configuration for the ripple animation. Allows modifying the enter and exit animation\n     * duration of the ripples. The animation durations will be overwritten if the\n     * `NoopAnimationsModule` is being used.\n     */\n    animation;\n    /**\n     * Whether click events will not trigger the ripple. Ripples can be still launched manually\n     * by using the `launch()` method.\n     */\n    get disabled() {\n      return this._disabled;\n    }\n    set disabled(value) {\n      if (value) {\n        this.fadeOutAllNonPersistent();\n      }\n      this._disabled = value;\n      this._setupTriggerEventsIfEnabled();\n    }\n    _disabled = false;\n    /**\n     * The element that triggers the ripple when click events are received.\n     * Defaults to the directive's host element.\n     */\n    get trigger() {\n      return this._trigger || this._elementRef.nativeElement;\n    }\n    set trigger(trigger) {\n      this._trigger = trigger;\n      this._setupTriggerEventsIfEnabled();\n    }\n    _trigger;\n    /** Renderer for the ripple DOM manipulations. */\n    _rippleRenderer;\n    /** Options that are set globally for all ripples. */\n    _globalOptions;\n    /** @docs-private Whether ripple directive is initialized and the input bindings are set. */\n    _isInitialized = false;\n    constructor() {\n      const ngZone = inject(NgZone);\n      const platform = inject(Platform);\n      const globalOptions = inject(MAT_RIPPLE_GLOBAL_OPTIONS, {\n        optional: true\n      });\n      const injector = inject(Injector);\n      // Note: cannot use `inject()` here, because this class\n      // gets instantiated manually in the ripple loader.\n      this._globalOptions = globalOptions || {};\n      this._rippleRenderer = new RippleRenderer(this, ngZone, this._elementRef, platform, injector);\n    }\n    ngOnInit() {\n      this._isInitialized = true;\n      this._setupTriggerEventsIfEnabled();\n    }\n    ngOnDestroy() {\n      this._rippleRenderer._removeTriggerEvents();\n    }\n    /** Fades out all currently showing ripple elements. */\n    fadeOutAll() {\n      this._rippleRenderer.fadeOutAll();\n    }\n    /** Fades out all currently showing non-persistent ripple elements. */\n    fadeOutAllNonPersistent() {\n      this._rippleRenderer.fadeOutAllNonPersistent();\n    }\n    /**\n     * Ripple configuration from the directive's input values.\n     * @docs-private Implemented as part of RippleTarget\n     */\n    get rippleConfig() {\n      return {\n        centered: this.centered,\n        radius: this.radius,\n        color: this.color,\n        animation: {\n          ...this._globalOptions.animation,\n          ...(this._animationMode === 'NoopAnimations' ? {\n            enterDuration: 0,\n            exitDuration: 0\n          } : {}),\n          ...this.animation\n        },\n        terminateOnPointerUp: this._globalOptions.terminateOnPointerUp\n      };\n    }\n    /**\n     * Whether ripples on pointer-down are disabled or not.\n     * @docs-private Implemented as part of RippleTarget\n     */\n    get rippleDisabled() {\n      return this.disabled || !!this._globalOptions.disabled;\n    }\n    /** Sets up the trigger event listeners if ripples are enabled. */\n    _setupTriggerEventsIfEnabled() {\n      if (!this.disabled && this._isInitialized) {\n        this._rippleRenderer.setupTriggerEvents(this.trigger);\n      }\n    }\n    /** Launches a manual ripple at the specified coordinated or just by the ripple config. */\n    launch(configOrX, y = 0, config) {\n      if (typeof configOrX === 'number') {\n        return this._rippleRenderer.fadeInRipple(configOrX, y, {\n          ...this.rippleConfig,\n          ...config\n        });\n      } else {\n        return this._rippleRenderer.fadeInRipple(0, 0, {\n          ...this.rippleConfig,\n          ...configOrX\n        });\n      }\n    }\n    static ɵfac = function MatRipple_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || MatRipple)();\n    };\n    static ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n      type: MatRipple,\n      selectors: [[\"\", \"mat-ripple\", \"\"], [\"\", \"matRipple\", \"\"]],\n      hostAttrs: [1, \"mat-ripple\"],\n      hostVars: 2,\n      hostBindings: function MatRipple_HostBindings(rf, ctx) {\n        if (rf & 2) {\n          i0.ɵɵclassProp(\"mat-ripple-unbounded\", ctx.unbounded);\n        }\n      },\n      inputs: {\n        color: [0, \"matRippleColor\", \"color\"],\n        unbounded: [0, \"matRippleUnbounded\", \"unbounded\"],\n        centered: [0, \"matRippleCentered\", \"centered\"],\n        radius: [0, \"matRippleRadius\", \"radius\"],\n        animation: [0, \"matRippleAnimation\", \"animation\"],\n        disabled: [0, \"matRippleDisabled\", \"disabled\"],\n        trigger: [0, \"matRippleTrigger\", \"trigger\"]\n      },\n      exportAs: [\"matRipple\"]\n    });\n  }\n  return MatRipple;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { MatRipple as M, RippleRenderer as R, MAT_RIPPLE_GLOBAL_OPTIONS as a, RippleState as b, RippleRef as c, defaultRippleAnimationConfig as d };\n","import * as i0 from '@angular/core';\nimport { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n/**\n * Component used to load structural styles for focus indicators.\n * @docs-private\n */\nlet _StructuralStylesLoader = /*#__PURE__*/(() => {\n  class _StructuralStylesLoader {\n    static ɵfac = function _StructuralStylesLoader_Factory(__ngFactoryType__) {\n      return new (__ngFactoryType__ || _StructuralStylesLoader)();\n    };\n    static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n      type: _StructuralStylesLoader,\n      selectors: [[\"structural-styles\"]],\n      decls: 0,\n      vars: 0,\n      template: function _StructuralStylesLoader_Template(rf, ctx) {},\n      styles: [\".mat-focus-indicator{position:relative}.mat-focus-indicator::before{top:0;left:0;right:0;bottom:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border-width:var(--mat-focus-indicator-border-width, 3px);border-style:var(--mat-focus-indicator-border-style, solid);border-color:var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus::before{content:\\\"\\\"}@media(forced-colors: active){html{--mat-focus-indicator-display: block}}\\n\"],\n      encapsulation: 2,\n      changeDetection: 0\n    });\n  }\n  return _StructuralStylesLoader;\n})();\n/*#__PURE__*/(() => {\n  (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { _StructuralStylesLoader as _ };\n"],"mappings":"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","names":["shadowDomIsSupported","_supportsShadowDom","head","_getShadowRoot","element","rootNode","_getEventTarget","event","_bindEventWithOptions","renderer","target","eventName","callback","options","major","VERSION","minor","hasV8BreakIterator","Platform","inject","PLATFORM_ID","isPlatformBrowser","__ngFactoryType__","ɵɵdefineInjectable","supportsPassiveEvents","supportsPassiveEventListeners","normalizePassiveListenerOptions","options","coerceNumberProperty","value","fallbackValue","_isNumberValue","coerceElement","elementOrRef","ElementRef","isFakeMousedownFromScreenReader","event","isFakeTouchstartFromScreenReader","touch","INPUT_MODALITY_DETECTOR_OPTIONS","InjectionToken","INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS","TOUCH_BUFFER_MS","modalityEventListenerOptions","InputModalityDetector","inject","Platform","BehaviorSubject","event","keyCode","_getEventTarget","isFakeMousedownFromScreenReader","isFakeTouchstartFromScreenReader","ngZone","NgZone","document","DOCUMENT","options","__spreadValues","skip","distinctUntilChanged","renderer","RendererFactory2","_bindEventWithOptions","cleanup","__ngFactoryType__","ɵɵdefineInjectable","FocusMonitorDetectionMode","FOCUS_MONITOR_DEFAULT_OPTIONS","captureEventListenerOptions","normalizePassiveListenerOptions","FocusMonitor","Subject","target","element","checkChildren","nativeElement","coerceElement","of","rootNode","_getShadowRoot","cachedInfo","info","elementInfo","origin","focusedElement","currentElement","_info","focusEventTarget","isFromInteraction","ms","rootNodeFocusListeners","takeUntil","modality","results","mostRecentTarget","mostRecentModality","labels","i","CdkMonitorFocus","ElementRef","EventEmitter","ɵɵdefineDirective","appsWithLoaders","_CdkPrivateStyleLoader","inject","Injector","EnvironmentInjector","loader","appRef","ApplicationRef","data","ref","createComponent","__ngFactoryType__","ɵɵdefineInjectable","_VisuallyHiddenLoader","__ngFactoryType__","ɵɵdefineComponent","rf","ctx","shouldIgnoreRecord","record","i","MutationObserverFactory","callback","__ngFactoryType__","ɵɵdefineInjectable","ContentObserver","inject","NgZone","_","element","elementOrRef","coerceElement","Observable","observer","subscription","map","records","filter","stream","Subject","mutations","CdkObserveContent","ElementRef","EventEmitter","value","coerceNumberProperty","debounceTime","ɵɵdefineDirective","booleanAttribute","ObserversModule","ɵɵdefineNgModule","ɵɵdefineInjector","coerceArray","value","mediaQueriesForWebkitCompatibility","mediaQueryStyleNode","MediaMatcher","inject","Platform","CSP_NONCE","noopMatchMedia","query","createEmptyStyleRule","__ngFactoryType__","ɵɵdefineInjectable","nonce","BreakpointObserver","NgZone","Subject","value","splitQueries","coerceArray","mediaQuery","observables","stateObservable","combineLatest","concat","take","skip","debounceTime","map","breakpointStates","response","matches","mql","output","Observable","observer","handler","e","startWith","takeUntil","queries","a1","a2","LIVE_ANNOUNCER_ELEMENT_TOKEN","InjectionToken","LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY","LIVE_ANNOUNCER_DEFAULT_OPTIONS","uniqueIds","LiveAnnouncer","inject","NgZone","DOCUMENT","elementToken","message","args","defaultOptions","politeness","duration","resolve","elementClass","previousElements","liveEl","i","id","modals","modal","ariaOwns","__ngFactoryType__","ɵɵdefineInjectable","HighContrastMode","BLACK_ON_WHITE_CSS_CLASS","WHITE_ON_BLACK_CSS_CLASS","HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS","HighContrastModeDetector","inject","Platform","DOCUMENT","BreakpointObserver","testElement","documentWindow","computedStyle","computedColor","bodyClasses","mode","__ngFactoryType__","ɵɵdefineInjectable","A11yModule","ɵɵdefineNgModule","ɵɵdefineInjector","ObserversModule","counters","_IdGenerator","inject","APP_ID","prefix","__ngFactoryType__","ɵɵdefineInjectable","hasModifierKey","event","modifiers","modifier","DEFAULT_TYPEAHEAD_DEBOUNCE_INTERVAL_MS","Typeahead","Subject","initialItems","config","typeAheadInterval","index","items","event","keyCode","tap","letter","debounceTime","filter","map","inputString","i","item","ListKeyManager","signal","Subscription","item","_items","injector","QueryList","newItems","isSignal","effect","Subject","predicate","shouldWrap","enabled","direction","keys","debounceInterval","items","Typeahead","delta","previousActiveItem","event","keyCode","isModifierAllowed","modifier","targetIndex","itemsLength","hasModifierKey","itemArray","index","activeItem","i","fallbackDelta","newIndex","FocusKeyManager","ListKeyManager","origin","item","ID_DELIMITER","addAriaReferencedId","el","attr","id","ids","getAriaReferenceIds","existingId","removeAriaReferencedId","filteredIds","val","CDK_DESCRIBEDBY_ID_PREFIX","CDK_DESCRIBEDBY_HOST_ATTRIBUTE","nextId","AriaDescriber","inject","Platform","DOCUMENT","_CdkPrivateStyleLoader","_VisuallyHiddenLoader","APP_ID","hostElement","message","role","key","getKey","setMessageId","registeredMessage","describedElements","i","messageElement","containerClassName","serverContainers","messagesContainer","element","originalReferenceIds","getAriaReferenceIds","id","addAriaReferencedId","removeAriaReferencedId","referenceIds","messageId","trimmedMessage","ariaLabel","__ngFactoryType__","ɵɵdefineInjectable","serviceId","DIR_DOCUMENT","InjectionToken","DIR_DOCUMENT_FACTORY","inject","DOCUMENT","RTL_LOCALE_PATTERN","_resolveDirectionality","rawValue","value","Directionality","EventEmitter","_document","bodyDir","htmlDir","__ngFactoryType__","ɵɵdefineInjectable","BidiModule","__ngFactoryType__","ɵɵdefineNgModule","ɵɵdefineInjector","MatCommonModule","inject","HighContrastModeDetector","__ngFactoryType__","ɵɵdefineNgModule","ɵɵdefineInjector","BidiModule","RtlScrollAxisType","rtlScrollAxisType","scrollBehaviorSupported","supportsScrollBehavior","scrollToFunction","getRtlScrollAxisType","scrollContainer","containerStyle","content","contentStyle","DEFAULT_SCROLL_TIME","ScrollDispatcher","inject","NgZone","Platform","RendererFactory2","Subject","scrollable","scrollableReference","auditTimeInMs","Observable","observer","subscription","auditTime","of","_","container","elementOrElementRef","ancestors","filter","target","scrollingContainers","_subscription","element","coerceElement","scrollableElement","__ngFactoryType__","ɵɵdefineInjectable","CdkScrollable","ElementRef","Directionality","Renderer2","event","options","el","isRtl","getRtlScrollAxisType","RtlScrollAxisType","supportsScrollBehavior","from","LEFT","RIGHT","ɵɵdefineDirective","DEFAULT_RESIZE_TIME","ViewportRuler","DOCUMENT","ngZone","renderer","changeListener","cleanup","output","scrollPosition","width","height","document","window","documentElement","documentRect","top","left","throttleTime","CdkScrollableModule","__ngFactoryType__","ɵɵdefineNgModule","ɵɵdefineInjector","ScrollingModule","BidiModule","Portal","host","ComponentPortal","component","viewContainerRef","injector","_componentFactoryResolver","projectableNodes","TemplatePortal","templateRef","context","DomPortal","element","ElementRef","BasePortalOutlet","portal","fn","DomPortalOutlet","BasePortalOutlet","outletElement","_unusedComponentFactoryResolver","_appRef","_defaultInjector","_document","portal","componentRef","injector","ngModuleRef","NgModuleRef$1","appRef","elementInjector","Injector","environmentInjector","EnvironmentInjector","createComponent","viewContainer","viewRef","rootNode","index","element","anchorNode","CdkPortal","TemplatePortal","templateRef","inject","TemplateRef","viewContainerRef","ViewContainerRef","__ngFactoryType__","ɵɵdefineDirective","ɵɵInheritDefinitionFeature","CdkPortalOutlet","BasePortalOutlet","inject","NgModuleRef$1","DOCUMENT","ViewContainerRef","portal","EventEmitter","viewContainerRef","ref","viewRef","element","anchorNode","nativeElement","__ngFactoryType__","ɵɵdefineDirective","ɵɵInheritDefinitionFeature","PortalModule","__ngFactoryType__","ɵɵdefineNgModule","ɵɵdefineInjector","coerceBooleanProperty","value","coerceCssPixelValue","value","_isTestEnvironment","RippleState","RippleRef","_renderer","element","config","_animationForciblyDisabledThroughCss","passiveCapturingEventOptions$1","normalizePassiveListenerOptions","RippleEventManager","ngZone","name","handler","handlersForEvent","handlersForElement","event","target","_getEventTarget","handlers","defaultRippleAnimationConfig","ignoreMouseEventsTimeout","passiveCapturingEventOptions","pointerDownEvents","pointerUpEvents","_MatRippleStylesLoader","__ngFactoryType__","ɵɵdefineComponent","rf","ctx","RippleRenderer","_RippleRenderer","_target","_ngZone","elementOrElementRef","_platform","injector","coerceElement","_CdkPrivateStyleLoader","x","y","containerRect","animationConfig","__spreadValues","radius","distanceToFurthestCorner","offsetX","offsetY","enterDuration","ripple","computedStyles","userTransitionProperty","userTransitionDuration","animationForciblyDisabledThroughCss","rippleRef","eventListeners","onTransitionEnd","fallbackTimer","onTransitionCancel","rippleEl","type","isMostRecentTransientRipple","persistent","isFakeMousedown","isFakeMousedownFromScreenReader","isSyntheticEvent","isFakeTouchstartFromScreenReader","touches","i","isVisible","trigger","rect","distX","distY","MAT_RIPPLE_GLOBAL_OPTIONS","InjectionToken","MatRipple","inject","ElementRef","ANIMATION_MODULE_TYPE","value","NgZone","platform","Platform","globalOptions","Injector","configOrX","ɵɵdefineDirective","ɵɵclassProp","_StructuralStylesLoader","__ngFactoryType__","ɵɵdefineComponent","rf","ctx"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]}