{"version":3,"sources":["node_modules/@angular/cdk/fesm2022/observers.mjs","node_modules/@angular/cdk/fesm2022/keycodes.mjs","node_modules/@angular/cdk/fesm2022/a11y.mjs","node_modules/@angular/material/fesm2022/core.mjs"],"sourcesContent":["import { coerceElement, coerceNumberProperty } from '@angular/cdk/coercion';\nimport * as i0 from '@angular/core';\nimport { Injectable, inject, NgZone, EventEmitter, booleanAttribute, Directive, Output, Input, NgModule } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { map, filter, debounceTime } from 'rxjs/operators';\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 {\n this.ɵfac = function MutationObserverFactory_Factory(t) {\n return new (t || MutationObserverFactory)();\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: MutationObserverFactory,\n factory: MutationObserverFactory.ɵfac,\n providedIn: 'root'\n });\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 constructor(_mutationObserverFactory) {\n this._mutationObserverFactory = _mutationObserverFactory;\n /** Keeps track of the existing MutationObservers so they can be reused. */\n this._observedElements = new Map();\n this._ngZone = inject(NgZone);\n }\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 {\n this.ɵfac = function ContentObserver_Factory(t) {\n return new (t || ContentObserver)(i0.ɵɵinject(MutationObserverFactory));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: ContentObserver,\n factory: ContentObserver.ɵfac,\n providedIn: 'root'\n });\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 /**\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 /** 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 constructor(_contentObserver, _elementRef) {\n this._contentObserver = _contentObserver;\n this._elementRef = _elementRef;\n /** Event emitted for each change in the element's content. */\n this.event = new EventEmitter();\n this._disabled = false;\n this._currentSubscription = null;\n }\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 {\n this.ɵfac = function CdkObserveContent_Factory(t) {\n return new (t || CdkObserveContent)(i0.ɵɵdirectiveInject(ContentObserver), i0.ɵɵdirectiveInject(i0.ElementRef));\n };\n }\n static {\n this.ɵ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 standalone: true,\n features: [i0.ɵɵInputTransformsFeature]\n });\n }\n }\n return CdkObserveContent;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet ObserversModule = /*#__PURE__*/(() => {\n class ObserversModule {\n static {\n this.ɵfac = function ObserversModule_Factory(t) {\n return new (t || ObserversModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: ObserversModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [MutationObserverFactory]\n });\n }\n }\n return ObserversModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { CdkObserveContent, ContentObserver, MutationObserverFactory, ObserversModule };\n","const MAC_ENTER = 3;\nconst BACKSPACE = 8;\nconst TAB = 9;\nconst NUM_CENTER = 12;\nconst ENTER = 13;\nconst SHIFT = 16;\nconst CONTROL = 17;\nconst ALT = 18;\nconst PAUSE = 19;\nconst CAPS_LOCK = 20;\nconst ESCAPE = 27;\nconst SPACE = 32;\nconst PAGE_UP = 33;\nconst PAGE_DOWN = 34;\nconst END = 35;\nconst HOME = 36;\nconst LEFT_ARROW = 37;\nconst UP_ARROW = 38;\nconst RIGHT_ARROW = 39;\nconst DOWN_ARROW = 40;\nconst PLUS_SIGN = 43;\nconst PRINT_SCREEN = 44;\nconst INSERT = 45;\nconst DELETE = 46;\nconst ZERO = 48;\nconst ONE = 49;\nconst TWO = 50;\nconst THREE = 51;\nconst FOUR = 52;\nconst FIVE = 53;\nconst SIX = 54;\nconst SEVEN = 55;\nconst EIGHT = 56;\nconst NINE = 57;\nconst FF_SEMICOLON = 59; // Firefox (Gecko) fires this for semicolon instead of 186\nconst FF_EQUALS = 61; // Firefox (Gecko) fires this for equals instead of 187\nconst QUESTION_MARK = 63;\nconst AT_SIGN = 64;\nconst A = 65;\nconst B = 66;\nconst C = 67;\nconst D = 68;\nconst E = 69;\nconst F = 70;\nconst G = 71;\nconst H = 72;\nconst I = 73;\nconst J = 74;\nconst K = 75;\nconst L = 76;\nconst M = 77;\nconst N = 78;\nconst O = 79;\nconst P = 80;\nconst Q = 81;\nconst R = 82;\nconst S = 83;\nconst T = 84;\nconst U = 85;\nconst V = 86;\nconst W = 87;\nconst X = 88;\nconst Y = 89;\nconst Z = 90;\nconst META = 91; // WIN_KEY_LEFT\nconst MAC_WK_CMD_LEFT = 91;\nconst MAC_WK_CMD_RIGHT = 93;\nconst CONTEXT_MENU = 93;\nconst NUMPAD_ZERO = 96;\nconst NUMPAD_ONE = 97;\nconst NUMPAD_TWO = 98;\nconst NUMPAD_THREE = 99;\nconst NUMPAD_FOUR = 100;\nconst NUMPAD_FIVE = 101;\nconst NUMPAD_SIX = 102;\nconst NUMPAD_SEVEN = 103;\nconst NUMPAD_EIGHT = 104;\nconst NUMPAD_NINE = 105;\nconst NUMPAD_MULTIPLY = 106;\nconst NUMPAD_PLUS = 107;\nconst NUMPAD_MINUS = 109;\nconst NUMPAD_PERIOD = 110;\nconst NUMPAD_DIVIDE = 111;\nconst F1 = 112;\nconst F2 = 113;\nconst F3 = 114;\nconst F4 = 115;\nconst F5 = 116;\nconst F6 = 117;\nconst F7 = 118;\nconst F8 = 119;\nconst F9 = 120;\nconst F10 = 121;\nconst F11 = 122;\nconst F12 = 123;\nconst NUM_LOCK = 144;\nconst SCROLL_LOCK = 145;\nconst FIRST_MEDIA = 166;\nconst FF_MINUS = 173;\nconst MUTE = 173; // Firefox (Gecko) fires 181 for MUTE\nconst VOLUME_DOWN = 174; // Firefox (Gecko) fires 182 for VOLUME_DOWN\nconst VOLUME_UP = 175; // Firefox (Gecko) fires 183 for VOLUME_UP\nconst FF_MUTE = 181;\nconst FF_VOLUME_DOWN = 182;\nconst LAST_MEDIA = 183;\nconst FF_VOLUME_UP = 183;\nconst SEMICOLON = 186; // Firefox (Gecko) fires 59 for SEMICOLON\nconst EQUALS = 187; // Firefox (Gecko) fires 61 for EQUALS\nconst COMMA = 188;\nconst DASH = 189; // Firefox (Gecko) fires 173 for DASH/MINUS\nconst PERIOD = 190;\nconst SLASH = 191;\nconst APOSTROPHE = 192;\nconst TILDE = 192;\nconst OPEN_SQUARE_BRACKET = 219;\nconst BACKSLASH = 220;\nconst CLOSE_SQUARE_BRACKET = 221;\nconst SINGLE_QUOTE = 222;\nconst MAC_META = 224;\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}\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { A, ALT, APOSTROPHE, AT_SIGN, B, BACKSLASH, BACKSPACE, C, CAPS_LOCK, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, D, DASH, DELETE, DOWN_ARROW, E, EIGHT, END, ENTER, EQUALS, ESCAPE, F, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, FF_EQUALS, FF_MINUS, FF_MUTE, FF_SEMICOLON, FF_VOLUME_DOWN, FF_VOLUME_UP, FIRST_MEDIA, FIVE, FOUR, G, H, HOME, I, INSERT, J, K, L, LAST_MEDIA, LEFT_ARROW, M, MAC_ENTER, MAC_META, MAC_WK_CMD_LEFT, MAC_WK_CMD_RIGHT, META, MUTE, N, NINE, NUMPAD_DIVIDE, NUMPAD_EIGHT, NUMPAD_FIVE, NUMPAD_FOUR, NUMPAD_MINUS, NUMPAD_MULTIPLY, NUMPAD_NINE, NUMPAD_ONE, NUMPAD_PERIOD, NUMPAD_PLUS, NUMPAD_SEVEN, NUMPAD_SIX, NUMPAD_THREE, NUMPAD_TWO, NUMPAD_ZERO, NUM_CENTER, NUM_LOCK, O, ONE, OPEN_SQUARE_BRACKET, P, PAGE_DOWN, PAGE_UP, PAUSE, PERIOD, PLUS_SIGN, PRINT_SCREEN, Q, QUESTION_MARK, R, RIGHT_ARROW, S, SCROLL_LOCK, SEMICOLON, SEVEN, SHIFT, SINGLE_QUOTE, SIX, SLASH, SPACE, T, TAB, THREE, TILDE, TWO, U, UP_ARROW, V, VOLUME_DOWN, VOLUME_UP, W, X, Y, Z, ZERO, hasModifierKey };\n","import { DOCUMENT } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { inject, APP_ID, Injectable, Inject, QueryList, isSignal, effect, afterNextRender, Injector, booleanAttribute, Directive, Input, InjectionToken, Optional, EventEmitter, Output, NgModule } from '@angular/core';\nimport * as i1 from '@angular/cdk/platform';\nimport { Platform, _getFocusedElementPierceShadowDom, normalizePassiveListenerOptions, _getEventTarget, _getShadowRoot } from '@angular/cdk/platform';\nimport { Subject, Subscription, BehaviorSubject, of } from 'rxjs';\nimport { hasModifierKey, A, Z, ZERO, NINE, PAGE_DOWN, PAGE_UP, END, HOME, LEFT_ARROW, RIGHT_ARROW, UP_ARROW, DOWN_ARROW, TAB, ALT, CONTROL, MAC_META, META, SHIFT } from '@angular/cdk/keycodes';\nimport { tap, debounceTime, filter, map, take, skip, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport * as i1$1 from '@angular/cdk/observers';\nimport { ObserversModule } from '@angular/cdk/observers';\nimport { coerceElement } from '@angular/cdk/coercion';\nimport { BreakpointObserver } from '@angular/cdk/layout';\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 constructor(_document,\n /**\n * @deprecated To be turned into a required parameter.\n * @breaking-change 14.0.0\n */\n _platform) {\n this._platform = _platform;\n /** Map of all registered message elements that have been placed into the document. */\n this._messageRegistry = new Map();\n /** Container for all registered messages. */\n this._messagesContainer = null;\n /** Unique ID for the service. */\n this._id = `${nextId++}`;\n this._document = _document;\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 // @breaking-change 14.0.0 Remove null check for `_platform`.\n if (this._platform && !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 {\n this.ɵfac = function AriaDescriber_Factory(t) {\n return new (t || AriaDescriber)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i1.Platform));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: AriaDescriber,\n factory: AriaDescriber.ɵfac,\n providedIn: 'root'\n });\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/**\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 constructor(_items, injector) {\n this._items = _items;\n this._activeItemIndex = -1;\n this._activeItem = null;\n this._wrap = false;\n this._letterKeyStream = new Subject();\n this._typeaheadSubscription = Subscription.EMPTY;\n this._vertical = true;\n this._allowedModifierKeys = [];\n this._homeAndEnd = false;\n this._pageUpAndDown = {\n enabled: false,\n delta: 10\n };\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 this._skipPredicateFn = item => item.disabled;\n // Buffer for the letters that the user has pressed when the typeahead option is turned on.\n this._pressedLetters = [];\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 this.tabOut = new Subject();\n /** Stream that emits whenever the active item of the list manager changes. */\n this.change = new Subject();\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 * 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 // 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._typeaheadSubscription = this._letterKeyStream.pipe(tap(letter => this._pressedLetters.push(letter)), debounceTime(debounceInterval), filter(() => this._pressedLetters.length > 0), map(() => this._pressedLetters.join(''))).subscribe(inputString => {\n const items = this._getItemsArray();\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 < items.length + 1; i++) {\n const index = (this._activeItemIndex + i) % items.length;\n const item = items[index];\n if (!this._skipPredicateFn(item) && item.getLabel().toUpperCase().trim().indexOf(inputString) === 0) {\n this.setActiveItem(index);\n break;\n }\n }\n this._pressedLetters = [];\n });\n return this;\n }\n /** Cancels the current typeahead sequence. */\n cancelTypeahead() {\n this._pressedLetters = [];\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 // 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 // Note that we return here, in order to avoid preventing\n // the default action of non-navigational keys.\n return;\n }\n this._pressedLetters = [];\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._pressedLetters.length > 0;\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 = activeItem == null ? null : activeItem;\n this._activeItemIndex = index;\n }\n /** Cleans up the key manager. */\n destroy() {\n this._typeaheadSubscription.unsubscribe();\n this._itemChangesSubscription?.unsubscribe();\n this._effectRef?.destroy();\n this._letterKeyStream.complete();\n this.tabOut.complete();\n this.change.complete();\n this._pressedLetters = [];\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 if (this._activeItem) {\n const newIndex = newItems.indexOf(this._activeItem);\n if (newIndex > -1 && newIndex !== this._activeItemIndex) {\n this._activeItemIndex = newIndex;\n }\n }\n }\n}\nclass ActiveDescendantKeyManager extends ListKeyManager {\n setActiveItem(index) {\n if (this.activeItem) {\n this.activeItem.setInactiveStyles();\n }\n super.setActiveItem(index);\n if (this.activeItem) {\n this.activeItem.setActiveStyles();\n }\n }\n}\nclass FocusKeyManager extends ListKeyManager {\n constructor() {\n super(...arguments);\n this._origin = 'program';\n }\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}\n\n/**\n * Configuration for the isFocusable method.\n */\nclass IsFocusableConfig {\n constructor() {\n /**\n * Whether to count an element as focusable even if it is not currently visible.\n */\n this.ignoreVisibility = false;\n }\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 constructor(_platform) {\n this._platform = _platform;\n }\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 {\n this.ɵfac = function InteractivityChecker_Factory(t) {\n return new (t || InteractivityChecker)(i0.ɵɵinject(i1.Platform));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: InteractivityChecker,\n factory: InteractivityChecker.ɵfac,\n providedIn: 'root'\n });\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 /** 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 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 this._hasAttached = false;\n // Event listeners for the anchors. Need to be regular functions so that we can unbind them later.\n this.startAnchorListener = () => this.focusLastTabbableElement();\n this.endAnchorListener = () => this.focusFirstTabbableElement();\n this._enabled = true;\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(mmalerba): Make this behave consistently across zonefull / zoneless.\n if (!this._ngZone.isStable) {\n // Subscribing `onStable` has slightly different behavior than `afterNextRender`.\n // `afterNextRender` does not wait for state changes queued up in a Promise\n // to avoid change after checked errors. In most cases we would consider this an\n // acceptable behavior change, the dialog at least made its best effort to focus the\n // first element. However, this is particularly problematic when combined with the\n // current behavior of the mat-radio-group, which adjusts the tabindex of its child\n // radios based on the selected value of the group. When the selected value is bound\n // via `[(ngModel)]` it hits this \"state change in a promise\" edge-case and can wind up\n // putting the focus on a radio button that is not supposed to be eligible to receive\n // focus. For now, we side-step this whole sequence of events by continuing to use\n // `onStable` in zonefull apps, but it should be noted that zoneless apps can still\n // suffer from this issue.\n this._ngZone.onStable.pipe(take(1)).subscribe(fn);\n } else {\n if (this._injector) {\n afterNextRender(fn, {\n injector: this._injector\n });\n } else {\n fn();\n }\n }\n }\n}\n/**\n * Factory that allows easy instantiation of focus traps.\n */\nlet FocusTrapFactory = /*#__PURE__*/(() => {\n class FocusTrapFactory {\n constructor(_checker, _ngZone, _document) {\n this._checker = _checker;\n this._ngZone = _ngZone;\n this._injector = inject(Injector);\n this._document = _document;\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 {\n this.ɵfac = function FocusTrapFactory_Factory(t) {\n return new (t || FocusTrapFactory)(i0.ɵɵinject(InteractivityChecker), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(DOCUMENT));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: FocusTrapFactory,\n factory: FocusTrapFactory.ɵfac,\n providedIn: 'root'\n });\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 /** 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 constructor(_elementRef, _focusTrapFactory,\n /**\n * @deprecated No longer being used. To be removed.\n * @breaking-change 13.0.0\n */\n _document) {\n this._elementRef = _elementRef;\n this._focusTrapFactory = _focusTrapFactory;\n /** Previously focused element to restore focus to upon destroy when using autoCapture. */\n this._previouslyFocusedElement = null;\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 {\n this.ɵfac = function CdkTrapFocus_Factory(t) {\n return new (t || CdkTrapFocus)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(FocusTrapFactory), i0.ɵɵdirectiveInject(DOCUMENT));\n };\n }\n static {\n this.ɵ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 standalone: true,\n features: [i0.ɵɵInputTransformsFeature, i0.ɵɵNgOnChangesFeature]\n });\n }\n }\n return CdkTrapFocus;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\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 /** 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) {\n super(_element, _checker, _ngZone, _document, config.defer);\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/** The injection token used to specify the inert strategy. */\nconst FOCUS_TRAP_INERT_STRATEGY = /*#__PURE__*/new InjectionToken('FOCUS_TRAP_INERT_STRATEGY');\n\n/**\n * Lightweight FocusTrapInertStrategy that adds a document focus event\n * listener to redirect focus back inside the FocusTrap.\n */\nclass EventListenerFocusTrapInertStrategy {\n constructor() {\n /** Focus event handler. */\n this._listener = null;\n }\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/** Injectable that ensures only the most recently enabled FocusTrap is active. */\nlet FocusTrapManager = /*#__PURE__*/(() => {\n class FocusTrapManager {\n constructor() {\n // A stack of the FocusTraps on the page. Only the FocusTrap at the\n // top of the stack is active.\n this._focusTrapStack = [];\n }\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 {\n this.ɵfac = function FocusTrapManager_Factory(t) {\n return new (t || FocusTrapManager)();\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: FocusTrapManager,\n factory: FocusTrapManager.ɵfac,\n providedIn: 'root'\n });\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 constructor(_checker, _ngZone, _focusTrapManager, _document, _inertStrategy) {\n this._checker = _checker;\n this._ngZone = _ngZone;\n this._focusTrapManager = _focusTrapManager;\n this._document = _document;\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);\n }\n static {\n this.ɵfac = function ConfigurableFocusTrapFactory_Factory(t) {\n return new (t || ConfigurableFocusTrapFactory)(i0.ɵɵinject(InteractivityChecker), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(FocusTrapManager), i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(FOCUS_TRAP_INERT_STRATEGY, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: ConfigurableFocusTrapFactory,\n factory: ConfigurableFocusTrapFactory.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return ConfigurableFocusTrapFactory;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\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}\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 = /*#__PURE__*/normalizePassiveListenerOptions({\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 /** The most recently detected input modality. */\n get mostRecentModality() {\n return this._modality.value;\n }\n constructor(_platform, ngZone, document, options) {\n this._platform = _platform;\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 this._mostRecentTarget = null;\n /** The underlying BehaviorSubject that emits whenever an input modality is detected. */\n this._modality = new BehaviorSubject(null);\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 this._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 this._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 this._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 this._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 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 (_platform.isBrowser) {\n ngZone.runOutsideAngular(() => {\n document.addEventListener('keydown', this._onKeydown, modalityEventListenerOptions);\n document.addEventListener('mousedown', this._onMousedown, modalityEventListenerOptions);\n document.addEventListener('touchstart', this._onTouchstart, modalityEventListenerOptions);\n });\n }\n }\n ngOnDestroy() {\n this._modality.complete();\n if (this._platform.isBrowser) {\n document.removeEventListener('keydown', this._onKeydown, modalityEventListenerOptions);\n document.removeEventListener('mousedown', this._onMousedown, modalityEventListenerOptions);\n document.removeEventListener('touchstart', this._onTouchstart, modalityEventListenerOptions);\n }\n }\n static {\n this.ɵfac = function InputModalityDetector_Factory(t) {\n return new (t || InputModalityDetector)(i0.ɵɵinject(i1.Platform), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(INPUT_MODALITY_DETECTOR_OPTIONS, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: InputModalityDetector,\n factory: InputModalityDetector.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return InputModalityDetector;\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/** @docs-private */\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 constructor(elementToken, _ngZone, _document, _defaultOptions) {\n this._ngZone = _ngZone;\n this._defaultOptions = _defaultOptions;\n // We inject the live element and document as `any` because the constructor signature cannot\n // reference browser globals (HTMLElement, Document) on non-browser environments, since having\n // a class decorator causes TypeScript to preserve the constructor signature types.\n this._document = _document;\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 {\n this.ɵfac = function LiveAnnouncer_Factory(t) {\n return new (t || LiveAnnouncer)(i0.ɵɵinject(LIVE_ANNOUNCER_ELEMENT_TOKEN, 8), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(LIVE_ANNOUNCER_DEFAULT_OPTIONS, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: LiveAnnouncer,\n factory: LiveAnnouncer.ɵfac,\n providedIn: 'root'\n });\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 /** 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 constructor(_elementRef, _liveAnnouncer, _contentObserver, _ngZone) {\n this._elementRef = _elementRef;\n this._liveAnnouncer = _liveAnnouncer;\n this._contentObserver = _contentObserver;\n this._ngZone = _ngZone;\n this._politeness = 'polite';\n }\n ngOnDestroy() {\n if (this._subscription) {\n this._subscription.unsubscribe();\n }\n }\n static {\n this.ɵfac = function CdkAriaLive_Factory(t) {\n return new (t || CdkAriaLive)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(LiveAnnouncer), i0.ɵɵdirectiveInject(i1$1.ContentObserver), i0.ɵɵdirectiveInject(i0.NgZone));\n };\n }\n static {\n this.ɵ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 standalone: true\n });\n }\n }\n return CdkAriaLive;\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 constructor(_ngZone, _platform, _inputModalityDetector, /** @breaking-change 11.0.0 make document required */\n document, options) {\n this._ngZone = _ngZone;\n this._platform = _platform;\n this._inputModalityDetector = _inputModalityDetector;\n /** The focus origin that the next focus event is a result of. */\n this._origin = null;\n /** Whether the window has just been focused. */\n this._windowFocused = false;\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 this._originFromTouchInteraction = false;\n /** Map of elements being monitored to their info. */\n this._elementInfo = new Map();\n /** The number of elements currently being monitored. */\n this._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 this._rootNodeFocusListenerCount = new Map();\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 this._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 = window.setTimeout(() => this._windowFocused = false);\n };\n /** Subject for stopping our InputModalityDetector subscription. */\n this._stopInputModalityDetector = new Subject();\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 this._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 this._document = document;\n this._detectionMode = options?.detectionMode || FocusMonitorDetectionMode.IMMEDIATE;\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 {\n this.ɵfac = function FocusMonitor_Factory(t) {\n return new (t || FocusMonitor)(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i1.Platform), i0.ɵɵinject(InputModalityDetector), i0.ɵɵinject(DOCUMENT, 8), i0.ɵɵinject(FOCUS_MONITOR_DEFAULT_OPTIONS, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: FocusMonitor,\n factory: FocusMonitor.ɵfac,\n providedIn: 'root'\n });\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 constructor(_elementRef, _focusMonitor) {\n this._elementRef = _elementRef;\n this._focusMonitor = _focusMonitor;\n this._focusOrigin = null;\n this.cdkFocusChange = new EventEmitter();\n }\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 {\n this.ɵfac = function CdkMonitorFocus_Factory(t) {\n return new (t || CdkMonitorFocus)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(FocusMonitor));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkMonitorFocus,\n selectors: [[\"\", \"cdkMonitorElementFocus\", \"\"], [\"\", \"cdkMonitorSubtreeFocus\", \"\"]],\n outputs: {\n cdkFocusChange: \"cdkFocusChange\"\n },\n exportAs: [\"cdkMonitorFocus\"],\n standalone: true\n });\n }\n }\n return CdkMonitorFocus;\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 constructor(_platform, document) {\n this._platform = _platform;\n this._document = document;\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 {\n this.ɵfac = function HighContrastModeDetector_Factory(t) {\n return new (t || HighContrastModeDetector)(i0.ɵɵinject(i1.Platform), i0.ɵɵinject(DOCUMENT));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HighContrastModeDetector,\n factory: HighContrastModeDetector.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return HighContrastModeDetector;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet A11yModule = /*#__PURE__*/(() => {\n class A11yModule {\n constructor(highContrastModeDetector) {\n highContrastModeDetector._applyBodyHighContrastModeCssClasses();\n }\n static {\n this.ɵfac = function A11yModule_Factory(t) {\n return new (t || A11yModule)(i0.ɵɵinject(HighContrastModeDetector));\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: A11yModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [ObserversModule]\n });\n }\n }\n return A11yModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { A11yModule, ActiveDescendantKeyManager, AriaDescriber, CDK_DESCRIBEDBY_HOST_ATTRIBUTE, CDK_DESCRIBEDBY_ID_PREFIX, CdkAriaLive, CdkMonitorFocus, CdkTrapFocus, ConfigurableFocusTrap, ConfigurableFocusTrapFactory, EventListenerFocusTrapInertStrategy, FOCUS_MONITOR_DEFAULT_OPTIONS, FOCUS_TRAP_INERT_STRATEGY, FocusKeyManager, FocusMonitor, FocusMonitorDetectionMode, FocusTrap, FocusTrapFactory, HighContrastMode, HighContrastModeDetector, INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS, INPUT_MODALITY_DETECTOR_OPTIONS, InputModalityDetector, InteractivityChecker, IsFocusableConfig, LIVE_ANNOUNCER_DEFAULT_OPTIONS, LIVE_ANNOUNCER_ELEMENT_TOKEN, LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY, ListKeyManager, LiveAnnouncer, MESSAGES_CONTAINER_ID, addAriaReferencedId, getAriaReferenceIds, isFakeMousedownFromScreenReader, isFakeTouchstartFromScreenReader, removeAriaReferencedId };\n","import * as i0 from '@angular/core';\nimport { Version, InjectionToken, inject, NgModule, Optional, Inject, LOCALE_ID, Injectable, Directive, ANIMATION_MODULE_TYPE, Input, Component, ViewEncapsulation, ChangeDetectionStrategy, booleanAttribute, EventEmitter, Output, ViewChild, NgZone, ElementRef } from '@angular/core';\nimport * as i1 from '@angular/cdk/a11y';\nimport { isFakeMousedownFromScreenReader, isFakeTouchstartFromScreenReader } from '@angular/cdk/a11y';\nimport { BidiModule } from '@angular/cdk/bidi';\nimport { VERSION as VERSION$1 } from '@angular/cdk';\nimport { DOCUMENT } from '@angular/common';\nimport * as i1$1 from '@angular/cdk/platform';\nimport { Platform, _isTestEnvironment, normalizePassiveListenerOptions, _getEventTarget } from '@angular/cdk/platform';\nimport { coerceBooleanProperty, coerceNumberProperty, coerceElement } from '@angular/cdk/coercion';\nimport { Observable, Subject } from 'rxjs';\nimport { startWith } from 'rxjs/operators';\nimport { ENTER, SPACE, hasModifierKey } from '@angular/cdk/keycodes';\n\n/** Current version of Angular Material. */\nconst _c0 = [\"*\", [[\"mat-option\"], [\"ng-container\"]]];\nconst _c1 = [\"*\", \"mat-option, ng-container\"];\nconst _c2 = [\"text\"];\nconst _c3 = [[[\"mat-icon\"]], \"*\"];\nconst _c4 = [\"mat-icon\", \"*\"];\nfunction MatOption_Conditional_0_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelement(0, \"mat-pseudo-checkbox\", 1);\n }\n if (rf & 2) {\n const ctx_r0 = i0.ɵɵnextContext();\n i0.ɵɵproperty(\"disabled\", ctx_r0.disabled)(\"state\", ctx_r0.selected ? \"checked\" : \"unchecked\");\n }\n}\nfunction MatOption_Conditional_5_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelement(0, \"mat-pseudo-checkbox\", 3);\n }\n if (rf & 2) {\n const ctx_r0 = i0.ɵɵnextContext();\n i0.ɵɵproperty(\"disabled\", ctx_r0.disabled);\n }\n}\nfunction MatOption_Conditional_6_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"span\", 4);\n i0.ɵɵtext(1);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const ctx_r0 = i0.ɵɵnextContext();\n i0.ɵɵadvance();\n i0.ɵɵtextInterpolate1(\"(\", ctx_r0.group.label, \")\");\n }\n}\nconst _c5 = [\"mat-internal-form-field\", \"\"];\nconst _c6 = [\"*\"];\nconst VERSION = /*#__PURE__*/new Version('18.0.0');\n\n/** @docs-private */\nlet AnimationCurves = /*#__PURE__*/(() => {\n class AnimationCurves {\n static {\n this.STANDARD_CURVE = 'cubic-bezier(0.4,0.0,0.2,1)';\n }\n static {\n this.DECELERATION_CURVE = 'cubic-bezier(0.0,0.0,0.2,1)';\n }\n static {\n this.ACCELERATION_CURVE = 'cubic-bezier(0.4,0.0,1,1)';\n }\n static {\n this.SHARP_CURVE = 'cubic-bezier(0.4,0.0,0.6,1)';\n }\n }\n return AnimationCurves;\n})();\n/** @docs-private */\nlet AnimationDurations = /*#__PURE__*/(() => {\n class AnimationDurations {\n static {\n this.COMPLEX = '375ms';\n }\n static {\n this.ENTERING = '225ms';\n }\n static {\n this.EXITING = '195ms';\n }\n }\n return AnimationDurations;\n})();\n/** @docs-private */\nfunction MATERIAL_SANITY_CHECKS_FACTORY() {\n return true;\n}\n/** Injection token that configures whether the Material sanity checks are enabled. */\nconst MATERIAL_SANITY_CHECKS = /*#__PURE__*/new InjectionToken('mat-sanity-checks', {\n providedIn: 'root',\n factory: MATERIAL_SANITY_CHECKS_FACTORY\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 */\nlet MatCommonModule = /*#__PURE__*/(() => {\n class MatCommonModule {\n constructor(highContrastModeDetector, _sanityChecks, _document) {\n this._sanityChecks = _sanityChecks;\n this._document = _document;\n /** Whether we've done the global sanity checks (e.g. a theme is loaded, there is a doctype). */\n this._hasDoneGlobalChecks = false;\n // While A11yModule also does this, we repeat it here to avoid importing A11yModule\n // in MatCommonModule.\n highContrastModeDetector._applyBodyHighContrastModeCssClasses();\n if (!this._hasDoneGlobalChecks) {\n this._hasDoneGlobalChecks = true;\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n // Inject in here so the reference to `Platform` can be removed in production mode.\n const platform = inject(Platform, {\n optional: true\n });\n if (this._checkIsEnabled('doctype')) {\n _checkDoctypeIsDefined(this._document);\n }\n if (this._checkIsEnabled('theme')) {\n _checkThemeIsPresent(this._document, !!platform?.isBrowser);\n }\n if (this._checkIsEnabled('version')) {\n _checkCdkVersionMatch();\n }\n }\n }\n }\n /** Gets whether a specific sanity check is enabled. */\n _checkIsEnabled(name) {\n if (_isTestEnvironment()) {\n return false;\n }\n if (typeof this._sanityChecks === 'boolean') {\n return this._sanityChecks;\n }\n return !!this._sanityChecks[name];\n }\n static {\n this.ɵfac = function MatCommonModule_Factory(t) {\n return new (t || MatCommonModule)(i0.ɵɵinject(i1.HighContrastModeDetector), i0.ɵɵinject(MATERIAL_SANITY_CHECKS, 8), i0.ɵɵinject(DOCUMENT));\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatCommonModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [BidiModule, BidiModule]\n });\n }\n }\n return MatCommonModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Checks that the page has a doctype. */\nfunction _checkDoctypeIsDefined(doc) {\n if (!doc.doctype) {\n console.warn('Current document does not have a doctype. This may cause ' + 'some Angular Material components not to behave as expected.');\n }\n}\n/** Checks that a theme has been included. */\nfunction _checkThemeIsPresent(doc, isBrowser) {\n // We need to assert that the `body` is defined, because these checks run very early\n // and the `body` won't be defined if the consumer put their scripts in the `head`.\n if (!doc.body || !isBrowser) {\n return;\n }\n const testElement = doc.createElement('div');\n testElement.classList.add('mat-theme-loaded-marker');\n doc.body.appendChild(testElement);\n const computedStyle = getComputedStyle(testElement);\n // In some situations the computed style of the test element can be null. For example in\n // Firefox, the computed style is null if an application is running inside of a hidden iframe.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n if (computedStyle && computedStyle.display !== 'none') {\n console.warn('Could not find Angular Material core theme. Most Material ' + 'components may not work as expected. For more info refer ' + 'to the theming guide: https://material.angular.io/guide/theming');\n }\n testElement.remove();\n}\n/** Checks whether the Material version matches the CDK version. */\nfunction _checkCdkVersionMatch() {\n if (VERSION.full !== VERSION$1.full) {\n console.warn('The Angular Material version (' + VERSION.full + ') does not match ' + 'the Angular CDK version (' + VERSION$1.full + ').\\n' + 'Please ensure the versions of these two packages exactly match.');\n }\n}\nfunction mixinDisabled(base) {\n return class extends base {\n get disabled() {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n }\n constructor(...args) {\n super(...args);\n this._disabled = false;\n }\n };\n}\nfunction mixinColor(base, defaultColor) {\n return class extends base {\n get color() {\n return this._color;\n }\n set color(value) {\n const colorPalette = value || this.defaultColor;\n if (colorPalette !== this._color) {\n if (this._color) {\n this._elementRef.nativeElement.classList.remove(`mat-${this._color}`);\n }\n if (colorPalette) {\n this._elementRef.nativeElement.classList.add(`mat-${colorPalette}`);\n }\n this._color = colorPalette;\n }\n }\n constructor(...args) {\n super(...args);\n this.defaultColor = defaultColor;\n // Set the default color that can be specified from the mixin.\n this.color = defaultColor;\n }\n };\n}\nfunction mixinDisableRipple(base) {\n return class extends base {\n /** Whether the ripple effect is disabled or not. */\n get disableRipple() {\n return this._disableRipple;\n }\n set disableRipple(value) {\n this._disableRipple = coerceBooleanProperty(value);\n }\n constructor(...args) {\n super(...args);\n this._disableRipple = false;\n }\n };\n}\nfunction mixinTabIndex(base, defaultTabIndex = 0) {\n return class extends base {\n get tabIndex() {\n return this.disabled ? -1 : this._tabIndex;\n }\n set tabIndex(value) {\n // If the specified tabIndex value is null or undefined, fall back to the default value.\n this._tabIndex = value != null ? coerceNumberProperty(value) : this.defaultTabIndex;\n }\n constructor(...args) {\n super(...args);\n this._tabIndex = defaultTabIndex;\n this.defaultTabIndex = defaultTabIndex;\n }\n };\n}\n\n/**\n * Class that tracks the error state of a component.\n * @docs-private\n */\nclass _ErrorStateTracker {\n constructor(_defaultMatcher, ngControl, _parentFormGroup, _parentForm, _stateChanges) {\n this._defaultMatcher = _defaultMatcher;\n this.ngControl = ngControl;\n this._parentFormGroup = _parentFormGroup;\n this._parentForm = _parentForm;\n this._stateChanges = _stateChanges;\n /** Whether the tracker is currently in an error state. */\n this.errorState = false;\n }\n /** Updates the error state based on the provided error state matcher. */\n updateErrorState() {\n const oldState = this.errorState;\n const parent = this._parentFormGroup || this._parentForm;\n const matcher = this.matcher || this._defaultMatcher;\n const control = this.ngControl ? this.ngControl.control : null;\n const newState = matcher?.isErrorState(control, parent) ?? false;\n if (newState !== oldState) {\n this.errorState = newState;\n this._stateChanges.next();\n }\n }\n}\nfunction mixinErrorState(base) {\n return class extends base {\n /** Whether the component is in an error state. */\n get errorState() {\n return this._getTracker().errorState;\n }\n set errorState(value) {\n this._getTracker().errorState = value;\n }\n /** An object used to control the error state of the component. */\n get errorStateMatcher() {\n return this._getTracker().matcher;\n }\n set errorStateMatcher(value) {\n this._getTracker().matcher = value;\n }\n /** Updates the error state based on the provided error state matcher. */\n updateErrorState() {\n this._getTracker().updateErrorState();\n }\n _getTracker() {\n if (!this._tracker) {\n this._tracker = new _ErrorStateTracker(this._defaultErrorStateMatcher, this.ngControl, this._parentFormGroup, this._parentForm, this.stateChanges);\n }\n return this._tracker;\n }\n constructor(...args) {\n super(...args);\n }\n };\n}\n\n/**\n * Mixin to augment a directive with an initialized property that will emits when ngOnInit ends.\n * @deprecated Track the initialized state manually.\n * @breaking-change 19.0.0\n */\nfunction mixinInitialized(base) {\n return class extends base {\n constructor(...args) {\n super(...args);\n /** Whether this directive has been marked as initialized. */\n this._isInitialized = false;\n /**\n * List of subscribers that subscribed before the directive was initialized. Should be notified\n * during _markInitialized. Set to null after pending subscribers are notified, and should\n * not expect to be populated after.\n */\n this._pendingSubscribers = [];\n /**\n * Observable stream that emits when the directive initializes. If already initialized, the\n * subscriber is stored to be notified once _markInitialized is called.\n */\n this.initialized = new Observable(subscriber => {\n // If initialized, immediately notify the subscriber. Otherwise store the subscriber to notify\n // when _markInitialized is called.\n if (this._isInitialized) {\n this._notifySubscriber(subscriber);\n } else {\n this._pendingSubscribers.push(subscriber);\n }\n });\n }\n /**\n * Marks the state as initialized and notifies pending subscribers. Should be called at the end\n * of ngOnInit.\n * @docs-private\n */\n _markInitialized() {\n if (this._isInitialized && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('This directive has already been marked as initialized and ' + 'should not be called twice.');\n }\n this._isInitialized = true;\n this._pendingSubscribers.forEach(this._notifySubscriber);\n this._pendingSubscribers = null;\n }\n /** Emits and completes the subscriber stream (should only emit once). */\n _notifySubscriber(subscriber) {\n subscriber.next();\n subscriber.complete();\n }\n };\n}\n\n/** InjectionToken for datepicker that can be used to override default locale code. */\nconst MAT_DATE_LOCALE = /*#__PURE__*/new InjectionToken('MAT_DATE_LOCALE', {\n providedIn: 'root',\n factory: MAT_DATE_LOCALE_FACTORY\n});\n/** @docs-private */\nfunction MAT_DATE_LOCALE_FACTORY() {\n return inject(LOCALE_ID);\n}\n/** Adapts type `D` to be usable as a date by cdk-based components that work with dates. */\nclass DateAdapter {\n constructor() {\n this._localeChanges = new Subject();\n /** A stream that emits when the locale changes. */\n this.localeChanges = this._localeChanges;\n }\n /**\n * Given a potential date object, returns that same date object if it is\n * a valid date, or `null` if it's not a valid date.\n * @param obj The object to check.\n * @returns A date or `null`.\n */\n getValidDateOrNull(obj) {\n return this.isDateInstance(obj) && this.isValid(obj) ? obj : null;\n }\n /**\n * Attempts to deserialize a value to a valid date object. This is different from parsing in that\n * deserialize should only accept non-ambiguous, locale-independent formats (e.g. a ISO 8601\n * string). The default implementation does not allow any deserialization, it simply checks that\n * the given value is already a valid date object or null. The `<mat-datepicker>` will call this\n * method on all of its `@Input()` properties that accept dates. It is therefore possible to\n * support passing values from your backend directly to these properties by overriding this method\n * to also deserialize the format used by your backend.\n * @param value The value to be deserialized into a date object.\n * @returns The deserialized date object, either a valid date, null if the value can be\n * deserialized into a null date (e.g. the empty string), or an invalid date.\n */\n deserialize(value) {\n if (value == null || this.isDateInstance(value) && this.isValid(value)) {\n return value;\n }\n return this.invalid();\n }\n /**\n * Sets the locale used for all dates.\n * @param locale The new locale.\n */\n setLocale(locale) {\n this.locale = locale;\n this._localeChanges.next();\n }\n /**\n * Compares two dates.\n * @param first The first date to compare.\n * @param second The second date to compare.\n * @returns 0 if the dates are equal, a number less than 0 if the first date is earlier,\n * a number greater than 0 if the first date is later.\n */\n compareDate(first, second) {\n return this.getYear(first) - this.getYear(second) || this.getMonth(first) - this.getMonth(second) || this.getDate(first) - this.getDate(second);\n }\n /**\n * Checks if two dates are equal.\n * @param first The first date to check.\n * @param second The second date to check.\n * @returns Whether the two dates are equal.\n * Null dates are considered equal to other null dates.\n */\n sameDate(first, second) {\n if (first && second) {\n let firstValid = this.isValid(first);\n let secondValid = this.isValid(second);\n if (firstValid && secondValid) {\n return !this.compareDate(first, second);\n }\n return firstValid == secondValid;\n }\n return first == second;\n }\n /**\n * Clamp the given date between min and max dates.\n * @param date The date to clamp.\n * @param min The minimum value to allow. If null or omitted no min is enforced.\n * @param max The maximum value to allow. If null or omitted no max is enforced.\n * @returns `min` if `date` is less than `min`, `max` if date is greater than `max`,\n * otherwise `date`.\n */\n clampDate(date, min, max) {\n if (min && this.compareDate(date, min) < 0) {\n return min;\n }\n if (max && this.compareDate(date, max) > 0) {\n return max;\n }\n return date;\n }\n}\nconst MAT_DATE_FORMATS = /*#__PURE__*/new InjectionToken('mat-date-formats');\n\n/**\n * Matches strings that have the form of a valid RFC 3339 string\n * (https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date\n * because the regex will match strings an with out of bounds month, date, etc.\n */\nconst ISO_8601_REGEX = /^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|(?:(?:\\+|-)\\d{2}:\\d{2}))?)?$/;\n/** Creates an array and fills it with values. */\nfunction range(length, valueFunction) {\n const valuesArray = Array(length);\n for (let i = 0; i < length; i++) {\n valuesArray[i] = valueFunction(i);\n }\n return valuesArray;\n}\n/** Adapts the native JS Date for use with cdk-based components that work with dates. */\nlet NativeDateAdapter = /*#__PURE__*/(() => {\n class NativeDateAdapter extends DateAdapter {\n constructor(\n /**\n * @deprecated Now injected via inject(), param to be removed.\n * @breaking-change 18.0.0\n */\n matDateLocale) {\n super();\n /**\n * @deprecated No longer being used. To be removed.\n * @breaking-change 14.0.0\n */\n this.useUtcForDisplay = false;\n /** The injected locale. */\n this._matDateLocale = inject(MAT_DATE_LOCALE, {\n optional: true\n });\n if (matDateLocale !== undefined) {\n this._matDateLocale = matDateLocale;\n }\n super.setLocale(this._matDateLocale);\n }\n getYear(date) {\n return date.getFullYear();\n }\n getMonth(date) {\n return date.getMonth();\n }\n getDate(date) {\n return date.getDate();\n }\n getDayOfWeek(date) {\n return date.getDay();\n }\n getMonthNames(style) {\n const dtf = new Intl.DateTimeFormat(this.locale, {\n month: style,\n timeZone: 'utc'\n });\n return range(12, i => this._format(dtf, new Date(2017, i, 1)));\n }\n getDateNames() {\n const dtf = new Intl.DateTimeFormat(this.locale, {\n day: 'numeric',\n timeZone: 'utc'\n });\n return range(31, i => this._format(dtf, new Date(2017, 0, i + 1)));\n }\n getDayOfWeekNames(style) {\n const dtf = new Intl.DateTimeFormat(this.locale, {\n weekday: style,\n timeZone: 'utc'\n });\n return range(7, i => this._format(dtf, new Date(2017, 0, i + 1)));\n }\n getYearName(date) {\n const dtf = new Intl.DateTimeFormat(this.locale, {\n year: 'numeric',\n timeZone: 'utc'\n });\n return this._format(dtf, date);\n }\n getFirstDayOfWeek() {\n // We can't tell using native JS Date what the first day of the week is, we default to Sunday.\n return 0;\n }\n getNumDaysInMonth(date) {\n return this.getDate(this._createDateWithOverflow(this.getYear(date), this.getMonth(date) + 1, 0));\n }\n clone(date) {\n return new Date(date.getTime());\n }\n createDate(year, month, date) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n // Check for invalid month and date (except upper bound on date which we have to check after\n // creating the Date).\n if (month < 0 || month > 11) {\n throw Error(`Invalid month index \"${month}\". Month index has to be between 0 and 11.`);\n }\n if (date < 1) {\n throw Error(`Invalid date \"${date}\". Date has to be greater than 0.`);\n }\n }\n let result = this._createDateWithOverflow(year, month, date);\n // Check that the date wasn't above the upper bound for the month, causing the month to overflow\n if (result.getMonth() != month && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error(`Invalid date \"${date}\" for month with index \"${month}\".`);\n }\n return result;\n }\n today() {\n return new Date();\n }\n parse(value, parseFormat) {\n // We have no way using the native JS Date to set the parse format or locale, so we ignore these\n // parameters.\n if (typeof value == 'number') {\n return new Date(value);\n }\n return value ? new Date(Date.parse(value)) : null;\n }\n format(date, displayFormat) {\n if (!this.isValid(date)) {\n throw Error('NativeDateAdapter: Cannot format invalid date.');\n }\n const dtf = new Intl.DateTimeFormat(this.locale, {\n ...displayFormat,\n timeZone: 'utc'\n });\n return this._format(dtf, date);\n }\n addCalendarYears(date, years) {\n return this.addCalendarMonths(date, years * 12);\n }\n addCalendarMonths(date, months) {\n let newDate = this._createDateWithOverflow(this.getYear(date), this.getMonth(date) + months, this.getDate(date));\n // It's possible to wind up in the wrong month if the original month has more days than the new\n // month. In this case we want to go to the last day of the desired month.\n // Note: the additional + 12 % 12 ensures we end up with a positive number, since JS % doesn't\n // guarantee this.\n if (this.getMonth(newDate) != ((this.getMonth(date) + months) % 12 + 12) % 12) {\n newDate = this._createDateWithOverflow(this.getYear(newDate), this.getMonth(newDate), 0);\n }\n return newDate;\n }\n addCalendarDays(date, days) {\n return this._createDateWithOverflow(this.getYear(date), this.getMonth(date), this.getDate(date) + days);\n }\n toIso8601(date) {\n return [date.getUTCFullYear(), this._2digit(date.getUTCMonth() + 1), this._2digit(date.getUTCDate())].join('-');\n }\n /**\n * Returns the given value if given a valid Date or null. Deserializes valid ISO 8601 strings\n * (https://www.ietf.org/rfc/rfc3339.txt) into valid Dates and empty string into null. Returns an\n * invalid date for all other values.\n */\n deserialize(value) {\n if (typeof value === 'string') {\n if (!value) {\n return null;\n }\n // The `Date` constructor accepts formats other than ISO 8601, so we need to make sure the\n // string is the right format first.\n if (ISO_8601_REGEX.test(value)) {\n let date = new Date(value);\n if (this.isValid(date)) {\n return date;\n }\n }\n }\n return super.deserialize(value);\n }\n isDateInstance(obj) {\n return obj instanceof Date;\n }\n isValid(date) {\n return !isNaN(date.getTime());\n }\n invalid() {\n return new Date(NaN);\n }\n /** Creates a date but allows the month and date to overflow. */\n _createDateWithOverflow(year, month, date) {\n // Passing the year to the constructor causes year numbers <100 to be converted to 19xx.\n // To work around this we use `setFullYear` and `setHours` instead.\n const d = new Date();\n d.setFullYear(year, month, date);\n d.setHours(0, 0, 0, 0);\n return d;\n }\n /**\n * Pads a number to make it two digits.\n * @param n The number to pad.\n * @returns The padded number.\n */\n _2digit(n) {\n return ('00' + n).slice(-2);\n }\n /**\n * When converting Date object to string, javascript built-in functions may return wrong\n * results because it applies its internal DST rules. The DST rules around the world change\n * very frequently, and the current valid rule is not always valid in previous years though.\n * We work around this problem building a new Date object which has its internal UTC\n * representation with the local date and time.\n * @param dtf Intl.DateTimeFormat object, containing the desired string format. It must have\n * timeZone set to 'utc' to work fine.\n * @param date Date from which we want to get the string representation according to dtf\n * @returns A Date object with its UTC representation based on the passed in date info\n */\n _format(dtf, date) {\n // Passing the year to the constructor causes year numbers <100 to be converted to 19xx.\n // To work around this we use `setUTCFullYear` and `setUTCHours` instead.\n const d = new Date();\n d.setUTCFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n d.setUTCHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n return dtf.format(d);\n }\n static {\n this.ɵfac = function NativeDateAdapter_Factory(t) {\n return new (t || NativeDateAdapter)(i0.ɵɵinject(MAT_DATE_LOCALE, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: NativeDateAdapter,\n factory: NativeDateAdapter.ɵfac\n });\n }\n }\n return NativeDateAdapter;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst MAT_NATIVE_DATE_FORMATS = {\n parse: {\n dateInput: null\n },\n display: {\n dateInput: {\n year: 'numeric',\n month: 'numeric',\n day: 'numeric'\n },\n monthYearLabel: {\n year: 'numeric',\n month: 'short'\n },\n dateA11yLabel: {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n },\n monthYearA11yLabel: {\n year: 'numeric',\n month: 'long'\n }\n }\n};\nlet NativeDateModule = /*#__PURE__*/(() => {\n class NativeDateModule {\n static {\n this.ɵfac = function NativeDateModule_Factory(t) {\n return new (t || NativeDateModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: NativeDateModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [{\n provide: DateAdapter,\n useClass: NativeDateAdapter\n }]\n });\n }\n }\n return NativeDateModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatNativeDateModule = /*#__PURE__*/(() => {\n class MatNativeDateModule {\n static {\n this.ɵfac = function MatNativeDateModule_Factory(t) {\n return new (t || MatNativeDateModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatNativeDateModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [provideNativeDateAdapter()]\n });\n }\n }\n return MatNativeDateModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nfunction provideNativeDateAdapter(formats = MAT_NATIVE_DATE_FORMATS) {\n return [{\n provide: DateAdapter,\n useClass: NativeDateAdapter\n }, {\n provide: MAT_DATE_FORMATS,\n useValue: formats\n }];\n}\n\n/** Error state matcher that matches when a control is invalid and dirty. */\nlet ShowOnDirtyErrorStateMatcher = /*#__PURE__*/(() => {\n class ShowOnDirtyErrorStateMatcher {\n isErrorState(control, form) {\n return !!(control && control.invalid && (control.dirty || form && form.submitted));\n }\n static {\n this.ɵfac = function ShowOnDirtyErrorStateMatcher_Factory(t) {\n return new (t || ShowOnDirtyErrorStateMatcher)();\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: ShowOnDirtyErrorStateMatcher,\n factory: ShowOnDirtyErrorStateMatcher.ɵfac\n });\n }\n }\n return ShowOnDirtyErrorStateMatcher;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Provider that defines how form controls behave with regards to displaying error messages. */\nlet ErrorStateMatcher = /*#__PURE__*/(() => {\n class ErrorStateMatcher {\n isErrorState(control, form) {\n return !!(control && control.invalid && (control.touched || form && form.submitted));\n }\n static {\n this.ɵfac = function ErrorStateMatcher_Factory(t) {\n return new (t || ErrorStateMatcher)();\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: ErrorStateMatcher,\n factory: ErrorStateMatcher.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return ErrorStateMatcher;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Shared directive to count lines inside a text area, such as a list item.\n * Line elements can be extracted with a @ContentChildren(MatLine) query, then\n * counted by checking the query list's length.\n */\nlet MatLine = /*#__PURE__*/(() => {\n class MatLine {\n static {\n this.ɵfac = function MatLine_Factory(t) {\n return new (t || MatLine)();\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: MatLine,\n selectors: [[\"\", \"mat-line\", \"\"], [\"\", \"matLine\", \"\"]],\n hostAttrs: [1, \"mat-line\"],\n standalone: true\n });\n }\n }\n return MatLine;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Helper that takes a query list of lines and sets the correct class on the host.\n * @docs-private\n */\nfunction setLines(lines, element, prefix = 'mat') {\n // Note: doesn't need to unsubscribe, because `changes`\n // gets completed by Angular when the view is destroyed.\n lines.changes.pipe(startWith(lines)).subscribe(({\n length\n }) => {\n setClass(element, `${prefix}-2-line`, false);\n setClass(element, `${prefix}-3-line`, false);\n setClass(element, `${prefix}-multi-line`, false);\n if (length === 2 || length === 3) {\n setClass(element, `${prefix}-${length}-line`, true);\n } else if (length > 3) {\n setClass(element, `${prefix}-multi-line`, true);\n }\n });\n}\n/** Adds or removes a class from an element. */\nfunction setClass(element, className, isAdd) {\n element.nativeElement.classList.toggle(className, isAdd);\n}\nlet MatLineModule = /*#__PURE__*/(() => {\n class MatLineModule {\n static {\n this.ɵfac = function MatLineModule_Factory(t) {\n return new (t || MatLineModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatLineModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [MatCommonModule, MatCommonModule]\n });\n }\n }\n return MatLineModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\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 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 /** Current state of the ripple. */\n this.state = RippleState.HIDDEN;\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 constructor() {\n this._events = new Map();\n /** Event handler that is bound and which dispatches the events to the different targets. */\n this._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 /** 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}\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'];\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 static {\n this._eventManager = /*#__PURE__*/new RippleEventManager();\n }\n constructor(_target, _ngZone, elementOrElementRef, _platform) {\n this._target = _target;\n this._ngZone = _ngZone;\n this._platform = _platform;\n /** Whether the pointer is currently down or not. */\n this._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 this._activeRipples = new Map();\n /** Whether pointer-up event listeners have been registered. */\n this._pointerUpEventsRegistered = false;\n // Only do anything if we're on the browser.\n if (_platform.isBrowser) {\n this._containerElement = coerceElement(elementOrElementRef);\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 = () => this._finishRippleTransition(rippleRef);\n const onTransitionCancel = () => this._destroyRipple(rippleRef);\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 };\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 }\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 /**\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 /**\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 constructor(_elementRef, ngZone, platform, globalOptions, _animationMode) {\n this._elementRef = _elementRef;\n this._animationMode = _animationMode;\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 this.radius = 0;\n this._disabled = false;\n /** @docs-private Whether ripple directive is initialized and the input bindings are set. */\n this._isInitialized = false;\n this._globalOptions = globalOptions || {};\n this._rippleRenderer = new RippleRenderer(this, ngZone, _elementRef, platform);\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 {\n this.ɵfac = function MatRipple_Factory(t) {\n return new (t || MatRipple)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i1$1.Platform), i0.ɵɵdirectiveInject(MAT_RIPPLE_GLOBAL_OPTIONS, 8), i0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8));\n };\n }\n static {\n this.ɵ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 standalone: true\n });\n }\n }\n return MatRipple;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatRippleModule = /*#__PURE__*/(() => {\n class MatRippleModule {\n static {\n this.ɵfac = function MatRippleModule_Factory(t) {\n return new (t || MatRippleModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatRippleModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [MatCommonModule, MatCommonModule]\n });\n }\n }\n return MatRippleModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Component that shows a simplified checkbox without including any kind of \"real\" checkbox.\n * Meant to be used when the checkbox is purely decorative and a large number of them will be\n * included, such as for the options in a multi-select. Uses no SVGs or complex animations.\n * Note that theming is meant to be handled by the parent element, e.g.\n * `mat-primary .mat-pseudo-checkbox`.\n *\n * Note that this component will be completely invisible to screen-reader users. This is *not*\n * interchangeable with `<mat-checkbox>` and should *not* be used if the user would directly\n * interact with the checkbox. The pseudo-checkbox should only be used as an implementation detail\n * of more complex components that appropriately handle selected / checked state.\n * @docs-private\n */\nlet MatPseudoCheckbox = /*#__PURE__*/(() => {\n class MatPseudoCheckbox {\n constructor(_animationMode) {\n this._animationMode = _animationMode;\n /** Display state of the checkbox. */\n this.state = 'unchecked';\n /** Whether the checkbox is disabled. */\n this.disabled = false;\n /**\n * Appearance of the pseudo checkbox. Default appearance of 'full' renders a checkmark/mixedmark\n * indicator inside a square box. 'minimal' appearance only renders the checkmark/mixedmark.\n */\n this.appearance = 'full';\n }\n static {\n this.ɵfac = function MatPseudoCheckbox_Factory(t) {\n return new (t || MatPseudoCheckbox)(i0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatPseudoCheckbox,\n selectors: [[\"mat-pseudo-checkbox\"]],\n hostAttrs: [1, \"mat-pseudo-checkbox\"],\n hostVars: 12,\n hostBindings: function MatPseudoCheckbox_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵclassProp(\"mat-pseudo-checkbox-indeterminate\", ctx.state === \"indeterminate\")(\"mat-pseudo-checkbox-checked\", ctx.state === \"checked\")(\"mat-pseudo-checkbox-disabled\", ctx.disabled)(\"mat-pseudo-checkbox-minimal\", ctx.appearance === \"minimal\")(\"mat-pseudo-checkbox-full\", ctx.appearance === \"full\")(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\");\n }\n },\n inputs: {\n state: \"state\",\n disabled: \"disabled\",\n appearance: \"appearance\"\n },\n standalone: true,\n features: [i0.ɵɵStandaloneFeature],\n decls: 0,\n vars: 0,\n template: function MatPseudoCheckbox_Template(rf, ctx) {},\n styles: [\".mat-pseudo-checkbox{border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:\\\"\\\";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox._mat-animation-noopable{transition:none !important;animation:none !important}.mat-pseudo-checkbox._mat-animation-noopable::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{left:1px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{left:1px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-minimal-pseudo-checkbox-selected-checkmark-color)}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color)}.mat-pseudo-checkbox-full{border-color:var(--mat-full-pseudo-checkbox-unselected-icon-color);border-width:2px;border-style:solid}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-disabled{border-color:var(--mat-full-pseudo-checkbox-disabled-unselected-icon-color)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate{background-color:var(--mat-full-pseudo-checkbox-selected-icon-color);border-color:rgba(0,0,0,0)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-full-pseudo-checkbox-selected-checkmark-color)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background-color:var(--mat-full-pseudo-checkbox-disabled-selected-icon-color)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-full-pseudo-checkbox-disabled-selected-checkmark-color)}.mat-pseudo-checkbox{width:18px;height:18px}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after{width:14px;height:6px;transform-origin:center;top:-4.2426406871px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{top:8px;width:16px}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after{width:10px;height:4px;transform-origin:center;top:-2.8284271247px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{top:6px;width:12px}\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return MatPseudoCheckbox;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatPseudoCheckboxModule = /*#__PURE__*/(() => {\n class MatPseudoCheckboxModule {\n static {\n this.ɵfac = function MatPseudoCheckboxModule_Factory(t) {\n return new (t || MatPseudoCheckboxModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatPseudoCheckboxModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [MatCommonModule]\n });\n }\n }\n return MatPseudoCheckboxModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Injection token used to provide the parent component to options.\n */\nconst MAT_OPTION_PARENT_COMPONENT = /*#__PURE__*/new InjectionToken('MAT_OPTION_PARENT_COMPONENT');\n\n// Notes on the accessibility pattern used for `mat-optgroup`.\n// The option group has two different \"modes\": regular and inert. The regular mode uses the\n// recommended a11y pattern which has `role=\"group\"` on the group element with `aria-labelledby`\n// pointing to the label. This works for `mat-select`, but it seems to hit a bug for autocomplete\n// under VoiceOver where the group doesn't get read out at all. The bug appears to be that if\n// there's __any__ a11y-related attribute on the group (e.g. `role` or `aria-labelledby`),\n// VoiceOver on Safari won't read it out.\n// We've introduced the `inert` mode as a workaround. Under this mode, all a11y attributes are\n// removed from the group, and we get the screen reader to read out the group label by mirroring it\n// inside an invisible element in the option. This is sub-optimal, because the screen reader will\n// repeat the group label on each navigation, whereas the default pattern only reads the group when\n// the user enters a new group. The following alternate approaches were considered:\n// 1. Reading out the group label using the `LiveAnnouncer` solves the problem, but we can't control\n// when the text will be read out so sometimes it comes in too late or never if the user\n// navigates quickly.\n// 2. `<mat-option aria-describedby=\"groupLabel\"` - This works on Safari, but VoiceOver in Chrome\n// won't read out the description at all.\n// 3. `<mat-option aria-labelledby=\"optionLabel groupLabel\"` - This works on Chrome, but Safari\n// doesn't read out the text at all. Furthermore, on\n// Counter for unique group ids.\nlet _uniqueOptgroupIdCounter = 0;\n/**\n * Injection token that can be used to reference instances of `MatOptgroup`. It serves as\n * alternative token to the actual `MatOptgroup` class which could cause unnecessary\n * retention of the class and its component metadata.\n */\nconst MAT_OPTGROUP = /*#__PURE__*/new InjectionToken('MatOptgroup');\n/**\n * Component that is used to group instances of `mat-option`.\n */\nlet MatOptgroup = /*#__PURE__*/(() => {\n class MatOptgroup {\n constructor(parent) {\n /** whether the option group is disabled. */\n this.disabled = false;\n /** Unique id for the underlying label. */\n this._labelId = `mat-optgroup-label-${_uniqueOptgroupIdCounter++}`;\n this._inert = parent?.inertGroups ?? false;\n }\n static {\n this.ɵfac = function MatOptgroup_Factory(t) {\n return new (t || MatOptgroup)(i0.ɵɵdirectiveInject(MAT_OPTION_PARENT_COMPONENT, 8));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatOptgroup,\n selectors: [[\"mat-optgroup\"]],\n hostAttrs: [1, \"mat-mdc-optgroup\"],\n hostVars: 3,\n hostBindings: function MatOptgroup_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵattribute(\"role\", ctx._inert ? null : \"group\")(\"aria-disabled\", ctx._inert ? null : ctx.disabled.toString())(\"aria-labelledby\", ctx._inert ? null : ctx._labelId);\n }\n },\n inputs: {\n label: \"label\",\n disabled: [2, \"disabled\", \"disabled\", booleanAttribute]\n },\n exportAs: [\"matOptgroup\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: MAT_OPTGROUP,\n useExisting: MatOptgroup\n }]), i0.ɵɵInputTransformsFeature, i0.ɵɵStandaloneFeature],\n ngContentSelectors: _c1,\n decls: 5,\n vars: 4,\n consts: [[\"role\", \"presentation\", 1, \"mat-mdc-optgroup-label\", 3, \"id\"], [1, \"mdc-list-item__primary-text\"]],\n template: function MatOptgroup_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojectionDef(_c0);\n i0.ɵɵelementStart(0, \"span\", 0)(1, \"span\", 1);\n i0.ɵɵtext(2);\n i0.ɵɵprojection(3);\n i0.ɵɵelementEnd()();\n i0.ɵɵprojection(4, 1);\n }\n if (rf & 2) {\n i0.ɵɵclassProp(\"mdc-list-item--disabled\", ctx.disabled);\n i0.ɵɵproperty(\"id\", ctx._labelId);\n i0.ɵɵadvance(2);\n i0.ɵɵtextInterpolate1(\"\", ctx.label, \" \");\n }\n },\n styles: [\".mat-mdc-optgroup{color:var(--mat-optgroup-label-text-color);font-family:var(--mat-optgroup-label-text-font);line-height:var(--mat-optgroup-label-text-line-height);font-size:var(--mat-optgroup-label-text-size);letter-spacing:var(--mat-optgroup-label-text-tracking);font-weight:var(--mat-optgroup-label-text-weight)}.mat-mdc-optgroup-label{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;padding-left:16px;padding-right:16px;min-height:48px}.mat-mdc-optgroup-label:focus{outline:none}[dir=rtl] .mat-mdc-optgroup-label,.mat-mdc-optgroup-label[dir=rtl]{padding-left:16px;padding-right:16px}.mat-mdc-optgroup-label.mdc-list-item--disabled{opacity:.38}.mat-mdc-optgroup-label .mdc-list-item__primary-text{font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;white-space:normal}\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return MatOptgroup;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Option IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nlet _uniqueIdCounter = 0;\n/** Event object emitted by MatOption when selected or deselected. */\nclass MatOptionSelectionChange {\n constructor( /** Reference to the option that emitted the event. */\n source, /** Whether the change in the option's value was a result of a user action. */\n isUserInput = false) {\n this.source = source;\n this.isUserInput = isUserInput;\n }\n}\n/**\n * Single option inside of a `<mat-select>` element.\n */\nlet MatOption = /*#__PURE__*/(() => {\n class MatOption {\n /** Whether the wrapping component is in multiple selection mode. */\n get multiple() {\n return this._parent && this._parent.multiple;\n }\n /** Whether or not the option is currently selected. */\n get selected() {\n return this._selected;\n }\n /** Whether the option is disabled. */\n get disabled() {\n return this.group && this.group.disabled || this._disabled;\n }\n set disabled(value) {\n this._disabled = value;\n }\n /** Whether ripples for the option are disabled. */\n get disableRipple() {\n return !!(this._parent && this._parent.disableRipple);\n }\n /** Whether to display checkmark for single-selection. */\n get hideSingleSelectionIndicator() {\n return !!(this._parent && this._parent.hideSingleSelectionIndicator);\n }\n constructor(_element, _changeDetectorRef, _parent, group) {\n this._element = _element;\n this._changeDetectorRef = _changeDetectorRef;\n this._parent = _parent;\n this.group = group;\n this._selected = false;\n this._active = false;\n this._disabled = false;\n this._mostRecentViewValue = '';\n /** The unique ID of the option. */\n this.id = `mat-option-${_uniqueIdCounter++}`;\n /** Event emitted when the option is selected or deselected. */\n // tslint:disable-next-line:no-output-on-prefix\n this.onSelectionChange = new EventEmitter();\n /** Emits when the state of the option changes and any parents have to be notified. */\n this._stateChanges = new Subject();\n }\n /**\n * Whether or not the option is currently active and ready to be selected.\n * An active option displays styles as if it is focused, but the\n * focus is actually retained somewhere else. This comes in handy\n * for components like autocomplete where focus must remain on the input.\n */\n get active() {\n return this._active;\n }\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValue() {\n // TODO(kara): Add input property alternative for node envs.\n return (this._text?.nativeElement.textContent || '').trim();\n }\n /** Selects the option. */\n select(emitEvent = true) {\n if (!this._selected) {\n this._selected = true;\n this._changeDetectorRef.markForCheck();\n if (emitEvent) {\n this._emitSelectionChangeEvent();\n }\n }\n }\n /** Deselects the option. */\n deselect(emitEvent = true) {\n if (this._selected) {\n this._selected = false;\n this._changeDetectorRef.markForCheck();\n if (emitEvent) {\n this._emitSelectionChangeEvent();\n }\n }\n }\n /** Sets focus onto this option. */\n focus(_origin, options) {\n // Note that we aren't using `_origin`, but we need to keep it because some internal consumers\n // use `MatOption` in a `FocusKeyManager` and we need it to match `FocusableOption`.\n const element = this._getHostElement();\n if (typeof element.focus === 'function') {\n element.focus(options);\n }\n }\n /**\n * This method sets display styles on the option to make it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setActiveStyles() {\n if (!this._active) {\n this._active = true;\n this._changeDetectorRef.markForCheck();\n }\n }\n /**\n * This method removes display styles on the option that made it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setInactiveStyles() {\n if (this._active) {\n this._active = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n /** Gets the label to be used when determining whether the option should be focused. */\n getLabel() {\n return this.viewValue;\n }\n /** Ensures the option is selected when activated from the keyboard. */\n _handleKeydown(event) {\n if ((event.keyCode === ENTER || event.keyCode === SPACE) && !hasModifierKey(event)) {\n this._selectViaInteraction();\n // Prevent the page from scrolling down and form submits.\n event.preventDefault();\n }\n }\n /**\n * `Selects the option while indicating the selection came from the user. Used to\n * determine if the select's view -> model callback should be invoked.`\n */\n _selectViaInteraction() {\n if (!this.disabled) {\n this._selected = this.multiple ? !this._selected : true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent(true);\n }\n }\n /** Returns the correct tabindex for the option depending on disabled state. */\n // This method is only used by `MatLegacyOption`. Keeping it here to avoid breaking the types.\n // That's because `MatLegacyOption` use `MatOption` type in a few places such as\n // `MatOptionSelectionChange`. It is safe to delete this when `MatLegacyOption` is deleted.\n _getTabIndex() {\n return this.disabled ? '-1' : '0';\n }\n /** Gets the host DOM element. */\n _getHostElement() {\n return this._element.nativeElement;\n }\n ngAfterViewChecked() {\n // Since parent components could be using the option's label to display the selected values\n // (e.g. `mat-select`) and they don't have a way of knowing if the option's label has changed\n // we have to check for changes in the DOM ourselves and dispatch an event. These checks are\n // relatively cheap, however we still limit them only to selected options in order to avoid\n // hitting the DOM too often.\n if (this._selected) {\n const viewValue = this.viewValue;\n if (viewValue !== this._mostRecentViewValue) {\n if (this._mostRecentViewValue) {\n this._stateChanges.next();\n }\n this._mostRecentViewValue = viewValue;\n }\n }\n }\n ngOnDestroy() {\n this._stateChanges.complete();\n }\n /** Emits the selection change event. */\n _emitSelectionChangeEvent(isUserInput = false) {\n this.onSelectionChange.emit(new MatOptionSelectionChange(this, isUserInput));\n }\n static {\n this.ɵfac = function MatOption_Factory(t) {\n return new (t || MatOption)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(MAT_OPTION_PARENT_COMPONENT, 8), i0.ɵɵdirectiveInject(MAT_OPTGROUP, 8));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatOption,\n selectors: [[\"mat-option\"]],\n viewQuery: function MatOption_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(_c2, 7);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._text = _t.first);\n }\n },\n hostAttrs: [\"role\", \"option\", 1, \"mat-mdc-option\", \"mdc-list-item\"],\n hostVars: 11,\n hostBindings: function MatOption_HostBindings(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵlistener(\"click\", function MatOption_click_HostBindingHandler() {\n return ctx._selectViaInteraction();\n })(\"keydown\", function MatOption_keydown_HostBindingHandler($event) {\n return ctx._handleKeydown($event);\n });\n }\n if (rf & 2) {\n i0.ɵɵhostProperty(\"id\", ctx.id);\n i0.ɵɵattribute(\"aria-selected\", ctx.selected)(\"aria-disabled\", ctx.disabled.toString());\n i0.ɵɵclassProp(\"mdc-list-item--selected\", ctx.selected)(\"mat-mdc-option-multiple\", ctx.multiple)(\"mat-mdc-option-active\", ctx.active)(\"mdc-list-item--disabled\", ctx.disabled);\n }\n },\n inputs: {\n value: \"value\",\n id: \"id\",\n disabled: [2, \"disabled\", \"disabled\", booleanAttribute]\n },\n outputs: {\n onSelectionChange: \"onSelectionChange\"\n },\n exportAs: [\"matOption\"],\n standalone: true,\n features: [i0.ɵɵInputTransformsFeature, i0.ɵɵStandaloneFeature],\n ngContentSelectors: _c4,\n decls: 8,\n vars: 5,\n consts: [[\"text\", \"\"], [\"aria-hidden\", \"true\", 1, \"mat-mdc-option-pseudo-checkbox\", 3, \"disabled\", \"state\"], [1, \"mdc-list-item__primary-text\"], [\"state\", \"checked\", \"aria-hidden\", \"true\", \"appearance\", \"minimal\", 1, \"mat-mdc-option-pseudo-checkbox\", 3, \"disabled\"], [1, \"cdk-visually-hidden\"], [\"aria-hidden\", \"true\", \"mat-ripple\", \"\", 1, \"mat-mdc-option-ripple\", \"mat-mdc-focus-indicator\", 3, \"matRippleTrigger\", \"matRippleDisabled\"]],\n template: function MatOption_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojectionDef(_c3);\n i0.ɵɵtemplate(0, MatOption_Conditional_0_Template, 1, 2, \"mat-pseudo-checkbox\", 1);\n i0.ɵɵprojection(1);\n i0.ɵɵelementStart(2, \"span\", 2, 0);\n i0.ɵɵprojection(4, 1);\n i0.ɵɵelementEnd();\n i0.ɵɵtemplate(5, MatOption_Conditional_5_Template, 1, 1, \"mat-pseudo-checkbox\", 3)(6, MatOption_Conditional_6_Template, 2, 1, \"span\", 4);\n i0.ɵɵelement(7, \"div\", 5);\n }\n if (rf & 2) {\n i0.ɵɵconditional(ctx.multiple ? 0 : -1);\n i0.ɵɵadvance(5);\n i0.ɵɵconditional(!ctx.multiple && ctx.selected && !ctx.hideSingleSelectionIndicator ? 5 : -1);\n i0.ɵɵadvance();\n i0.ɵɵconditional(ctx.group && ctx.group._inert ? 6 : -1);\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"matRippleTrigger\", ctx._getHostElement())(\"matRippleDisabled\", ctx.disabled || ctx.disableRipple);\n }\n },\n dependencies: [MatPseudoCheckbox, MatRipple],\n styles: [\".mat-mdc-option{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;padding-left:16px;padding-right:16px;-webkit-user-select:none;user-select:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0);color:var(--mat-option-label-text-color);font-family:var(--mat-option-label-text-font);line-height:var(--mat-option-label-text-line-height);font-size:var(--mat-option-label-text-size);letter-spacing:var(--mat-option-label-text-tracking);font-weight:var(--mat-option-label-text-weight);min-height:48px}.mat-mdc-option:focus{outline:none}[dir=rtl] .mat-mdc-option,.mat-mdc-option[dir=rtl]{padding-left:16px;padding-right:16px}.mat-mdc-option:hover:not(.mdc-list-item--disabled){background-color:var(--mat-option-hover-state-layer-color)}.mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:var(--mat-option-focus-state-layer-color)}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled) .mdc-list-item__primary-text{color:var(--mat-option-selected-state-label-text-color)}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-multiple){background-color:var(--mat-option-selected-state-layer-color)}.mat-mdc-option.mdc-list-item{align-items:center;background:rgba(0,0,0,0)}.mat-mdc-option.mdc-list-item--disabled{cursor:default;pointer-events:none}.mat-mdc-option.mdc-list-item--disabled .mat-mdc-option-pseudo-checkbox,.mat-mdc-option.mdc-list-item--disabled .mdc-list-item__primary-text,.mat-mdc-option.mdc-list-item--disabled>mat-icon{opacity:.38}.mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:32px}[dir=rtl] .mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:16px;padding-right:32px}.mat-mdc-option .mat-icon,.mat-mdc-option .mat-pseudo-checkbox-full{margin-right:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-icon,[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:0;margin-left:16px}.mat-mdc-option .mat-pseudo-checkbox-minimal{margin-left:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-minimal{margin-right:16px;margin-left:0}.mat-mdc-option .mat-mdc-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-option .mdc-list-item__primary-text{white-space:normal;font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;margin-right:auto}[dir=rtl] .mat-mdc-option .mdc-list-item__primary-text{margin-right:0;margin-left:auto}.cdk-high-contrast-active .mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple)::after{content:\\\"\\\";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}[dir=rtl] .cdk-high-contrast-active .mat-mdc-option.mdc-list-item--selected:not(.mat-mdc-option-multiple)::after{right:auto;left:16px}.mat-mdc-option-multiple{--mdc-list-list-item-selected-container-color:var(--mdc-list-list-item-container-color, transparent)}.mat-mdc-option-active .mat-mdc-focus-indicator::before{content:\\\"\\\"}\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return MatOption;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Counts the amount of option group labels that precede the specified option.\n * @param optionIndex Index of the option at which to start counting.\n * @param options Flat list of all of the options.\n * @param optionGroups Flat list of all of the option groups.\n * @docs-private\n */\nfunction _countGroupLabelsBeforeOption(optionIndex, options, optionGroups) {\n if (optionGroups.length) {\n let optionsArray = options.toArray();\n let groups = optionGroups.toArray();\n let groupCounter = 0;\n for (let i = 0; i < optionIndex + 1; i++) {\n if (optionsArray[i].group && optionsArray[i].group === groups[groupCounter]) {\n groupCounter++;\n }\n }\n return groupCounter;\n }\n return 0;\n}\n/**\n * Determines the position to which to scroll a panel in order for an option to be into view.\n * @param optionOffset Offset of the option from the top of the panel.\n * @param optionHeight Height of the options.\n * @param currentScrollPosition Current scroll position of the panel.\n * @param panelHeight Height of the panel.\n * @docs-private\n */\nfunction _getOptionScrollPosition(optionOffset, optionHeight, currentScrollPosition, panelHeight) {\n if (optionOffset < currentScrollPosition) {\n return optionOffset;\n }\n if (optionOffset + optionHeight > currentScrollPosition + panelHeight) {\n return Math.max(0, optionOffset - panelHeight + optionHeight);\n }\n return currentScrollPosition;\n}\nlet MatOptionModule = /*#__PURE__*/(() => {\n class MatOptionModule {\n static {\n this.ɵfac = function MatOptionModule_Factory(t) {\n return new (t || MatOptionModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatOptionModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [MatRippleModule, MatCommonModule, MatPseudoCheckboxModule]\n });\n }\n }\n return MatOptionModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** The options for the MatRippleLoader's event listeners. */\nconst eventListenerOptions = {\n capture: true\n};\n/**\n * The events that should trigger the initialization of the ripple.\n * Note that we use `mousedown`, rather than `click`, for mouse devices because\n * we can't rely on `mouseenter` in the shadow DOM and `click` happens too late.\n */\nconst rippleInteractionEvents = ['focus', 'mousedown', 'mouseenter', 'touchstart'];\n/** The attribute attached to a component whose ripple has not yet been initialized. */\nconst matRippleUninitialized = 'mat-ripple-loader-uninitialized';\n/** Additional classes that should be added to the ripple when it is rendered. */\nconst matRippleClassName = 'mat-ripple-loader-class-name';\n/** Whether the ripple should be centered. */\nconst matRippleCentered = 'mat-ripple-loader-centered';\n/** Whether the ripple should be disabled. */\nconst matRippleDisabled = 'mat-ripple-loader-disabled';\n/**\n * Handles attaching ripples on demand.\n *\n * This service allows us to avoid eagerly creating & attaching MatRipples.\n * It works by creating & attaching a ripple only when a component is first interacted with.\n *\n * @docs-private\n */\nlet MatRippleLoader = /*#__PURE__*/(() => {\n class MatRippleLoader {\n constructor() {\n this._document = inject(DOCUMENT, {\n optional: true\n });\n this._animationMode = inject(ANIMATION_MODULE_TYPE, {\n optional: true\n });\n this._globalRippleOptions = inject(MAT_RIPPLE_GLOBAL_OPTIONS, {\n optional: true\n });\n this._platform = inject(Platform);\n this._ngZone = inject(NgZone);\n this._hosts = new Map();\n /**\n * Handles creating and attaching component internals\n * when a component is initially interacted with.\n */\n this._onInteraction = event => {\n const eventTarget = _getEventTarget(event);\n if (eventTarget instanceof HTMLElement) {\n // TODO(wagnermaciel): Consider batching these events to improve runtime performance.\n const element = eventTarget.closest(`[${matRippleUninitialized}=\"${this._globalRippleOptions?.namespace ?? ''}\"]`);\n if (element) {\n this._createRipple(element);\n }\n }\n };\n this._ngZone.runOutsideAngular(() => {\n for (const event of rippleInteractionEvents) {\n this._document?.addEventListener(event, this._onInteraction, eventListenerOptions);\n }\n });\n }\n ngOnDestroy() {\n const hosts = this._hosts.keys();\n for (const host of hosts) {\n this.destroyRipple(host);\n }\n for (const event of rippleInteractionEvents) {\n this._document?.removeEventListener(event, this._onInteraction, eventListenerOptions);\n }\n }\n /**\n * Configures the ripple that will be rendered by the ripple loader.\n *\n * Stores the given information about how the ripple should be configured on the host\n * element so that it can later be retrived & used when the ripple is actually created.\n */\n configureRipple(host, config) {\n // Indicates that the ripple has not yet been rendered for this component.\n host.setAttribute(matRippleUninitialized, this._globalRippleOptions?.namespace ?? '');\n // Store the additional class name(s) that should be added to the ripple element.\n if (config.className || !host.hasAttribute(matRippleClassName)) {\n host.setAttribute(matRippleClassName, config.className || '');\n }\n // Store whether the ripple should be centered.\n if (config.centered) {\n host.setAttribute(matRippleCentered, '');\n }\n if (config.disabled) {\n host.setAttribute(matRippleDisabled, '');\n }\n }\n /** Returns the ripple instance for the given host element. */\n getRipple(host) {\n const ripple = this._hosts.get(host);\n return ripple || this._createRipple(host);\n }\n /** Sets the disabled state on the ripple instance corresponding to the given host element. */\n setDisabled(host, disabled) {\n const ripple = this._hosts.get(host);\n // If the ripple has already been instantiated, just disable it.\n if (ripple) {\n ripple.disabled = disabled;\n return;\n }\n // Otherwise, set an attribute so we know what the\n // disabled state should be when the ripple is initialized.\n if (disabled) {\n host.setAttribute(matRippleDisabled, '');\n } else {\n host.removeAttribute(matRippleDisabled);\n }\n }\n /** Creates a MatRipple and appends it to the given element. */\n _createRipple(host) {\n if (!this._document) {\n return;\n }\n const existingRipple = this._hosts.get(host);\n if (existingRipple) {\n return existingRipple;\n }\n // Create the ripple element.\n host.querySelector('.mat-ripple')?.remove();\n const rippleEl = this._document.createElement('span');\n rippleEl.classList.add('mat-ripple', host.getAttribute(matRippleClassName));\n host.append(rippleEl);\n // Create the MatRipple.\n const ripple = new MatRipple(new ElementRef(rippleEl), this._ngZone, this._platform, this._globalRippleOptions ? this._globalRippleOptions : undefined, this._animationMode ? this._animationMode : undefined);\n ripple._isInitialized = true;\n ripple.trigger = host;\n ripple.centered = host.hasAttribute(matRippleCentered);\n ripple.disabled = host.hasAttribute(matRippleDisabled);\n this.attachRipple(host, ripple);\n return ripple;\n }\n attachRipple(host, ripple) {\n host.removeAttribute(matRippleUninitialized);\n this._hosts.set(host, ripple);\n }\n destroyRipple(host) {\n const ripple = this._hosts.get(host);\n if (ripple) {\n // Since this directive is created manually, it needs to be destroyed manually too.\n // tslint:disable-next-line:no-lifecycle-invocation\n ripple.ngOnDestroy();\n this._hosts.delete(host);\n }\n }\n static {\n this.ɵfac = function MatRippleLoader_Factory(t) {\n return new (t || MatRippleLoader)();\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: MatRippleLoader,\n factory: MatRippleLoader.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return MatRippleLoader;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Internal shared component used as a container in form field controls.\n * Not to be confused with `mat-form-field` which MDC calls a \"text field\".\n * @docs-private\n */\nlet _MatInternalFormField = /*#__PURE__*/(() => {\n class _MatInternalFormField {\n static {\n this.ɵfac = function _MatInternalFormField_Factory(t) {\n return new (t || _MatInternalFormField)();\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: _MatInternalFormField,\n selectors: [[\"div\", \"mat-internal-form-field\", \"\"]],\n hostAttrs: [1, \"mdc-form-field\", \"mat-internal-form-field\"],\n hostVars: 2,\n hostBindings: function _MatInternalFormField_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵclassProp(\"mdc-form-field--align-end\", ctx.labelPosition === \"before\");\n }\n },\n inputs: {\n labelPosition: \"labelPosition\"\n },\n standalone: true,\n features: [i0.ɵɵStandaloneFeature],\n attrs: _c5,\n ngContentSelectors: _c6,\n decls: 1,\n vars: 0,\n template: function _MatInternalFormField_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojectionDef();\n i0.ɵɵprojection(0);\n }\n },\n styles: [\".mdc-form-field{display:inline-flex;align-items:center;vertical-align:middle}.mdc-form-field[hidden]{display:none}.mdc-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mdc-form-field>label,.mdc-form-field>label[dir=rtl]{margin-left:auto;margin-right:0}[dir=rtl] .mdc-form-field>label,.mdc-form-field>label[dir=rtl]{padding-left:0;padding-right:4px}.mdc-form-field--nowrap>label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end>label,.mdc-form-field--align-end>label[dir=rtl]{margin-left:0;margin-right:auto}[dir=rtl] .mdc-form-field--align-end>label,.mdc-form-field--align-end>label[dir=rtl]{padding-left:4px;padding-right:0}.mdc-form-field--space-between{justify-content:space-between}.mdc-form-field--space-between>label{margin:0}[dir=rtl] .mdc-form-field--space-between>label,.mdc-form-field--space-between>label[dir=rtl]{margin:0}.mat-internal-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return _MatInternalFormField;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { AnimationCurves, AnimationDurations, DateAdapter, ErrorStateMatcher, MATERIAL_SANITY_CHECKS, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MAT_DATE_LOCALE_FACTORY, MAT_NATIVE_DATE_FORMATS, MAT_OPTGROUP, MAT_OPTION_PARENT_COMPONENT, MAT_RIPPLE_GLOBAL_OPTIONS, MatCommonModule, MatLine, MatLineModule, MatNativeDateModule, MatOptgroup, MatOption, MatOptionModule, MatOptionSelectionChange, MatPseudoCheckbox, MatPseudoCheckboxModule, MatRipple, MatRippleLoader, MatRippleModule, NativeDateAdapter, NativeDateModule, RippleRef, RippleRenderer, RippleState, ShowOnDirtyErrorStateMatcher, VERSION, _ErrorStateTracker, _MatInternalFormField, _countGroupLabelsBeforeOption, _getOptionScrollPosition, defaultRippleAnimationConfig, mixinColor, mixinDisableRipple, mixinDisabled, mixinErrorState, mixinInitialized, mixinTabIndex, provideNativeDateAdapter, setLines };\n"],"mappings":"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","names":["shouldIgnoreRecord","record","i","MutationObserverFactory","_MutationObserverFactory","callback","t","ɵɵdefineInjectable","ContentObserver","_ContentObserver","_mutationObserverFactory","inject","NgZone","_","element","elementOrRef","coerceElement","Observable","observer","subscription","map","records","filter","stream","Subject","mutations","ɵɵinject","CdkObserveContent","_CdkObserveContent","value","coerceNumberProperty","_contentObserver","_elementRef","EventEmitter","debounceTime","ɵɵdirectiveInject","ElementRef","ɵɵdefineDirective","booleanAttribute","ɵɵInputTransformsFeature","ObserversModule","_ObserversModule","ɵɵdefineNgModule","ɵɵdefineInjector","hasModifierKey","event","modifiers","modifier","ID_DELIMITER","addAriaReferencedId","el","attr","id","ids","getAriaReferenceIds","existingId","removeAriaReferencedId","filteredIds","val","CDK_DESCRIBEDBY_ID_PREFIX","CDK_DESCRIBEDBY_HOST_ATTRIBUTE","nextId","AriaDescriber","_AriaDescriber","_document","_platform","inject","APP_ID","hostElement","message","role","key","getKey","setMessageId","registeredMessage","describedElements","messageElement","containerClassName","serverContainers","i","messagesContainer","element","originalReferenceIds","getAriaReferenceIds","id","addAriaReferencedId","removeAriaReferencedId","referenceIds","messageId","trimmedMessage","ariaLabel","t","ɵɵinject","DOCUMENT","Platform","ɵɵdefineInjectable","serviceId","ListKeyManager","_items","injector","Subject","Subscription","item","QueryList","newItems","isSignal","effect","predicate","shouldWrap","enabled","direction","keys","debounceInterval","tap","letter","debounceTime","filter","map","inputString","items","index","delta","previousActiveItem","event","keyCode","isModifierAllowed","modifier","targetIndex","itemsLength","hasModifierKey","itemArray","activeItem","fallbackDelta","newIndex","ActiveDescendantKeyManager","FocusKeyManager","origin","InteractivityChecker","_InteractivityChecker","_platform","element","hasGeometry","frameElement","getFrameElement","getWindow","getTabIndexValue","nodeName","tabIndexValue","isPotentiallyTabbableIOS","config","isPotentiallyFocusable","t","ɵɵinject","Platform","ɵɵdefineInjectable","window","isNativeFormElement","isHiddenInput","isInputElement","isAnchorWithHref","isAnchorElement","hasValidTabIndex","tabIndex","inputType","node","FocusTrap","value","_element","_checker","_ngZone","_document","deferAnchors","_injector","startAnchor","endAnchor","options","resolve","bound","markers","redirectToElement","focusableChild","root","children","i","tabbableChild","anchor","isEnabled","enabled","fn","afterNextRender","take","FocusTrapFactory","_FocusTrapFactory","inject","Injector","deferCaptureElements","NgZone","DOCUMENT","CdkTrapFocus","_CdkTrapFocus","_elementRef","_focusTrapFactory","changes","autoCaptureChange","_getFocusedElementPierceShadowDom","ɵɵdirectiveInject","ElementRef","ɵɵdefineDirective","booleanAttribute","ɵɵInputTransformsFeature","ɵɵNgOnChangesFeature","isFakeMousedownFromScreenReader","event","isFakeTouchstartFromScreenReader","touch","INPUT_MODALITY_DETECTOR_OPTIONS","InjectionToken","INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS","TOUCH_BUFFER_MS","modalityEventListenerOptions","normalizePassiveListenerOptions","InputModalityDetector","_InputModalityDetector","_platform","ngZone","document","options","BehaviorSubject","keyCode","_getEventTarget","__spreadValues","skip","distinctUntilChanged","t","ɵɵinject","Platform","NgZone","DOCUMENT","ɵɵdefineInjectable","LIVE_ANNOUNCER_ELEMENT_TOKEN","LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY","LIVE_ANNOUNCER_DEFAULT_OPTIONS","uniqueIds","LiveAnnouncer","_LiveAnnouncer","elementToken","_ngZone","_document","_defaultOptions","message","args","defaultOptions","politeness","duration","resolve","elementClass","previousElements","liveEl","i","id","modals","modal","ariaOwns","FocusMonitorDetectionMode","FOCUS_MONITOR_DEFAULT_OPTIONS","InjectionToken","captureEventListenerOptions","normalizePassiveListenerOptions","FocusMonitor","_FocusMonitor","_ngZone","_platform","_inputModalityDetector","document","options","Subject","event","target","_getEventTarget","element","checkChildren","nativeElement","coerceElement","of","rootNode","_getShadowRoot","cachedInfo","info","elementInfo","origin","focusedElement","currentElement","_info","focusEventTarget","isFromInteraction","ms","TOUCH_BUFFER_MS","rootNodeFocusListeners","takeUntil","modality","results","mostRecentTarget","mostRecentModality","labels","i","t","ɵɵinject","NgZone","Platform","InputModalityDetector","DOCUMENT","ɵɵdefineInjectable","CdkMonitorFocus","_CdkMonitorFocus","_elementRef","_focusMonitor","EventEmitter","ɵɵdirectiveInject","ElementRef","ɵɵdefineDirective","HighContrastMode","BLACK_ON_WHITE_CSS_CLASS","WHITE_ON_BLACK_CSS_CLASS","HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS","HighContrastModeDetector","_HighContrastModeDetector","inject","BreakpointObserver","testElement","documentWindow","computedStyle","computedColor","bodyClasses","mode","A11yModule","_A11yModule","highContrastModeDetector","ɵɵdefineNgModule","ɵɵdefineInjector","ObserversModule","_c2","_c3","_c4","MatOption_Conditional_0_Template","rf","ctx","ɵɵelement","ctx_r0","ɵɵnextContext","ɵɵproperty","MatOption_Conditional_5_Template","MatOption_Conditional_6_Template","ɵɵelementStart","ɵɵtext","ɵɵelementEnd","ɵɵadvance","ɵɵtextInterpolate1","_c5","_c6","MATERIAL_SANITY_CHECKS_FACTORY","MATERIAL_SANITY_CHECKS","InjectionToken","MatCommonModule","_MatCommonModule","highContrastModeDetector","_sanityChecks","_document","name","_isTestEnvironment","t","ɵɵinject","HighContrastModeDetector","DOCUMENT","ɵɵdefineNgModule","ɵɵdefineInjector","BidiModule","mixinColor","base","defaultColor","value","colorPalette","args","_ErrorStateTracker","_defaultMatcher","ngControl","_parentFormGroup","_parentForm","_stateChanges","oldState","parent","matcher","control","newState","mixinErrorState","base","value","args","MAT_DATE_LOCALE","InjectionToken","MAT_DATE_LOCALE_FACTORY","inject","LOCALE_ID","DateAdapter","Subject","obj","value","locale","first","second","firstValid","secondValid","date","min","max","MAT_DATE_FORMATS","ISO_8601_REGEX","range","length","valueFunction","valuesArray","i","NativeDateAdapter","_NativeDateAdapter","matDateLocale","style","dtf","year","month","result","parseFormat","displayFormat","__spreadProps","__spreadValues","years","months","newDate","days","d","n","t","ɵɵinject","ɵɵdefineInjectable","MAT_NATIVE_DATE_FORMATS","MatNativeDateModule","_MatNativeDateModule","t","ɵɵdefineNgModule","ɵɵdefineInjector","provideNativeDateAdapter","formats","MAT_NATIVE_DATE_FORMATS","DateAdapter","NativeDateAdapter","MAT_DATE_FORMATS","ErrorStateMatcher","_ErrorStateMatcher","control","form","t","ɵɵdefineInjectable","RippleState","RippleRef","_renderer","element","config","_animationForciblyDisabledThroughCss","passiveCapturingEventOptions$1","normalizePassiveListenerOptions","RippleEventManager","event","target","_getEventTarget","handlers","handler","ngZone","name","handlersForEvent","handlersForElement","defaultRippleAnimationConfig","ignoreMouseEventsTimeout","passiveCapturingEventOptions","pointerDownEvents","pointerUpEvents","_RippleRenderer","_target","_ngZone","elementOrElementRef","_platform","coerceElement","x","y","containerRect","animationConfig","__spreadValues","radius","distanceToFurthestCorner","offsetX","offsetY","enterDuration","ripple","computedStyles","userTransitionProperty","userTransitionDuration","animationForciblyDisabledThroughCss","rippleRef","eventListeners","onTransitionEnd","onTransitionCancel","rippleEl","type","isMostRecentTransientRipple","persistent","isFakeMousedown","isFakeMousedownFromScreenReader","isSyntheticEvent","isFakeTouchstartFromScreenReader","touches","i","isVisible","trigger","RippleRenderer","rect","distX","distY","MAT_RIPPLE_GLOBAL_OPTIONS","InjectionToken","MatRipple","_MatRipple","value","_elementRef","platform","globalOptions","_animationMode","configOrX","t","ɵɵdirectiveInject","ElementRef","NgZone","Platform","ANIMATION_MODULE_TYPE","ɵɵdefineDirective","rf","ctx","ɵɵclassProp","MatRippleModule","_MatRippleModule","ɵɵdefineNgModule","ɵɵdefineInjector","MatCommonModule","MatPseudoCheckbox","_MatPseudoCheckbox","ɵɵdefineComponent","ɵɵStandaloneFeature","MatPseudoCheckboxModule","_MatPseudoCheckboxModule","MAT_OPTION_PARENT_COMPONENT","MAT_OPTGROUP","InjectionToken","_uniqueIdCounter","MatOptionSelectionChange","source","isUserInput","MatOption","_MatOption","value","_element","_changeDetectorRef","_parent","group","EventEmitter","Subject","emitEvent","_origin","options","element","event","hasModifierKey","viewValue","t","ɵɵdirectiveInject","ElementRef","ChangeDetectorRef","MAT_OPTION_PARENT_COMPONENT","MAT_OPTGROUP","ɵɵdefineComponent","rf","ctx","ɵɵviewQuery","_c2","_t","ɵɵqueryRefresh","ɵɵloadQuery","ɵɵlistener","$event","ɵɵhostProperty","ɵɵattribute","ɵɵclassProp","booleanAttribute","ɵɵInputTransformsFeature","ɵɵStandaloneFeature","_c4","ɵɵprojectionDef","_c3","ɵɵtemplate","MatOption_Conditional_0_Template","ɵɵprojection","ɵɵelementStart","ɵɵelementEnd","MatOption_Conditional_5_Template","MatOption_Conditional_6_Template","ɵɵelement","ɵɵconditional","ɵɵadvance","ɵɵproperty","MatPseudoCheckbox","MatRipple","_countGroupLabelsBeforeOption","optionIndex","optionGroups","optionsArray","groups","groupCounter","i","_getOptionScrollPosition","optionOffset","optionHeight","currentScrollPosition","panelHeight","MatOptionModule","_MatOptionModule","ɵɵdefineNgModule","ɵɵdefineInjector","MatRippleModule","MatCommonModule","MatPseudoCheckboxModule","eventListenerOptions","rippleInteractionEvents","matRippleUninitialized","matRippleClassName","matRippleCentered","matRippleDisabled","MatRippleLoader","_MatRippleLoader","inject","DOCUMENT","ANIMATION_MODULE_TYPE","MAT_RIPPLE_GLOBAL_OPTIONS","Platform","NgZone","eventTarget","_getEventTarget","hosts","host","config","disabled","ripple","existingRipple","rippleEl","ɵɵdefineInjectable","_MatInternalFormField","__MatInternalFormField","_c5","_c6"],"x_google_ignoreList":[0,1,2,3]}