{"version":3,"file":"tabs.bundle.mjs","sources":["../../../../src/govuk/common/index.mjs","../../../../src/govuk/errors/index.mjs","../../../../src/govuk/component.mjs","../../../../src/govuk/components/tabs/tabs.mjs"],"sourcesContent":["/**\n * Common helpers which do not require polyfill.\n *\n * IMPORTANT: If a helper require a polyfill, please isolate it in its own module\n * so that the polyfill can be properly tree-shaken and does not burden\n * the components that do not need that helper\n */\n\n/**\n * Get GOV.UK Frontend breakpoint value from CSS custom property\n *\n * @private\n * @param {string} name - Breakpoint name\n * @returns {{ property: string, value?: string }} Breakpoint object\n */\nexport function getBreakpoint(name) {\n  const property = `--govuk-breakpoint-${name}`\n\n  // Get value from `<html>` with breakpoints on CSS :root\n  const value = window\n    .getComputedStyle(document.documentElement)\n    .getPropertyValue(property)\n\n  return {\n    property,\n    value: value || undefined\n  }\n}\n\n/**\n * Move focus to element\n *\n * Sets tabindex to -1 to make the element programmatically focusable,\n * but removes it on blur as the element doesn't need to be focused again.\n *\n * @private\n * @template {HTMLElement} FocusElement\n * @param {FocusElement} $element - HTML element\n * @param {object} [options] - Handler options\n * @param {function(this: FocusElement): void} [options.onBeforeFocus] - Callback before focus\n * @param {function(this: FocusElement): void} [options.onBlur] - Callback on blur\n */\nexport function setFocus($element, options = {}) {\n  const isFocusable = $element.getAttribute('tabindex')\n\n  if (!isFocusable) {\n    $element.setAttribute('tabindex', '-1')\n  }\n\n  /**\n   * Handle element focus\n   */\n  function onFocus() {\n    $element.addEventListener('blur', onBlur, { once: true })\n  }\n\n  /**\n   * Handle element blur\n   */\n  function onBlur() {\n    options.onBlur?.call($element)\n\n    if (!isFocusable) {\n      $element.removeAttribute('tabindex')\n    }\n  }\n\n  // Add listener to reset element on blur, after focus\n  $element.addEventListener('focus', onFocus, { once: true })\n\n  // Focus element\n  options.onBeforeFocus?.call($element)\n  $element.focus()\n}\n\n/**\n * Checks if component is already initialised\n *\n * @internal\n * @param {Element} $root - HTML element to be checked\n * @param {string} moduleName - name of component module\n * @returns {boolean} Whether component is already initialised\n */\nexport function isInitialised($root, moduleName) {\n  return (\n    $root instanceof HTMLElement &&\n    $root.hasAttribute(`data-${moduleName}-init`)\n  )\n}\n\n/**\n * Checks if GOV.UK Frontend is supported on this page\n *\n * Some browsers will load and run our JavaScript but GOV.UK Frontend\n * won't be supported.\n *\n * @param {HTMLElement | null} [$scope] - (internal) `<body>` HTML element checked for browser support\n * @returns {boolean} Whether GOV.UK Frontend is supported on this page\n */\nexport function isSupported($scope = document.body) {\n  if (!$scope) {\n    return false\n  }\n\n  return $scope.classList.contains('govuk-frontend-supported')\n}\n\n/**\n * Check for an array\n *\n * @internal\n * @param {unknown} option - Option to check\n * @returns {boolean} Whether the option is an array\n */\nfunction isArray(option) {\n  return Array.isArray(option)\n}\n\n/**\n * Check for an object\n *\n * @internal\n * @template {Partial<Record<keyof ObjectType, unknown>>} ObjectType\n * @param {unknown | ObjectType} option - Option to check\n * @returns {option is ObjectType} Whether the option is an object\n */\nexport function isObject(option) {\n  return !!option && typeof option === 'object' && !isArray(option)\n}\n\n/**\n * Check for valid scope\n *\n * @internal\n * @template {Element | Document} ScopeType\n * @param {unknown | ScopeType} $scope - Scope of the document to search within\n * @returns {$scope is ScopeType} Whether the scope can be queried\n */\nexport function isScope($scope) {\n  return !!$scope && ($scope instanceof Element || $scope instanceof Document)\n}\n\n/**\n * Format error message\n *\n * @internal\n * @param {ComponentWithModuleName} Component - Component that threw the error\n * @param {string} message - Error message\n * @returns {string} - Formatted error message\n */\nexport function formatErrorMessage(Component, message) {\n  return `${Component.moduleName}: ${message}`\n}\n\n/* eslint-disable jsdoc/valid-types --\n * `{new(...args: any[] ): object}` is not recognised as valid\n * https://github.com/gajus/eslint-plugin-jsdoc/issues/145#issuecomment-1308722878\n * https://github.com/jsdoc-type-pratt-parser/jsdoc-type-pratt-parser/issues/131\n **/\n\n/**\n * @typedef ComponentWithModuleName\n * @property {string} moduleName - Name of the component\n */\n\n/* eslint-enable jsdoc/valid-types */\n","import { formatErrorMessage, isObject } from '../common/index.mjs'\n\n/**\n * GOV.UK Frontend error\n *\n * A base class for `Error`s thrown by GOV.UK Frontend.\n *\n * It is meant to be extended into specific types of errors\n * to be thrown by our code.\n *\n * @example\n * ```js\n * class MissingRootError extends GOVUKFrontendError {\n *   // Setting an explicit name is important as extending the class will not\n *   // set a new `name` on the subclass. The `name` property is important\n *   // to ensure intelligible error names even if the class name gets\n *   // mangled by a minifier\n *   name = \"MissingRootError\"\n * }\n * ```\n * @virtual\n */\nexport class GOVUKFrontendError extends Error {\n  name = 'GOVUKFrontendError'\n}\n\n/**\n * Indicates that GOV.UK Frontend is not supported\n */\nexport class SupportError extends GOVUKFrontendError {\n  name = 'SupportError'\n\n  /**\n   * Checks if GOV.UK Frontend is supported on this page\n   *\n   * @param {HTMLElement | null} [$scope] - HTML element `<body>` checked for browser support\n   */\n  constructor($scope = document.body) {\n    const supportMessage =\n      'noModule' in HTMLScriptElement.prototype\n        ? 'GOV.UK Frontend initialised without `<body class=\"govuk-frontend-supported\">` from template `<script>` snippet'\n        : 'GOV.UK Frontend is not supported in this browser'\n\n    super(\n      $scope\n        ? supportMessage\n        : 'GOV.UK Frontend initialised without `<script type=\"module\">`'\n    )\n  }\n}\n\n/**\n * Indicates that a component has received an illegal configuration\n */\nexport class ConfigError extends GOVUKFrontendError {\n  name = 'ConfigError'\n}\n\n/**\n * Indicates an issue with an element (possibly `null` or `undefined`)\n */\nexport class ElementError extends GOVUKFrontendError {\n  name = 'ElementError'\n\n  /**\n   * @internal\n   * @overload\n   * @param {string} message - Element error message\n   */\n\n  /**\n   * @internal\n   * @overload\n   * @param {ElementErrorOptions} options - Element error options\n   */\n\n  /**\n   * @internal\n   * @param {string | ElementErrorOptions} messageOrOptions - Element error message or options\n   */\n  constructor(messageOrOptions) {\n    let message = typeof messageOrOptions === 'string' ? messageOrOptions : ''\n\n    // Build message from options\n    if (isObject(messageOrOptions)) {\n      const { component, identifier, element, expectedType } = messageOrOptions\n\n      message = identifier\n\n      // Append reason\n      message += element\n        ? ` is not of type ${expectedType ?? 'HTMLElement'}`\n        : ' not found'\n\n      // Prepend with module name (optional)\n      if (component) {\n        message = formatErrorMessage(component, message)\n      }\n    }\n\n    super(message)\n  }\n}\n\n/**\n * Indicates that a component is already initialised\n */\nexport class InitError extends GOVUKFrontendError {\n  name = 'InitError'\n\n  /**\n   * @internal\n   * @param {ComponentWithModuleName | string} componentOrMessage - name of the component module\n   */\n  constructor(componentOrMessage) {\n    const message =\n      typeof componentOrMessage === 'string'\n        ? componentOrMessage\n        : formatErrorMessage(\n            componentOrMessage,\n            `Root element (\\`$root\\`) already initialised`\n          )\n\n    super(message)\n  }\n}\n\n/**\n * Element error options\n *\n * @internal\n * @typedef {object} ElementErrorOptions\n * @property {Element | Document | null} [element] - The element in error (optional)\n * @property {ComponentWithModuleName} [component] - Component throwing the error (optional)\n * @property {string} identifier - An identifier that'll let the user understand which element has an error. This is whatever makes the most sense\n * @property {string} [expectedType] - The type that was expected for the identifier (optional)\n */\n\n/**\n * @import { ComponentWithModuleName } from '../common/index.mjs'\n */\n","import { isInitialised, isSupported } from './common/index.mjs'\nimport { ElementError, InitError, SupportError } from './errors/index.mjs'\n\n/**\n * Base Component class\n *\n * Centralises the behaviours shared by our components\n *\n * @virtual\n * @template {Element} [RootElementType=HTMLElement]\n */\nexport class Component {\n  /**\n   * @type {typeof Element}\n   */\n  static elementType = HTMLElement\n\n  // allows Typescript user to work around the lack of types\n  // in GOVUKFrontend package, Typescript is not aware of $root\n  // in components that extend GOVUKFrontendComponent\n  /**\n   * Returns the root element of the component\n   *\n   * @protected\n   * @returns {RootElementType} - the root element of component\n   */\n  get $root() {\n    return this._$root\n  }\n\n  /**\n   * @protected\n   * @type {RootElementType}\n   */\n  _$root\n\n  /**\n   * Constructs a new component, validating that GOV.UK Frontend is supported\n   *\n   * @internal\n   * @param {Element | null} [$root] - HTML element to use for component\n   */\n  constructor($root) {\n    const childConstructor = /** @type {ChildClassConstructor} */ (\n      this.constructor\n    )\n\n    // TypeScript does not enforce that inheriting classes will define a `moduleName`\n    // (even if we add a `@virtual` `static moduleName` property to this class).\n    // While we trust users to do this correctly, we do a little check to provide them\n    // a helpful error message.\n    //\n    // After this, we'll be sure that `childConstructor` has a `moduleName`\n    // as expected of the `ChildClassConstructor` we've cast `this.constructor` to.\n    if (typeof childConstructor.moduleName !== 'string') {\n      throw new InitError(`\\`moduleName\\` not defined in component`)\n    }\n\n    if (!($root instanceof childConstructor.elementType)) {\n      throw new ElementError({\n        element: $root,\n        component: childConstructor,\n        identifier: 'Root element (`$root`)',\n        expectedType: childConstructor.elementType.name\n      })\n    } else {\n      this._$root = /** @type {RootElementType} */ ($root)\n    }\n\n    childConstructor.checkSupport()\n\n    this.checkInitialised()\n\n    const moduleName = childConstructor.moduleName\n\n    this.$root.setAttribute(`data-${moduleName}-init`, '')\n  }\n\n  /**\n   * Validates whether component is already initialised\n   *\n   * @private\n   * @throws {InitError} when component is already initialised\n   */\n  checkInitialised() {\n    const constructor = /** @type {ChildClassConstructor} */ (this.constructor)\n    const moduleName = constructor.moduleName\n\n    if (moduleName && isInitialised(this.$root, moduleName)) {\n      throw new InitError(constructor)\n    }\n  }\n\n  /**\n   * Validates whether components are supported\n   *\n   * @throws {SupportError} when the components are not supported\n   */\n  static checkSupport() {\n    if (!isSupported()) {\n      throw new SupportError()\n    }\n  }\n}\n\n/**\n * @typedef ChildClass\n * @property {string} moduleName - The module name that'll be looked for in the DOM when initialising the component\n */\n\n/**\n * @typedef {typeof Component & ChildClass} ChildClassConstructor\n */\n","import { getBreakpoint } from '../../common/index.mjs'\nimport { Component } from '../../component.mjs'\nimport { ElementError } from '../../errors/index.mjs'\n\n/**\n * Tabs component\n *\n * @preserve\n */\nexport class Tabs extends Component {\n  /** @private */\n  $tabs\n\n  /** @private */\n  $tabList\n\n  /** @private */\n  $tabListItems\n\n  /** @private */\n  jsHiddenClass = 'govuk-tabs__panel--hidden'\n\n  /** @private */\n  changingHash = false\n\n  /** @private */\n  boundTabClick\n\n  /** @private */\n  boundTabKeydown\n\n  /** @private */\n  boundOnHashChange\n\n  /**\n   * @private\n   * @type {MediaQueryList | null}\n   */\n  mql = null\n\n  /**\n   * @param {Element | null} $root - HTML element to use for tabs\n   */\n  constructor($root) {\n    super($root)\n\n    const $tabs = this.$root.querySelectorAll('a.govuk-tabs__tab')\n    if (!$tabs.length) {\n      throw new ElementError({\n        component: Tabs,\n        identifier: 'Links (`<a class=\"govuk-tabs__tab\">`)'\n      })\n    }\n\n    this.$tabs = $tabs\n\n    // Save bound functions so we can remove event listeners during teardown\n    this.boundTabClick = this.onTabClick.bind(this)\n    this.boundTabKeydown = this.onTabKeydown.bind(this)\n    this.boundOnHashChange = this.onHashChange.bind(this)\n\n    const $tabList = this.$root.querySelector('.govuk-tabs__list')\n    const $tabListItems = this.$root.querySelectorAll(\n      'li.govuk-tabs__list-item'\n    )\n\n    if (!$tabList) {\n      throw new ElementError({\n        component: Tabs,\n        identifier: 'List (`<ul class=\"govuk-tabs__list\">`)'\n      })\n    }\n\n    if (!$tabListItems.length) {\n      throw new ElementError({\n        component: Tabs,\n        identifier: 'List items (`<li class=\"govuk-tabs__list-item\">`)'\n      })\n    }\n\n    this.$tabList = $tabList\n    this.$tabListItems = $tabListItems\n\n    this.setupResponsiveChecks()\n  }\n\n  /**\n   * Setup viewport resize check\n   *\n   * @private\n   */\n  setupResponsiveChecks() {\n    const breakpoint = getBreakpoint('tablet')\n\n    if (!breakpoint.value) {\n      throw new ElementError({\n        component: Tabs,\n        identifier: `CSS custom property (\\`${breakpoint.property}\\`) on pseudo-class \\`:root\\``\n      })\n    }\n\n    // Media query list for GOV.UK Frontend tablet breakpoint\n    this.mql = window.matchMedia(`(min-width: ${breakpoint.value})`)\n\n    // MediaQueryList.addEventListener isn't supported by Safari < 14 so we need\n    // to be able to fall back to the deprecated MediaQueryList.addListener\n    if ('addEventListener' in this.mql) {\n      this.mql.addEventListener('change', () => this.checkMode())\n    } else {\n      // @ts-expect-error Property 'addListener' does not exist\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n      this.mql.addListener(() => this.checkMode())\n    }\n\n    this.checkMode()\n  }\n\n  /**\n   * Setup or teardown handler for viewport resize check\n   *\n   * @private\n   */\n  checkMode() {\n    if (this.mql?.matches) {\n      this.setup()\n    } else {\n      this.teardown()\n    }\n  }\n\n  /**\n   * Setup tab component\n   *\n   * @private\n   */\n  setup() {\n    this.$tabList.setAttribute('role', 'tablist')\n\n    this.$tabListItems.forEach(($item) => {\n      $item.setAttribute('role', 'presentation')\n    })\n\n    this.$tabs.forEach(($tab) => {\n      // Set HTML attributes\n      this.setAttributes($tab)\n\n      // Handle events\n      $tab.addEventListener('click', this.boundTabClick, true)\n      $tab.addEventListener('keydown', this.boundTabKeydown, true)\n\n      // Remove old active panels\n      this.hideTab($tab)\n    })\n\n    // Show either the active tab according to the URL's hash or the first tab\n    const $activeTab = this.getTab(window.location.hash) ?? this.$tabs[0]\n\n    this.showTab($activeTab)\n\n    // Handle hashchange events\n    window.addEventListener('hashchange', this.boundOnHashChange, true)\n  }\n\n  /**\n   * Teardown tab component\n   *\n   * @private\n   */\n  teardown() {\n    this.$tabList.removeAttribute('role')\n\n    this.$tabListItems.forEach(($item) => {\n      $item.removeAttribute('role')\n    })\n\n    this.$tabs.forEach(($tab) => {\n      // Remove events\n      $tab.removeEventListener('click', this.boundTabClick, true)\n      $tab.removeEventListener('keydown', this.boundTabKeydown, true)\n\n      // Unset HTML attributes\n      this.unsetAttributes($tab)\n    })\n\n    // Remove hashchange event handler\n    window.removeEventListener('hashchange', this.boundOnHashChange, true)\n  }\n\n  /**\n   * Handle hashchange event\n   *\n   * @private\n   * @returns {void | undefined} Returns void, or undefined when prevented\n   */\n  onHashChange() {\n    const hash = window.location.hash\n    const $tabWithHash = this.getTab(hash)\n    if (!$tabWithHash) {\n      return\n    }\n\n    // Prevent changing the hash\n    if (this.changingHash) {\n      this.changingHash = false\n      return\n    }\n\n    // Show either the active tab according to the URL's hash or the first tab\n    const $previousTab = this.getCurrentTab()\n    if (!$previousTab) {\n      return\n    }\n\n    this.hideTab($previousTab)\n    this.showTab($tabWithHash)\n    $tabWithHash.focus()\n  }\n\n  /**\n   * Hide panel for tab link\n   *\n   * @private\n   * @param {HTMLAnchorElement} $tab - Tab link\n   */\n  hideTab($tab) {\n    this.unhighlightTab($tab)\n    this.hidePanel($tab)\n  }\n\n  /**\n   * Show panel for tab link\n   *\n   * @private\n   * @param {HTMLAnchorElement} $tab - Tab link\n   */\n  showTab($tab) {\n    this.highlightTab($tab)\n    this.showPanel($tab)\n  }\n\n  /**\n   * Get tab link by hash\n   *\n   * @private\n   * @param {string} hash - Hash fragment including #\n   * @returns {HTMLAnchorElement | null} Tab link\n   */\n  getTab(hash) {\n    return this.$root.querySelector(`a.govuk-tabs__tab[href=\"${hash}\"]`)\n  }\n\n  /**\n   * Set tab link and panel attributes\n   *\n   * @private\n   * @param {HTMLAnchorElement} $tab - Tab link\n   */\n  setAttributes($tab) {\n    const panelId = $tab.hash.replace('#', '')\n    if (!panelId) {\n      return\n    }\n\n    // Set tab attributes\n    $tab.setAttribute('id', `tab_${panelId}`)\n    $tab.setAttribute('role', 'tab')\n    $tab.setAttribute('aria-controls', panelId)\n    $tab.setAttribute('aria-selected', 'false')\n    $tab.setAttribute('tabindex', '-1')\n\n    // Set panel attributes\n    const $panel = this.getPanel($tab)\n    if (!$panel) {\n      return\n    }\n\n    $panel.setAttribute('role', 'tabpanel')\n    $panel.setAttribute('aria-labelledby', $tab.id)\n    $panel.classList.add(this.jsHiddenClass)\n  }\n\n  /**\n   * Unset tab link and panel attributes\n   *\n   * @private\n   * @param {HTMLAnchorElement} $tab - Tab link\n   */\n  unsetAttributes($tab) {\n    // unset tab attributes\n    $tab.removeAttribute('id')\n    $tab.removeAttribute('role')\n    $tab.removeAttribute('aria-controls')\n    $tab.removeAttribute('aria-selected')\n    $tab.removeAttribute('tabindex')\n\n    // unset panel attributes\n    const $panel = this.getPanel($tab)\n    if (!$panel) {\n      return\n    }\n\n    $panel.removeAttribute('role')\n    $panel.removeAttribute('aria-labelledby')\n    $panel.classList.remove(this.jsHiddenClass)\n  }\n\n  /**\n   * Handle tab link clicks\n   *\n   * @private\n   * @param {MouseEvent} event - Mouse click event\n   * @returns {void} Returns void\n   */\n  onTabClick(event) {\n    const $currentTab = this.getCurrentTab()\n    const $nextTab = event.currentTarget\n\n    if (!$currentTab || !($nextTab instanceof HTMLAnchorElement)) {\n      return\n    }\n\n    event.preventDefault()\n\n    this.hideTab($currentTab)\n    this.showTab($nextTab)\n    this.createHistoryEntry($nextTab)\n  }\n\n  /**\n   * Update browser URL hash fragment for tab\n   *\n   * - Allows back/forward to navigate tabs\n   * - Avoids page jump when hash changes\n   *\n   * @private\n   * @param {HTMLAnchorElement} $tab - Tab link\n   */\n  createHistoryEntry($tab) {\n    const $panel = this.getPanel($tab)\n    if (!$panel) {\n      return\n    }\n\n    // Save and restore the id so the page doesn't jump when a user clicks a tab\n    // (which changes the hash)\n    const panelId = $panel.id\n    $panel.id = ''\n    this.changingHash = true\n    window.location.hash = panelId\n    $panel.id = panelId\n  }\n\n  /**\n   * Handle tab keydown event\n   *\n   * - Press right arrow for next tab\n   * - Press left arrow for previous tab\n   *\n   * @private\n   * @param {KeyboardEvent} event - Keydown event\n   */\n  onTabKeydown(event) {\n    switch (event.key) {\n      // 'Left' and 'Right' required for Edge 16 support.\n      case 'ArrowLeft':\n      case 'Left':\n        this.activatePreviousTab()\n        event.preventDefault()\n        break\n      case 'ArrowRight':\n      case 'Right':\n        this.activateNextTab()\n        event.preventDefault()\n        break\n    }\n  }\n\n  /**\n   * Activate next tab\n   *\n   * @private\n   */\n  activateNextTab() {\n    const $currentTab = this.getCurrentTab()\n    if (!$currentTab?.parentElement) {\n      return\n    }\n\n    const $nextTabListItem = $currentTab.parentElement.nextElementSibling\n    if (!$nextTabListItem) {\n      return\n    }\n\n    const $nextTab = $nextTabListItem.querySelector('a.govuk-tabs__tab')\n    if (!$nextTab) {\n      return\n    }\n\n    this.hideTab($currentTab)\n    this.showTab($nextTab)\n    $nextTab.focus()\n    this.createHistoryEntry($nextTab)\n  }\n\n  /**\n   * Activate previous tab\n   *\n   * @private\n   */\n  activatePreviousTab() {\n    const $currentTab = this.getCurrentTab()\n    if (!$currentTab?.parentElement) {\n      return\n    }\n\n    const $previousTabListItem =\n      $currentTab.parentElement.previousElementSibling\n    if (!$previousTabListItem) {\n      return\n    }\n\n    const $previousTab = $previousTabListItem.querySelector('a.govuk-tabs__tab')\n    if (!$previousTab) {\n      return\n    }\n\n    this.hideTab($currentTab)\n    this.showTab($previousTab)\n    $previousTab.focus()\n    this.createHistoryEntry($previousTab)\n  }\n\n  /**\n   * Get tab panel for tab link\n   *\n   * @private\n   * @param {HTMLAnchorElement} $tab - Tab link\n   * @returns {Element | null} Tab panel\n   */\n  getPanel($tab) {\n    const panelId = $tab.hash.replace('#', '')\n    if (!panelId) {\n      return null\n    }\n\n    return this.$root.querySelector(`#${panelId}`)\n  }\n\n  /**\n   * Show tab panel for tab link\n   *\n   * @private\n   * @param {HTMLAnchorElement} $tab - Tab link\n   */\n  showPanel($tab) {\n    const $panel = this.getPanel($tab)\n    if (!$panel) {\n      return\n    }\n\n    $panel.classList.remove(this.jsHiddenClass)\n  }\n\n  /**\n   * Hide tab panel for tab link\n   *\n   * @private\n   * @param {HTMLAnchorElement} $tab - Tab link\n   */\n  hidePanel($tab) {\n    const $panel = this.getPanel($tab)\n    if (!$panel) {\n      return\n    }\n\n    $panel.classList.add(this.jsHiddenClass)\n  }\n\n  /**\n   * Unset 'selected' state for tab link\n   *\n   * @private\n   * @param {HTMLAnchorElement} $tab - Tab link\n   */\n  unhighlightTab($tab) {\n    if (!$tab.parentElement) {\n      return\n    }\n\n    $tab.setAttribute('aria-selected', 'false')\n    $tab.parentElement.classList.remove('govuk-tabs__list-item--selected')\n    $tab.setAttribute('tabindex', '-1')\n  }\n\n  /**\n   * Set 'selected' state for tab link\n   *\n   * @private\n   * @param {HTMLAnchorElement} $tab - Tab link\n   */\n  highlightTab($tab) {\n    if (!$tab.parentElement) {\n      return\n    }\n\n    $tab.setAttribute('aria-selected', 'true')\n    $tab.parentElement.classList.add('govuk-tabs__list-item--selected')\n    $tab.setAttribute('tabindex', '0')\n  }\n\n  /**\n   * Get current tab link\n   *\n   * @private\n   * @returns {HTMLAnchorElement | null} Tab link\n   */\n  getCurrentTab() {\n    return this.$root.querySelector(\n      '.govuk-tabs__list-item--selected a.govuk-tabs__tab'\n    )\n  }\n\n  /**\n   * Name for the component used when initialising using data-module attributes.\n   */\n  static moduleName = 'govuk-tabs'\n}\n"],"names":["getBreakpoint","name","property","value","window","getComputedStyle","document","documentElement","getPropertyValue","undefined","isInitialised","$root","moduleName","HTMLElement","hasAttribute","isSupported","$scope","body","classList","contains","isArray","option","Array","isObject","formatErrorMessage","Component","message","GOVUKFrontendError","Error","constructor","args","SupportError","supportMessage","HTMLScriptElement","prototype","ElementError","messageOrOptions","component","identifier","element","expectedType","InitError","componentOrMessage","_$root","childConstructor","elementType","checkSupport","checkInitialised","setAttribute","Tabs","$tabs","$tabList","$tabListItems","jsHiddenClass","changingHash","boundTabClick","boundTabKeydown","boundOnHashChange","mql","querySelectorAll","length","onTabClick","bind","onTabKeydown","onHashChange","querySelector","setupResponsiveChecks","breakpoint","matchMedia","addEventListener","checkMode","addListener","_this$mql","matches","setup","teardown","_this$getTab","forEach","$item","$tab","setAttributes","hideTab","$activeTab","getTab","location","hash","showTab","removeAttribute","removeEventListener","unsetAttributes","$tabWithHash","$previousTab","getCurrentTab","focus","unhighlightTab","hidePanel","highlightTab","showPanel","panelId","replace","$panel","getPanel","id","add","remove","event","$currentTab","$nextTab","currentTarget","HTMLAnchorElement","preventDefault","createHistoryEntry","key","activatePreviousTab","activateNextTab","parentElement","$nextTabListItem","nextElementSibling","$previousTabListItem","previousElementSibling"],"mappings":"AAeO,SAASA,aAAaA,CAACC,IAAI,EAAE;AAClC,EAAA,MAAMC,QAAQ,GAAG,CAAA,mBAAA,EAAsBD,IAAI,CAAA,CAAE;AAG7C,EAAA,MAAME,KAAK,GAAGC,MAAM,CACjBC,gBAAgB,CAACC,QAAQ,CAACC,eAAe,CAAC,CAC1CC,gBAAgB,CAACN,QAAQ,CAAC;EAE7B,OAAO;IACLA,QAAQ;IACRC,KAAK,EAAEA,KAAK,IAAIM;GACjB;AACH;AAwDO,SAASC,aAAaA,CAACC,KAAK,EAAEC,UAAU,EAAE;EAC/C,OACED,KAAK,YAAYE,WAAW,IAC5BF,KAAK,CAACG,YAAY,CAAC,CAAA,KAAA,EAAQF,UAAU,CAAA,KAAA,CAAO,CAAC;AAEjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,WAAWA,CAACC,MAAM,GAAGV,QAAQ,CAACW,IAAI,EAAE;EAClD,IAAI,CAACD,MAAM,EAAE;AACX,IAAA,OAAO,KAAK;AACd,EAAA;AAEA,EAAA,OAAOA,MAAM,CAACE,SAAS,CAACC,QAAQ,CAAC,0BAA0B,CAAC;AAC9D;AASA,SAASC,OAAOA,CAACC,MAAM,EAAE;AACvB,EAAA,OAAOC,KAAK,CAACF,OAAO,CAACC,MAAM,CAAC;AAC9B;AAUO,SAASE,QAAQA,CAACF,MAAM,EAAE;AAC/B,EAAA,OAAO,CAAC,CAACA,MAAM,IAAI,OAAOA,MAAM,KAAK,QAAQ,IAAI,CAACD,OAAO,CAACC,MAAM,CAAC;AACnE;AAsBO,SAASG,kBAAkBA,CAACC,SAAS,EAAEC,OAAO,EAAE;AACrD,EAAA,OAAO,GAAGD,SAAS,CAACb,UAAU,CAAA,EAAA,EAAKc,OAAO,CAAA,CAAE;AAC9C;AAQA;AACA;AACA;AACA;;AC7IO,MAAMC,kBAAkB,SAASC,KAAK,CAAC;AAAAC,EAAAA,WAAAA,CAAA,GAAAC,IAAA,EAAA;AAAA,IAAA,KAAA,CAAA,GAAAA,IAAA,CAAA;IAAA,IAAA,CAC5C7B,IAAI,GAAG,oBAAoB;AAAA,EAAA;AAC7B;AAKO,MAAM8B,YAAY,SAASJ,kBAAkB,CAAC;AAGnD;AACF;AACA;AACA;AACA;AACEE,EAAAA,WAAWA,CAACb,MAAM,GAAGV,QAAQ,CAACW,IAAI,EAAE;IAClC,MAAMe,cAAc,GAClB,UAAU,IAAIC,iBAAiB,CAACC,SAAS,GACrC,gHAAgH,GAChH,kDAAkD;AAExD,IAAA,KAAK,CACHlB,MAAM,GACFgB,cAAc,GACd,8DACN,CAAC;IAAA,IAAA,CAjBH/B,IAAI,GAAG,cAAc;AAkBrB,EAAA;AACF;AAYO,MAAMkC,YAAY,SAASR,kBAAkB,CAAC;EAmBnDE,WAAWA,CAACO,gBAAgB,EAAE;IAC5B,IAAIV,OAAO,GAAG,OAAOU,gBAAgB,KAAK,QAAQ,GAAGA,gBAAgB,GAAG,EAAE;AAG1E,IAAA,IAAIb,QAAQ,CAACa,gBAAgB,CAAC,EAAE;MAC9B,MAAM;QAAEC,SAAS;QAAEC,UAAU;QAAEC,OAAO;AAAEC,QAAAA;AAAa,OAAC,GAAGJ,gBAAgB;AAEzEV,MAAAA,OAAO,GAAGY,UAAU;MAGpBZ,OAAO,IAAIa,OAAO,GACd,CAAA,gBAAA,EAAmBC,YAAY,IAAA,IAAA,GAAZA,YAAY,GAAI,aAAa,CAAA,CAAE,GAClD,YAAY;AAGhB,MAAA,IAAIH,SAAS,EAAE;AACbX,QAAAA,OAAO,GAAGF,kBAAkB,CAACa,SAAS,EAAEX,OAAO,CAAC;AAClD,MAAA;AACF,IAAA;IAEA,KAAK,CAACA,OAAO,CAAC;IAAA,IAAA,CAtChBzB,IAAI,GAAG,cAAc;AAuCrB,EAAA;AACF;AAKO,MAAMwC,SAAS,SAASd,kBAAkB,CAAC;EAOhDE,WAAWA,CAACa,kBAAkB,EAAE;AAC9B,IAAA,MAAMhB,OAAO,GACX,OAAOgB,kBAAkB,KAAK,QAAQ,GAClCA,kBAAkB,GAClBlB,kBAAkB,CAChBkB,kBAAkB,EAClB,8CACF,CAAC;IAEP,KAAK,CAAChB,OAAO,CAAC;IAAA,IAAA,CAfhBzB,IAAI,GAAG,WAAW;AAgBlB,EAAA;AACF;AAaA;AACA;AACA;;ACjIO,MAAMwB,SAAS,CAAC;AASrB;AACF;AACA;AACA;AACA;AACA;EACE,IAAId,KAAKA,GAAG;IACV,OAAO,IAAI,CAACgC,MAAM;AACpB,EAAA;EAcAd,WAAWA,CAAClB,KAAK,EAAE;AAAA,IAAA,IAAA,CARnBgC,MAAM,GAAA,MAAA;AASJ,IAAA,MAAMC,gBAAgB,GACpB,IAAI,CAACf,WACN;AASD,IAAA,IAAI,OAAOe,gBAAgB,CAAChC,UAAU,KAAK,QAAQ,EAAE;AACnD,MAAA,MAAM,IAAI6B,SAAS,CAAC,CAAA,uCAAA,CAAyC,CAAC;AAChE,IAAA;AAEA,IAAA,IAAI,EAAE9B,KAAK,YAAYiC,gBAAgB,CAACC,WAAW,CAAC,EAAE;MACpD,MAAM,IAAIV,YAAY,CAAC;AACrBI,QAAAA,OAAO,EAAE5B,KAAK;AACd0B,QAAAA,SAAS,EAAEO,gBAAgB;AAC3BN,QAAAA,UAAU,EAAE,wBAAwB;AACpCE,QAAAA,YAAY,EAAEI,gBAAgB,CAACC,WAAW,CAAC5C;AAC7C,OAAC,CAAC;AACJ,IAAA,CAAC,MAAM;MACL,IAAI,CAAC0C,MAAM,GAAmChC,KAAM;AACtD,IAAA;IAEAiC,gBAAgB,CAACE,YAAY,EAAE;IAE/B,IAAI,CAACC,gBAAgB,EAAE;AAEvB,IAAA,MAAMnC,UAAU,GAAGgC,gBAAgB,CAAChC,UAAU;IAE9C,IAAI,CAACD,KAAK,CAACqC,YAAY,CAAC,QAAQpC,UAAU,CAAA,KAAA,CAAO,EAAE,EAAE,CAAC;AACxD,EAAA;AAQAmC,EAAAA,gBAAgBA,GAAG;AACjB,IAAA,MAAMlB,WAAW,GAAyC,IAAI,CAACA,WAAY;AAC3E,IAAA,MAAMjB,UAAU,GAAGiB,WAAW,CAACjB,UAAU;IAEzC,IAAIA,UAAU,IAAIF,aAAa,CAAC,IAAI,CAACC,KAAK,EAAEC,UAAU,CAAC,EAAE;AACvD,MAAA,MAAM,IAAI6B,SAAS,CAACZ,WAAW,CAAC;AAClC,IAAA;AACF,EAAA;EAOA,OAAOiB,YAAYA,GAAG;AACpB,IAAA,IAAI,CAAC/B,WAAW,EAAE,EAAE;MAClB,MAAM,IAAIgB,YAAY,EAAE;AAC1B,IAAA;AACF,EAAA;AACF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AArGaN,SAAS,CAIboB,WAAW,GAAGhC,WAAW;;ACXlC;AACA;AACA;AACA;AACA;AACO,MAAMoC,IAAI,SAASxB,SAAS,CAAC;AA+BlC;AACF;AACA;EACEI,WAAWA,CAAClB,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;AAAA,IAAA,IAAA,CAjCduC,KAAK,GAAA,MAAA;AAAA,IAAA,IAAA,CAGLC,QAAQ,GAAA,MAAA;AAAA,IAAA,IAAA,CAGRC,aAAa,GAAA,MAAA;IAAA,IAAA,CAGbC,aAAa,GAAG,2BAA2B;IAAA,IAAA,CAG3CC,YAAY,GAAG,KAAK;AAAA,IAAA,IAAA,CAGpBC,aAAa,GAAA,MAAA;AAAA,IAAA,IAAA,CAGbC,eAAe,GAAA,MAAA;AAAA,IAAA,IAAA,CAGfC,iBAAiB,GAAA,MAAA;IAAA,IAAA,CAMjBC,GAAG,GAAG,IAAI;IAQR,MAAMR,KAAK,GAAG,IAAI,CAACvC,KAAK,CAACgD,gBAAgB,CAAC,mBAAmB,CAAC;AAC9D,IAAA,IAAI,CAACT,KAAK,CAACU,MAAM,EAAE;MACjB,MAAM,IAAIzB,YAAY,CAAC;AACrBE,QAAAA,SAAS,EAAEY,IAAI;AACfX,QAAAA,UAAU,EAAE;AACd,OAAC,CAAC;AACJ,IAAA;IAEA,IAAI,CAACY,KAAK,GAAGA,KAAK;IAGlB,IAAI,CAACK,aAAa,GAAG,IAAI,CAACM,UAAU,CAACC,IAAI,CAAC,IAAI,CAAC;IAC/C,IAAI,CAACN,eAAe,GAAG,IAAI,CAACO,YAAY,CAACD,IAAI,CAAC,IAAI,CAAC;IACnD,IAAI,CAACL,iBAAiB,GAAG,IAAI,CAACO,YAAY,CAACF,IAAI,CAAC,IAAI,CAAC;IAErD,MAAMX,QAAQ,GAAG,IAAI,CAACxC,KAAK,CAACsD,aAAa,CAAC,mBAAmB,CAAC;IAC9D,MAAMb,aAAa,GAAG,IAAI,CAACzC,KAAK,CAACgD,gBAAgB,CAC/C,0BACF,CAAC;IAED,IAAI,CAACR,QAAQ,EAAE;MACb,MAAM,IAAIhB,YAAY,CAAC;AACrBE,QAAAA,SAAS,EAAEY,IAAI;AACfX,QAAAA,UAAU,EAAE;AACd,OAAC,CAAC;AACJ,IAAA;AAEA,IAAA,IAAI,CAACc,aAAa,CAACQ,MAAM,EAAE;MACzB,MAAM,IAAIzB,YAAY,CAAC;AACrBE,QAAAA,SAAS,EAAEY,IAAI;AACfX,QAAAA,UAAU,EAAE;AACd,OAAC,CAAC;AACJ,IAAA;IAEA,IAAI,CAACa,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACC,aAAa,GAAGA,aAAa;IAElC,IAAI,CAACc,qBAAqB,EAAE;AAC9B,EAAA;AAOAA,EAAAA,qBAAqBA,GAAG;AACtB,IAAA,MAAMC,UAAU,GAAGnE,aAAa,CAAC,QAAQ,CAAC;AAE1C,IAAA,IAAI,CAACmE,UAAU,CAAChE,KAAK,EAAE;MACrB,MAAM,IAAIgC,YAAY,CAAC;AACrBE,QAAAA,SAAS,EAAEY,IAAI;AACfX,QAAAA,UAAU,EAAE,CAAA,uBAAA,EAA0B6B,UAAU,CAACjE,QAAQ,CAAA,6BAAA;AAC3D,OAAC,CAAC;AACJ,IAAA;AAGA,IAAA,IAAI,CAACwD,GAAG,GAAGtD,MAAM,CAACgE,UAAU,CAAC,CAAA,YAAA,EAAeD,UAAU,CAAChE,KAAK,CAAA,CAAA,CAAG,CAAC;AAIhE,IAAA,IAAI,kBAAkB,IAAI,IAAI,CAACuD,GAAG,EAAE;AAClC,MAAA,IAAI,CAACA,GAAG,CAACW,gBAAgB,CAAC,QAAQ,EAAE,MAAM,IAAI,CAACC,SAAS,EAAE,CAAC;AAC7D,IAAA,CAAC,MAAM;MAGL,IAAI,CAACZ,GAAG,CAACa,WAAW,CAAC,MAAM,IAAI,CAACD,SAAS,EAAE,CAAC;AAC9C,IAAA;IAEA,IAAI,CAACA,SAAS,EAAE;AAClB,EAAA;AAOAA,EAAAA,SAASA,GAAG;AAAA,IAAA,IAAAE,SAAA;IACV,IAAA,CAAAA,SAAA,GAAI,IAAI,CAACd,GAAG,KAAA,IAAA,IAARc,SAAA,CAAUC,OAAO,EAAE;MACrB,IAAI,CAACC,KAAK,EAAE;AACd,IAAA,CAAC,MAAM;MACL,IAAI,CAACC,QAAQ,EAAE;AACjB,IAAA;AACF,EAAA;AAOAD,EAAAA,KAAKA,GAAG;AAAA,IAAA,IAAAE,YAAA;IACN,IAAI,CAACzB,QAAQ,CAACH,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;AAE7C,IAAA,IAAI,CAACI,aAAa,CAACyB,OAAO,CAAEC,KAAK,IAAK;AACpCA,MAAAA,KAAK,CAAC9B,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC;AAC5C,IAAA,CAAC,CAAC;AAEF,IAAA,IAAI,CAACE,KAAK,CAAC2B,OAAO,CAAEE,IAAI,IAAK;AAE3B,MAAA,IAAI,CAACC,aAAa,CAACD,IAAI,CAAC;MAGxBA,IAAI,CAACV,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACd,aAAa,EAAE,IAAI,CAAC;MACxDwB,IAAI,CAACV,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACb,eAAe,EAAE,IAAI,CAAC;AAG5D,MAAA,IAAI,CAACyB,OAAO,CAACF,IAAI,CAAC;AACpB,IAAA,CAAC,CAAC;IAGF,MAAMG,UAAU,IAAAN,YAAA,GAAG,IAAI,CAACO,MAAM,CAAC/E,MAAM,CAACgF,QAAQ,CAACC,IAAI,CAAC,YAAAT,YAAA,GAAI,IAAI,CAAC1B,KAAK,CAAC,CAAC,CAAC;AAErE,IAAA,IAAI,CAACoC,OAAO,CAACJ,UAAU,CAAC;IAGxB9E,MAAM,CAACiE,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAACZ,iBAAiB,EAAE,IAAI,CAAC;AACrE,EAAA;AAOAkB,EAAAA,QAAQA,GAAG;AACT,IAAA,IAAI,CAACxB,QAAQ,CAACoC,eAAe,CAAC,MAAM,CAAC;AAErC,IAAA,IAAI,CAACnC,aAAa,CAACyB,OAAO,CAAEC,KAAK,IAAK;AACpCA,MAAAA,KAAK,CAACS,eAAe,CAAC,MAAM,CAAC;AAC/B,IAAA,CAAC,CAAC;AAEF,IAAA,IAAI,CAACrC,KAAK,CAAC2B,OAAO,CAAEE,IAAI,IAAK;MAE3BA,IAAI,CAACS,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAACjC,aAAa,EAAE,IAAI,CAAC;MAC3DwB,IAAI,CAACS,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAChC,eAAe,EAAE,IAAI,CAAC;AAG/D,MAAA,IAAI,CAACiC,eAAe,CAACV,IAAI,CAAC;AAC5B,IAAA,CAAC,CAAC;IAGF3E,MAAM,CAACoF,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC/B,iBAAiB,EAAE,IAAI,CAAC;AACxE,EAAA;AAQAO,EAAAA,YAAYA,GAAG;AACb,IAAA,MAAMqB,IAAI,GAAGjF,MAAM,CAACgF,QAAQ,CAACC,IAAI;AACjC,IAAA,MAAMK,YAAY,GAAG,IAAI,CAACP,MAAM,CAACE,IAAI,CAAC;IACtC,IAAI,CAACK,YAAY,EAAE;AACjB,MAAA;AACF,IAAA;IAGA,IAAI,IAAI,CAACpC,YAAY,EAAE;MACrB,IAAI,CAACA,YAAY,GAAG,KAAK;AACzB,MAAA;AACF,IAAA;AAGA,IAAA,MAAMqC,YAAY,GAAG,IAAI,CAACC,aAAa,EAAE;IACzC,IAAI,CAACD,YAAY,EAAE;AACjB,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,CAACV,OAAO,CAACU,YAAY,CAAC;AAC1B,IAAA,IAAI,CAACL,OAAO,CAACI,YAAY,CAAC;IAC1BA,YAAY,CAACG,KAAK,EAAE;AACtB,EAAA;EAQAZ,OAAOA,CAACF,IAAI,EAAE;AACZ,IAAA,IAAI,CAACe,cAAc,CAACf,IAAI,CAAC;AACzB,IAAA,IAAI,CAACgB,SAAS,CAAChB,IAAI,CAAC;AACtB,EAAA;EAQAO,OAAOA,CAACP,IAAI,EAAE;AACZ,IAAA,IAAI,CAACiB,YAAY,CAACjB,IAAI,CAAC;AACvB,IAAA,IAAI,CAACkB,SAAS,CAAClB,IAAI,CAAC;AACtB,EAAA;EASAI,MAAMA,CAACE,IAAI,EAAE;IACX,OAAO,IAAI,CAAC1E,KAAK,CAACsD,aAAa,CAAC,CAAA,wBAAA,EAA2BoB,IAAI,CAAA,EAAA,CAAI,CAAC;AACtE,EAAA;EAQAL,aAAaA,CAACD,IAAI,EAAE;IAClB,MAAMmB,OAAO,GAAGnB,IAAI,CAACM,IAAI,CAACc,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAC1C,IAAI,CAACD,OAAO,EAAE;AACZ,MAAA;AACF,IAAA;IAGAnB,IAAI,CAAC/B,YAAY,CAAC,IAAI,EAAE,CAAA,IAAA,EAAOkD,OAAO,EAAE,CAAC;AACzCnB,IAAAA,IAAI,CAAC/B,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC;AAChC+B,IAAAA,IAAI,CAAC/B,YAAY,CAAC,eAAe,EAAEkD,OAAO,CAAC;AAC3CnB,IAAAA,IAAI,CAAC/B,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC;AAC3C+B,IAAAA,IAAI,CAAC/B,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC;AAGnC,IAAA,MAAMoD,MAAM,GAAG,IAAI,CAACC,QAAQ,CAACtB,IAAI,CAAC;IAClC,IAAI,CAACqB,MAAM,EAAE;AACX,MAAA;AACF,IAAA;AAEAA,IAAAA,MAAM,CAACpD,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC;IACvCoD,MAAM,CAACpD,YAAY,CAAC,iBAAiB,EAAE+B,IAAI,CAACuB,EAAE,CAAC;IAC/CF,MAAM,CAAClF,SAAS,CAACqF,GAAG,CAAC,IAAI,CAAClD,aAAa,CAAC;AAC1C,EAAA;EAQAoC,eAAeA,CAACV,IAAI,EAAE;AAEpBA,IAAAA,IAAI,CAACQ,eAAe,CAAC,IAAI,CAAC;AAC1BR,IAAAA,IAAI,CAACQ,eAAe,CAAC,MAAM,CAAC;AAC5BR,IAAAA,IAAI,CAACQ,eAAe,CAAC,eAAe,CAAC;AACrCR,IAAAA,IAAI,CAACQ,eAAe,CAAC,eAAe,CAAC;AACrCR,IAAAA,IAAI,CAACQ,eAAe,CAAC,UAAU,CAAC;AAGhC,IAAA,MAAMa,MAAM,GAAG,IAAI,CAACC,QAAQ,CAACtB,IAAI,CAAC;IAClC,IAAI,CAACqB,MAAM,EAAE;AACX,MAAA;AACF,IAAA;AAEAA,IAAAA,MAAM,CAACb,eAAe,CAAC,MAAM,CAAC;AAC9Ba,IAAAA,MAAM,CAACb,eAAe,CAAC,iBAAiB,CAAC;IACzCa,MAAM,CAAClF,SAAS,CAACsF,MAAM,CAAC,IAAI,CAACnD,aAAa,CAAC;AAC7C,EAAA;EASAQ,UAAUA,CAAC4C,KAAK,EAAE;AAChB,IAAA,MAAMC,WAAW,GAAG,IAAI,CAACd,aAAa,EAAE;AACxC,IAAA,MAAMe,QAAQ,GAAGF,KAAK,CAACG,aAAa;IAEpC,IAAI,CAACF,WAAW,IAAI,EAAEC,QAAQ,YAAYE,iBAAiB,CAAC,EAAE;AAC5D,MAAA;AACF,IAAA;IAEAJ,KAAK,CAACK,cAAc,EAAE;AAEtB,IAAA,IAAI,CAAC7B,OAAO,CAACyB,WAAW,CAAC;AACzB,IAAA,IAAI,CAACpB,OAAO,CAACqB,QAAQ,CAAC;AACtB,IAAA,IAAI,CAACI,kBAAkB,CAACJ,QAAQ,CAAC;AACnC,EAAA;EAWAI,kBAAkBA,CAAChC,IAAI,EAAE;AACvB,IAAA,MAAMqB,MAAM,GAAG,IAAI,CAACC,QAAQ,CAACtB,IAAI,CAAC;IAClC,IAAI,CAACqB,MAAM,EAAE;AACX,MAAA;AACF,IAAA;AAIA,IAAA,MAAMF,OAAO,GAAGE,MAAM,CAACE,EAAE;IACzBF,MAAM,CAACE,EAAE,GAAG,EAAE;IACd,IAAI,CAAChD,YAAY,GAAG,IAAI;AACxBlD,IAAAA,MAAM,CAACgF,QAAQ,CAACC,IAAI,GAAGa,OAAO;IAC9BE,MAAM,CAACE,EAAE,GAAGJ,OAAO;AACrB,EAAA;EAWAnC,YAAYA,CAAC0C,KAAK,EAAE;IAClB,QAAQA,KAAK,CAACO,GAAG;AAEf,MAAA,KAAK,WAAW;AAChB,MAAA,KAAK,MAAM;QACT,IAAI,CAACC,mBAAmB,EAAE;QAC1BR,KAAK,CAACK,cAAc,EAAE;AACtB,QAAA;AACF,MAAA,KAAK,YAAY;AACjB,MAAA,KAAK,OAAO;QACV,IAAI,CAACI,eAAe,EAAE;QACtBT,KAAK,CAACK,cAAc,EAAE;AACtB,QAAA;AACJ;AACF,EAAA;AAOAI,EAAAA,eAAeA,GAAG;AAChB,IAAA,MAAMR,WAAW,GAAG,IAAI,CAACd,aAAa,EAAE;AACxC,IAAA,IAAI,EAACc,WAAW,IAAA,IAAA,IAAXA,WAAW,CAAES,aAAa,CAAA,EAAE;AAC/B,MAAA;AACF,IAAA;AAEA,IAAA,MAAMC,gBAAgB,GAAGV,WAAW,CAACS,aAAa,CAACE,kBAAkB;IACrE,IAAI,CAACD,gBAAgB,EAAE;AACrB,MAAA;AACF,IAAA;AAEA,IAAA,MAAMT,QAAQ,GAAGS,gBAAgB,CAACnD,aAAa,CAAC,mBAAmB,CAAC;IACpE,IAAI,CAAC0C,QAAQ,EAAE;AACb,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,CAAC1B,OAAO,CAACyB,WAAW,CAAC;AACzB,IAAA,IAAI,CAACpB,OAAO,CAACqB,QAAQ,CAAC;IACtBA,QAAQ,CAACd,KAAK,EAAE;AAChB,IAAA,IAAI,CAACkB,kBAAkB,CAACJ,QAAQ,CAAC;AACnC,EAAA;AAOAM,EAAAA,mBAAmBA,GAAG;AACpB,IAAA,MAAMP,WAAW,GAAG,IAAI,CAACd,aAAa,EAAE;AACxC,IAAA,IAAI,EAACc,WAAW,IAAA,IAAA,IAAXA,WAAW,CAAES,aAAa,CAAA,EAAE;AAC/B,MAAA;AACF,IAAA;AAEA,IAAA,MAAMG,oBAAoB,GACxBZ,WAAW,CAACS,aAAa,CAACI,sBAAsB;IAClD,IAAI,CAACD,oBAAoB,EAAE;AACzB,MAAA;AACF,IAAA;AAEA,IAAA,MAAM3B,YAAY,GAAG2B,oBAAoB,CAACrD,aAAa,CAAC,mBAAmB,CAAC;IAC5E,IAAI,CAAC0B,YAAY,EAAE;AACjB,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,CAACV,OAAO,CAACyB,WAAW,CAAC;AACzB,IAAA,IAAI,CAACpB,OAAO,CAACK,YAAY,CAAC;IAC1BA,YAAY,CAACE,KAAK,EAAE;AACpB,IAAA,IAAI,CAACkB,kBAAkB,CAACpB,YAAY,CAAC;AACvC,EAAA;EASAU,QAAQA,CAACtB,IAAI,EAAE;IACb,MAAMmB,OAAO,GAAGnB,IAAI,CAACM,IAAI,CAACc,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAC1C,IAAI,CAACD,OAAO,EAAE;AACZ,MAAA,OAAO,IAAI;AACb,IAAA;IAEA,OAAO,IAAI,CAACvF,KAAK,CAACsD,aAAa,CAAC,CAAA,CAAA,EAAIiC,OAAO,CAAA,CAAE,CAAC;AAChD,EAAA;EAQAD,SAASA,CAAClB,IAAI,EAAE;AACd,IAAA,MAAMqB,MAAM,GAAG,IAAI,CAACC,QAAQ,CAACtB,IAAI,CAAC;IAClC,IAAI,CAACqB,MAAM,EAAE;AACX,MAAA;AACF,IAAA;IAEAA,MAAM,CAAClF,SAAS,CAACsF,MAAM,CAAC,IAAI,CAACnD,aAAa,CAAC;AAC7C,EAAA;EAQA0C,SAASA,CAAChB,IAAI,EAAE;AACd,IAAA,MAAMqB,MAAM,GAAG,IAAI,CAACC,QAAQ,CAACtB,IAAI,CAAC;IAClC,IAAI,CAACqB,MAAM,EAAE;AACX,MAAA;AACF,IAAA;IAEAA,MAAM,CAAClF,SAAS,CAACqF,GAAG,CAAC,IAAI,CAAClD,aAAa,CAAC;AAC1C,EAAA;EAQAyC,cAAcA,CAACf,IAAI,EAAE;AACnB,IAAA,IAAI,CAACA,IAAI,CAACoC,aAAa,EAAE;AACvB,MAAA;AACF,IAAA;AAEApC,IAAAA,IAAI,CAAC/B,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC;IAC3C+B,IAAI,CAACoC,aAAa,CAACjG,SAAS,CAACsF,MAAM,CAAC,iCAAiC,CAAC;AACtEzB,IAAAA,IAAI,CAAC/B,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC;AACrC,EAAA;EAQAgD,YAAYA,CAACjB,IAAI,EAAE;AACjB,IAAA,IAAI,CAACA,IAAI,CAACoC,aAAa,EAAE;AACvB,MAAA;AACF,IAAA;AAEApC,IAAAA,IAAI,CAAC/B,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC;IAC1C+B,IAAI,CAACoC,aAAa,CAACjG,SAAS,CAACqF,GAAG,CAAC,iCAAiC,CAAC;AACnExB,IAAAA,IAAI,CAAC/B,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC;AACpC,EAAA;AAQA4C,EAAAA,aAAaA,GAAG;AACd,IAAA,OAAO,IAAI,CAACjF,KAAK,CAACsD,aAAa,CAC7B,oDACF,CAAC;AACH,EAAA;AAMF;AArgBahB,IAAI,CAogBRrC,UAAU,GAAG,YAAY;;;;"}