@sdcorejs/angular 19.2.1 → 19.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-modules-layout.mjs","sources":["../../../projects/sdcorejs-angular/modules/layout/components/page/page.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/page/page.component.html","../../../projects/sdcorejs-angular/modules/layout/services/menu/menu.utils.ts","../../../projects/sdcorejs-angular/modules/layout/services/storage/storage.service.ts","../../../projects/sdcorejs-angular/modules/layout/configurations/layout.configuration.ts","../../../projects/sdcorejs-angular/modules/layout/services/responsive/responsive.service.ts","../../../projects/sdcorejs-angular/modules/layout/services/navigation-state/navigation-state.service.ts","../../../projects/sdcorejs-angular/modules/layout/services/layout.service.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/menu.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/menu-focus.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/high-light-search.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/user-menu/user-menu.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/user-menu/user-menu.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/user/user.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/user/user.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/user/user.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/user/user.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/shared/menu-tree/menu-tree.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/menu-tree/menu-tree.component.html","../../../projects/sdcorejs-angular/modules/layout/components/shared/search-field/search-field.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/search-field/search-field.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v2/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v2/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v2/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v2/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v3/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v3/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v3/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v3/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/layout-main/layout-main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/layout-main/layout-main.component.html","../../../projects/sdcorejs-angular/modules/layout/utils/tab-name.util.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/components/home-page/home-page.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/components/home-page/home-page.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/home/guards/home-redirect.guard.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/home.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/home.module.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/pages/root/root.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/pages/root/root.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/not-found.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/not-found.module.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/pages/root/root.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/pages/root/root.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/forbidden.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/forbidden.module.ts","../../../projects/sdcorejs-angular/modules/layout/layout.routing.ts","../../../projects/sdcorejs-angular/modules/layout/layout.module.ts","../../../projects/sdcorejs-angular/modules/layout/sdcorejs-angular-modules-layout.ts"],"sourcesContent":["import { booleanAttribute, Component, effect, ElementRef, inject, input } from '@angular/core';\n\n@Component({\n selector: 'sd-page',\n templateUrl: './page.component.html',\n styleUrl: './page.component.scss',\n})\nexport class SdPageComponent {\n private el = inject(ElementRef);\n\n title = input<string>('', { alias: 'title' });\n description = input<string>('', { alias: 'description' });\n noHeader = input(false, { transform: booleanAttribute, alias: 'noHeader' });\n\n constructor() {\n effect(() => {\n if (this.title()) {\n this.el.nativeElement.removeAttribute('title');\n }\n });\n }\n}\n","@if (!noHeader()) {\n <div class=\"c-page-header bg-white\">\n <div class=\"p-16 d-flex align-items-center w-full justify-content-between\">\n <div class=\"d-flex\">\n <ng-content select=\"[headerLeft]\">\n <div class=\"d-flex flex-column\">\n <div class=\"T20M\">{{ title() }}</div>\n @if (description()) {\n <div class=\"T14R text-secondary mt-4\">{{ description() }}</div>\n }\n </div>\n </ng-content>\n </div>\n <ng-content select=\"[headerRight]\"></ng-content>\n </div>\n </div>\n}\n\n<div class=\"c-page-wrapper px-0\">\n <div class=\"c-page-content\">\n <ng-content></ng-content>\n </div>\n</div>\n","import { SdLayoutChildrenMenu, SdLayoutMenu, SdLayoutRootMenu } from './menu.model';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\nexport function getMenuStableKey(menu: SdLayoutMenu | null | undefined, ancestors: string[] = []): string {\n if (!menu || typeof menu !== 'object') return '';\n if (typeof menu.id === 'string' && menu.id.trim()) return `id:${menu.id.trim()}`;\n if ('path' in menu && typeof menu.path === 'string' && menu.path.trim()) return `path:${menu.path.trim()}`;\n\n const title = typeof menu.title === 'string' ? menu.title.trim() : '';\n const segments = [...ancestors, title]\n .map(segment => StringUtilities.changeAliasLowerCase(segment).trim().replace(/\\s+/g, '-'))\n .filter(Boolean);\n return segments.length ? `group:${segments.join('/')}` : '';\n}\n\nexport function searchMenuLeaves(menus: SdLayoutMenu[], query: string): SdLayoutRootMenu[] {\n const leaves = flattenMenuLeaves(menus);\n const normalizedQuery = query?.trim();\n if (!normalizedQuery) return leaves;\n return leaves.filter(menu =>\n [menu.title, menu.tooltipTitle].some(value => value && StringUtilities.aliasIncludes(value, normalizedQuery))\n );\n}\n\nexport function selectPrimaryMenuGroups(menus: SdLayoutMenu[], requestedIds: string[] | undefined, maximum = 3): SdLayoutMenu[] {\n const limit = Number.isFinite(maximum) && maximum > 0 ? Math.min(3, Math.floor(maximum)) : 3;\n const byId = new Map(menus.filter(menu => typeof menu.id === 'string').map(menu => [menu.id!, menu]));\n const selected: SdLayoutMenu[] = [];\n const selectedKeys = new Set<string>();\n\n for (const id of requestedIds ?? []) {\n const menu = byId.get(id);\n const key = getMenuStableKey(menu);\n if (!menu || !key || selectedKeys.has(key)) continue;\n selected.push(menu);\n selectedKeys.add(key);\n if (selected.length === limit) return selected;\n }\n\n for (const menu of menus) {\n const key = getMenuStableKey(menu);\n if (!key || selectedKeys.has(key)) continue;\n selected.push(menu);\n selectedKeys.add(key);\n if (selected.length === limit) break;\n }\n return selected;\n}\n\nexport function resolveMenuKeys(menus: SdLayoutMenu[], keys: string[]): (SdLayoutRootMenu | SdLayoutChildrenMenu)[] {\n const menuByKey = new Map<string, SdLayoutMenu>();\n visitMenus(menus, [], (menu, ancestors) => {\n const key = getMenuStableKey(menu, ancestors);\n if (key && !menuByKey.has(key)) menuByKey.set(key, menu);\n });\n return [...new Set(keys)].map(key => menuByKey.get(key)).filter((menu): menu is SdLayoutMenu => !!menu);\n}\n\nexport function flattenMenuLeaves(menus: SdLayoutMenu[]): SdLayoutRootMenu[] {\n const leaves: SdLayoutRootMenu[] = [];\n visitMenus(menus, [], menu => {\n if ('path' in menu && typeof menu.path === 'string' && menu.path) leaves.push(menu);\n });\n return leaves;\n}\n\nfunction visitMenus(\n menus: SdLayoutMenu[] | undefined,\n ancestors: string[],\n visitor: (menu: SdLayoutMenu, ancestors: string[]) => void\n): void {\n for (const menu of menus ?? []) {\n if (!menu || typeof menu !== 'object') continue;\n visitor(menu, ancestors);\n if ('children' in menu && Array.isArray(menu.children)) {\n const title = typeof menu.title === 'string' && menu.title.trim() ? menu.title.trim() : getMenuStableKey(menu, ancestors);\n visitMenus(menu.children, title ? [...ancestors, title] : ancestors, visitor);\n }\n }\n}\n","import { InjectionToken, Injectable, inject } from '@angular/core';\nimport { SdStorage, SdStorageOption, SdStorageService } from '@sdcorejs/angular/services';\nimport { SdLayoutChildrenMenu, SdLayoutMenu } from '../menu/menu.model';\nimport { getMenuStableKey, resolveMenuKeys } from '../menu/menu.utils';\n\n/**\n * Namespace áp cho toàn bộ state layout được persist — hằng chuỗi, hoặc hàm resolve lại mỗi lần đọc\n * (dùng cho danh tính chỉ biết được SAU khi đăng nhập, ví dụ id user hoặc tenant).\n */\nexport type SdLayoutStorageNamespace = string | (() => string | null | undefined);\n\n/**\n * Namespace do consumer cung cấp cho toàn bộ state layout được persist (thường là id user hoặc tenant).\n *\n * why: các key dưới đây là UUID CỐ ĐỊNH, không gắn với ai cả. Trên máy dùng chung, user A đăng xuất\n * rồi user B đăng nhập thì `pinnedMenuKeys` / `recentMenuKeys` / `lastActiveMenuGroupId` của A vẫn\n * còn nguyên trong localStorage và B nhìn thấy đúng những module A đã ghim và vừa truy cập. Cấp\n * namespace theo user/tenant sẽ tách hẳn không gian lưu trữ.\n *\n * ⚠️ `SdLayoutStorageService` là singleton `providedIn: 'root'`, thường được khởi tạo TRƯỚC khi biết\n * người dùng là ai. Vì vậy hãy cấp một **hàm** — nó được gọi lại ở mỗi lần truy cập handle, nên khi\n * danh tính đến (hoặc đổi) thì cả bảy handle tự dựng lại trên namespace mới:\n *\n * ```ts\n * providers: [\n * {\n * provide: SD_LAYOUT_STORAGE_NAMESPACE,\n * useFactory: () => {\n * const auth = inject(SdAuthService);\n * return () => auth.getAuthInfo?.()?.id;\n * },\n * },\n * ];\n * ```\n *\n * Đây là biện pháp bổ sung chứ không thay thế `SdLayoutStorageService.clear()` lúc signout.\n */\nexport const SD_LAYOUT_STORAGE_NAMESPACE = new InjectionToken<SdLayoutStorageNamespace>('sd.layout.storage.namespace');\n\ninterface SdLayoutStorageHandles {\n namespace: string | undefined;\n isShowSidebar: SdStorage<boolean>;\n menuLockStatus: SdStorage<boolean>;\n lastActiveMenuGroupId: SdStorage<string>;\n pinnedMenuGroup: SdStorage<SdLayoutChildrenMenu>;\n pinnedMenuKeys: SdStorage<string[]>;\n recentMenuKeys: SdStorage<string[]>;\n versionStates: SdStorage<Record<string, SdLayoutVersionState>>;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdLayoutStorageService {\n readonly #sdStorageService = inject(SdStorageService);\n readonly #namespaceSource = inject(SD_LAYOUT_STORAGE_NAMESPACE, { optional: true });\n #handles?: SdLayoutStorageHandles;\n\n // why: đọc namespace bằng field initializer là vô nghĩa — service là singleton `providedIn: 'root'`\n // nên nó chạy ở lần inject đầu tiên, thường TRƯỚC khi đăng nhập xong, và factory theo user trả về\n // `undefined` cho cả phiên; biện pháp \"pinned/recent của A không lộ sang B\" quảng cáo trong doc khi\n // đó không bao giờ có hiệu lực. Giải quyết bằng cách resolve LƯỜI ở mỗi lần truy cập handle: khi\n // danh tính đến (hoặc đổi user trong cùng phiên SPA) thì bảy handle được dựng lại trên namespace mới.\n get isShowSidebar(): SdStorage<boolean> {\n return this.#resolveHandles().isShowSidebar;\n }\n\n get menuLockStatus(): SdStorage<boolean> {\n return this.#resolveHandles().menuLockStatus;\n }\n\n get lastActiveMenuGroupId(): SdStorage<string> {\n return this.#resolveHandles().lastActiveMenuGroupId;\n }\n\n get pinnedMenuGroup(): SdStorage<SdLayoutChildrenMenu> {\n return this.#resolveHandles().pinnedMenuGroup;\n }\n\n get pinnedMenuKeys(): SdStorage<string[]> {\n return this.#resolveHandles().pinnedMenuKeys;\n }\n\n get recentMenuKeys(): SdStorage<string[]> {\n return this.#resolveHandles().recentMenuKeys;\n }\n\n get versionStates(): SdStorage<Record<string, SdLayoutVersionState>> {\n return this.#resolveHandles().versionStates;\n }\n\n /**\n * Xoá toàn bộ state layout đã persist.\n *\n * **Consumer PHẢI gọi hàm này trong luồng signout, TRƯỚC khi danh tính bị xoá.** Nếu không,\n * pinned/recent/last-active của user vừa đăng xuất sẽ còn lại trên trình duyệt và hiện ra cho người\n * đăng nhập kế tiếp — rò rỉ tên module nội bộ mà người đó có thể không có quyền thấy.\n *\n * why: khi đã cấu hình `SD_LAYOUT_STORAGE_NAMESPACE` theo user, namespace được resolve NGAY LÚC GỌI.\n * Gọi `clear()` sau khi auth info về `undefined` sẽ xoá nhầm partition không-namespace, còn dữ liệu\n * của user vừa thoát thì vẫn nguyên.\n */\n clear(): void {\n const handles = this.#resolveHandles();\n for (const handle of this.#allHandles(handles)) handle.remove();\n }\n\n // why: namespace rỗng/space phải quy về undefined, nếu không mỗi chuỗi rác lại tạo ra một không\n // gian lưu trữ khác và state của chính user đó biến mất sau khi reload.\n #resolveNamespace(): string | undefined {\n const source = this.#namespaceSource;\n const raw = typeof source === 'function' ? source() : source;\n return typeof raw === 'string' ? raw.trim() || undefined : undefined;\n }\n\n #resolveHandles(): SdLayoutStorageHandles {\n const namespace = this.#resolveNamespace();\n const current = this.#handles;\n if (current && current.namespace === namespace) return current;\n // why: handle cũ phải `destroy()` (KHÔNG phải `remove()`) — chỉ gỡ facade và complete subject,\n // dữ liệu của namespace trước vẫn nằm nguyên để user đó quay lại còn đọc được.\n if (current) for (const handle of this.#allHandles(current)) handle.destroy();\n const next = this.#createHandles(namespace);\n this.#handles = next;\n return next;\n }\n\n #createHandles(namespace: string | undefined): SdLayoutStorageHandles {\n // why: `{ namespace: undefined }` cho ra đúng identity như khi không truyền option (`SdStorageService`\n // không áp namespace mặc định nào), nên app không cấu hình namespace vẫn đọc được state đã persist\n // từ trước — không mất pinned/recent khi nâng cấp thư viện.\n const option: SdStorageOption = { namespace };\n return {\n namespace,\n isShowSidebar: this.#sdStorageService.create('cb07c316-ed6d-4620-9e92-53dbef6aa983', option),\n menuLockStatus: this.#sdStorageService.create('2c2f4816-18b3-4ec3-8177-7b90bff036c3', option),\n lastActiveMenuGroupId: this.#sdStorageService.create('2e6961d0-3380-4a94-a6a1-38837560cd96', option),\n pinnedMenuGroup: this.#sdStorageService.create('e81da122-5dab-4250-b309-64197fb19d44', option),\n pinnedMenuKeys: this.#sdStorageService.create('4bdc7f80-9ff4-4fe0-908f-6c9f7fe4100a', option),\n recentMenuKeys: this.#sdStorageService.create('fb989dc1-f6e7-4b62-a611-861a8f214a51', option),\n versionStates: this.#sdStorageService.create('ca8e4261-fbd4-4209-af88-2dbe278c1a1b', option),\n };\n }\n\n #allHandles(handles: SdLayoutStorageHandles): readonly Pick<SdStorage, 'remove' | 'destroy'>[] {\n return [\n handles.isShowSidebar,\n handles.menuLockStatus,\n handles.lastActiveMenuGroupId,\n handles.pinnedMenuGroup,\n handles.pinnedMenuKeys,\n handles.recentMenuKeys,\n handles.versionStates,\n ];\n }\n\n readPinnedMenuKeys(menus: SdLayoutMenu[]): string[] {\n const storedKeys = this.pinnedMenuKeys.has() ? this.pinnedMenuKeys.get() : this.#getLegacyPinnedKeys();\n const validKeys = this.#resolveValidKeys(menus, storedKeys ?? []);\n if (!this.pinnedMenuKeys.has() || !this.#sameKeys(storedKeys ?? [], validKeys)) {\n this.pinnedMenuKeys.set(validKeys);\n }\n return validKeys;\n }\n\n writePinnedMenuKeys(keys: string[]): void {\n this.pinnedMenuKeys.set([...new Set(keys.filter(Boolean))]);\n }\n\n readRecentMenuKeys(menus: SdLayoutMenu[], maximum = 5): string[] {\n const storedKeys = this.recentMenuKeys.get() ?? [];\n const limit = Number.isFinite(maximum) && maximum > 0 ? Math.floor(maximum) : 5;\n const validKeys = this.#resolveValidKeys(menus, storedKeys).slice(0, limit);\n if (!this.#sameKeys(storedKeys, validKeys)) this.recentMenuKeys.set(validKeys);\n return validKeys;\n }\n\n writeRecentMenuKeys(keys: string[]): void {\n this.recentMenuKeys.set([...new Set(keys.filter(Boolean))]);\n }\n\n readVersionState(version: 1 | 2 | 3): SdLayoutVersionState {\n return this.versionStates.get()?.[String(version)] ?? {};\n }\n\n patchVersionState(version: 1 | 2 | 3, patch: SdLayoutVersionState): SdLayoutVersionState {\n const states = this.versionStates.get() ?? {};\n const nextState = { ...(states[String(version)] ?? {}), ...patch };\n this.versionStates.set({ ...states, [String(version)]: nextState });\n return nextState;\n }\n\n #getLegacyPinnedKeys(): string[] {\n const legacyGroup = this.pinnedMenuGroup.get();\n if (!legacyGroup || !Array.isArray(legacyGroup.children)) return [];\n return legacyGroup.children.map(menu => getMenuStableKey(menu)).filter(Boolean);\n }\n\n #resolveValidKeys(menus: SdLayoutMenu[], keys: string[]): string[] {\n return resolveMenuKeys(menus, keys)\n .map(menu => getMenuStableKey(menu))\n .filter(Boolean);\n }\n\n #sameKeys(left: string[], right: string[]): boolean {\n return left.length === right.length && left.every((key, index) => key === right[index]);\n }\n}\n\nexport interface SdLayoutVersionState {\n activeGroupKey?: string;\n locked?: boolean;\n collapsed?: boolean;\n}\n","import { InjectionToken, Signal } from '@angular/core';\nimport { MaybeAsync } from '@sdcorejs/utils/models';\nimport { Observable } from 'rxjs';\n\n/** Consumer-owned account action invoked without arguments by the shared user menu. */\nexport type SdLayoutAccountAction = () => void | Promise<void>;\n\n/** Notification badge source and the action that opens the consumer's notification experience. */\nexport interface SdLayoutNotificationConfiguration {\n /**\n * Số lượng thông báo chưa đọc. Hỗ trợ giá trị tĩnh hoặc nguồn reactive dài hạn.\n */\n count: number | Signal<number> | Observable<number>;\n\n /**\n * Tác vụ do consumer xử lý khi người dùng chọn thông báo.\n */\n action: SdLayoutAccountAction;\n}\n\nexport interface ISdLayoutConfiguration {\n homeUrl?: string;\n mobileBreakpoint?: number;\n sidebar: ISdSidebarConfiguration | (() => MaybeAsync<ISdSidebarConfiguration>);\n userInfo: SdLayoutUserInfo | (() => MaybeAsync<SdLayoutUserInfo>);\n signout: SdLayoutAccountAction;\n changePassword?: SdLayoutAccountAction;\n\n /**\n * Tác vụ chỉnh sửa hồ sơ do consumer cung cấp.\n */\n updateProfile?: SdLayoutAccountAction;\n\n /**\n * Tác vụ mở thiết lập tài khoản do consumer cung cấp.\n */\n setting?: SdLayoutAccountAction;\n\n /**\n * Cấu hình số lượng và tác vụ thông báo của tài khoản.\n */\n notification?: SdLayoutNotificationConfiguration;\n}\n\n/** Optional role metadata rendered below the user's email when `text` is non-empty. */\nexport interface SdLayoutUserRole {\n text: string;\n /** Icon name resolved by `SdIcon`. */\n icon?: string;\n /** CSS color applied to the role metadata. */\n color?: string;\n}\n\nexport interface SdLayoutUserInfo {\n /**\n * Tên đăng nhập hoặc tên định danh của người dùng.\n * Thường dùng làm định danh rút gọn hoặc fallback hiển thị nếu user chưa cập nhật fullName.\n */\n username?: string;\n\n /**\n * Địa chỉ thư điện tử của người dùng.\n * Thường được hiển thị bên dưới tên người dùng trong popup/menu thông tin tài khoản.\n */\n email?: string;\n\n /**\n * Họ và tên đầy đủ của người dùng.\n * Đây là thông tin được ưu tiên hiển thị chính trên giao diện (VD: góc phải màn hình, lời chào).\n */\n fullName?: string;\n\n /**\n * Hình đại diện (avatar) của người dùng.\n * Nếu để trống, hệ thống sẽ tự động lấy ký tự đầu tiên của fullName hoặc username để tạo avatar mặc định.\n * Hỗ trợ các định dạng: URL (http/https), chuỗi base64 (data:image), hoặc đường dẫn nội bộ.\n */\n avatar?: string;\n\n /**\n * Chức vụ hoặc vai trò hiển thị cùng thông tin người dùng.\n * Không render khi `text` rỗng.\n */\n role?: SdLayoutUserRole;\n}\n\nexport const DEFAULT_LAYOUT_MOBILE_BREAKPOINT = 1024;\n\nexport interface SidebarConfigurationBase {\n brandColor?: string;\n brandLightColor?: string;\n logoUrl?: string;\n defaultTitle?: string;\n pin?: {\n enabled?: boolean;\n };\n}\n\nexport type ISdSidebarConfiguration = SidebarConfigurationV1 | SidebarConfigurationV2 | SidebarConfigurationV3;\n\nexport interface SidebarConfigurationV1 extends SidebarConfigurationBase {\n version: 1;\n\n /**\n * Màu brand chính.\n * Nên sử dụng mã màu #HEX hoặc rgb để hỗ trợ opacity khi hover.\n * Ví dụ: #1890ff, rgb(24,144,255)\n */\n brandColor?: string;\n\n /**\n * Màu brand nhạt (light).\n * Dùng cho background, hover nhẹ.\n */\n brandLightColor?: string;\n\n /**\n * URL logo hiển thị ở sidebar.\n * Nên đặt trong thư mục public hoặc dùng URL CDN.\n */\n logoUrl?: string;\n\n /**\n * Title mặc định của hệ thống.\n * Nếu menu không truyền title thì sẽ dùng giá trị này.\n * @default \"Back Office\"\n */\n defaultTitle?: string;\n\n /**\n * Cấu hình tính năng ghim menu.\n * - `enabled`: bật/tắt tính năng ghim.\n * Hệ thống mặc định là false\n */\n pin?: {\n enabled?: boolean;\n };\n}\n\nexport interface SidebarConfigurationV2 extends SidebarConfigurationBase {\n version: 2;\n interaction?: 'click' | 'hover-lock';\n primaryMenuIds?: string[];\n}\n\nexport interface SidebarConfigurationV3 extends SidebarConfigurationBase {\n version: 3;\n defaultCollapsed?: boolean;\n recent?: {\n enabled?: boolean;\n maxItems?: number;\n };\n}\n\nexport interface ResolvedSidebarRecentConfiguration {\n enabled: boolean;\n maxItems: number;\n}\n\nexport function normalizeLayoutMobileBreakpoint(value: number | undefined): number {\n if (!Number.isFinite(value) || Number(value) <= 0) {\n return DEFAULT_LAYOUT_MOBILE_BREAKPOINT;\n }\n return Math.floor(Number(value));\n}\n\nexport function resolveSidebarV2Interaction(sidebar: SidebarConfigurationV2): 'click' | 'hover-lock' {\n return sidebar.interaction === 'hover-lock' ? 'hover-lock' : 'click';\n}\n\nexport function resolveSidebarV3Recent(sidebar: SidebarConfigurationV3): ResolvedSidebarRecentConfiguration {\n const configuredLimit = sidebar.recent?.maxItems;\n const maxItems = Number.isFinite(configuredLimit) && Number(configuredLimit) > 0 ? Math.floor(Number(configuredLimit)) : 5;\n return {\n enabled: sidebar.recent?.enabled ?? true,\n maxItems,\n };\n}\n\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV1): SidebarConfigurationV1;\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV2): SidebarConfigurationV2;\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV3): SidebarConfigurationV3;\nexport function normalizeSidebarConfiguration(sidebar: ISdSidebarConfiguration): ISdSidebarConfiguration {\n if (sidebar.version === 2) {\n return {\n ...sidebar,\n interaction: resolveSidebarV2Interaction(sidebar),\n primaryMenuIds: [...new Set((sidebar.primaryMenuIds ?? []).filter(id => typeof id === 'string' && id.trim()))].slice(0, 3),\n };\n }\n if (sidebar.version === 3) {\n return {\n ...sidebar,\n defaultCollapsed: sidebar.defaultCollapsed ?? false,\n recent: resolveSidebarV3Recent(sidebar),\n };\n }\n return sidebar;\n}\n\nexport const SD_LAYOUT_CONFIGURATION = new InjectionToken<ISdLayoutConfiguration>('sd.layout.configuration');\n","import { Injectable, inject } from '@angular/core';\nimport { SD_VIEWPORT, SdViewport, SdViewportService } from '@sdcorejs/angular/services/viewport';\nimport { normalizeLayoutMobileBreakpoint } from '../../configurations';\n\nexport type SdLayoutViewport = SdViewport;\nexport const SD_LAYOUT_VIEWPORT = SD_VIEWPORT;\n\n/** @deprecated Prefer `SdViewportService` from `@sdcorejs/angular/services/viewport`. */\n@Injectable({ providedIn: 'root' })\nexport class SdLayoutResponsiveService {\n readonly #viewport = inject(SdViewportService);\n readonly viewportWidth = this.#viewport.width;\n\n isMobile(breakpoint: number): boolean {\n return this.viewportWidth() < normalizeLayoutMobileBreakpoint(breakpoint);\n }\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { ResolvedSidebarRecentConfiguration } from '../../configurations';\nimport { SdLayoutMenu } from '../menu/menu.model';\nimport { getMenuStableKey, resolveMenuKeys } from '../menu/menu.utils';\nimport { SdLayoutStorageService, SdLayoutVersionState } from '../storage/storage.service';\n\n@Injectable({ providedIn: 'root' })\nexport class SdLayoutNavigationStateService {\n readonly #storage = inject(SdLayoutStorageService);\n readonly #menus = signal<SdLayoutMenu[]>([]);\n readonly pinnedKeys = signal<string[]>([]);\n readonly recentKeys = signal<string[]>([]);\n readonly pinnedMenus = computed(() => resolveMenuKeys(this.#menus(), this.pinnedKeys()));\n readonly recentMenus = computed(() => resolveMenuKeys(this.#menus(), this.recentKeys()));\n\n hydrate(menus: SdLayoutMenu[], recentMaximum = 5): void {\n this.#menus.set(menus);\n this.pinnedKeys.set(this.#storage.readPinnedMenuKeys(menus));\n this.recentKeys.set(this.#storage.readRecentMenuKeys(menus, recentMaximum));\n }\n\n togglePinned(menu: SdLayoutMenu): void {\n const key = getMenuStableKey(menu);\n if (!key) return;\n const nextKeys = this.pinnedKeys().includes(key)\n ? this.pinnedKeys().filter(currentKey => currentKey !== key)\n : [...this.pinnedKeys(), key];\n this.pinnedKeys.set(nextKeys);\n this.#storage.writePinnedMenuKeys(nextKeys);\n }\n\n recordRecent(menu: SdLayoutMenu, configuration: ResolvedSidebarRecentConfiguration): void {\n if (!configuration.enabled) return;\n const key = getMenuStableKey(menu);\n if (!key) return;\n const maximum = Number.isFinite(configuration.maxItems) && configuration.maxItems > 0 ? Math.floor(configuration.maxItems) : 5;\n const nextKeys = [key, ...this.recentKeys().filter(currentKey => currentKey !== key)].slice(0, maximum);\n this.recentKeys.set(nextKeys);\n this.#storage.writeRecentMenuKeys(nextKeys);\n }\n\n patchVersionState(version: 1 | 2 | 3, patch: SdLayoutVersionState): void {\n this.#storage.patchVersionState(version, patch);\n }\n\n versionState(version: 1 | 2 | 3): SdLayoutVersionState {\n return this.#storage.readVersionState(version);\n }\n}\n","import { InjectionToken, Injectable, inject, signal } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { resolveMaybeAsync } from '@sdcorejs/utils/models';\nimport { ISdLayoutConfiguration, ISdSidebarConfiguration, SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../configurations';\n\n/**\n * Bật fallback demo của `SdLayoutService` khi KHÔNG provide `SD_LAYOUT_CONFIGURATION`.\n *\n * why: fallback cũ chạy ngầm sau mỗi `console.warn`, nên một app cấu hình thiếu vẫn ship được UI có\n * user \"demo@example.com\" đang đăng nhập cùng nút signout không làm gì — người dùng cuối tin là đã\n * đăng nhập thật. Giờ mặc định là throw; ai thực sự cần demo/playground phải khai báo ý định:\n *\n * ```ts\n * providers: [{ provide: SD_LAYOUT_DEMO_FALLBACK, useValue: true }]\n * ```\n *\n * Cờ nằm ở token riêng chứ không phải field của `ISdLayoutConfiguration`, vì nó phải đọc được ĐÚNG\n * lúc `SD_LAYOUT_CONFIGURATION` vắng mặt — khi đó không có object configuration nào để đọc field.\n */\nexport const SD_LAYOUT_DEMO_FALLBACK = new InjectionToken<boolean>('sd.layout.demo-fallback');\n\n@Injectable({\n providedIn: 'root', // Có thể đổi thành 'any' hoặc khai báo trong mảng providers của LayoutModule tùy kiến trúc của bạn\n})\nexport class SdLayoutService {\n // ==========================================\n // INJECT CONFIGURATIONS\n // ==========================================\n // WHY: optional=true để service tự phát hiện consumer thiếu config và báo lỗi rõ ràng,\n // thay vì để Angular ném NullInjectorError khó đọc từ một component sâu trong cây.\n #layoutConfiguration = inject<ISdLayoutConfiguration | null>(SD_LAYOUT_CONFIGURATION, { optional: true });\n #demoFallback = inject(SD_LAYOUT_DEMO_FALLBACK, { optional: true }) ?? false;\n #i18n = inject(I18nService);\n\n // ==========================================\n // SHARED SIGNALS (STATE)\n // ==========================================\n userInfo = signal<SdLayoutUserInfo | undefined>(undefined);\n sidebar = signal<ISdSidebarConfiguration | undefined>(undefined);\n\n /**\n * Route \"về trang chủ\" của consumer, lấy từ `ISdLayoutConfiguration.homeUrl`.\n * why: các trang lỗi (forbidden / not-found) cần một đích điều hướng thật thay vì reload chính nó.\n */\n readonly homeUrl = this.#layoutConfiguration?.homeUrl?.trim() || '/';\n\n constructor() {\n if (!this.#layoutConfiguration) {\n if (!this.#demoFallback) {\n // why: fail loudly. Im lặng degrade sang mock user là ship ra production một UI nói dối\n // rằng người dùng đã đăng nhập (email demo, signout no-op).\n throw new Error(\n // @i18n-ignore dev-facing error — không cần dịch\n '[SdLayoutService] SD_LAYOUT_CONFIGURATION chưa được provide. ' +\n // @i18n-ignore\n 'Provide token này (xem ISdLayoutConfiguration) để cấu hình user info / sidebar / signout. ' +\n // @i18n-ignore\n 'Nếu đang chạy demo/playground và CHỦ ĐỘNG muốn mock data, provide SD_LAYOUT_DEMO_FALLBACK = true.'\n );\n }\n\n // WHY: chỉ chạy khi consumer chủ động opt-in demo fallback.\n // @i18n-ignore dev-facing console.warn — không cần dịch\n console.warn(\n // @i18n-ignore\n '[SdLayoutService] SD_LAYOUT_CONFIGURATION chưa được inject — đang dùng mock data qua SD_LAYOUT_DEMO_FALLBACK. ' +\n // @i18n-ignore\n 'Tuyệt đối không bật cờ này trên môi trường thật.'\n );\n this.userInfo.set(this.#mockUserInfo());\n this.sidebar.set(this.#mockSidebar());\n return;\n }\n this.#initUserInfo();\n this.#initSidebar();\n }\n\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n #initUserInfo(): void {\n const userInfoConfig = this.#layoutConfiguration!.userInfo;\n if (typeof userInfoConfig === 'function') {\n resolveMaybeAsync(userInfoConfig()).then(userInfo => this.userInfo.set(userInfo));\n } else {\n this.userInfo.set(userInfoConfig);\n }\n }\n\n #initSidebar(): void {\n const sidebarConfig = this.#layoutConfiguration!.sidebar;\n if (typeof sidebarConfig === 'function') {\n resolveMaybeAsync(sidebarConfig()).then(config => this.sidebar.set(config));\n } else {\n this.sidebar.set(sidebarConfig);\n }\n }\n\n #mockUserInfo(): SdLayoutUserInfo {\n return {\n fullName: this.#i18n.t('core.module.layout.mock.user.full-name'),\n email: 'demo@example.com',\n username: 'demo',\n };\n }\n\n #mockSidebar(): ISdSidebarConfiguration {\n return {\n version: 1,\n defaultTitle: 'Back Office',\n };\n }\n}\n","import { Utilities } from '@sdcorejs/utils/fns';\nimport { Injectable, Pipe, PipeTransform, inject } from '@angular/core';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdLayoutMenu, Menus } from '../services/menu/menu.model';\nimport { Params } from '@angular/router';\nimport { SdPermissionService } from '@sdcorejs/angular/modules/permission';\nimport { sdIsExternalHttpUrl, sdParseUrl } from '@sdcorejs/angular/utilities';\n// End\n@Pipe({\n name: 'menu',\n})\n@Injectable({\n providedIn: 'root',\n})\nexport class MenuPipe implements PipeTransform {\n private permissionService = inject(SdPermissionService);\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {}\n transform(menus: SdLayoutMenu[]): SdLayoutMenu[] {\n const results: Menus = [];\n const check = (menu: SdLayoutMenu): SdLayoutMenu | null => {\n if ('children' in menu) {\n const children: Menus = [];\n menu.children?.forEach(childMenu => {\n childMenu = check(childMenu) as SdLayoutMenu;\n if (childMenu) {\n children.push({ ...childMenu, id: this.#getHashIdMenu(childMenu) });\n }\n });\n\n if (!children.length) {\n return null;\n }\n\n return {\n ...menu,\n children,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if ('permission' in menu) {\n // why: code cũ là `const path = menu?.path?.includes('http') ? menu.path : menu.path` — hai\n // nhánh giống hệt nhau nên biến `path` không biến đổi gì, tức phần validate URL đã bị mất.\n // `path` chảy thẳng xuống `window.open()` / `routerLink` của sidebar, nên ở đây validate thật\n // và loại menu có scheme nguy hiểm (`javascript:`, `data:`, `vbscript:`…) — fail closed.\n // Không cần biến trung gian nữa: `path` đi kèm nguyên vẹn trong `{ ...menu }`.\n if (!menu.path || !this.#isSafeMenuPath(menu.path)) {\n return null;\n }\n\n if (\n (typeof menu.permission === 'string' || Array.isArray(menu.permission)) &&\n this.permissionService.hasPermission(menu.permission, menu.permissionKey)\n ) {\n return {\n ...menu,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if (typeof menu.permission === 'boolean' && menu.permission) {\n return {\n ...menu,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if (typeof menu.permission === 'function' && menu.permission()) {\n return {\n ...menu,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n return null;\n }\n\n // why: tới đây menu không có `children` và cũng KHÔNG có key `permission`. Nếu nó vẫn có `path`\n // thì đó là một menu lá điều hướng được, và việc gõ sai key (`permision`, `permissions`) sẽ\n // khiến item hiện với MỌI người — fail open. Chặn ở runtime (fail closed) thay vì siết type\n // `SdLayoutMenu`: menu thường được dựng động từ API/JSON rồi ép `as SdLayoutMenu[]`, nên siết\n // type không bắt được ca đó mà lại thành breaking change cho consumer đang build tĩnh.\n if ('path' in menu) {\n return null;\n }\n\n return {\n ...menu,\n id: Utilities.generateUuid(),\n };\n };\n\n menus?.forEach(menu => {\n menu = check(menu) as SdLayoutMenu;\n if (menu) {\n results.push(menu);\n }\n });\n return results;\n }\n\n /**\n * why: `sdParseUrl` không truyền base nên chỉ parse được URL TUYỆT ĐỐI. Không parse được ⇒ path\n * tương đối ⇒ route nội bộ của app, an toàn. Parse được thì scheme bắt buộc phải là `http(s)`;\n * mọi scheme khác bị loại vì `path` cuối cùng chảy vào `window.open()` của sidebar.\n */\n #isSafeMenuPath = (path: string): boolean => sdParseUrl(path) == null || sdIsExternalHttpUrl(path);\n\n #getHashIdMenu = (menu: SdLayoutMenu): string => {\n const explicitId = typeof menu.id === 'string' ? menu.id.trim() : '';\n if (explicitId) return explicitId;\n\n const extendedMenu = menu as SdLayoutMenu & {\n path?: string;\n permission?: string;\n permissionKey?: string;\n queryParams?: Params;\n };\n const hashKeys: (keyof typeof extendedMenu)[] = [\n 'title',\n 'path',\n 'permission',\n 'permissionKey',\n 'queryParams',\n 'icon',\n 'level',\n 'tooltipTitle',\n ];\n const hashData = hashKeys.reduce(\n (acc, key) => {\n const value = extendedMenu[key];\n if (value !== undefined && value !== null) {\n acc[key as string] = value;\n }\n return acc;\n },\n {} as Record<string, any>\n );\n\n return Object.keys(hashData).length > 0 ? Utilities.hash(hashData) : Utilities.generateUuid();\n };\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdLayoutMenu } from '../services';\n// End\n@Pipe({\n name: 'menuFocus',\n})\n@Injectable({ providedIn: 'root' })\nexport class MenuFocusPipe implements PipeTransform {\n transform(routePath: string, menuItem: SdLayoutMenu): boolean {\n if (!routePath) {\n return false;\n }\n if ('children' in menuItem && menuItem.children) {\n return menuItem.children.some(child => {\n return 'path' in child && child.path ? this.#match(routePath, child.path) : false;\n });\n }\n return 'path' in menuItem && this.#match(routePath, menuItem.path);\n }\n\n #match = (routePath: string, path: string): boolean => {\n if (!path) {\n return false;\n }\n if (routePath === path) {\n return true;\n }\n return this.#normalizePath(routePath).startsWith(this.#normalizePath(path));\n };\n\n #normalizePath = (p: string): string => {\n return p.endsWith('/') ? p : p + '/';\n };\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\n@Pipe({\n name: 'highLightSearch',\n})\nexport class HighlightSearchPipe implements PipeTransform {\n transform(\n value: string,\n keyword: string,\n args?: {\n color?: string;\n }\n ): string {\n const { color = '#ffff00' } = args ?? {};\n keyword = this.#normalizeValue(keyword);\n if (!keyword || keyword.length < 2) {\n return value;\n }\n value = value?.trim() || '';\n const aliasKeyword = StringUtilities.changeAliasLowerCase(keyword);\n const aliasLowerCaseStr = StringUtilities.changeAliasLowerCase(value);\n\n // Ưu tiên highlight theo chuỗi con liền nhau (khớp trực tiếp với tiêu đề/route)\n const substringHighlight = this.#highlightSubstring(value, aliasLowerCaseStr, aliasKeyword, color);\n if (substringHighlight !== null) {\n return substringHighlight;\n }\n\n // Không có chuỗi con nào khớp -> thử highlight theo ký tự đầu (viết tắt), vd \"sp\" -> \"Sản phẩm\"\n return this.#highlightOrderedInitials(value, aliasLowerCaseStr, aliasKeyword, color) ?? value;\n }\n\n #highlightSubstring = (value: string, aliasLowerCaseStr: string, aliasKeyword: string, color: string): string | null => {\n const regex = new RegExp(aliasKeyword, 'gi'); //'gi' for case insensitive and can use 'g' if you want the search to be case sensitive.\n const strs: string[] = [];\n let previousOffset = 0;\n let hasMatch = false;\n aliasLowerCaseStr.replace(regex, (_, offset) => {\n hasMatch = true;\n strs.push(value.substring(previousOffset, offset));\n strs.push(`<mark style=\"background-color: ${color}\">${value.substring(offset, offset + aliasKeyword.length)}</mark>`);\n previousOffset = offset + aliasKeyword.length;\n return `<mark style=\"background-color: ${color}\">${value.substring(offset, offset + aliasKeyword.length)}</mark>`;\n });\n if (!hasMatch) {\n return null;\n }\n strs.push(value.substring(previousOffset, value.length));\n return strs.join('');\n };\n\n #highlightOrderedInitials = (value: string, aliasLowerCaseStr: string, aliasKeyword: string, color: string): string | null => {\n const wordRegex = /\\S+/g;\n const matchedPositions: number[] = [];\n let matchedCount = 0;\n let wordMatch: RegExpExecArray | null;\n while ((wordMatch = wordRegex.exec(aliasLowerCaseStr))) {\n if (matchedCount >= aliasKeyword.length) {\n break;\n }\n if (wordMatch[0][0] === aliasKeyword[matchedCount]) {\n matchedPositions.push(wordMatch.index);\n matchedCount++;\n }\n }\n if (matchedCount !== aliasKeyword.length) {\n return null;\n }\n\n let result = '';\n let cursor = 0;\n for (const position of matchedPositions) {\n result += value.substring(cursor, position);\n result += `<mark style=\"background-color: ${color}\">${value.charAt(position)}</mark>`;\n cursor = position + 1;\n }\n result += value.substring(cursor);\n return result;\n };\n\n #normalizeValue = (keyword: string) => {\n let str: string = keyword?.toString() ?? '';\n /* eslint-disable no-useless-escape */\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\n str = str.replace(/ + /g, ' ');\n str = str.trim();\n return str;\n };\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n isSignal,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdAvatar } from '@sdcorejs/angular/components';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { isObservable } from 'rxjs';\nimport {\n SD_LAYOUT_CONFIGURATION,\n SdLayoutAccountAction,\n SdLayoutNotificationConfiguration,\n SdLayoutUserInfo,\n} from '../../../configurations';\n\n@Component({\n selector: 'sd-layout-user-menu',\n standalone: true,\n imports: [SdAvatar, SdIcon, SdTranslatePipe],\n templateUrl: './user-menu.component.html',\n styleUrl: './user-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutUserMenuComponent {\n readonly #configuration = inject(SD_LAYOUT_CONFIGURATION, { optional: true });\n readonly #destroyRef = inject(DestroyRef);\n readonly #document = inject(DOCUMENT);\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n private readonly menu = viewChild<ElementRef<HTMLElement>>('menu');\n\n userInfo = input.required<SdLayoutUserInfo>();\n signout = input<SdLayoutAccountAction | undefined>();\n changePassword = input<SdLayoutAccountAction | undefined>();\n updateProfile = input<SdLayoutAccountAction | undefined>();\n setting = input<SdLayoutAccountAction | undefined>();\n notification = input<SdLayoutNotificationConfiguration | undefined>();\n compact = input(false);\n presentation = input<'disclosure' | 'mobile' | 'mobile-inline'>('disclosure');\n opened = output<void>();\n closed = output<void>();\n isOpen = signal(false);\n readonly #observableNotificationCount = signal<number | undefined>(undefined);\n\n avatar = computed(() => {\n const user = this.userInfo();\n return user.avatar || user.fullName || user.username || user.email;\n });\n displayName = computed(() => this.userInfo().fullName || this.userInfo().username || this.userInfo().email || 'User');\n role = computed(() => {\n const role = this.userInfo().role;\n const text = role?.text?.trim();\n return text ? { ...role, text } : undefined;\n });\n signoutAction = computed(() => this.signout() ?? this.#configuration?.signout);\n changePasswordAction = computed(() => this.changePassword() ?? this.#configuration?.changePassword);\n updateProfileAction = computed(() => this.updateProfile() ?? this.#configuration?.updateProfile);\n settingAction = computed(() => this.setting() ?? this.#configuration?.setting);\n notificationConfiguration = computed(() => this.notification() ?? this.#configuration?.notification);\n notificationAction = computed(() => this.notificationConfiguration()?.action);\n notificationCount = computed(() => {\n const source = this.notificationConfiguration()?.count;\n const value = isSignal(source) ? source() : isObservable(source) ? this.#observableNotificationCount() : source;\n return this.#normalizeNotificationCount(value);\n });\n notificationBadge = computed(() => {\n const count = this.notificationCount();\n return count > 99 ? '99+' : count > 0 ? String(count) : undefined;\n });\n\n constructor() {\n // Observable sources may change with component inputs; effect cleanup guarantees one active subscription.\n effect(onCleanup => {\n const source = this.notificationConfiguration()?.count;\n this.#observableNotificationCount.set(undefined);\n if (!isObservable(source)) return;\n\n const subscription = source.subscribe(value => this.#observableNotificationCount.set(value));\n onCleanup(() => subscription.unsubscribe());\n });\n\n effect(() => {\n if (!this.isOpen()) return;\n this.menu()?.nativeElement.querySelector<HTMLButtonElement>('[role=\"menuitem\"]')?.focus();\n });\n\n const onDocumentKeydown = (event: KeyboardEvent): void => {\n if (!this.isOpen() || event.key !== 'Escape') return;\n event.preventDefault();\n this.close();\n };\n const onDocumentPointerDown = (event: PointerEvent): void => {\n if (!this.isOpen()) return;\n const nodeConstructor = this.#document.defaultView?.Node;\n if (!nodeConstructor || !(event.target instanceof nodeConstructor) || this.#host.nativeElement.contains(event.target)) return;\n this.close(false);\n };\n\n this.#document.addEventListener('keydown', onDocumentKeydown);\n this.#document.addEventListener('pointerdown', onDocumentPointerDown);\n this.#destroyRef.onDestroy(() => {\n this.#document.removeEventListener('keydown', onDocumentKeydown);\n this.#document.removeEventListener('pointerdown', onDocumentPointerDown);\n });\n }\n\n open(): void {\n if (this.isOpen()) return;\n this.isOpen.set(true);\n this.opened.emit();\n }\n\n toggle(): void {\n if (this.isOpen()) this.close(false);\n else this.open();\n }\n\n close(restoreFocus = true): void {\n const wasOpen = this.isOpen();\n this.isOpen.set(false);\n if (wasOpen) this.closed.emit();\n if (restoreFocus) this.trigger()?.nativeElement.focus();\n }\n\n onMenuKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key) || !(event.currentTarget instanceof HTMLElement)) return;\n\n const actions = [...event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"menuitem\"]')];\n if (!actions.length) return;\n event.preventDefault();\n const currentIndex = actions.findIndex(action => action === this.#document.activeElement);\n const nextIndex =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? actions.length - 1\n : event.key === 'ArrowDown'\n ? (currentIndex + 1) % actions.length\n : (currentIndex - 1 + actions.length) % actions.length;\n actions[nextIndex].focus();\n }\n\n runChangePassword(): void {\n this.#runAction(this.changePasswordAction());\n }\n\n runSignout(): void {\n this.#runAction(this.signoutAction());\n }\n\n runUpdateProfile(): void {\n this.#runAction(this.updateProfileAction());\n }\n\n runSetting(): void {\n this.#runAction(this.settingAction());\n }\n\n runNotification(): void {\n this.#runAction(this.notificationAction());\n }\n\n #runAction(action: SdLayoutAccountAction | undefined): void {\n action?.();\n this.close();\n }\n\n #normalizeNotificationCount(value: number | undefined): number {\n return Number.isFinite(value) && Number(value) > 0 ? Math.floor(Number(value)) : 0;\n }\n}\n","@let _presentation = presentation();\n@let _role = role();\n@let _notificationBadge = notificationBadge();\n<div class=\"sd-layout-user-menu position-relative\">\n @if (_presentation !== 'disclosure') {\n <div class=\"sd-layout-user-menu__mobile d-flex flex-column gap-8\">\n <div\n data-mobile-account-row\n class=\"sd-layout-user-menu__mobile-row sd-layout-user-menu__mobile--inline d-flex align-items-center gap-8\">\n <div data-user-summary class=\"sd-layout-user-menu__summary d-flex align-items-center gap-8 flex-1\">\n <sd-avatar [src]=\"avatar()\" [size]=\"40\"></sd-avatar>\n <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n @if (userInfo().email) {\n <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n }\n @if (_role) {\n <span\n data-user-role\n class=\"sd-layout-user-menu__role d-flex align-items-center gap-4 T12R text-ellipsis\"\n [style.color]=\"_role.color\">\n @if (_role.icon) {\n <sd-icon [name]=\"_role.icon\"></sd-icon>\n }\n {{ _role.text }}\n </span>\n }\n </span>\n </div>\n @if (signoutAction()) {\n <button\n type=\"button\"\n data-user-action=\"signout\"\n class=\"sd-layout-user-menu__action sd-layout-user-menu__signout d-flex align-items-center gap-8 px-8 py-8 T14R text-left text-error\"\n (click)=\"runSignout()\">\n <sd-icon name=\"logout\"></sd-icon>\n {{ 'core.module.layout.user.logout' | sdTranslate }}\n </button>\n }\n </div>\n\n @if (updateProfileAction() || settingAction() || notificationAction() || changePasswordAction()) {\n <div data-mobile-account-actions class=\"sd-layout-user-menu__mobile-actions d-flex flex-column gap-4\">\n @if (updateProfileAction()) {\n <button\n type=\"button\"\n data-user-action=\"update-profile\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runUpdateProfile()\">\n <sd-icon name=\"edit\"></sd-icon>\n {{ 'core.module.layout.user.update-profile' | sdTranslate }}\n </button>\n }\n @if (settingAction()) {\n <button\n type=\"button\"\n data-user-action=\"setting\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runSetting()\">\n <sd-icon name=\"settings\"></sd-icon>\n {{ 'core.module.layout.user.setting' | sdTranslate }}\n </button>\n }\n @if (notificationAction()) {\n <button\n type=\"button\"\n data-user-action=\"notification\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runNotification()\">\n <sd-icon name=\"notifications\"></sd-icon>\n <span class=\"flex-1\">{{ 'core.module.layout.user.notification' | sdTranslate }}</span>\n @if (_notificationBadge) {\n <span data-notification-badge class=\"sd-layout-user-menu__badge\">{{ _notificationBadge }}</span>\n }\n </button>\n }\n @if (changePasswordAction()) {\n <button\n type=\"button\"\n data-user-action=\"change-password\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runChangePassword()\">\n <sd-icon name=\"lock\"></sd-icon>\n {{ 'core.module.layout.user.change-password' | sdTranslate }}\n </button>\n }\n </div>\n }\n </div>\n } @else {\n <button\n #trigger\n type=\"button\"\n data-user-trigger\n class=\"sd-layout-user-menu__trigger d-flex align-items-center text-left\"\n [class.sd-layout-user-menu__trigger--compact]=\"compact()\"\n [class.w-full]=\"!compact()\"\n [class.gap-8]=\"!compact()\"\n [class.w-56]=\"compact()\"\n [class.gap-0]=\"compact()\"\n aria-haspopup=\"menu\"\n [attr.aria-label]=\"compact() ? displayName() : null\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"toggle()\">\n <sd-avatar [src]=\"avatar()\" [size]=\"compact() ? 32 : 40\"></sd-avatar>\n @if (!compact()) {\n <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n @if (userInfo().email) {\n <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n }\n </span>\n <sd-icon [name]=\"isOpen() ? 'expand_less' : 'expand_more'\"></sd-icon>\n }\n </button>\n\n @if (isOpen()) {\n <div\n #menu\n data-user-menu\n class=\"sd-layout-user-menu__popup d-flex flex-column gap-4 p-8 bg-white border border-black200 rounded-8 mat-elevation-z4\"\n role=\"menu\"\n tabindex=\"-1\"\n (keydown)=\"onMenuKeydown($event)\">\n <div data-user-identity class=\"sd-layout-user-menu__identity d-flex align-items-center gap-8 px-8 py-4\">\n <sd-avatar [src]=\"avatar()\" [size]=\"40\"></sd-avatar>\n <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n @if (userInfo().email) {\n <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n }\n @if (_role) {\n <span\n data-user-role\n class=\"sd-layout-user-menu__role d-flex align-items-center gap-4 T12R text-ellipsis\"\n [style.color]=\"_role.color\">\n @if (_role.icon) {\n <sd-icon [name]=\"_role.icon\"></sd-icon>\n }\n {{ _role.text }}\n </span>\n }\n </span>\n </div>\n @if (updateProfileAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"update-profile\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runUpdateProfile()\">\n <sd-icon name=\"edit\"></sd-icon>\n {{ 'core.module.layout.user.update-profile' | sdTranslate }}\n </button>\n }\n @if (settingAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"setting\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runSetting()\">\n <sd-icon name=\"settings\"></sd-icon>\n {{ 'core.module.layout.user.setting' | sdTranslate }}\n </button>\n }\n @if (notificationAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"notification\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runNotification()\">\n <sd-icon name=\"notifications\"></sd-icon>\n <span class=\"flex-1\">{{ 'core.module.layout.user.notification' | sdTranslate }}</span>\n @if (_notificationBadge) {\n <span data-notification-badge class=\"sd-layout-user-menu__badge\">{{ _notificationBadge }}</span>\n }\n </button>\n }\n @if (changePasswordAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"change-password\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runChangePassword()\">\n <sd-icon name=\"lock\"></sd-icon>\n {{ 'core.module.layout.user.change-password' | sdTranslate }}\n </button>\n }\n @if (signoutAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"signout\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left text-error\"\n (click)=\"runSignout()\">\n <sd-icon name=\"logout\"></sd-icon>\n {{ 'core.module.layout.user.logout' | sdTranslate }}\n </button>\n }\n </div>\n }\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo } from '../../../../configurations';\nimport { SdLayoutUserMenuComponent } from '../../../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'lib-layout-user',\n templateUrl: './user.component.html',\n styleUrl: './user.component.scss',\n imports: [SdIcon, SdLayoutUserMenuComponent, SdTranslatePipe],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LayoutUserComponent {\n isMobileOrTablet = input<boolean>(false);\n isMenuLock = input<boolean>(false);\n isShowSidebar = input<boolean>(false);\n userInfo = input.required<SdLayoutUserInfo>();\n\n menuClosed = output<void>();\n menuOpened = output<void>();\n toggleMenuLock = output<Event>();\n\n onMenuOpened(): void {\n this.menuOpened.emit();\n }\n\n onMenuClosed(): void {\n this.menuClosed.emit();\n }\n\n onToggleMenuLock(event: Event): void {\n this.toggleMenuLock.emit(event);\n }\n}\n","<div class=\"c-layout-user-wrapper\">\n <sd-layout-user-menu\n class=\"c-layout-user-avatar\"\n [userInfo]=\"userInfo()\"\n [compact]=\"true\"\n (opened)=\"onMenuOpened()\"\n (closed)=\"onMenuClosed()\"></sd-layout-user-menu>\n\n @if (!isMobileOrTablet()) {\n <button\n type=\"button\"\n class=\"c-layout-icon-toggle\"\n [attr.aria-label]=\"'core.module.layout.sidebar.toggle' | sdTranslate\"\n (click)=\"onToggleMenuLock($event)\">\n <sd-icon [name]=\"isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left'\"></sd-icon>\n </button>\n }\n</div>\n","import { NestedTreeControl } from '@angular/cdk/tree';\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree';\nimport { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\n\nimport { SdInput, SdSuffixDefDirective } from '@sdcorejs/angular/forms';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdSafeHtmlPipe } from '@sdcorejs/angular/pipes';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\nimport { HighlightSearchPipe, MenuFocusPipe } from '../../../../pipes';\nimport { SdLayoutChildrenMenu, SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutStorageService } from '../../../../services';\nimport { LayoutUserComponent } from '../user/user.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-sidebar-v1-panel',\n standalone: true,\n imports: [\n SdIcon,\n SdInput,\n FormsModule,\n CommonModule,\n RouterModule,\n MatTreeModule,\n SdSafeHtmlPipe,\n MatInputModule,\n MenuFocusPipe,\n MatTooltipModule,\n HighlightSearchPipe,\n SdSuffixDefDirective,\n LayoutUserComponent,\n SdTranslatePipe,\n ],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarV1Panel {\n // ==========================================\n // INJECT SERVICES (Thay thế Constructor rườm rà)\n // ==========================================\n #router = inject(Router);\n #layoutStorageService = inject(SdLayoutStorageService);\n #navigationState = inject(SdLayoutNavigationStateService);\n #menuFocusPipe = inject(MenuFocusPipe);\n #i18n = inject(I18nService);\n #window = inject(DOCUMENT).defaultView;\n #destroyRef = inject(DestroyRef); // Dùng để unsubscribe RxJS tự động\n\n // ==========================================\n // SIGNAL INPUTS & OUTPUTS\n // ==========================================\n isShowSidebar = input.required<boolean>();\n menus = input.required<SdLayoutMenu[]>();\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n isMobile = input(false);\n expandSideBar = output<void>();\n popupUserMenuClosed = output<void>();\n popupUserMenuOpened = output<void>();\n showSideBar = output<boolean | null>();\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\n currentPath = signal<string>(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\n searchText = signal<string>('');\n titleMenuGroup = signal<string | undefined>('');\n idMenuGroupActive = signal<string | undefined>('');\n menusByGroup = signal<SdLayoutMenu[]>([]);\n #hoveredMenuNodeKey = signal<string | null>(null);\n #pinIconHoverTimerId = signal<ReturnType<typeof setTimeout> | null>(null);\n // why: `title` của nhóm ghim là nhãn HIỂN THỊ (đổ vào `titleMenuGroup` trên header), không phải\n // id — phải dịch. Tính trong computed nên đổi ngôn ngữ là tiêu đề nhóm đổi theo.\n pinnedMenuGroup = computed<SdLayoutChildrenMenu>(() => ({\n id: 'pinned-menu-group',\n title: this.#i18n.t('core.module.layout.sidebar.pinned'),\n children: this.#navigationState.pinnedMenus(),\n }));\n\n // ==========================================\n // COMPUTED STATE\n // ==========================================\n totalMenuInMenusByGroup = computed(() => this.#getTotalMenus(this.menusByGroup()));\n logoUrl = computed(() => this.sidebar().logoUrl?.trim() || undefined);\n pinnedNodeKeys = computed(() => new Set(this.pinnedMenuGroup().children?.map(m => this.#getMenuNodeKey(m)) ?? []));\n isPinnedMenuGroupActive = computed(() => this.idMenuGroupActive() === this.pinnedMenuGroup().id);\n\n // ==========================================\n // DATA STRUCTURES\n // ==========================================\n #pinIconHoverTimerDelay = 300;\n #isFirstBindingMenu = signal<boolean>(true);\n dataSource = new MatTreeNestedDataSource<SdLayoutMenu>();\n treeControl = new NestedTreeControl<SdLayoutMenu>(node => ('children' in node && node.children?.length ? node.children : []));\n\n constructor() {\n this.#setupEffects();\n this.#setupSubscriptions();\n }\n\n #setupEffects(): void {\n effect(() => {\n const currentMenus = this.menus();\n untracked(() => {\n this.#navigationState.hydrate(currentMenus);\n const lastActiveMenuGroupId = this.#layoutStorageService.lastActiveMenuGroupId.get();\n const pinnedGroup = this.pinnedMenuGroup();\n const isPinEnabled = this.sidebar()?.pin?.enabled;\n // Xử lý khi lần đầu vào web (nếu chưa có active group)\n if (!lastActiveMenuGroupId || (lastActiveMenuGroupId === pinnedGroup?.id && !isPinEnabled)) {\n // Ưu tiên pinnedGroup nếu đủ điều kiện, còn không lấy menu đầu tiền dev khai báo\n const targetId = isPinEnabled && pinnedGroup?.children?.length ? pinnedGroup?.id : currentMenus?.[0]?.id;\n this.#layoutStorageService.lastActiveMenuGroupId.set(targetId ?? '');\n }\n\n this.#bindingMenuGroupByCurrentPath(currentMenus);\n this.#isFirstBindingMenu.set(false);\n });\n });\n }\n\n #setupSubscriptions(): void {\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (event instanceof NavigationEnd) {\n const currentPath = event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '';\n if (this.currentPath() !== currentPath) {\n this.currentPath.set(currentPath);\n this.#bindingMenuGroupByCurrentPath(this.menus());\n }\n }\n });\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n hasChild = (_: number, node: SdLayoutMenu): boolean => 'children' in node && !!node.children?.length;\n\n onToggleMenuNode = (menu: SdLayoutMenu): void => {\n this.treeControl.toggle(menu);\n };\n\n menuNodeHref = (node: { path: string; queryParams?: Params }): string => {\n if (sdIsExternalHttpUrl(node.path)) return node.path;\n return this.#router.serializeUrl(\n this.#router.createUrlTree([node.path.split('?')[0]], {\n queryParams: node.queryParams ?? {},\n })\n );\n };\n\n onMenuNodeClick = (event: MouseEvent, node: { path: string; queryParams?: Params }): void => {\n event.preventDefault();\n this.navigate({ path: node.path, queryParams: node.queryParams ?? {} });\n };\n\n // why: giữ public keyboard handler cũ để không làm thay đổi declaration API.\n onMenuNodeKeydown = (event: KeyboardEvent, node: { path: string; queryParams: Params }): void => {\n if (event.target !== event.currentTarget) return;\n // why: chặn Space cuộn trang.\n event.preventDefault();\n this.navigate({ path: node.path, queryParams: node.queryParams ?? {} });\n };\n\n // why: giữ public keyboard handler cũ; native branch button now owns keyboard activation.\n onToggleMenuNodeKeydown = (event: KeyboardEvent, menu: SdLayoutMenu): void => {\n if (event.target !== event.currentTarget) return;\n event.preventDefault();\n this.onToggleMenuNode(menu);\n };\n\n isPinnedNode = (node: SdLayoutMenu): boolean => this.pinnedNodeKeys().has(this.#getMenuNodeKey(node));\n isHoveredNode = (node: SdLayoutMenu): boolean => this.#hoveredMenuNodeKey() === this.#getMenuNodeKey(node);\n\n expandPinnedGroup = (): void => {\n const group = this.pinnedMenuGroup();\n this.idMenuGroupActive.set(group.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(group.id || '');\n this.titleMenuGroup.set(group.title);\n this.#setMenusByGroup(group.children ?? []);\n this.searchText.set('');\n this.expandSideBar.emit();\n };\n\n onTogglePin = (event: MouseEvent, node: SdLayoutMenu): void => {\n event.stopPropagation();\n this.#navigationState.togglePinned(node);\n };\n\n #onExpandAllMenuNodes = (menus: SdLayoutMenu[]): void => {\n menus?.forEach(menu => {\n this.treeControl.expand(menu);\n if ('children' in menu && menu.children?.length) {\n this.#onExpandAllMenuNodes(menu.children);\n }\n });\n };\n\n #onCollapseAllMenuNodes = (menus: SdLayoutMenu[]): void => {\n menus?.forEach(menu => {\n this.treeControl.collapse(menu);\n if ('children' in menu && menu.children?.length) {\n this.#onCollapseAllMenuNodes(menu.children);\n }\n });\n };\n\n toggleMenuLock(event: Event): void {\n event.stopPropagation();\n this.isMenuLock.update(v => !v);\n this.#layoutStorageService.menuLockStatus?.set(this.isMenuLock());\n this.showSideBar.emit(this.isMenuLock());\n }\n\n openHomePage = (): void => {\n this.#router.navigateByUrl('/layout/home');\n this.searchText.set('');\n this.#layoutStorageService.lastActiveMenuGroupId.set('');\n };\n\n onUserMenuClosed = (): void => this.popupUserMenuClosed.emit();\n\n onUserMenuOpened = (): void => this.popupUserMenuOpened.emit();\n\n navigate = (args: { path: string; queryParams: Params }): void => {\n const { path, queryParams } = args;\n // why: `path.includes('http')` là substring test chứ không phải scheme test — chuỗi\n // `javascript:fetch(...)//http` lọt qua rồi chạy như script trong chính origin của app.\n // `sdIsExternalHttpUrl` parse URL thật, `sdOpenExternal` từ chối scheme lạ và luôn gắn\n // `noopener,noreferrer` (chặn reverse tabnabbing qua `window.opener`).\n if (sdIsExternalHttpUrl(path)) {\n sdOpenExternal(path);\n return;\n }\n this.#router.navigate([path.split('?')[0]], {\n queryParams,\n state: { switchTab: true },\n });\n\n if (this.isMobile()) {\n this.#closeMenu();\n }\n };\n\n onFilterSearchText = (event: string): void => {\n this.searchText.set(event);\n this.#filterMenuBySearchText(this.menusByGroup());\n };\n\n onClearSearchText = (): void => {\n this.searchText.set('');\n this.#filterMenuBySearchText(this.menusByGroup());\n };\n\n expandMenuGroup = (menuGroupNode: SdLayoutMenu): void => {\n this.titleMenuGroup.set(menuGroupNode?.tooltipTitle || menuGroupNode?.title);\n\n // Case 1: Menu không có children\n if (!('children' in menuGroupNode && menuGroupNode.children?.length)) {\n if ('path' in menuGroupNode) {\n this.navigate({ path: menuGroupNode.path, queryParams: menuGroupNode?.queryParams ?? {} });\n return;\n }\n }\n\n // Case 2: Menu có children\n if ('children' in menuGroupNode && menuGroupNode.children?.length) {\n this.#setMenusByGroup(menuGroupNode.children);\n this.searchText.set('');\n this.onFilterSearchText('');\n this.expandSideBar.emit();\n }\n\n this.idMenuGroupActive.set(menuGroupNode?.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(menuGroupNode?.id || '');\n if (!this.currentPath()) {\n this.currentPath.set(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\n }\n };\n\n // ==========================================\n // CỤM HOVER MENU GROUP & NODE\n // ==========================================\n onMouseOverMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\n if (this.idMenuGroupActive() !== menuNode?.id) {\n const menuGroup = event.currentTarget as HTMLElement;\n const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\n const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\n\n if (menuGroupIcon) {\n menuGroupIcon.style.transition = 'all 0.15s';\n menuGroupIcon.style.backgroundColor =\n brandLightColorOpacity || 'color-mix(in srgb, var(--sd-primary-light, #d7e3ff) 60%, transparent)';\n if (!(menuGroupIcon instanceof HTMLImageElement)) {\n menuGroupIcon.style.color = this.sidebar()?.brandColor || 'var(--sd-primary, #005cbb)';\n }\n }\n }\n };\n\n onMouseLeaveMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\n if (this.idMenuGroupActive() !== menuNode?.id) {\n const menuGroup = event.currentTarget as HTMLElement;\n const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\n\n if (menuGroupIcon) {\n menuGroupIcon.style.transition = 'all 0.15s';\n menuGroupIcon.style.backgroundColor = 'transparent';\n if (menuGroupIcon instanceof HTMLImageElement) {\n menuGroupIcon.style.opacity = '0.55';\n } else {\n menuGroupIcon.style.color = 'var(--sd-text-secondary, #44474f)';\n }\n }\n }\n };\n\n onMouseOverMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\n const menuNode = event.currentTarget as HTMLElement;\n const brandColor = this.sidebar()?.brandColor || 'var(--sd-primary, #005cbb)';\n\n // Nếu có bật config pin menu\n if (this.sidebar()?.pin?.enabled) {\n const iconPin = menuNode.querySelector('.c-menu-node-description-icon-pin') as HTMLElement;\n if (iconPin) {\n if (this.#pinIconHoverTimerId()) {\n clearTimeout(this.#pinIconHoverTimerId()!);\n this.#pinIconHoverTimerId.set(null);\n }\n\n this.#pinIconHoverTimerId.set(\n setTimeout(() => {\n this.#hoveredMenuNodeKey.set(this.#getMenuNodeKey(menuItem));\n iconPin.style.color = brandColor;\n iconPin.style.transition = 'all 0.15s';\n iconPin.style.opacity = '1';\n this.#pinIconHoverTimerId.set(null);\n }, this.#pinIconHoverTimerDelay)\n );\n }\n }\n\n if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem)) {\n const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\n const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\n const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\n const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\n\n if (menuNode) {\n menuNode.style.transition = 'all 0.15s';\n menuNode.style.backgroundColor = brandLightColorOpacity || 'rgba(248, 249, 250, 0.6)';\n\n if (iconMenu) {\n iconMenu.style.transition = 'all 0.15s';\n iconMenu.style.color = brandColor;\n }\n if (content) {\n content.style.transition = 'all 0.15s';\n content.style.color = brandColor;\n }\n if (iconExpand) {\n iconExpand.style.transition = 'all 0.15s';\n iconExpand.style.color = brandColor;\n }\n }\n }\n };\n\n onMouseLeaveMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\n const menuNode = event.currentTarget as HTMLElement;\n\n // Nếu có bật config pin menu\n if (this.sidebar()?.pin?.enabled) {\n const iconPin = menuNode.querySelector('.c-menu-node-description-icon-pin') as HTMLElement;\n if (iconPin) {\n if (this.#pinIconHoverTimerId()) {\n clearTimeout(this.#pinIconHoverTimerId()!);\n this.#pinIconHoverTimerId.set(null);\n }\n this.#hoveredMenuNodeKey.set(null);\n\n iconPin.style.transition = 'all 0.15s';\n if (!this.isPinnedNode(menuItem)) {\n iconPin.style.color = '#8C8C8C';\n iconPin.style.opacity = '0';\n }\n }\n }\n\n if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem)) {\n const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\n const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\n const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\n\n if (menuNode) {\n menuNode.style.transition = 'all 0.15s';\n menuNode.style.backgroundColor = 'transparent';\n\n if (iconMenu) {\n iconMenu.style.transition = 'all 0.15s';\n iconMenu.style.color = '#8C8C8C';\n }\n if (content) {\n content.style.transition = 'all 0.15s';\n content.style.color = '#1F1F1F';\n }\n if (iconExpand) {\n iconExpand.style.transition = 'all 0.15s';\n iconExpand.style.color = '#8C8C8C';\n }\n }\n }\n };\n\n // ==========================================\n // PRIVATE LOGIC\n // ==========================================\n #setMenusByGroup = (menus: SdLayoutMenu[]): void => {\n this.menusByGroup.set(menus);\n this.dataSource.data = menus;\n };\n\n #getMenuNodeKey = (node: SdLayoutMenu): string => {\n if (node?.id) {\n return node.id;\n }\n if ('path' in node && node.path) {\n return node.path;\n }\n\n return node.title || '';\n };\n\n #getMenuGroupByCurrentPath = (menus: SdLayoutMenu[], menuGroup?: SdLayoutMenu): SdLayoutMenu[] => {\n for (const menu of menus) {\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\n return [menuGroup ?? menu];\n }\n if ('children' in menu && menu.children?.length) {\n const result = this.#getMenuGroupByCurrentPath(menu.children, menuGroup ?? menu);\n if (result?.length) {\n return result;\n }\n }\n }\n return [];\n };\n\n #bindingMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): void => {\n // Chỉ bindingGroup mới khi người dùng không searchText\n if (!this.#getValidSearchText()) {\n const pinnedChildren = this.pinnedMenuGroup()?.children ?? [];\n\n // Ưu tiên: Current path khớp với item trong pinMenuGroup thì lần đầu vào trang sẽ hiện pinnedMenuGroup\n const isPinnedPathMatchValid =\n this.sidebar()?.pin?.enabled &&\n pinnedChildren?.length &&\n this.#getMenuGroupByCurrentPath(pinnedChildren)?.length &&\n this.#isFirstBindingMenu() &&\n this.idMenuGroupActive() !== this.pinnedMenuGroup()?.id;\n\n if (isPinnedPathMatchValid) {\n const pinned = this.pinnedMenuGroup();\n this.idMenuGroupActive.set(pinned.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(pinned.id ?? '');\n this.titleMenuGroup.set(pinned.title);\n this.#setMenusByGroup(pinnedChildren);\n this.#expandParentNodesByCurrentPath(pinnedChildren);\n return;\n }\n\n let menuGroupByPath = this.#getMenuGroupByCurrentPath(menus);\n // Nếu không tìm được path nào khớp với menu\n if (!menuGroupByPath?.length) {\n const lastActiveId = this.#layoutStorageService.lastActiveMenuGroupId.get() || '';\n // Nếu có pinned group thì hiện mậc định là pinnedMenuGroup\n if (this.sidebar()?.pin?.enabled && lastActiveId === this.pinnedMenuGroup()?.id && pinnedChildren?.length) {\n const pinned = this.pinnedMenuGroup();\n this.idMenuGroupActive.set(pinned.id);\n this.titleMenuGroup.set(pinned.title);\n this.#setMenusByGroup(pinnedChildren);\n this.#expandParentNodesByCurrentPath(pinnedChildren);\n return;\n }\n // Nếu không có pinnedMenuGroup thì menuGroup lấy từ thao tác cuối cùng của người dùng\n menuGroupByPath = this.menus()?.filter(menu => menu?.id === lastActiveId) || [];\n }\n\n // Kiểm tra lại menuGroupPath đã thực sự tìm được chưa?\n if (menuGroupByPath?.length) {\n // Nếu user đang ở pinedGroup và curentPath có chứa trong pinnedMenuGroup thì return luôn, không chuyển sang menuGroup mới\n if (\n this.sidebar()?.pin?.enabled &&\n this.idMenuGroupActive() === this.pinnedMenuGroup()?.id &&\n this.#getMenuGroupByCurrentPath(pinnedChildren)?.length\n ) {\n return;\n } else {\n const matchedGroup = menuGroupByPath[0];\n this.idMenuGroupActive.set(matchedGroup?.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(matchedGroup?.id || '');\n this.titleMenuGroup.set(matchedGroup?.tooltipTitle || matchedGroup?.title);\n\n if ('children' in matchedGroup && matchedGroup.children?.length) {\n this.menusByGroup.set(matchedGroup.children);\n this.#expandParentNodesByCurrentPath(this.menusByGroup());\n } else {\n this.menusByGroup.set([]);\n }\n }\n } else {\n this.idMenuGroupActive.set('');\n this.titleMenuGroup.set('');\n this.menusByGroup.set([]);\n }\n\n this.dataSource.data = this.menusByGroup();\n }\n };\n\n #expandParentNodesByCurrentPath(menus: SdLayoutMenu[]): boolean {\n let shouldPropagate = false;\n for (const menu of menus) {\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\n shouldPropagate = true;\n }\n if ('children' in menu && menu.children?.length) {\n const childHasMatch = this.#expandParentNodesByCurrentPath(menu.children);\n if (childHasMatch) {\n this.treeControl.expand(menu);\n shouldPropagate = true;\n }\n }\n }\n return shouldPropagate;\n }\n\n #filterMenuBySearchText = (menus: SdLayoutMenu[]): void => {\n const validSearchText = this.#getValidSearchText();\n if (!validSearchText) {\n this.dataSource.data = menus;\n this.#onCollapseAllMenuNodes(menus);\n this.#expandParentNodesByCurrentPath(menus);\n } else {\n const aliasSearchText = StringUtilities.changeAliasLowerCase(validSearchText);\n this.dataSource.data = this.#getMenuByAliasSearchText(menus, aliasSearchText);\n if (this.dataSource.data?.length) {\n this.#onExpandAllMenuNodes(this.dataSource.data);\n }\n }\n };\n\n #getMenuByAliasSearchText = (menus: SdLayoutMenu[], aliasSearchText: string): SdLayoutMenu[] => {\n const result: SdLayoutMenu[] = [];\n for (const menu of menus) {\n const aliasTitle = StringUtilities.changeAliasLowerCase(menu.title as string);\n // why: hỗ trợ search theo route (path) và search theo ký tự đầu (viết tắt) bên cạnh search theo tiêu đề\n const matchByRoutePath = 'path' in menu && !!menu.path && menu.path.toLowerCase().includes(aliasSearchText);\n const matchByInitials = this.#matchesTitleInitials(aliasTitle, aliasSearchText);\n\n if (aliasTitle.includes(aliasSearchText) || matchByRoutePath || matchByInitials) {\n result.push(menu);\n continue;\n }\n\n let matchedChildren: SdLayoutMenu[] = [];\n if ('children' in menu && menu.children?.length) {\n matchedChildren = this.#getMenuByAliasSearchText(menu.children, aliasSearchText);\n }\n\n if (matchedChildren?.length) {\n result.push({ ...menu, children: matchedChildren });\n }\n }\n return result;\n };\n\n #matchesTitleInitials = (aliasTitle: string, aliasSearchText: string): boolean => {\n const initials = aliasTitle\n .split(' ')\n .filter(word => word)\n .map(word => word[0])\n .join('');\n return this.#isOrderedSubsequence(aliasSearchText, initials);\n };\n\n #isOrderedSubsequence = (needle: string, haystack: string): boolean => {\n let matchedCount = 0;\n for (const char of haystack) {\n if (char === needle[matchedCount]) {\n matchedCount++;\n }\n }\n return matchedCount === needle.length;\n };\n\n #isMenuPathMatchByCurrentPath = (path: string): boolean => {\n if (!path) {\n return false;\n }\n\n if (this.currentPath() === path) {\n return true;\n }\n\n return this.#normalizePath(this.currentPath()).startsWith(this.#normalizePath(path));\n };\n\n #normalizePath = (p: string): string => (p.endsWith('/') ? p : p + '/');\n\n #closeMenu(): void {\n this.showSideBar.emit(null);\n }\n\n #convertColor = (input: string | undefined, opacity = 1): string => {\n if (!input) {\n return '';\n }\n\n input = input.trim();\n const hexRegex = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\n const rgbRegex = /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/i;\n\n if (hexRegex.test(input)) {\n let hex = input.slice(1);\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map(c => c + c)\n .join('');\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n\n const rgbMatch = input.match(rgbRegex);\n if (rgbMatch) {\n const [_, r, g, b] = rgbMatch;\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n\n return input;\n };\n\n #getValidSearchText = (): string => {\n const normalized = this.#normalizeSearchText(this.searchText());\n return normalized && normalized.length >= 2 ? normalized : '';\n };\n\n #normalizeSearchText = (searchText: string) => {\n let str: string = searchText?.toString() ?? '';\n /* eslint-disable no-useless-escape */\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\n str = str.replace(/ + /g, ' ');\n return str.trim();\n };\n\n #getTotalMenus = (menus: SdLayoutMenu[]): number => {\n return menus.reduce((total, menu) => total + this.#countMenuNode(menu), 0);\n };\n\n #countMenuNode = (menu: SdLayoutMenu): number => {\n if (!('children' in menu) || !menu.children?.length) {\n return 1;\n }\n\n let count = 1;\n for (const child of menu.children) {\n count += this.#countMenuNode(child);\n }\n return count;\n };\n}\n","@let _userInfo = userInfo();\n@let _sidebar = sidebar();\n\n@if (_userInfo && _sidebar) {\n <div class=\"wrapper\" [style.height]=\"isMobile() ? '100dvh' : '100%'\">\n <div class=\"c-header\">\n <div class=\"c-logo\">\n <a\n href=\"/layout/home\"\n [attr.aria-label]=\"'core.module.layout.home.tab-name' | sdTranslate\"\n (click)=\"$event.preventDefault(); openHomePage()\">\n @if (logoUrl(); as _logoUrl) {\n <img alt=\"\" [src]=\"_logoUrl\" />\n } @else {\n <sd-icon name=\"apps\"></sd-icon>\n }\n </a>\n </div>\n <div class=\"c-title-menu-group\" [class.d-none]=\"!isShowSidebar()\">\n <span>{{ titleMenuGroup() || _sidebar.defaultTitle || 'Back Office' }}</span>\n </div>\n </div>\n <div class=\"c-body\">\n <div class=\"c-menu\">\n <div class=\"c-menu-group\">\n @if (_sidebar?.pin?.enabled && pinnedMenuGroup().children?.length) {\n <button\n type=\"button\"\n [attr.aria-label]=\"'core.module.layout.sidebar.pinned' | sdTranslate\"\n (mouseenter)=\"onMouseOverMenuGroupNode($event, pinnedMenuGroup())\"\n (mouseleave)=\"onMouseLeaveMenuGroupNode($event, pinnedMenuGroup())\"\n (click)=\"expandPinnedGroup()\"\n [matTooltip]=\"'core.module.layout.sidebar.pinned' | sdTranslate\"\n [matTooltipClass]=\"'c-tooltip-menu-group-7a22ab15-0083-4d4c-9c0c-00a30bc8c140'\"\n [matTooltipPosition]=\"'right'\"\n style=\"padding: 0; margin: 0; border: none; background-color: transparent\">\n <sd-icon\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n color: isPinnedMenuGroupActive()\n ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n : 'var(--sd-text-secondary, #44474f)',\n backgroundColor: isPinnedMenuGroupActive()\n ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n : 'transparent',\n }\"\n name=\"push_pin\"></sd-icon>\n </button>\n }\n @for (nodeMenuGroup of menus(); track nodeMenuGroup.id) {\n <button\n type=\"button\"\n [attr.aria-label]=\"nodeMenuGroup.tooltipTitle || nodeMenuGroup.title\"\n (mouseenter)=\"onMouseOverMenuGroupNode($event, nodeMenuGroup)\"\n (mouseleave)=\"onMouseLeaveMenuGroupNode($event, nodeMenuGroup)\"\n (click)=\"expandMenuGroup(nodeMenuGroup)\"\n [matTooltip]=\"nodeMenuGroup.tooltipTitle || nodeMenuGroup.title\"\n [matTooltipClass]=\"'c-tooltip-menu-group-7a22ab15-0083-4d4c-9c0c-00a30bc8c140'\"\n [matTooltipPosition]=\"'right'\"\n style=\"padding: 0; margin: 0; border: none; background-color: transparent\">\n @if (nodeMenuGroup.iconUrl) {\n <span\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n backgroundColor:\n idMenuGroupActive() === nodeMenuGroup?.id\n ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n : 'transparent',\n }\">\n <img width=\"24px\" height=\"24px\" [src]=\"nodeMenuGroup.iconUrl\" [alt]=\"nodeMenuGroup.title\" />\n </span>\n } @else {\n <sd-icon\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n color:\n idMenuGroupActive() === nodeMenuGroup?.id\n ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n : 'var(--sd-text-secondary, #44474f)',\n backgroundColor:\n idMenuGroupActive() === nodeMenuGroup?.id\n ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n : 'transparent',\n }\"\n [name]=\"nodeMenuGroup.icon || 'widgets'\"></sd-icon>\n }\n </button>\n }\n </div>\n <div class=\"c-menu-tree\" [class.d-none]=\"!isShowSidebar()\" [attr.inert]=\"!isShowSidebar() ? '' : null\">\n @if (totalMenuInMenusByGroup() > 10) {\n <div style=\"padding: 0px 4px\" class=\"c-menu-tree-search\">\n <sd-input\n size=\"sm\"\n [placeholder]=\"'core.module.layout.sidebar.search' | sdTranslate\"\n [autoId]=\"'layout-v1-menu-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"onFilterSearchText($event)\">\n <ng-template sdSuffixDef>\n @if (searchText()) {\n <sd-icon class=\"c-search-prefix-icon cancel\" (click)=\"onClearSearchText()\" name=\"cancel\"></sd-icon>\n } @else {\n <sd-icon class=\"c-search-prefix-icon search\" name=\"search\"></sd-icon>\n }\n </ng-template>\n </sd-input>\n </div>\n }\n <div class=\"c-menu-tree-container\">\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" [style.backgroundColor]=\"'transparent'\">\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: !hasChild\">\n <div\n class=\"c-menu-node\"\n (mouseenter)=\"onMouseOverMenuNode($event, node)\"\n (mouseleave)=\"onMouseLeaveMenuNode($event, node)\"\n [ngStyle]=\"{\n backgroundColor:\n (currentPath() | menuFocus: node) ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)' : 'transparent',\n }\">\n <div class=\"c-menu-node-description\" [class.d-none]=\"!isShowSidebar()\">\n <a\n class=\"c-menu-node-description-content\"\n [href]=\"menuNodeHref(node)\"\n [attr.aria-current]=\"(currentPath() | menuFocus: node) ? 'page' : null\"\n (click)=\"onMenuNodeClick($event, node)\"\n [ngStyle]=\"{\n color:\n (currentPath() | menuFocus: node)\n ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n : 'var(--sd-text, #1a1b1f)',\n }\"\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></a>\n\n <!-- why: nút ghim trước đây là <sd-icon (click)> — custom element không nhận\n focus bàn phím và không có tên khả truy cập, nên không ghim được bằng phím.\n Đổi sang <button type=\"button\"> + aria-pressed, giống pattern đã dùng ở\n `shared/menu-tree`. -->\n @if (_sidebar?.pin?.enabled) {\n <button\n type=\"button\"\n class=\"c-menu-node-description-icon-pin\"\n [style.opacity]=\"isPinnedNode(node) || isHoveredNode(node) ? '1' : null\"\n [style.color]=\"\n isPinnedNode(node) || isHoveredNode(node) ? sidebar().brandColor || 'var(--sd-primary, #005cbb)' : null\n \"\n [attr.aria-pressed]=\"isPinnedNode(node)\"\n [attr.aria-label]=\"\n (isPinnedNode(node) ? 'core.module.layout.menu.unpin' : 'core.module.layout.menu.pin')\n | sdTranslate: { title: node.title }\n \"\n (click)=\"onTogglePin($event, node)\">\n <sd-icon name=\"push_pin\"></sd-icon>\n </button>\n }\n </div>\n </div>\n </mat-nested-tree-node>\n\n <mat-nested-tree-node\n *matTreeNodeDef=\"let node; when: hasChild\"\n [class]=\"{ expanded: treeControl.isExpanded(node), isfocus: currentPath() | menuFocus: node }\">\n <div class=\"c-menu-node\" (mouseenter)=\"onMouseOverMenuNode($event, node)\" (mouseleave)=\"onMouseLeaveMenuNode($event, node)\">\n <div class=\"d-flex align-items-center\" style=\"gap: 10px; width: 100%\">\n <button\n type=\"button\"\n [class.d-none]=\"!isShowSidebar()\"\n class=\"c-menu-node-description\"\n [attr.aria-expanded]=\"treeControl.isExpanded(node)\"\n (click)=\"onToggleMenuNode(node)\">\n <span\n class=\"c-menu-node-description-content\"\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></span>\n <sd-icon\n aria-hidden=\"true\"\n class=\"c-menu-node-description-icon-expand\"\n [name]=\"treeControl.isExpanded(node) ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-icon>\n </button>\n </div>\n </div>\n <div class=\"c-menu-node-group p-0\" role=\"group\" [class.d-none]=\"!treeControl.isExpanded(node)\">\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n </mat-nested-tree-node>\n </mat-tree>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"c-footer\">\n <lib-layout-user\n [userInfo]=\"_userInfo\"\n [isMobileOrTablet]=\"isMobile()\"\n (menuOpened)=\"onUserMenuOpened()\"\n (menuClosed)=\"onUserMenuClosed()\"\n [isShowSidebar]=\"isShowSidebar()\"\n (toggleMenuLock)=\"toggleMenuLock($event)\">\n </lib-layout-user>\n </div>\n\n <div class=\"c-vertical\"></div>\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, inject, input, signal, untracked, viewChild } from '@angular/core';\nimport { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\n\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../services';\nimport { SdSidebarV1Panel } from './components/sidebar/sidebar.component';\n\n@Component({\n selector: 'sd-sidebar-v1',\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n imports: [MatSidenavModule, CommonModule, SdSidebarV1Panel],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarV1 {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #layoutStorageService = inject(SdLayoutStorageService);\n\n // ==========================================\n // VIEW CHILD & INPUTS\n // ==========================================\n sidenav = viewChild.required<MatSidenav>('sidenav');\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n isMobile = input(false);\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n // Trạng thái khóa menu (luôn mở rộng hay không)\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\n\n // Trạng thái hiển thị (mở/đóng) của Sidenav\n isShowSidebar = signal<boolean>(this.isMobile() ? false : (this.#layoutStorageService.menuLockStatus?.get() ?? true));\n\n onhover = signal<boolean>(false);\n\n // ==========================================\n // PRIVATE TIMERS\n // ==========================================\n #timerMouseInMenu: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n // EFFECT: Tự động đồng bộ isShowSidebar vào storage service mỗi khi nó thay đổi\n effect(() => {\n const isShow = this.isShowSidebar();\n untracked(() => {\n this.#layoutStorageService.isShowSidebar.set(isShow);\n });\n });\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n\n #mouseLeave = (): void => {\n if (this.#timerMouseInMenu) {\n clearTimeout(this.#timerMouseInMenu);\n }\n\n if (this.onhover() && this.isShowSidebar()) {\n this.isShowSidebar.set(false);\n this.onhover.set(false);\n }\n };\n\n #handleMouseLeaveTransition = (): void => {\n if (!this.isShowSidebar()) {\n const delayTime = 400;\n if (this.#timerMouseInMenu) {\n clearTimeout(this.#timerMouseInMenu);\n }\n setTimeout(() => {\n this.#mouseLeave();\n }, delayTime);\n } else {\n this.#mouseLeave();\n }\n };\n\n openSidebar = (): void => {\n if (!this.isMobile()) {\n return;\n }\n\n if (!this.isShowSidebar()) {\n this.isShowSidebar.set(true);\n this.onhover.set(true);\n }\n };\n\n onPopupOfSideBarOpened = (): void => {\n this.onhover.set(false);\n this.isShowSidebar.set(true);\n };\n\n onPopupOfSideBarClosed = (): void => {\n const delayTime = 500;\n if (!this.isMenuLock()) {\n this.onhover.set(true);\n setTimeout(() => {\n this.#mouseLeave();\n }, delayTime);\n }\n };\n\n onExpandSideBar = (): void => {\n if (this.isMobile()) {\n return;\n }\n if (!this.isShowSidebar()) {\n this.isShowSidebar.set(true);\n this.onhover.set(true);\n }\n };\n\n onMouseleaveSideBar = (): void => {\n if (this.isMobile()) {\n return;\n }\n this.#mouseLeave();\n };\n\n onSidenavOpenedChange = (opened: boolean): void => {\n if (this.isMobile()) {\n this.isShowSidebar.set(opened);\n }\n };\n\n onToggle = (data: boolean | null) => {\n if (data === null) {\n this.#handleMouseLeaveTransition();\n } else {\n this.#mouseLeave();\n this.isShowSidebar.set(data);\n this.isMenuLock.set(data);\n\n // Desktop keeps the Material drawer mounted as a 60px rail; mobile still opens and closes the overlay.\n if (this.isMobile()) {\n const sidenavComp = this.sidenav();\n if (sidenavComp) {\n if (data) {\n sidenavComp.open();\n } else {\n sidenavComp.close();\n }\n }\n }\n }\n };\n}\n","<mat-sidenav-container class=\"c-layout-wrapper\">\n <mat-sidenav\n #sidenav\n [opened]=\"!isMobile() || isShowSidebar()\"\n (openedChange)=\"onSidenavOpenedChange($event)\"\n class=\"c-layout-sidebar\"\n [class.is-expanded]=\"isShowSidebar()\"\n (click)=\"openSidebar()\"\n (mouseleave)=\"onMouseleaveSideBar()\"\n [mode]=\"isMobile() ? 'over' : 'side'\"\n [fixedInViewport]=\"isMobile()\">\n <sd-sidebar-v1-panel\n [menus]=\"menus()\"\n [userInfo]=\"userInfo()\"\n [sidebar]=\"sidebar()\"\n [isMobile]=\"isMobile()\"\n [isShowSidebar]=\"isShowSidebar()\"\n (showSideBar)=\"onToggle($event)\"\n (expandSideBar)=\"onExpandSideBar()\"\n (popupUserMenuOpened)=\"onPopupOfSideBarOpened()\"\n (popupUserMenuClosed)=\"onPopupOfSideBarClosed()\">\n </sd-sidebar-v1-panel>\n </mat-sidenav>\n\n <mat-sidenav-content class=\"c-layout-content\" [class.isShowSidebar]=\"isMenuLock()\">\n <mat-drawer-container class=\"c-mat-drawer-container\">\n <mat-drawer-content>\n <ng-content></ng-content>\n </mat-drawer-content>\n </mat-drawer-container>\n </mat-sidenav-content>\n</mat-sidenav-container>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo } from '../../../../configurations';\nimport { SdLayoutUserMenuComponent } from '../../../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'lib-layout-user',\n templateUrl: './user.component.html',\n styleUrl: './user.component.scss',\n imports: [SdIcon, SdLayoutUserMenuComponent, SdTranslatePipe],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LayoutUserComponent {\n isMobileOrTablet = input<boolean>(false);\n isMenuLock = input<boolean>(false);\n isShowSidebar = input<boolean>(false);\n userInfo = input.required<SdLayoutUserInfo>();\n\n menuClosed = output<void>();\n menuOpened = output<void>();\n toggleMenuLock = output<Event>();\n\n onMenuOpened(): void {\n this.menuOpened.emit();\n }\n\n onMenuClosed(): void {\n this.menuClosed.emit();\n }\n\n onToggleMenuLock(event: Event): void {\n this.toggleMenuLock.emit(event);\n }\n}\n","@if (isMobileOrTablet()) {\n <sd-layout-user-menu [userInfo]=\"userInfo()\" presentation=\"mobile\"></sd-layout-user-menu>\n} @else {\n <div class=\"c-layout-user-wrapper\">\n <sd-layout-user-menu\n class=\"c-layout-user-avatar\"\n [userInfo]=\"userInfo()\"\n [compact]=\"true\"\n (opened)=\"onMenuOpened()\"\n (closed)=\"onMenuClosed()\"></sd-layout-user-menu>\n\n <button\n type=\"button\"\n class=\"c-layout-icon-toggle\"\n [attr.aria-label]=\"'core.module.layout.sidebar.toggle' | sdTranslate\"\n (click)=\"onToggleMenuLock($event)\">\n <sd-icon [name]=\"isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left'\"></sd-icon>\n </button>\n </div>\n}\n","import { CommonModule, DOCUMENT } from '@angular/common';\nimport { Component, DestroyRef, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\n\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../../../services';\nimport { LayoutUserComponent } from '../user/user.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-sidebar-mobile-overlay',\n standalone: true,\n imports: [SdIcon, CommonModule, RouterModule, LayoutUserComponent],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n})\nexport class SdSidebarMobileOverlay {\n #router = inject(Router);\n #destroyRef = inject(DestroyRef);\n #layoutStorageService = inject(SdLayoutStorageService);\n // why: các sidebar anh em đều lấy window qua DOCUMENT.defaultView; đọc global `window` trực tiếp\n // sẽ throw khi render phía server (SSR) vì global đó không tồn tại.\n #window = inject(DOCUMENT).defaultView;\n\n // ==========================================\n // INPUTS & OUTPUTS\n // ==========================================\n isShowSidebar = input<boolean>(false);\n menus = input.required<SdLayoutMenu[]>();\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n\n // showSideBar(null) = đóng sidebar (tương thích với onToggle của main component)\n showSideBar = output<boolean | null>();\n expandSideBar = output<void>();\n popupUserMenuOpened = output<void>();\n popupUserMenuClosed = output<void>();\n titleMenuGroupChanged = output<string | undefined>();\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n titleMenuGroup = signal<string | undefined>('');\n currentPath = signal<string>(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\n\n // Lưu danh sách ID các menu group đang được mở\n expandedMobileGroups = signal<Set<string>>(new Set<string>());\n\n constructor() {\n // Bind title khi menus thay đổi\n effect(() => {\n const currentMenus = this.menus();\n untracked(() => {\n const lastActiveMenuGroupId = this.#layoutStorageService.lastActiveMenuGroupId.get();\n if (!lastActiveMenuGroupId) {\n this.#layoutStorageService.lastActiveMenuGroupId.set(currentMenus?.[0]?.id ?? '');\n }\n this.#bindingMenuGroupByCurrentPath(currentMenus);\n });\n });\n\n // Bind title khi điều hướng\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (event instanceof NavigationEnd) {\n // why: giống sidebar v1 desktop — lấy path từ chính sự kiện router thay vì đọc global\n // `window.location`, để component chạy được cả khi không có global window (SSR).\n const currentPath = event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '';\n if (this.currentPath() !== currentPath) {\n this.currentPath.set(currentPath);\n this.#bindingMenuGroupByCurrentPath(this.menus());\n }\n }\n });\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n toggleMobileGroup(groupId: string | undefined): void {\n if (!groupId) return;\n this.expandedMobileGroups.update(groups => {\n const newGroups = new Set(groups);\n if (newGroups.has(groupId)) {\n newGroups.delete(groupId);\n } else {\n newGroups.add(groupId);\n }\n return newGroups;\n });\n }\n\n isExpanded(groupId: string | undefined): boolean {\n if (!groupId) return false;\n return this.expandedMobileGroups().has(groupId);\n }\n\n navigate(args: { path?: string; queryParams?: Params }): void {\n const { path, queryParams } = args;\n if (!path) return;\n\n // why: `path.includes('http')` là substring test chứ không phải scheme test —\n // `javascript:fetch(...)//http` lọt qua rồi chạy như script trong chính origin của app. Ngoài ra\n // `window.open(path)` cũ không truyền `noopener` nên tab mới giữ được `window.opener` và có thể\n // điều hướng ngược tab gốc (reverse tabnabbing). `sdOpenExternal` luôn gắn `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(path)) {\n sdOpenExternal(path);\n return;\n }\n\n this.#router.navigate([path.split('?')[0]], {\n queryParams: queryParams ?? {},\n state: { switchTab: true },\n });\n\n // Sau khi điều hướng trên mobile, tự động đóng sidebar\n this.onClose();\n }\n\n onClose(): void {\n this.showSideBar.emit(null);\n }\n\n // Kiểm tra menu có children (là SdLayoutChildrenMenu)\n hasChildren(menu: SdLayoutMenu): boolean {\n return 'children' in menu && !!menu.children?.length;\n }\n\n // Lấy danh sách children an toàn (type-safe)\n getChildren(menu: SdLayoutMenu): SdLayoutMenu[] {\n return 'children' in menu ? (menu.children ?? []) : [];\n }\n\n // Lấy path an toàn từ leaf menu (SdLayoutRootMenu)\n getPath(menu: SdLayoutMenu): string | undefined {\n return 'path' in menu ? menu.path : undefined;\n }\n\n // Lấy queryParams an toàn từ leaf menu\n getQueryParams(menu: SdLayoutMenu): Params {\n return ('queryParams' in menu ? menu.queryParams : undefined) ?? {};\n }\n\n onUserMenuOpened = (): void => this.popupUserMenuOpened.emit();\n onUserMenuClosed = (): void => this.popupUserMenuClosed.emit();\n\n // ==========================================\n // PRIVATE LOGIC\n // ==========================================\n #bindingMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): void => {\n let menuGroupByPath = this.#getMenuGroupByCurrentPath(menus);\n\n if (!menuGroupByPath?.length) {\n const lastActiveId = this.#layoutStorageService.lastActiveMenuGroupId.get() || '';\n menuGroupByPath = menus?.filter(menu => menu?.id === lastActiveId) || [];\n }\n\n if (menuGroupByPath?.length) {\n const matchedGroup = menuGroupByPath[0];\n this.#layoutStorageService.lastActiveMenuGroupId.set(matchedGroup?.id || '');\n const title = matchedGroup?.tooltipTitle || matchedGroup?.title;\n this.titleMenuGroup.set(title);\n this.titleMenuGroupChanged.emit(title);\n } else {\n this.titleMenuGroup.set('');\n this.titleMenuGroupChanged.emit('');\n }\n };\n\n #getMenuGroupByCurrentPath = (menus: SdLayoutMenu[], menuGroup?: SdLayoutMenu): SdLayoutMenu[] => {\n for (const menu of menus) {\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\n return [menuGroup ?? menu];\n }\n if ('children' in menu && menu.children?.length) {\n const result = this.#getMenuGroupByCurrentPath(menu.children, menuGroup ?? menu);\n if (result?.length) return result;\n }\n }\n return [];\n };\n\n #isMenuPathMatchByCurrentPath = (path: string): boolean => {\n if (!path) return false;\n if (this.currentPath() === path) return true;\n return this.#normalizePath(this.currentPath()).startsWith(this.#normalizePath(path));\n };\n\n #normalizePath = (p: string): string => (p.endsWith('/') ? p : p + '/');\n}\n","@let _userInfo = userInfo();\n@let _sidebar = sidebar();\n\n@if (_userInfo && _sidebar) {\n <div\n class=\"m-backdrop\"\n [class.m-backdrop--visible]=\"isShowSidebar()\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onClose()\"\n (keydown.escape)=\"onClose()\">\n </div>\n\n <div class=\"m-wrapper\" [class.m-wrapper--open]=\"isShowSidebar()\">\n <div class=\"m-header\">\n <div class=\"m-title-group\">\n @if (_sidebar.logoUrl) {\n <img class=\"m-logo\" alt=\"logo\" [src]=\"_sidebar.logoUrl\" />\n }\n <span class=\"m-title\">{{ titleMenuGroup() || _sidebar.defaultTitle || 'Back Office' }}</span>\n </div>\n <button class=\"m-close-btn\" (click)=\"onClose()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </div>\n\n <div class=\"m-user-section\">\n <lib-layout-user\n [userInfo]=\"_userInfo\"\n [isMobileOrTablet]=\"true\"\n (menuOpened)=\"onUserMenuOpened()\"\n (menuClosed)=\"onUserMenuClosed()\">\n </lib-layout-user>\n </div>\n\n <div class=\"m-menu-list\">\n @for (group of menus(); track group.id) {\n <div class=\"m-menu-card\">\n <button class=\"m-card-header\" (click)=\"toggleMobileGroup(group.id)\">\n <div class=\"m-card-header-left\">\n @if (group.iconUrl) {\n <img class=\"m-group-icon\" [src]=\"group.iconUrl\" [alt]=\"group.title\" />\n } @else {\n <sd-icon class=\"m-group-icon\" [name]=\"group.icon || 'widgets'\"></sd-icon>\n }\n <span class=\"m-group-title\">{{ group.title }}</span>\n </div>\n <sd-icon class=\"m-expand-icon\" [name]=\"expandedMobileGroups().has(group.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-icon>\n </button>\n\n @if (expandedMobileGroups().has(group.id ?? '') && hasChildren(group)) {\n <div class=\"m-card-body\">\n @for (child of getChildren(group); track child.id) {\n @if (hasChildren(child)) {\n <div class=\"m-sub-group\">\n <button class=\"m-sub-group-header\" (click)=\"toggleMobileGroup(child.id)\">\n <div class=\"m-item-left\">\n @if (child.iconUrl) {\n <img class=\"m-item-icon-img\" [src]=\"child.iconUrl\" alt=\"icon\" />\n } @else {\n <sd-icon class=\"m-item-icon\" [name]=\"child.icon || 'folder'\"></sd-icon>\n }\n <span class=\"m-item-title\">{{ child.title }}</span>\n </div>\n <sd-icon class=\"m-expand-icon\" [name]=\"expandedMobileGroups().has(child.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-icon>\n </button>\n @if (expandedMobileGroups().has(child.id ?? '')) {\n @for (subChild of getChildren(child); track subChild.id) {\n <button class=\"m-menu-item m-menu-item--indented\"\n (click)=\"navigate({ path: getPath(subChild), queryParams: getQueryParams(subChild) })\">\n <div class=\"m-item-left\">\n @if (subChild.iconUrl) {\n <img class=\"m-item-icon-img\" [src]=\"subChild.iconUrl\" alt=\"icon\" />\n } @else {\n <sd-icon class=\"m-item-icon\" [name]=\"subChild.icon || 'insert_drive_file'\"></sd-icon>\n }\n <span class=\"m-item-title\">{{ subChild.title }}</span>\n </div>\n <sd-icon class=\"m-nav-icon\" name=\"chevron_right\"></sd-icon>\n </button>\n }\n }\n </div>\n } @else {\n <button class=\"m-menu-item\" (click)=\"navigate({ path: getPath(child), queryParams: getQueryParams(child) })\">\n <div class=\"m-item-left\">\n @if (child.iconUrl) {\n <img class=\"m-item-icon-img\" [src]=\"child.iconUrl\" alt=\"icon\" />\n } @else {\n <sd-icon class=\"m-item-icon\" [name]=\"child.icon || 'insert_drive_file'\"></sd-icon>\n }\n <span class=\"m-item-title\">{{ child.title }}</span>\n </div>\n <sd-icon class=\"m-nav-icon\" name=\"chevron_right\"></sd-icon>\n </button>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, effect, inject, input, signal, untracked } from '@angular/core';\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../services';\nimport { SdSidebarMobileOverlay } from './components/sidebar/sidebar.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-sidebar-mobile-v1',\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n imports: [SdIcon, CommonModule, SdSidebarMobileOverlay],\n standalone: true,\n})\nexport class SdSidebarMobileV1 {\n #layoutStorageService = inject(SdLayoutStorageService);\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n\n // Sidebar luôn bắt đầu đóng trên mobile\n isShowSidebar = signal<boolean>(false);\n titleMenuGroup = signal<string | undefined>('');\n\n constructor() {\n effect(() => {\n const isShow = this.isShowSidebar();\n untracked(() => {\n this.#layoutStorageService.isShowSidebar.set(isShow);\n });\n });\n }\n\n openSidebar = (): void => {\n this.isShowSidebar.set(true);\n };\n\n onToggle = (_data: boolean | null): void => {\n this.isShowSidebar.set(false);\n };\n\n onPopupOfSideBarOpened = (): void => {};\n onPopupOfSideBarClosed = (): void => {};\n onExpandSideBar = (): void => {};\n onMouseleaveSideBar = (): void => {};\n onTitleMenuGroupChanged = (title: string | undefined): void => {\n this.titleMenuGroup.set(title);\n };\n}\n","<div class=\"c-mobile-layout\">\n <div class=\"c-mobile-topbar\">\n <div class=\"c-topbar-brand\">\n @if (sidebar().logoUrl) {\n <img class=\"c-topbar-logo\" [src]=\"sidebar().logoUrl\" alt=\"logo\" />\n }\n <span class=\"c-topbar-title\">{{ titleMenuGroup() || sidebar().defaultTitle || 'Back Office' }}</span>\n </div>\n <button class=\"c-hamburger-btn\" (click)=\"openSidebar()\">\n <sd-icon name=\"menu\"></sd-icon>\n </button>\n </div>\n\n <div class=\"c-mobile-content\">\n <ng-content></ng-content>\n </div>\n\n <sd-sidebar-mobile-overlay\n [menus]=\"menus()\"\n [userInfo]=\"userInfo()\"\n [sidebar]=\"sidebar()\"\n [isShowSidebar]=\"isShowSidebar()\"\n (showSideBar)=\"onToggle($event)\"\n (expandSideBar)=\"onExpandSideBar()\"\n (popupUserMenuOpened)=\"onPopupOfSideBarOpened()\"\n (popupUserMenuClosed)=\"onPopupOfSideBarClosed()\"\n (titleMenuGroupChanged)=\"onTitleMenuGroupChanged($event)\">\n </sd-sidebar-mobile-overlay>\n</div>\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, input, output, signal } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutMenu, SdLayoutRootMenu, getMenuStableKey, searchMenuLeaves } from '../../../services';\n\ninterface SdLayoutMenuTreeNode {\n menu: SdLayoutMenu;\n key: string;\n title: string;\n depth: number;\n paddingLeft: number;\n isGroup: boolean;\n isActive: boolean;\n isPinned: boolean;\n isPinVisible: boolean;\n /** Accessible name of the pin toggle — already i18n-resolved with the menu title interpolated. */\n pinLabel: string;\n}\n\n@Component({\n selector: 'sd-layout-menu-tree',\n standalone: true,\n imports: [SdIcon],\n templateUrl: './menu-tree.component.html',\n styleUrl: './menu-tree.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutMenuTreeComponent {\n readonly #destroyRef = inject(DestroyRef);\n readonly #i18n = inject(I18nService);\n readonly #hoveredPinKey = signal<string | null>(null);\n #pinHoverTimerId: ReturnType<typeof setTimeout> | undefined;\n\n menus = input<SdLayoutMenu[]>([]);\n query = input('');\n activePath = input('');\n pinnedKeys = input<string[]>([]);\n showPin = input(true);\n pinVisibility = input<'hover' | 'always'>('hover');\n navigate = output<SdLayoutRootMenu>();\n togglePinned = output<SdLayoutMenu>();\n\n nodes = computed<SdLayoutMenuTreeNode[]>(() => {\n const pinnedKeys = new Set(this.pinnedKeys());\n const hoveredPinKey = this.#hoveredPinKey();\n const alwaysShowPin = this.pinVisibility() === 'always';\n const query = this.query().trim();\n const menus = query ? searchMenuLeaves(this.menus(), query) : this.menus();\n const nodes: SdLayoutMenuTreeNode[] = [];\n\n const append = (items: SdLayoutMenu[], depth: number, ancestors: string[]): void => {\n for (const menu of items) {\n const key = getMenuStableKey(menu, ancestors);\n if (!key) continue;\n const isGroup = 'children' in menu && !!menu.children?.length;\n const path = 'path' in menu ? menu.path : '';\n const title = menu.title ?? menu.tooltipTitle ?? '';\n const isPinned = pinnedKeys.has(key);\n nodes.push({\n menu,\n key,\n title,\n depth,\n paddingLeft: 12 + depth * 16,\n isGroup,\n isActive: !!path && this.#pathMatches(this.activePath(), path),\n isPinned,\n isPinVisible: alwaysShowPin || isPinned || hoveredPinKey === key,\n // why: template cũ nối `'Pin ' + node.title` — chuỗi tiếng Anh cứng và ép trật tự\n // \"động từ trước tên\" của tiếng Anh lên mọi ngôn ngữ. Nội suy `{title}` để catalog tự\n // quyết định vị trí. Tính trong `nodes` computed nên tự cập nhật khi đổi ngôn ngữ.\n pinLabel: this.#i18n.t(isPinned ? 'core.module.layout.menu.unpin' : 'core.module.layout.menu.pin', { title }),\n });\n if (isGroup && 'children' in menu) append(menu.children ?? [], depth + 1, [...ancestors, menu.title ?? key]);\n }\n };\n\n append(menus, 0, []);\n return nodes;\n });\n\n constructor() {\n this.#destroyRef.onDestroy(() => this.#clearPinHoverTimer());\n }\n\n onNavigate(menu: SdLayoutMenu): void {\n if ('path' in menu) this.navigate.emit(menu);\n }\n\n onTogglePinned(event: MouseEvent, menu: SdLayoutMenu): void {\n event.stopPropagation();\n this.togglePinned.emit(menu);\n }\n\n onPinHoverStart(key: string): void {\n if (this.pinVisibility() === 'always') return;\n this.#clearPinHoverTimer();\n this.#pinHoverTimerId = setTimeout(() => {\n this.#hoveredPinKey.set(key);\n this.#pinHoverTimerId = undefined;\n }, 300);\n }\n\n onPinHoverEnd(key: string): void {\n this.#clearPinHoverTimer();\n if (this.#hoveredPinKey() === key) this.#hoveredPinKey.set(null);\n }\n\n #clearPinHoverTimer(): void {\n if (this.#pinHoverTimerId === undefined) return;\n clearTimeout(this.#pinHoverTimerId);\n this.#pinHoverTimerId = undefined;\n }\n\n #pathMatches(currentPath: string, menuPath: string): boolean {\n const normalize = (path: string): string => (path.endsWith('/') ? path : `${path}/`);\n return currentPath === menuPath || normalize(currentPath).startsWith(normalize(menuPath));\n }\n}\n","<nav class=\"d-flex flex-column gap-4\" aria-label=\"Navigation menu\">\n @for (node of nodes(); track node.key) {\n @if (node.isGroup) {\n <div class=\"sd-layout-menu-tree__group d-flex align-items-center gap-8 T12M text-black400\" [style.padding-left.px]=\"node.paddingLeft\">\n <sd-icon [name]=\"node.menu.icon || 'folder'\"></sd-icon>\n <span class=\"text-ellipsis\">{{ node.title }}</span>\n </div>\n } @else {\n <div\n class=\"sd-layout-menu-tree__route d-flex align-items-center gap-4\"\n (mouseenter)=\"onPinHoverStart(node.key)\"\n (mouseleave)=\"onPinHoverEnd(node.key)\">\n <button\n type=\"button\"\n class=\"sd-layout-menu-tree__route-button d-flex align-items-center gap-8 flex-1 text-left T14R\"\n data-menu-route\n [attr.data-menu-key]=\"node.key\"\n [attr.aria-current]=\"node.isActive ? 'page' : null\"\n [class.sd-layout-menu-tree__route-button--active]=\"node.isActive\"\n [style.padding-left.px]=\"node.paddingLeft\"\n (click)=\"onNavigate(node.menu)\">\n @if (node.menu.iconUrl) {\n <img class=\"sd-layout-menu-tree__icon-image\" [src]=\"node.menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"node.menu.icon || 'chevron_right'\"></sd-icon>\n }\n <span class=\"text-ellipsis\">{{ node.title }}</span>\n </button>\n @if (showPin()) {\n <button\n type=\"button\"\n class=\"sd-layout-menu-tree__pin d-flex align-items-center justify-content-center\"\n [class.sd-layout-menu-tree__pin--visible]=\"node.isPinVisible\"\n [attr.data-pin-key]=\"node.key\"\n [attr.aria-label]=\"node.pinLabel\"\n [attr.aria-pressed]=\"node.isPinned\"\n (click)=\"onTogglePinned($event, node.menu)\">\n <sd-icon name=\"push_pin\"></sd-icon>\n </button>\n }\n </div>\n }\n } @empty {\n <div class=\"d-flex flex-column align-items-center justify-content-center gap-12 p-24 text-black400 T14R\">\n Không tìm thấy menu phù hợp\n </div>\n }\n</nav>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SdInput } from '@sdcorejs/angular/forms';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-layout-search-field',\n standalone: true,\n imports: [SdIcon, SdInput],\n templateUrl: './search-field.component.html',\n styleUrl: './search-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutSearchFieldComponent {\n model = input('');\n placeholder = input.required<string>();\n autoId = input.required<string>();\n sdChange = output<string>();\n}\n","<div\n data-layout-search\n class=\"sd-layout-search-field sd-layout-search-field--soft-pill d-flex align-items-center gap-8\">\n <sd-icon class=\"sd-layout-search-field__icon\" name=\"search\"></sd-icon>\n <sd-input\n class=\"sd-layout-search-field__control\"\n size=\"sm\"\n hideInlineError\n [placeholder]=\"placeholder()\"\n [autoId]=\"autoId()\"\n [model]=\"model()\"\n (sdChange)=\"sdChange.emit($event)\">\n </sd-input>\n</div>\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\nimport { SdLayoutUserInfo, SidebarConfigurationV2, resolveSidebarV2Interaction } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, getMenuStableKey } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\ninterface SidebarV2RailItem {\n menu: SdLayoutMenu;\n key: string;\n title: string;\n}\n\n@Component({\n selector: 'sd-sidebar-v2',\n standalone: true,\n imports: [SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent, SdTranslatePipe],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // why: Escape-để-đóng-flyout gom về HOST. Trước đây handler nằm trên div bọc và trên <section>\n // flyout — cả hai đều không focusable nên chỉ chạy nhờ event nổi bọt từ con, đồng thời khai\n // interaction handler trên phần tử không nhận được focus. Host là tổ tiên của tất cả nên hành vi\n // giữ nguyên hệt như cũ.\n host: {\n '(keydown.escape)': 'closeFromEscape()',\n },\n})\nexport class SdSidebarV2 {\n readonly #router = inject(Router);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV2>();\n activeGroupKey = signal('');\n isFlyoutOpen = signal(false);\n isFlyoutLocked = signal(false);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n\n interaction = computed(() => resolveSidebarV2Interaction(this.sidebar()));\n railItems = computed<SidebarV2RailItem[]>(() =>\n this.menus()\n .map(menu => ({ menu, key: getMenuStableKey(menu), title: menu.tooltipTitle || menu.title || 'Menu' }))\n .filter(item => !!item.key)\n );\n activeGroup = computed(() => this.railItems().find(item => item.key === this.activeGroupKey())?.menu);\n contextMenus = computed<SdLayoutMenu[]>(() => {\n const activeGroup = this.activeGroup();\n if (!activeGroup) return [];\n return 'children' in activeGroup && activeGroup.children?.length ? activeGroup.children : [activeGroup];\n });\n pinnedKeys = this.#navigationState.pinnedKeys;\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n untracked(() => {\n this.#navigationState.hydrate(menus);\n const persistedState = this.#navigationState.versionState(2);\n if (persistedState.activeGroupKey && !this.activeGroupKey()) this.activeGroupKey.set(persistedState.activeGroupKey);\n });\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (!(event instanceof NavigationEnd)) return;\n this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n this.closeFromNavigation();\n });\n }\n\n selectGroup(menu: SdLayoutMenu): void {\n const key = getMenuStableKey(menu);\n if (!key) return;\n\n if (this.interaction() === 'click') {\n if (this.activeGroupKey() === key && this.isFlyoutOpen()) {\n this.#closeFlyout();\n return;\n }\n this.#openGroup(key, false);\n return;\n }\n\n if (this.activeGroupKey() === key && this.isFlyoutLocked()) {\n this.#closeFlyout();\n return;\n }\n this.#openGroup(key, true);\n }\n\n previewGroup(menu: SdLayoutMenu): void {\n if (this.interaction() !== 'hover-lock' || this.isFlyoutLocked()) return;\n const key = getMenuStableKey(menu);\n if (key) this.#openGroup(key, false, false);\n }\n\n leaveFlyout(): void {\n if (this.interaction() === 'hover-lock' && !this.isFlyoutLocked()) this.#closeFlyout(false);\n }\n\n closeFromBackdrop(): void {\n this.#closeFlyout();\n }\n\n closeFromEscape(): void {\n this.#closeFlyout();\n }\n\n closeFromNavigation(): void {\n this.#closeFlyout();\n }\n\n onNavigate(menu: SdLayoutMenu): void {\n if (!('path' in menu)) return;\n this.#navigationState.recordRecent(menu, { enabled: true, maxItems: 5 });\n // why: `includes('http')` là substring test — `javascript:fetch(...)//http` lọt qua và chạy như\n // script trong origin của app. Parse URL thật rồi mới mở, kèm `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(menu.path)) {\n sdOpenExternal(menu.path);\n this.closeFromNavigation();\n return;\n }\n void this.#router.navigate([menu.path.split('?')[0]], {\n queryParams: menu.queryParams ?? {},\n state: { switchTab: true },\n });\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n\n #openGroup(key: string, locked: boolean, persist = true): void {\n this.activeGroupKey.set(key);\n this.isFlyoutOpen.set(true);\n this.isFlyoutLocked.set(locked);\n this.searchText.set('');\n if (persist) this.#navigationState.patchVersionState(2, { activeGroupKey: key, locked });\n }\n\n #closeFlyout(persist = true): void {\n this.isFlyoutOpen.set(false);\n this.isFlyoutLocked.set(false);\n this.searchText.set('');\n if (persist) this.#navigationState.patchVersionState(2, { locked: false });\n }\n}\n","<!-- why: `(keydown.escape)` được gom lên HOST của component (xem `host` trong main.component.ts).\n Trước đây nó nằm trên div bọc và trên <section> flyout — cả hai đều KHÔNG focusable nên chỉ\n \"chạy nhờ\" event nổi bọt từ con, đồng thời khiến markup khai báo interaction handler trên\n phần tử không nhận được focus. Host là tổ tiên của tất cả nên hành vi giữ nguyên. -->\n<div class=\"sd-sidebar-v2\">\n <aside class=\"sd-sidebar-v2__rail d-flex flex-column align-items-center gap-8 py-12 bg-white border-right border-black200\">\n <button type=\"button\" class=\"sd-sidebar-v2__brand d-flex align-items-center justify-content-center\" [attr.aria-label]=\"'core.module.layout.home.tab-name' | sdTranslate\">\n @if (sidebar().logoUrl) {\n <img class=\"sd-sidebar-v2__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n } @else {\n <sd-icon name=\"apps\"></sd-icon>\n }\n </button>\n\n <nav class=\"d-flex flex-column align-items-center gap-4 flex-1\" [attr.aria-label]=\"'core.module.layout.sidebar.menu-groups' | sdTranslate\">\n @for (item of railItems(); track item.key) {\n <button\n type=\"button\"\n class=\"sd-sidebar-v2__rail-action d-flex flex-column align-items-center justify-content-center gap-4\"\n [attr.data-v2-group-key]=\"item.key\"\n [attr.aria-label]=\"item.title\"\n [attr.aria-expanded]=\"activeGroupKey() === item.key && isFlyoutOpen()\"\n [class.sd-sidebar-v2__rail-action--active]=\"activeGroupKey() === item.key\"\n (click)=\"selectGroup(item.menu)\"\n (mouseenter)=\"previewGroup(item.menu)\"\n (focus)=\"previewGroup(item.menu)\">\n @if (item.menu.iconUrl) {\n <img class=\"sd-sidebar-v2__rail-icon\" [src]=\"item.menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"item.menu.icon || 'widgets'\"></sd-icon>\n }\n <span class=\"sd-sidebar-v2__rail-label text-ellipsis\">{{ item.title }}</span>\n </button>\n }\n </nav>\n\n <sd-layout-user-menu [userInfo]=\"userInfo()\" [compact]=\"true\"></sd-layout-user-menu>\n </aside>\n\n @if (isFlyoutOpen()) {\n <button\n type=\"button\"\n class=\"sd-sidebar-v2__backdrop\"\n [attr.aria-label]=\"'core.module.layout.sidebar.close-menu' | sdTranslate\"\n (click)=\"closeFromBackdrop()\"\n (keydown.escape)=\"closeFromEscape()\"></button>\n <section\n class=\"sd-sidebar-v2__flyout d-flex flex-column bg-white border-right border-black200 mat-elevation-z4\"\n role=\"region\"\n [attr.aria-label]=\"activeGroup()?.title || 'Menu'\"\n (mouseleave)=\"leaveFlyout()\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n <span class=\"T16M text-ellipsis\">{{ activeGroup()?.title || sidebar().defaultTitle || 'Menu' }}</span>\n @if (isFlyoutLocked()) {\n <sd-icon name=\"lock\"></sd-icon>\n }\n </header>\n <div class=\"p-12\">\n <sd-layout-search-field\n [placeholder]=\"'core.module.layout.sidebar.search-in-group' | sdTranslate\"\n [autoId]=\"'layout-v2-context-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-layout-search-field>\n </div>\n <div class=\"flex-1 overflow-auto px-8 pb-12\">\n <sd-layout-menu-tree\n [menus]=\"contextMenus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"onNavigate($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </div>\n </section>\n }\n\n <main class=\"sd-sidebar-v2__content\" data-v2-content data-content-offset=\"rail\">\n <ng-content></ng-content>\n </main>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\nimport { SdLayoutUserInfo, SidebarConfigurationV2 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, getMenuStableKey, selectPrimaryMenuGroups } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'sd-sidebar-mobile-v2',\n standalone: true,\n imports: [A11yModule, SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent, SdTranslatePipe],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarMobileV2 {\n readonly #router = inject(Router);\n readonly #i18n = inject(I18nService);\n readonly #document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n #restoreFocusElement: HTMLElement | null = null;\n #previousBodyOverflow = '';\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV2>();\n primaryMenus = computed(() => selectPrimaryMenuGroups(this.menus(), this.sidebar().primaryMenuIds));\n overflowMenus = computed(() => {\n const primaryKeys = new Set(this.primaryMenus().map(menu => getMenuStableKey(menu)));\n return this.menus().filter(menu => !primaryKeys.has(getMenuStableKey(menu)));\n });\n isSheetOpen = signal(false);\n sheetGroupKey = signal('');\n sheetTitle = signal('');\n sheetMenus = signal<SdLayoutMenu[]>([]);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n pinnedKeys = this.#navigationState.pinnedKeys;\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n untracked(() => this.#navigationState.hydrate(menus));\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (!(event instanceof NavigationEnd)) return;\n this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n this.closeSheet(false);\n });\n this.#destroyRef.onDestroy(() => this.#releaseBodyScroll());\n }\n\n openMore(trigger?: EventTarget | null): void {\n this.#openSheet('more', this.#i18n.t('core.module.layout.sidebar.more'), this.overflowMenus(), trigger);\n }\n\n activateMenu(menu: SdLayoutMenu, trigger?: EventTarget | null): void {\n if ('path' in menu) {\n this.#navigate(menu);\n return;\n }\n this.#openSheet(getMenuStableKey(menu), menu.title || 'Menu', menu.children ?? [], trigger);\n }\n\n closeSheet(restoreFocus = true): void {\n if (!this.isSheetOpen()) return;\n this.isSheetOpen.set(false);\n this.searchText.set('');\n this.#releaseBodyScroll();\n if (restoreFocus) this.#restoreFocusElement?.focus();\n this.#restoreFocusElement = null;\n }\n\n onSheetKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n this.closeSheet();\n }\n\n onNavigate(menu: SdLayoutMenu): void {\n if ('path' in menu) this.#navigate(menu);\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n\n #openSheet(key: string, title: string, menus: SdLayoutMenu[], trigger?: EventTarget | null): void {\n this.sheetGroupKey.set(key);\n this.sheetTitle.set(title);\n this.sheetMenus.set(menus);\n this.searchText.set('');\n this.#restoreFocusElement =\n trigger instanceof HTMLElement ? trigger : this.#document.activeElement instanceof HTMLElement ? this.#document.activeElement : null;\n if (!this.isSheetOpen()) {\n this.#previousBodyOverflow = this.#document.body.style.overflow;\n this.#document.body.style.overflow = 'hidden';\n }\n this.isSheetOpen.set(true);\n }\n\n #navigate(menu: Extract<SdLayoutMenu, { path: string }>): void {\n this.#navigationState.recordRecent(menu, { enabled: true, maxItems: 5 });\n // why: `includes('http')` là substring test — `javascript:fetch(...)//http` lọt qua và chạy như\n // script trong origin của app. Parse URL thật rồi mới mở, kèm `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(menu.path)) {\n sdOpenExternal(menu.path);\n this.closeSheet();\n return;\n }\n void this.#router\n .navigate([menu.path.split('?')[0]], { queryParams: menu.queryParams ?? {}, state: { switchTab: true } })\n .then(navigated => {\n if (navigated) this.closeSheet();\n });\n }\n\n #releaseBodyScroll(): void {\n this.#document.body.style.overflow = this.#previousBodyOverflow;\n }\n}\n","<div class=\"sd-sidebar-mobile-v2 d-flex flex-column\">\n <main class=\"sd-sidebar-mobile-v2__content flex-1 overflow-auto\">\n <ng-content></ng-content>\n </main>\n\n <nav class=\"sd-sidebar-mobile-v2__bar d-flex align-items-stretch bg-white border-top border-black200\" [attr.aria-label]=\"'core.module.layout.sidebar.primary-nav' | sdTranslate\">\n @for (menu of primaryMenus(); track menu.id || menu.title) {\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v2__bar-action d-flex flex-column align-items-center justify-content-center gap-4 flex-1\"\n [attr.data-mobile-menu-key]=\"menu.id ? 'id:' + menu.id : null\"\n [attr.aria-label]=\"menu.tooltipTitle || menu.title || 'Menu'\"\n [attr.aria-expanded]=\"sheetGroupKey() === (menu.id ? 'id:' + menu.id : '') && isSheetOpen()\"\n (click)=\"activateMenu(menu, $event.currentTarget)\">\n @if (menu.iconUrl) {\n <img class=\"sd-sidebar-mobile-v2__icon\" [src]=\"menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"menu.icon || 'widgets'\"></sd-icon>\n }\n <span class=\"sd-sidebar-mobile-v2__label text-ellipsis\">{{ menu.tooltipTitle || menu.title }}</span>\n </button>\n }\n @if (overflowMenus().length) {\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v2__bar-action d-flex flex-column align-items-center justify-content-center gap-4 flex-1\"\n [attr.aria-label]=\"'core.module.layout.sidebar.more-menu' | sdTranslate\"\n [attr.aria-expanded]=\"sheetGroupKey() === 'more' && isSheetOpen()\"\n (click)=\"openMore($event.currentTarget)\">\n <sd-icon name=\"more_horiz\"></sd-icon>\n <span class=\"sd-sidebar-mobile-v2__label\">{{ 'core.module.layout.sidebar.more' | sdTranslate }}</span>\n </button>\n }\n </nav>\n\n @if (isSheetOpen()) {\n <button type=\"button\" class=\"sd-sidebar-mobile-v2__backdrop\" [attr.aria-label]=\"'core.module.layout.sidebar.close-menu' | sdTranslate\" (click)=\"closeSheet()\"></button>\n <section\n data-v2-sheet\n class=\"sd-sidebar-mobile-v2__sheet d-flex flex-column bg-white rounded-top-16 mat-elevation-z8\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"sheetTitle()\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n (keydown)=\"onSheetKeydown($event)\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n <span class=\"T16M text-ellipsis\">{{ sheetTitle() }}</span>\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v2__close d-flex align-items-center justify-content-center\"\n [attr.aria-label]=\"'core.common.close' | sdTranslate\"\n (click)=\"closeSheet()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </header>\n <div class=\"d-flex flex-column gap-12 p-12 overflow-auto\">\n <sd-layout-user-menu presentation=\"mobile-inline\" [userInfo]=\"userInfo()\"></sd-layout-user-menu>\n <sd-layout-search-field\n [placeholder]=\"'core.module.layout.sidebar.search-in-menu' | sdTranslate\"\n [autoId]=\"'layout-v2-mobile-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-layout-search-field>\n <sd-layout-menu-tree\n [menus]=\"sheetMenus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n pinVisibility=\"always\"\n (navigate)=\"onNavigate($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </div>\n </section>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\nimport { SdLayoutUserInfo, SidebarConfigurationV3, resolveSidebarV3Recent } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutRootMenu, getMenuStableKey, searchMenuLeaves } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n@Component({\n selector: 'sd-sidebar-v3',\n standalone: true,\n imports: [SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent, SdTranslatePipe],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarV3 {\n readonly #router = inject(Router);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n #initialized = false;\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV3>();\n isCollapsed = signal(false);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n searchResults = computed<SdLayoutRootMenu[]>(() => searchMenuLeaves(this.menus(), this.searchText()));\n recentConfiguration = computed(() => resolveSidebarV3Recent(this.sidebar()));\n pinnedKeys = this.#navigationState.pinnedKeys;\n pinnedMenus = this.#navigationState.pinnedMenus;\n recentMenus = this.#navigationState.recentMenus;\n collapsedItems = computed(() =>\n this.menus().map(menu => ({ menu, key: getMenuStableKey(menu), title: menu.tooltipTitle || menu.title || 'Menu' }))\n );\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n const sidebar = this.sidebar();\n const recentConfiguration = resolveSidebarV3Recent(sidebar);\n untracked(() => {\n this.#navigationState.hydrate(menus, recentConfiguration.maxItems);\n if (this.#initialized) return;\n const persistedCollapsed = this.#navigationState.versionState(3).collapsed;\n this.isCollapsed.set(typeof persistedCollapsed === 'boolean' ? persistedCollapsed : (sidebar.defaultCollapsed ?? false));\n this.#initialized = true;\n });\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (event instanceof NavigationEnd) this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n });\n }\n\n toggleCollapsed(): void {\n this.isCollapsed.update(collapsed => !collapsed);\n this.#navigationState.patchVersionState(3, { collapsed: this.isCollapsed() });\n }\n\n activateCollapsedMenu(menu: SdLayoutMenu): void {\n if ('path' in menu) this.navigateMenu(menu);\n else {\n this.isCollapsed.set(false);\n this.#navigationState.patchVersionState(3, { collapsed: false });\n }\n }\n\n navigateMenu(menu: SdLayoutMenu): void {\n if (!('path' in menu)) return;\n this.#navigationState.recordRecent(menu, this.recentConfiguration());\n // why: `includes('http')` là substring test — `javascript:fetch(...)//http` lọt qua và chạy như\n // script trong origin của app. Parse URL thật rồi mới mở, kèm `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(menu.path)) {\n sdOpenExternal(menu.path);\n return;\n }\n void this.#router.navigate([menu.path.split('?')[0]], {\n queryParams: menu.queryParams ?? {},\n state: { switchTab: true },\n });\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n}\n","<div class=\"sd-sidebar-v3\" [class.sd-sidebar-v3--collapsed]=\"isCollapsed()\">\n <aside\n class=\"sd-sidebar-v3__drawer d-flex flex-column bg-white border-right border-black200\"\n data-v3-sidebar\n [attr.data-collapsed]=\"isCollapsed()\">\n <header\n data-v3-header\n class=\"sd-sidebar-v3__header d-flex align-items-center gap-8 p-12 border-bottom border-black200\"\n [class.sd-sidebar-v3__header--collapsed]=\"isCollapsed()\"\n [class.justify-content-between]=\"!isCollapsed()\"\n [class.justify-content-center]=\"isCollapsed()\">\n @if (!isCollapsed()) {\n <div data-v3-brand class=\"d-flex align-items-center gap-8 overflow-hidden\">\n @if (sidebar().logoUrl) {\n <img class=\"sd-sidebar-v3__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n } @else {\n <sd-icon name=\"apps\"></sd-icon>\n }\n <span class=\"T16M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n </div>\n }\n <button\n type=\"button\"\n class=\"sd-sidebar-v3__icon-action d-flex align-items-center justify-content-center\"\n [attr.aria-label]=\"isCollapsed() ? 'Mở rộng sidebar' : 'Thu gọn sidebar'\"\n [attr.aria-expanded]=\"!isCollapsed()\"\n (click)=\"toggleCollapsed()\">\n <sd-icon [name]=\"isCollapsed() ? 'chevron_right' : 'chevron_left'\"></sd-icon>\n </button>\n </header>\n\n @if (isCollapsed()) {\n <nav class=\"d-flex flex-column align-items-center gap-4 p-8 flex-1\" aria-label=\"Menu thu gọn\">\n @for (item of collapsedItems(); track item.key) {\n <button\n type=\"button\"\n class=\"sd-sidebar-v3__collapsed-action d-flex align-items-center justify-content-center\"\n [attr.aria-label]=\"item.title\"\n (click)=\"activateCollapsedMenu(item.menu)\">\n @if (item.menu.iconUrl) {\n <img class=\"sd-sidebar-v3__logo\" [src]=\"item.menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"item.menu.icon || 'widgets'\"></sd-icon>\n }\n </button>\n }\n </nav>\n } @else {\n <div class=\"p-12\">\n <sd-layout-search-field\n placeholder=\"Tìm trong tất cả menu\"\n [autoId]=\"'layout-v3-global-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-layout-search-field>\n </div>\n <div class=\"sd-sidebar-v3__navigation d-flex flex-column gap-16 flex-1 overflow-auto px-8 pb-12\">\n @if (pinnedMenus().length) {\n <section data-v3-pinned class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">{{ 'core.module.layout.sidebar.pinned' | sdTranslate }}</h2>\n <sd-layout-menu-tree\n [menus]=\"pinnedMenus()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n @if (recentConfiguration().enabled && recentMenus().length) {\n <section data-v3-recent class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">{{ 'core.module.layout.sidebar.recent' | sdTranslate }}</h2>\n <sd-layout-menu-tree [menus]=\"recentMenus()\" [activePath]=\"activePath()\" [showPin]=\"false\" (navigate)=\"navigateMenu($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n <section class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">{{ 'core.module.layout.sidebar.all-menu' | sdTranslate }}</h2>\n <sd-layout-menu-tree\n [menus]=\"menus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n </div>\n }\n\n <div class=\"p-8 border-top border-black200\">\n <sd-layout-user-menu [userInfo]=\"userInfo()\" [compact]=\"isCollapsed()\"></sd-layout-user-menu>\n </div>\n </aside>\n\n <main class=\"sd-sidebar-v3__content\">\n <ng-content></ng-content>\n </main>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\nimport { SdLayoutUserInfo, SidebarConfigurationV3, resolveSidebarV3Recent } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutRootMenu, searchMenuLeaves } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n@Component({\n selector: 'sd-sidebar-mobile-v3',\n standalone: true,\n imports: [A11yModule, SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent, SdTranslatePipe],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarMobileV3 {\n readonly #router = inject(Router);\n readonly #document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n #restoreFocusElement: HTMLElement | null = null;\n #previousBodyOverflow = '';\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV3>();\n isDrawerOpen = signal(false);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n searchResults = computed<SdLayoutRootMenu[]>(() => searchMenuLeaves(this.menus(), this.searchText()));\n recentConfiguration = computed(() => resolveSidebarV3Recent(this.sidebar()));\n pinnedKeys = this.#navigationState.pinnedKeys;\n pinnedMenus = this.#navigationState.pinnedMenus;\n recentMenus = this.#navigationState.recentMenus;\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n const maximum = resolveSidebarV3Recent(this.sidebar()).maxItems;\n untracked(() => this.#navigationState.hydrate(menus, maximum));\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (!(event instanceof NavigationEnd)) return;\n this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n this.closeFromNavigation();\n });\n this.#destroyRef.onDestroy(() => this.#releaseBodyScroll());\n }\n\n openDrawer(trigger?: EventTarget | null): void {\n this.#restoreFocusElement =\n trigger instanceof HTMLElement\n ? trigger\n : this.#document.activeElement instanceof HTMLElement\n ? this.#document.activeElement\n : (this.trigger()?.nativeElement ?? null);\n if (!this.isDrawerOpen()) {\n this.#previousBodyOverflow = this.#document.body.style.overflow;\n this.#document.body.style.overflow = 'hidden';\n }\n this.isDrawerOpen.set(true);\n }\n\n closeFromBackdrop(): void {\n this.#closeDrawer();\n }\n\n closeFromEscape(): void {\n this.#closeDrawer();\n }\n\n closeFromNavigation(): void {\n this.#closeDrawer();\n }\n\n onDrawerKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n this.closeFromEscape();\n }\n\n navigateMenu(menu: SdLayoutMenu): void {\n if (!('path' in menu)) return;\n this.#navigationState.recordRecent(menu, this.recentConfiguration());\n // why: `includes('http')` là substring test — `javascript:fetch(...)//http` lọt qua và chạy như\n // script trong origin của app. Parse URL thật rồi mới mở, kèm `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(menu.path)) {\n sdOpenExternal(menu.path);\n this.closeFromNavigation();\n return;\n }\n void this.#router\n .navigate([menu.path.split('?')[0]], { queryParams: menu.queryParams ?? {}, state: { switchTab: true } })\n .then(navigated => {\n if (navigated) this.closeFromNavigation();\n });\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n\n #closeDrawer(): void {\n if (!this.isDrawerOpen()) return;\n this.isDrawerOpen.set(false);\n this.searchText.set('');\n this.#releaseBodyScroll();\n (this.#restoreFocusElement ?? this.trigger()?.nativeElement)?.focus();\n this.#restoreFocusElement = null;\n }\n\n #releaseBodyScroll(): void {\n this.#document.body.style.overflow = this.#previousBodyOverflow;\n }\n}\n","<div class=\"sd-sidebar-mobile-v3 d-flex flex-column\">\n <header\n class=\"sd-sidebar-mobile-v3__topbar d-flex align-items-center justify-content-between gap-8 px-16 bg-white border-bottom border-black200\">\n <div class=\"d-flex align-items-center gap-8 overflow-hidden\">\n @if (sidebar().logoUrl) {\n <img class=\"sd-sidebar-mobile-v3__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n }\n <span class=\"T16M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n </div>\n <button\n #trigger\n type=\"button\"\n data-v3-mobile-trigger\n class=\"sd-sidebar-mobile-v3__icon-action d-flex align-items-center justify-content-center\"\n aria-label=\"Mở menu\"\n [attr.aria-expanded]=\"isDrawerOpen()\"\n (click)=\"openDrawer($event.currentTarget)\">\n <sd-icon name=\"menu\"></sd-icon>\n </button>\n </header>\n\n <main class=\"flex-1 overflow-auto\">\n <ng-content></ng-content>\n </main>\n\n @if (isDrawerOpen()) {\n <button type=\"button\" class=\"sd-sidebar-mobile-v3__backdrop\" aria-label=\"Đóng menu\" (click)=\"closeFromBackdrop()\"></button>\n <aside\n class=\"sd-sidebar-mobile-v3__drawer d-flex flex-column bg-white mat-elevation-z8\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Menu chính\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n (keydown)=\"onDrawerKeydown($event)\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n <span class=\"T18M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v3__icon-action d-flex align-items-center justify-content-center\"\n aria-label=\"Đóng menu\"\n (click)=\"closeFromBackdrop()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </header>\n <div class=\"sd-sidebar-mobile-v3__navigation d-flex flex-column gap-16 flex-1 overflow-auto p-12\">\n <sd-layout-user-menu presentation=\"mobile-inline\" [userInfo]=\"userInfo()\"></sd-layout-user-menu>\n <div class=\"sd-sidebar-mobile-v3__search bg-white\">\n <sd-layout-search-field\n placeholder=\"Tìm trong tất cả menu\"\n [autoId]=\"'layout-v3-mobile-global-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-layout-search-field>\n </div>\n @if (pinnedMenus().length) {\n <section data-v3-mobile-pinned class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">{{ 'core.module.layout.sidebar.pinned' | sdTranslate }}</h2>\n <sd-layout-menu-tree\n [menus]=\"pinnedMenus()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n pinVisibility=\"always\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n @if (recentConfiguration().enabled && recentMenus().length) {\n <section data-v3-mobile-recent class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">{{ 'core.module.layout.sidebar.recent' | sdTranslate }}</h2>\n <sd-layout-menu-tree [menus]=\"recentMenus()\" [activePath]=\"activePath()\" [showPin]=\"false\" (navigate)=\"navigateMenu($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n <section class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">{{ 'core.module.layout.sidebar.all-menu' | sdTranslate }}</h2>\n <sd-layout-menu-tree\n [menus]=\"menus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n pinVisibility=\"always\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n </div>\n </aside>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n// Import nội bộ trong module layout\nimport { SdLayoutMenu, SdLayoutResponsiveService, SdLayoutService } from '../../services';\nimport { MenuPipe } from '../../pipes';\nimport { SdSidebarV1 } from '../sidebar-v1/main.component';\nimport { SdSidebarMobileV1 } from '../sidebar-mobile-v1/main.component';\nimport { SdSidebarV2 } from '../sidebar-v2/main.component';\nimport { SdSidebarMobileV2 } from '../sidebar-mobile-v2/main.component';\nimport { SdSidebarV3 } from '../sidebar-v3/main.component';\nimport { SdSidebarMobileV3 } from '../sidebar-mobile-v3/main.component';\nimport {\n SD_LAYOUT_CONFIGURATION,\n SidebarConfigurationV1,\n SidebarConfigurationV2,\n SidebarConfigurationV3,\n normalizeLayoutMobileBreakpoint,\n} from '../../configurations';\n\n@Component({\n selector: 'sd-layout',\n templateUrl: './layout-main.component.html',\n styleUrl: './layout-main.component.scss',\n imports: [SdSidebarV1, SdSidebarMobileV1, SdSidebarV2, SdSidebarMobileV2, SdSidebarV3, SdSidebarMobileV3, NgTemplateOutlet],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutComponent {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #menuPipe = inject(MenuPipe);\n #layoutService = inject(SdLayoutService);\n #responsiveService = inject(SdLayoutResponsiveService);\n #layoutConfiguration = inject(SD_LAYOUT_CONFIGURATION, { optional: true });\n\n // ==========================================\n // SIGNAL INPUTS\n // ==========================================\n menusInput = input<SdLayoutMenu[]>([], { alias: 'menus' });\n menus = computed(() => this.#menuPipe.transform(this.menusInput() || []));\n\n // ==========================================\n // CONSUME SHARED STATE\n // ==========================================\n userInfo = this.#layoutService.userInfo;\n sidebar = this.#layoutService.sidebar;\n sidebarV1 = computed<SidebarConfigurationV1 | undefined>(() => {\n const sidebar = this.sidebar();\n return sidebar?.version === 1 ? sidebar : undefined;\n });\n sidebarV2 = computed<SidebarConfigurationV2 | undefined>(() => {\n const sidebar = this.sidebar();\n return sidebar?.version === 2 ? sidebar : undefined;\n });\n sidebarV3 = computed<SidebarConfigurationV3 | undefined>(() => {\n const sidebar = this.sidebar();\n return sidebar?.version === 3 ? sidebar : undefined;\n });\n mobileBreakpoint = normalizeLayoutMobileBreakpoint(this.#layoutConfiguration?.mobileBreakpoint);\n isMobile = computed(() => this.#responsiveService.isMobile(this.mobileBreakpoint));\n}\n","<ng-template #projectedContent>\n <ng-content></ng-content>\n</ng-template>\n\n@let _userInfo = userInfo();\n@let _sidebarV1 = sidebarV1();\n@let _sidebarV2 = sidebarV2();\n@let _sidebarV3 = sidebarV3();\n\n@if (_userInfo && _sidebarV1) {\n @if (!isMobile()) {\n <sd-sidebar-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV1\" [isMobile]=\"false\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-v1>\n } @else {\n <sd-sidebar-mobile-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV1\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-mobile-v1>\n }\n}\n\n@if (_userInfo && _sidebarV3) {\n @if (!isMobile()) {\n <sd-sidebar-v3 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV3\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-v3>\n } @else {\n <sd-sidebar-mobile-v3 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV3\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-mobile-v3>\n }\n}\n\n@if (_userInfo && _sidebarV2) {\n @if (!isMobile()) {\n <sd-sidebar-v2 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV2\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-v2>\n } @else {\n <sd-sidebar-mobile-v2 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV2\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-mobile-v2>\n }\n}\n","import { I18N_MESSAGES, I18N_STORAGE_KEY } from '@sdcorejs/angular/i18n';\nimport { Language } from '@sdcorejs/utils/models';\n\n/**\n * Resolve a translated tab name for `@SdTabComponent`.\n *\n * WHY not I18nService: the decorator runs at module-evaluation time, before\n * Angular's DI exists, so the service cannot be injected. We read the language\n * the app persisted and look the key up in the static catalog instead.\n */\nexport function resolveTabName(key: string): string {\n const lang = ((): Language => {\n try {\n const stored = localStorage.getItem(I18N_STORAGE_KEY) as Language | null;\n if (stored) return stored;\n } catch {\n // localStorage can throw (private mode, SSR shim) — fall back below.\n }\n return 'vi';\n })();\n\n return I18N_MESSAGES[lang]?.[key] ?? I18N_MESSAGES.vi[key] ?? key;\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { SdTabComponent } from '@sdcorejs/angular/components';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { Language } from '@sdcorejs/utils/models';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService } from '../../../../services';\nimport { resolveTabName } from '../../../../utils';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n// End\n\n@Component({\n selector: 'app-home-page',\n imports: [SdIcon, SdPageComponent, SdTranslatePipe],\n templateUrl: './home-page.component.html',\n styleUrl: './home-page.component.scss',\n standalone: true,\n})\n@SdTabComponent({\n component: HomePageComponent,\n name: () => resolveTabName('core.module.layout.home.tab-name'),\n icon: 'home',\n color: 'primary',\n})\nexport class HomePageComponent {\n // ==========================================\n // INJECT SERVICES (Modern Angular)\n // ==========================================\n readonly #layoutService = inject(SdLayoutService);\n readonly #i18n = inject(I18nService);\n\n // Map Language code → BCP 47 locale tag dùng cho Intl date formatting\n // WHY: must be declared before todayInfo — field init runs top-to-bottom; #getTodayInfo reads #localeMap.\n readonly #localeMap: Record<Language, string> = {\n vi: 'vi-VN',\n en: 'en-US',\n ja: 'ja-JP',\n ko: 'ko-KR',\n zh: 'zh-CN',\n };\n\n // ==========================================\n // SIGNALS (STATE)\n // ==========================================\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n userInfo = this.#layoutService.userInfo;\n\n // WHY: static data, không cần signal. `storage` + `schema` thay cho `database` + `account_tree`\n // để đảm bảo render trên mọi version của Material Icons mặc định.\n readonly features = [\n { icon: 'storage', key: 'core.module.layout.home.feature.data', area: 'data' },\n { icon: 'insights', key: 'core.module.layout.home.feature.reports', area: 'report' },\n { icon: 'group', key: 'core.module.layout.home.feature.users', area: 'users' },\n { icon: 'schema', key: 'core.module.layout.home.feature.workflow', area: 'flow' },\n { icon: 'verified_user', key: 'core.module.layout.home.feature.audit', area: 'audit' },\n { icon: 'hub', key: 'core.module.layout.home.feature.integration', area: 'integ' },\n ] as const;\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n\n #getTimezone() {\n const now = new Date();\n const timezoneOffset = now.getTimezoneOffset();\n const offsetHours = -timezoneOffset / 60;\n const sign = offsetHours >= 0 ? '+' : '';\n const simpleGmtString = `GMT${sign}${offsetHours}`;\n return simpleGmtString;\n }\n\n #getTodayInfo(date: Date) {\n // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n // WHY: dùng locale theo ngôn ngữ hiện tại để định dạng số (dd/mm/yyyy vs mm/dd/yyyy ...)\n const locale = this.#localeMap[this.#i18n.language()] ?? 'vi-VN';\n const dateStr = date.toLocaleDateString(locale, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n const formatted = this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n return `${formatted} (${this.#getTimezone()})`;\n }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n <div class=\"d-flex flex-column\" headerLeft>\n <div class=\"font-weight-medium fs-20\">\n {{ 'core.module.layout.greeting.hello' | sdTranslate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}\n </div>\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n </div>\n\n <div class=\"wrapper\">\n <div class=\"bento\">\n <!-- Hero -->\n <div class=\"card hero-card\">\n <div class=\"hero-ring ring-3\"></div>\n <div class=\"hero-ring ring-2\"></div>\n <div class=\"hero-ring ring-1\"></div>\n <div class=\"hero-core\">\n <sd-icon class=\"hero-icon\" name=\"space_dashboard\"></sd-icon>\n </div>\n <div class=\"hero-decoration\">\n <span class=\"dot d1\"></span>\n <span class=\"dot d2\"></span>\n <span class=\"dot d3\"></span>\n </div>\n </div>\n\n <!-- Features -->\n @for (feature of features; track feature.key; let i = $index) {\n <div\n class=\"card feature-card\"\n [class.feature-wide]=\"feature.area === 'audit' || feature.area === 'integ'\"\n [style.gridArea]=\"feature.area\"\n [style.animation-delay.ms]=\"(i + 1) * 80\"\n >\n <div class=\"feature-accent\"></div>\n <div class=\"feature-content\">\n <div class=\"feature-icon-wrap\">\n <sd-icon class=\"feature-icon\" [name]=\"feature.icon\"></sd-icon>\n </div>\n <span class=\"feature-label\">{{ feature.key | sdTranslate }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n</sd-page>\n","import { inject, Injectable } from '@angular/core';\nimport { CanActivate, Router } from '@angular/router';\n\n// Giả sử bạn có một service để đọc config\nimport { ISdLayoutConfiguration, SD_LAYOUT_CONFIGURATION } from '../../../configurations';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HomeRedirectGuard implements CanActivate {\n private readonly router = inject(Router);\n private readonly layoutConfiguration: ISdLayoutConfiguration = inject(SD_LAYOUT_CONFIGURATION);\n\n async canActivate() {\n const homeUrl = this.layoutConfiguration?.homeUrl;\n if (homeUrl) {\n // Nếu có config homeUrl, tạo một UrlTree để redirect\n // Đây là cách redirect chính thống từ trong guard\n return this.router.createUrlTree([homeUrl]);\n }\n // Nếu không có homeUrl, cho phép kích hoạt route\n return true;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { HomePageComponent } from './components/home-page/home-page.component';\nimport { HomeRedirectGuard } from './guards/home-redirect.guard';\n\nconst routes: Routes = [\n {\n path: '',\n canActivate: [HomeRedirectGuard],\n component: HomePageComponent,\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class HomeRoutingModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HomeRoutingModule } from './home.routing';\n\n@NgModule({\n declarations: [],\n imports: [CommonModule, HomeRoutingModule],\n})\nexport class HomeModule {}\n","import { Component, inject, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { SdButton, SdTabComponent } from '@sdcorejs/angular/components';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService } from '../../../../services';\nimport { resolveTabName } from '../../../../utils';\n// End\n\n@Component({\n templateUrl: './root.component.html',\n styleUrl: './root.component.scss',\n imports: [SdButton, SdPageComponent, SdTranslatePipe],\n})\n@SdTabComponent({\n component: RootComponent,\n name: () => resolveTabName('core.module.layout.not-found.tab-name'),\n icon: 'search_off',\n color: 'warning',\n})\nexport class RootComponent {\n // ==========================================\n // INJECT SERVICES (Modern Angular)\n // ==========================================\n readonly #route = inject(ActivatedRoute);\n readonly #router = inject(Router);\n readonly #layoutService = inject(SdLayoutService);\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // SIGNALS (STATE)\n // ==========================================\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n userInfo = this.#layoutService.userInfo;\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n #getTodayInfo(date: Date): string {\n // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n const dateStr = date.toLocaleDateString('vi-VN', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n return this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n }\n\n // ==========================================\n // PUBLIC METHODS\n // ==========================================\n /**\n * why: `window.location.href = ''` vừa là global thô (throw khi SSR vì không có `window`), vừa chỉ\n * reload lại đúng trang lỗi này thay vì rời khỏi nó — trong khi nút mang nhãn \"Quay lại trang chủ\".\n * Điều hướng bằng Router tới `homeUrl` mà consumer đã khai trong SD_LAYOUT_CONFIGURATION.\n */\n reload(): void {\n void this.#router.navigateByUrl(this.#layoutService.homeUrl);\n }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n <div class=\"d-flex flex-column\" headerLeft>\n <div class=\"font-weight-medium fs-20\">{{ 'core.module.layout.greeting.hello' | sdTranslate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}</div>\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n </div>\n\n <div class=\"h-full d-flex flex-column align-items-center\">\n <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\n <img alt=\"not-found\" class=\"sd-image-not-found\" />\n <span class=\"T16M mt-24\">{{ 'core.module.layout.not-found.title' | sdTranslate }}</span>\n <span class=\"T16R text-secondary mt-4\">\n {{ 'core.module.layout.not-found.message' | sdTranslate }}\n </span>\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" [title]=\"'core.module.layout.not-found.back' | sdTranslate\" prefixIcon=\"arrow_back\"> </sd-button>\n </div>\n </div>\n</sd-page>\n","import { Route } from '@angular/router';\nimport { RootComponent } from './pages/root/root.component';\n\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './not-found.routing';\n\n@NgModule({\n imports: [CommonModule, RouterModule.forChild(Routes)],\n exports: [],\n})\nexport class NotFoundModule {}\n","import { Component, inject, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { SdButton, SdTabComponent } from '@sdcorejs/angular/components';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService } from '../../../../services';\nimport { resolveTabName } from '../../../../utils';\n// End\n\n@Component({\n templateUrl: './root.component.html',\n styleUrl: './root.component.scss',\n imports: [SdButton, SdPageComponent, SdTranslatePipe],\n})\n@SdTabComponent({\n component: RootComponent,\n name: () => resolveTabName('core.module.layout.forbidden.tab-name'),\n icon: 'block',\n color: 'error',\n})\nexport class RootComponent {\n // ==========================================\n // INJECT SERVICES (Modern Angular)\n // ==========================================\n readonly #route = inject(ActivatedRoute);\n readonly #router = inject(Router);\n readonly #layoutService = inject(SdLayoutService);\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // SIGNALS (STATE)\n // ==========================================\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n userInfo = this.#layoutService.userInfo;\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n #getTodayInfo(date: Date): string {\n // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n const dateStr = date.toLocaleDateString('vi-VN', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n return this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n }\n\n // ==========================================\n // PUBLIC METHODS\n // ==========================================\n /**\n * why: `window.location.href = ''` vừa là global thô (throw khi SSR vì không có `window`), vừa chỉ\n * reload lại đúng trang lỗi này thay vì rời khỏi nó — trong khi nút mang nhãn \"Về trang chủ\".\n * Điều hướng bằng Router tới `homeUrl` mà consumer đã khai trong SD_LAYOUT_CONFIGURATION.\n */\n reload(): void {\n void this.#router.navigateByUrl(this.#layoutService.homeUrl);\n }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n <div class=\"d-flex flex-column\" headerLeft>\n <div class=\"font-weight-medium fs-20\">{{ 'core.module.layout.greeting.hello' | sdTranslate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}</div>\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n </div>\n <div class=\"h-full d-flex flex-column align-items-center\">\n <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\n <img alt=\"forbidden\" class=\"sd-image-forbidden\" />\n <span class=\"T16M mt-24\">{{ 'core.module.layout.forbidden.title' | sdTranslate }}</span>\n <span class=\"T14R text-secondary mt-4\"\n >{{ 'core.module.layout.forbidden.message' | sdTranslate }}</span\n >\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" [title]=\"'core.module.layout.forbidden.back-home' | sdTranslate\"> </sd-button>\n </div>\n </div>\n</sd-page>\n","import { Route } from '@angular/router';\nimport { RootComponent } from './pages/root/root.component';\n\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './forbidden.routing';\n\n@NgModule({\n imports: [CommonModule, RouterModule.forChild(Routes)],\n exports: [],\n})\nexport class ForbiddenModule {}\n","import { Route } from '@angular/router';\nimport { SD_PERMISSION_PUBLIC } from '@sdcorejs/angular/modules/permission';\n\n// why: `SdPermissionGuard.canActivateChild` từ chối mọi route không khai báo `data.permission`. Ba\n// trang built-in dưới đây là hạ tầng của layout (home / 404 / 403), ai đăng nhập cũng phải vào được —\n// đặc biệt `forbidden`, vì `onForbiden` thường điều hướng chính vào nó: thiếu khai báo ở đây thì\n// trang 403 tự bị chặn và app rơi vào vòng lặp redirect. Nói tường minh bằng `SD_PERMISSION_PUBLIC`.\n// Route con `path: ''` trong từng module kế thừa `data` này (chiến lược `emptyOnly` mặc định).\nconst PUBLIC_ROUTE_DATA = { permission: SD_PERMISSION_PUBLIC } as const;\n\nexport const Routes: Route[] = [\n {\n path: '',\n pathMatch: 'full',\n redirectTo: 'not-found',\n },\n {\n path: 'home',\n data: PUBLIC_ROUTE_DATA,\n loadChildren: () => import('./modules/home').then(m => m.HomeModule),\n },\n {\n path: 'not-found',\n data: PUBLIC_ROUTE_DATA,\n loadChildren: () => import('./modules/not-found').then(m => m.NotFoundModule),\n },\n {\n path: 'forbidden',\n data: PUBLIC_ROUTE_DATA,\n loadChildren: () => import('./modules/forbidden').then(m => m.ForbiddenModule),\n },\n];\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './layout.routing';\n@NgModule({\n declarations: [],\n imports: [RouterModule.forChild(Routes)],\n providers: [],\n})\nexport class SdLayoutModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["LayoutUserComponent","i1","RootComponent","Routes"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAOa,eAAe,CAAA;AAClB,IAAA,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;IAE/B,KAAK,GAAG,KAAK,CAAS,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC7C,WAAW,GAAG,KAAK,CAAS,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;AACzD,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAE3E,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;gBAChB,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC;YAChD;AACF,QAAA,CAAC,CAAC;IACJ;wGAbW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,kdCP5B,0sBAuBA,EAAA,MAAA,EAAA,CAAA,qaAAA,CAAA,EAAA,CAAA;;4FDhBa,eAAe,EAAA,UAAA,EAAA,CAAA;kBAL3B,SAAS;+BACE,SAAS,EAAA,QAAA,EAAA,0sBAAA,EAAA,MAAA,EAAA,CAAA,qaAAA,CAAA,EAAA;;;SEAL,gBAAgB,CAAC,IAAqC,EAAE,YAAsB,EAAE,EAAA;AAC9F,IAAA,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,EAAE;AAChD,IAAA,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,CAAA,GAAA,EAAM,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE;AAChF,IAAA,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;IAE1G,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE;AACrE,IAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,EAAE,KAAK;SAClC,GAAG,CAAC,OAAO,IAAI,eAAe,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACxF,MAAM,CAAC,OAAO,CAAC;AAClB,IAAA,OAAO,QAAQ,CAAC,MAAM,GAAG,SAAS,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAE,GAAG,EAAE;AAC7D;AAEM,SAAU,gBAAgB,CAAC,KAAqB,EAAE,KAAa,EAAA;AACnE,IAAA,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC;AACvC,IAAA,MAAM,eAAe,GAAG,KAAK,EAAE,IAAI,EAAE;AACrC,IAAA,IAAI,CAAC,eAAe;AAAE,QAAA,OAAO,MAAM;AACnC,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,IACvB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,eAAe,CAAC,aAAa,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAC9G;AACH;AAEM,SAAU,uBAAuB,CAAC,KAAqB,EAAE,YAAkC,EAAE,OAAO,GAAG,CAAC,EAAA;AAC5G,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC;AAC5F,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACrG,MAAM,QAAQ,GAAmB,EAAE;AACnC,IAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU;AAEtC,IAAA,KAAK,MAAM,EAAE,IAAI,YAAY,IAAI,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,QAAA,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE;AAC5C,QAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACnB,QAAA,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;AACrB,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK;AAAE,YAAA,OAAO,QAAQ;IAChD;AAEA,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE;AACnC,QAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACnB,QAAA,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;AACrB,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK;YAAE;IACjC;AACA,IAAA,OAAO,QAAQ;AACjB;AAEM,SAAU,eAAe,CAAC,KAAqB,EAAE,IAAc,EAAA;AACnE,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwB;IACjD,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,KAAI;QACxC,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC;QAC7C,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,YAAA,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;AAC1D,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,KAA2B,CAAC,CAAC,IAAI,CAAC;AACzG;AAEM,SAAU,iBAAiB,CAAC,KAAqB,EAAA;IACrD,MAAM,MAAM,GAAuB,EAAE;AACrC,IAAA,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,IAAG;AAC3B,QAAA,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACrF,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,MAAM;AACf;AAEA,SAAS,UAAU,CACjB,KAAiC,EACjC,SAAmB,EACnB,OAA0D,EAAA;AAE1D,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE;AAC9B,QAAA,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE;AACvC,QAAA,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;AACxB,QAAA,IAAI,UAAU,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACtD,YAAA,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC;YACzH,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC;QAC/E;IACF;AACF;;ACpEA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;MACU,2BAA2B,GAAG,IAAI,cAAc,CAA2B,6BAA6B;MAgBxG,sBAAsB,CAAA;AACxB,IAAA,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC5C,gBAAgB,GAAG,MAAM,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACnF,IAAA,QAAQ;;;;;;AAOR,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,aAAa;IAC7C;AAEA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,cAAc;IAC9C;AAEA,IAAA,IAAI,qBAAqB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,qBAAqB;IACrD;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,eAAe;IAC/C;AAEA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,cAAc;IAC9C;AAEA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,cAAc;IAC9C;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,aAAa;IAC7C;AAEA;;;;;;;;;;AAUG;IACH,KAAK,GAAA;AACH,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE;QACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YAAE,MAAM,CAAC,MAAM,EAAE;IACjE;;;IAIA,iBAAiB,GAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB;AACpC,QAAA,MAAM,GAAG,GAAG,OAAO,MAAM,KAAK,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM;AAC5D,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,SAAS,GAAG,SAAS;IACtE;IAEA,eAAe,GAAA;AACb,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC1C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ;AAC7B,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;AAAE,YAAA,OAAO,OAAO;;;AAG9D,QAAA,IAAI,OAAO;YAAE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;gBAAE,MAAM,CAAC,OAAO,EAAE;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;AAC3C,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,cAAc,CAAC,SAA6B,EAAA;;;;AAI1C,QAAA,MAAM,MAAM,GAAoB,EAAE,SAAS,EAAE;QAC7C,OAAO;YACL,SAAS;YACT,aAAa,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,sCAAsC,EAAE,MAAM,CAAC;YAC5F,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,sCAAsC,EAAE,MAAM,CAAC;YAC7F,qBAAqB,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,sCAAsC,EAAE,MAAM,CAAC;YACpG,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,sCAAsC,EAAE,MAAM,CAAC;YAC9F,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,sCAAsC,EAAE,MAAM,CAAC;YAC7F,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,sCAAsC,EAAE,MAAM,CAAC;YAC7F,aAAa,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,sCAAsC,EAAE,MAAM,CAAC;SAC7F;IACH;AAEA,IAAA,WAAW,CAAC,OAA+B,EAAA;QACzC,OAAO;AACL,YAAA,OAAO,CAAC,aAAa;AACrB,YAAA,OAAO,CAAC,cAAc;AACtB,YAAA,OAAO,CAAC,qBAAqB;AAC7B,YAAA,OAAO,CAAC,eAAe;AACvB,YAAA,OAAO,CAAC,cAAc;AACtB,YAAA,OAAO,CAAC,cAAc;AACtB,YAAA,OAAO,CAAC,aAAa;SACtB;IACH;AAEA,IAAA,kBAAkB,CAAC,KAAqB,EAAA;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACtG,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,EAAE,SAAS,CAAC,EAAE;AAC9E,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;QACpC;AACA,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,mBAAmB,CAAC,IAAc,EAAA;AAChC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7D;AAEA,IAAA,kBAAkB,CAAC,KAAqB,EAAE,OAAO,GAAG,CAAC,EAAA;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAC/E,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QAC3E,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC;AAAE,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9E,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,mBAAmB,CAAC,IAAc,EAAA;AAChC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7D;AAEA,IAAA,gBAAgB,CAAC,OAAkB,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;IAC1D;IAEA,iBAAiB,CAAC,OAAkB,EAAE,KAA2B,EAAA;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE;AAC7C,QAAA,MAAM,SAAS,GAAG,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE;AAClE,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,EAAE,CAAC;AACnE,QAAA,OAAO,SAAS;IAClB;IAEA,oBAAoB,GAAA;QAClB,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE;QAC9C,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,EAAE;QACnE,OAAO,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IACjF;IAEA,iBAAiB,CAAC,KAAqB,EAAE,IAAc,EAAA;AACrD,QAAA,OAAO,eAAe,CAAC,KAAK,EAAE,IAAI;aAC/B,GAAG,CAAC,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC;aAClC,MAAM,CAAC,OAAO,CAAC;IACpB;IAEA,SAAS,CAAC,IAAc,EAAE,KAAe,EAAA;QACvC,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,GAAG,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;IACzF;wGAzJW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA;;4FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACkCM,MAAM,gCAAgC,GAAG;AAyE1C,SAAU,+BAA+B,CAAC,KAAyB,EAAA;AACvE,IAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AACjD,QAAA,OAAO,gCAAgC;IACzC;IACA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClC;AAEM,SAAU,2BAA2B,CAAC,OAA+B,EAAA;AACzE,IAAA,OAAO,OAAO,CAAC,WAAW,KAAK,YAAY,GAAG,YAAY,GAAG,OAAO;AACtE;AAEM,SAAU,sBAAsB,CAAC,OAA+B,EAAA;AACpE,IAAA,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ;AAChD,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC;IAC1H,OAAO;AACL,QAAA,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI;QACxC,QAAQ;KACT;AACH;AAKM,SAAU,6BAA6B,CAAC,OAAgC,EAAA;AAC5E,IAAA,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,EAAE;QACzB,OAAO;AACL,YAAA,GAAG,OAAO;AACV,YAAA,WAAW,EAAE,2BAA2B,CAAC,OAAO,CAAC;AACjD,YAAA,cAAc,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SAC3H;IACH;AACA,IAAA,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,EAAE;QACzB,OAAO;AACL,YAAA,GAAG,OAAO;AACV,YAAA,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,KAAK;AACnD,YAAA,MAAM,EAAE,sBAAsB,CAAC,OAAO,CAAC;SACxC;IACH;AACA,IAAA,OAAO,OAAO;AAChB;MAEa,uBAAuB,GAAG,IAAI,cAAc,CAAyB,yBAAyB;;ACnMpG,MAAM,kBAAkB,GAAG;AAElC;MAEa,yBAAyB,CAAA;AAC3B,IAAA,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACrC,IAAA,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;AAE7C,IAAA,QAAQ,CAAC,UAAkB,EAAA;QACzB,OAAO,IAAI,CAAC,aAAa,EAAE,GAAG,+BAA+B,CAAC,UAAU,CAAC;IAC3E;wGANW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,cADZ,MAAM,EAAA,CAAA;;4FACnB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCDrB,8BAA8B,CAAA;AAChC,IAAA,QAAQ,GAAG,MAAM,CAAC,sBAAsB,CAAC;AACzC,IAAA,MAAM,GAAG,MAAM,CAAiB,EAAE,CAAC;AACnC,IAAA,UAAU,GAAG,MAAM,CAAW,EAAE,CAAC;AACjC,IAAA,UAAU,GAAG,MAAM,CAAW,EAAE,CAAC;AACjC,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AAC/E,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AAExF,IAAA,OAAO,CAAC,KAAqB,EAAE,aAAa,GAAG,CAAC,EAAA;AAC9C,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAC5D,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC7E;AAEA,IAAA,YAAY,CAAC,IAAkB,EAAA;AAC7B,QAAA,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,GAAG;YAAE;QACV,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,GAAG;AAC7C,cAAE,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,UAAU,IAAI,UAAU,KAAK,GAAG;cACzD,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,CAAC;AAC/B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC;IAC7C;IAEA,YAAY,CAAC,IAAkB,EAAE,aAAiD,EAAA;QAChF,IAAI,CAAC,aAAa,CAAC,OAAO;YAAE;AAC5B,QAAA,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,GAAG;YAAE;AACV,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC9H,QAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,UAAU,IAAI,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC;AACvG,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC;IAC7C;IAEA,iBAAiB,CAAC,OAAkB,EAAE,KAA2B,EAAA;QAC/D,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC;IACjD;AAEA,IAAA,YAAY,CAAC,OAAkB,EAAA;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC;IAChD;wGAxCW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAA9B,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,8BAA8B,cADjB,MAAM,EAAA,CAAA;;4FACnB,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAD1C,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACDlC;;;;;;;;;;;;;AAaG;MACU,uBAAuB,GAAG,IAAI,cAAc,CAAU,yBAAyB;MAK/E,eAAe,CAAA;;;;;;IAM1B,oBAAoB,GAAG,MAAM,CAAgC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACzG,IAAA,aAAa,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK;AAC5E,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;;;AAK3B,IAAA,QAAQ,GAAG,MAAM,CAA+B,SAAS,CAAC;AAC1D,IAAA,OAAO,GAAG,MAAM,CAAsC,SAAS,CAAC;AAEhE;;;AAGG;IACM,OAAO,GAAG,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG;AAEpE,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;AAC9B,YAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;;;AAGvB,gBAAA,MAAM,IAAI,KAAK;;gBAEb,+DAA+D;;oBAE7D,4FAA4F;;AAE5F,oBAAA,mGAAmG,CACtG;YACH;;;AAIA,YAAA,OAAO,CAAC,IAAI;;YAEV,gHAAgH;;AAE9G,gBAAA,kDAAkD,CACrD;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC;QACF;QACA,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,YAAY,EAAE;IACrB;;;;IAKA,aAAa,GAAA;AACX,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAqB,CAAC,QAAQ;AAC1D,QAAA,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE;YACxC,iBAAiB,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnF;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC;QACnC;IACF;IAEA,YAAY,GAAA;AACV,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAqB,CAAC,OAAO;AACxD,QAAA,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE;YACvC,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7E;aAAO;AACL,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACjC;IACF;IAEA,aAAa,GAAA;QACX,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC;AAChE,YAAA,KAAK,EAAE,kBAAkB;AACzB,YAAA,QAAQ,EAAE,MAAM;SACjB;IACH;IAEA,YAAY,GAAA;QACV,OAAO;AACL,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,YAAY,EAAE,aAAa;SAC5B;IACH;wGAvFW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;oBACV,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACfD;MAOa,QAAQ,CAAA;AACX,IAAA,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAKvD,IAAA,WAAA,GAAA,EAAe;AACf,IAAA,SAAS,CAAC,KAAqB,EAAA;QAC7B,MAAM,OAAO,GAAU,EAAE;AACzB,QAAA,MAAM,KAAK,GAAG,CAAC,IAAkB,KAAyB;AACxD,YAAA,IAAI,UAAU,IAAI,IAAI,EAAE;gBACtB,MAAM,QAAQ,GAAU,EAAE;AAC1B,gBAAA,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,IAAG;AACjC,oBAAA,SAAS,GAAG,KAAK,CAAC,SAAS,CAAiB;oBAC5C,IAAI,SAAS,EAAE;AACb,wBAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;oBACrE;AACF,gBAAA,CAAC,CAAC;AAEF,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AACpB,oBAAA,OAAO,IAAI;gBACb;gBAEA,OAAO;AACL,oBAAA,GAAG,IAAI;oBACP,QAAQ;AACR,oBAAA,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;iBAC9B;YACH;AAEA,YAAA,IAAI,YAAY,IAAI,IAAI,EAAE;;;;;;AAMxB,gBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAClD,oBAAA,OAAO,IAAI;gBACb;AAEA,gBAAA,IACE,CAAC,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AACtE,oBAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,EACzE;oBACA,OAAO;AACL,wBAAA,GAAG,IAAI;AACP,wBAAA,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;qBAC9B;gBACH;gBAEA,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;oBAC3D,OAAO;AACL,wBAAA,GAAG,IAAI;AACP,wBAAA,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;qBAC9B;gBACH;AAEA,gBAAA,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;oBAC9D,OAAO;AACL,wBAAA,GAAG,IAAI;AACP,wBAAA,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;qBAC9B;gBACH;AAEA,gBAAA,OAAO,IAAI;YACb;;;;;;AAOA,YAAA,IAAI,MAAM,IAAI,IAAI,EAAE;AAClB,gBAAA,OAAO,IAAI;YACb;YAEA,OAAO;AACL,gBAAA,GAAG,IAAI;AACP,gBAAA,EAAE,EAAE,SAAS,CAAC,YAAY,EAAE;aAC7B;AACH,QAAA,CAAC;AAED,QAAA,KAAK,EAAE,OAAO,CAAC,IAAI,IAAG;AACpB,YAAA,IAAI,GAAG,KAAK,CAAC,IAAI,CAAiB;YAClC,IAAI,IAAI,EAAE;AACR,gBAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACpB;AACF,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,OAAO;IAChB;AAEA;;;;AAIG;AACH,IAAA,eAAe,GAAG,CAAC,IAAY,KAAc,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC;AAElG,IAAA,cAAc,GAAG,CAAC,IAAkB,KAAY;QAC9C,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE;AACpE,QAAA,IAAI,UAAU;AAAE,YAAA,OAAO,UAAU;QAEjC,MAAM,YAAY,GAAG,IAKpB;AACD,QAAA,MAAM,QAAQ,GAAkC;YAC9C,OAAO;YACP,MAAM;YACN,YAAY;YACZ,eAAe;YACf,aAAa;YACb,MAAM;YACN,OAAO;YACP,cAAc;SACf;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAC9B,CAAC,GAAG,EAAE,GAAG,KAAI;AACX,YAAA,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;AACzC,gBAAA,GAAG,CAAC,GAAa,CAAC,GAAG,KAAK;YAC5B;AACA,YAAA,OAAO,GAAG;QACZ,CAAC,EACD,EAAyB,CAC1B;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,YAAY,EAAE;AAC/F,IAAA,CAAC;wGAlIU,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA;AAAR,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,QAAQ,cAFP,MAAM,EAAA,CAAA;;4FAEP,QAAQ,EAAA,UAAA,EAAA,CAAA;kBANpB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,MAAM;AACb,iBAAA;;kBACA,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACVD;MAKa,aAAa,CAAA;IACxB,SAAS,CAAC,SAAiB,EAAE,QAAsB,EAAA;QACjD,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,KAAK;QACd;QACA,IAAI,UAAU,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE;YAC/C,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAG;gBACpC,OAAO,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK;AACnF,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,OAAO,MAAM,IAAI,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC;IACpE;AAEA,IAAA,MAAM,GAAG,CAAC,SAAiB,EAAE,IAAY,KAAa;QACpD,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,SAAS,KAAK,IAAI,EAAE;AACtB,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AAC7E,IAAA,CAAC;AAED,IAAA,cAAc,GAAG,CAAC,CAAS,KAAY;AACrC,QAAA,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG;AACtC,IAAA,CAAC;wGAzBU,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;4FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBAJzB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,WAAW;AAClB,iBAAA;;kBACA,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCFrB,mBAAmB,CAAA;AAC9B,IAAA,SAAS,CACP,KAAa,EACb,OAAe,EACf,IAEC,EAAA;QAED,MAAM,EAAE,KAAK,GAAG,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE;AACxC,QAAA,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AAClC,YAAA,OAAO,KAAK;QACd;AACA,QAAA,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;QAC3B,MAAM,YAAY,GAAG,eAAe,CAAC,oBAAoB,CAAC,OAAO,CAAC;QAClE,MAAM,iBAAiB,GAAG,eAAe,CAAC,oBAAoB,CAAC,KAAK,CAAC;;AAGrE,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,KAAK,CAAC;AAClG,QAAA,IAAI,kBAAkB,KAAK,IAAI,EAAE;AAC/B,YAAA,OAAO,kBAAkB;QAC3B;;AAGA,QAAA,OAAO,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,KAAK,CAAC,IAAI,KAAK;IAC/F;IAEA,mBAAmB,GAAG,CAAC,KAAa,EAAE,iBAAyB,EAAE,YAAoB,EAAE,KAAa,KAAmB;QACrH,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAa,EAAE;QACzB,IAAI,cAAc,GAAG,CAAC;QACtB,IAAI,QAAQ,GAAG,KAAK;QACpB,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAI;YAC7C,QAAQ,GAAG,IAAI;AACf,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,CAAA,+BAAA,EAAkC,KAAK,CAAA,EAAA,EAAK,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA,OAAA,CAAS,CAAC;AACrH,YAAA,cAAc,GAAG,MAAM,GAAG,YAAY,CAAC,MAAM;AAC7C,YAAA,OAAO,kCAAkC,KAAK,CAAA,EAAA,EAAK,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS;AACnH,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;AACxD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACtB,IAAA,CAAC;IAED,yBAAyB,GAAG,CAAC,KAAa,EAAE,iBAAyB,EAAE,YAAoB,EAAE,KAAa,KAAmB;QAC3H,MAAM,SAAS,GAAG,MAAM;QACxB,MAAM,gBAAgB,GAAa,EAAE;QACrC,IAAI,YAAY,GAAG,CAAC;AACpB,QAAA,IAAI,SAAiC;QACrC,QAAQ,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG;AACtD,YAAA,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,EAAE;gBACvC;YACF;AACA,YAAA,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,YAAY,CAAC,EAAE;AAClD,gBAAA,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACtC,gBAAA,YAAY,EAAE;YAChB;QACF;AACA,QAAA,IAAI,YAAY,KAAK,YAAY,CAAC,MAAM,EAAE;AACxC,YAAA,OAAO,IAAI;QACb;QAEA,IAAI,MAAM,GAAG,EAAE;QACf,IAAI,MAAM,GAAG,CAAC;AACd,QAAA,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC;YAC3C,MAAM,IAAI,CAAA,+BAAA,EAAkC,KAAK,CAAA,EAAA,EAAK,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA,OAAA,CAAS;AACrF,YAAA,MAAM,GAAG,QAAQ,GAAG,CAAC;QACvB;AACA,QAAA,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;AACjC,QAAA,OAAO,MAAM;AACf,IAAA,CAAC;AAED,IAAA,eAAe,GAAG,CAAC,OAAe,KAAI;QACpC,IAAI,GAAG,GAAW,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;;QAE3C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,wFAAwF,EAAE,EAAE,CAAC;QAC/G,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;AAC9B,QAAA,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE;AAChB,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC;wGAlFU,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,iBAAiB;AACxB,iBAAA;;;MC6BY,yBAAyB,CAAA;IAC3B,cAAc,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACpE,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,KAAK,GAAG,MAAM,CAA0B,UAAU,CAAC;AAC3C,IAAA,OAAO,GAAG,SAAS,CAAgC,SAAS,CAAC;AAC7D,IAAA,IAAI,GAAG,SAAS,CAA0B,MAAM,CAAC;AAElE,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAoB;IAC7C,OAAO,GAAG,KAAK,EAAqC;IACpD,cAAc,GAAG,KAAK,EAAqC;IAC3D,aAAa,GAAG,KAAK,EAAqC;IAC1D,OAAO,GAAG,KAAK,EAAqC;IACpD,YAAY,GAAG,KAAK,EAAiD;AACrE,IAAA,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;AACtB,IAAA,YAAY,GAAG,KAAK,CAA4C,YAAY,CAAC;IAC7E,MAAM,GAAG,MAAM,EAAQ;IACvB,MAAM,GAAG,MAAM,EAAQ;AACvB,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;AACb,IAAA,4BAA4B,GAAG,MAAM,CAAqB,SAAS,CAAC;AAE7E,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAK;AACrB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,QAAA,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK;AACpE,IAAA,CAAC,CAAC;AACF,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,MAAM,CAAC;AACrH,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI;QACjC,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAC/B,QAAA,OAAO,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS;AAC7C,IAAA,CAAC,CAAC;AACF,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC;AAC9E,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC;AACnG,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC;AAChG,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC;AAC9E,IAAA,yBAAyB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC;AACpG,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,yBAAyB,EAAE,EAAE,MAAM,CAAC;AAC7E,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB,EAAE,EAAE,KAAK;AACtD,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,4BAA4B,EAAE,GAAG,MAAM;AAC/G,QAAA,OAAO,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC;AAChD,IAAA,CAAC,CAAC;AACF,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACtC,OAAO,KAAK,GAAG,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS;AACnE,IAAA,CAAC,CAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,SAAS,IAAG;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB,EAAE,EAAE,KAAK;AACtD,YAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,SAAS,CAAC;AAChD,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;gBAAE;AAE3B,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5F,SAAS,CAAC,MAAM,YAAY,CAAC,WAAW,EAAE,CAAC;AAC7C,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAAE;AACpB,YAAA,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa,CAAC,aAAa,CAAoB,mBAAmB,CAAC,EAAE,KAAK,EAAE;AAC3F,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAG,CAAC,KAAoB,KAAU;YACvD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;gBAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,EAAE;AACd,QAAA,CAAC;AACD,QAAA,MAAM,qBAAqB,GAAG,CAAC,KAAmB,KAAU;AAC1D,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAAE;YACpB,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI;YACxD,IAAI,CAAC,eAAe,IAAI,EAAE,KAAK,CAAC,MAAM,YAAY,eAAe,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;gBAAE;AACvH,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACnB,QAAA,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,CAAC;QAC7D,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,aAAa,EAAE,qBAAqB,CAAC;AACrE,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAK;YAC9B,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,CAAC;YAChE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,aAAa,EAAE,qBAAqB,CAAC;AAC1E,QAAA,CAAC,CAAC;IACJ;IAEA,IAAI,GAAA;QACF,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEA,MAAM,GAAA;QACJ,IAAI,IAAI,CAAC,MAAM,EAAE;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;;YAC/B,IAAI,CAAC,IAAI,EAAE;IAClB;IAEA,KAAK,CAAC,YAAY,GAAG,IAAI,EAAA;AACvB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,OAAO;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAC/B,QAAA,IAAI,YAAY;YAAE,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IACzD;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,EAAE;YACZ;QACF;QACA,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,YAAY,WAAW,CAAC;YAAE;AAEnH,QAAA,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAoB,mBAAmB,CAAC,CAAC;QACjG,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE;QACrB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,IAAI,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;AACzF,QAAA,MAAM,SAAS,GACb,KAAK,CAAC,GAAG,KAAK;AACZ,cAAE;AACF,cAAE,KAAK,CAAC,GAAG,KAAK;AACd,kBAAE,OAAO,CAAC,MAAM,GAAG;AACnB,kBAAE,KAAK,CAAC,GAAG,KAAK;sBACZ,CAAC,YAAY,GAAG,CAAC,IAAI,OAAO,CAAC;AAC/B,sBAAE,CAAC,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;AAC9D,QAAA,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE;IAC5B;IAEA,iBAAiB,GAAA;QACf,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9C;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IACvC;IAEA,gBAAgB,GAAA;QACd,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7C;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IACvC;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5C;AAEA,IAAA,UAAU,CAAC,MAAyC,EAAA;QAClD,MAAM,IAAI;QACV,IAAI,CAAC,KAAK,EAAE;IACd;AAEA,IAAA,2BAA2B,CAAC,KAAyB,EAAA;AACnD,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;IACpF;wGAvJW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,s5CClCtC,qyRA8MA,EAAA,MAAA,EAAA,CAAA,6hDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjLY,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,mKAAE,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKhC,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBARrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC,EAAA,eAAA,EAG3B,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,qyRAAA,EAAA,MAAA,EAAA,CAAA,6hDAAA,CAAA,EAAA;;;kCElBpC,mBAAmB,CAAA;AAC9B,IAAA,gBAAgB,GAAG,KAAK,CAAU,KAAK,CAAC;AACxC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,CAAC;AAClC,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,CAAC;AACrC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAoB;IAE7C,UAAU,GAAG,MAAM,EAAQ;IAC3B,UAAU,GAAG,MAAM,EAAQ;IAC3B,cAAc,GAAG,MAAM,EAAS;IAEhC,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;AAEA,IAAA,gBAAgB,CAAC,KAAY,EAAA;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;IACjC;wGApBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,0uBCdhC,+lBAkBA,EAAA,MAAA,EAAA,CAAA,ufAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDRY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,oNAAE,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIjDA,qBAAmB,EAAA,UAAA,EAAA,CAAA;kBAR/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,OAAA,EAGlB,CAAC,MAAM,EAAE,yBAAyB,EAAE,eAAe,CAAC,EAAA,UAAA,EACjD,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+lBAAA,EAAA,MAAA,EAAA,CAAA,ufAAA,CAAA,EAAA;;;MEkCpC,gBAAgB,CAAA;;;;AAI3B,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AACxB,IAAA,qBAAqB,GAAG,MAAM,CAAC,sBAAsB,CAAC;AACtD,IAAA,gBAAgB,GAAG,MAAM,CAAC,8BAA8B,CAAC;AACzD,IAAA,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC;AACtC,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;AAC3B,IAAA,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW;AACtC,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;;;;AAKjC,IAAA,aAAa,GAAG,KAAK,CAAC,QAAQ,EAAW;AACzC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAkB;AACxC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAoB;AAC7C,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAA0B;AAClD,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;IACvB,aAAa,GAAG,MAAM,EAAQ;IAC9B,mBAAmB,GAAG,MAAM,EAAQ;IACpC,mBAAmB,GAAG,MAAM,EAAQ;IACpC,WAAW,GAAG,MAAM,EAAkB;;;;AAKtC,IAAA,UAAU,GAAG,MAAM,CAAU,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC;AACtF,IAAA,WAAW,GAAG,MAAM,CAAS,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3G,IAAA,UAAU,GAAG,MAAM,CAAS,EAAE,CAAC;AAC/B,IAAA,cAAc,GAAG,MAAM,CAAqB,EAAE,CAAC;AAC/C,IAAA,iBAAiB,GAAG,MAAM,CAAqB,EAAE,CAAC;AAClD,IAAA,YAAY,GAAG,MAAM,CAAiB,EAAE,CAAC;AACzC,IAAA,mBAAmB,GAAG,MAAM,CAAgB,IAAI,CAAC;AACjD,IAAA,oBAAoB,GAAG,MAAM,CAAuC,IAAI,CAAC;;;AAGzE,IAAA,eAAe,GAAG,QAAQ,CAAuB,OAAO;AACtD,QAAA,EAAE,EAAE,mBAAmB;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mCAAmC,CAAC;AACxD,QAAA,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE;AAC9C,KAAA,CAAC,CAAC;;;;AAKH,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AAClF,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AACrE,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAClH,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC;;;;IAKhG,uBAAuB,GAAG,GAAG;AAC7B,IAAA,mBAAmB,GAAG,MAAM,CAAU,IAAI,CAAC;AAC3C,IAAA,UAAU,GAAG,IAAI,uBAAuB,EAAgB;AACxD,IAAA,WAAW,GAAG,IAAI,iBAAiB,CAAe,IAAI,KAAK,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;AAE7H,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEA,aAAa,GAAA;QACX,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;YACjC,SAAS,CAAC,MAAK;AACb,gBAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC;gBAC3C,MAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,EAAE;AACpF,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE;gBAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO;;AAEjD,gBAAA,IAAI,CAAC,qBAAqB,KAAK,qBAAqB,KAAK,WAAW,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE;;oBAE1F,MAAM,QAAQ,GAAG,YAAY,IAAI,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,EAAE,GAAG,YAAY,GAAG,CAAC,CAAC,EAAE,EAAE;oBACxG,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACtE;AAEA,gBAAA,IAAI,CAAC,8BAA8B,CAAC,YAAY,CAAC;AACjD,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AACrC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,IAAG;AAC/E,YAAA,IAAI,KAAK,YAAY,aAAa,EAAE;AAClC,gBAAA,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AACrE,gBAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,WAAW,EAAE;AACtC,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;oBACjC,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnD;YACF;AACF,QAAA,CAAC,CAAC;IACJ;;;;AAKA,IAAA,QAAQ,GAAG,CAAC,CAAS,EAAE,IAAkB,KAAc,UAAU,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM;AAEpG,IAAA,gBAAgB,GAAG,CAAC,IAAkB,KAAU;AAC9C,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;AAC/B,IAAA,CAAC;AAED,IAAA,YAAY,GAAG,CAAC,IAA4C,KAAY;AACtE,QAAA,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAC9B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACpD,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;AACpC,SAAA,CAAC,CACH;AACH,IAAA,CAAC;AAED,IAAA,eAAe,GAAG,CAAC,KAAiB,EAAE,IAA4C,KAAU;QAC1F,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;AACzE,IAAA,CAAC;;AAGD,IAAA,iBAAiB,GAAG,CAAC,KAAoB,EAAE,IAA2C,KAAU;AAC9F,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa;YAAE;;QAE1C,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;AACzE,IAAA,CAAC;;AAGD,IAAA,uBAAuB,GAAG,CAAC,KAAoB,EAAE,IAAkB,KAAU;AAC3E,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa;YAAE;QAC1C,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AAC7B,IAAA,CAAC;IAED,YAAY,GAAG,CAAC,IAAkB,KAAc,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACrG,IAAA,aAAa,GAAG,CAAC,IAAkB,KAAc,IAAI,CAAC,mBAAmB,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;IAE1G,iBAAiB,GAAG,MAAW;AAC7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;QACpC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;AACpC,QAAA,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QACpE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;QACpC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC3C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;AAC3B,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,CAAC,KAAiB,EAAE,IAAkB,KAAU;QAC5D,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC;AAC1C,IAAA,CAAC;AAED,IAAA,qBAAqB,GAAG,CAAC,KAAqB,KAAU;AACtD,QAAA,KAAK,EAAE,OAAO,CAAC,IAAI,IAAG;AACpB,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;YAC7B,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;AAC/C,gBAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3C;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,uBAAuB,GAAG,CAAC,KAAqB,KAAU;AACxD,QAAA,KAAK,EAAE,OAAO,CAAC,IAAI,IAAG;AACpB,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC/B,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;AAC/C,gBAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC7C;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,cAAc,CAAC,KAAY,EAAA;QACzB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/B,QAAA,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACjE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1C;IAEA,YAAY,GAAG,MAAW;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC;AAC1C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1D,IAAA,CAAC;IAED,gBAAgB,GAAG,MAAY,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;IAE9D,gBAAgB,GAAG,MAAY,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;AAE9D,IAAA,QAAQ,GAAG,CAAC,IAA2C,KAAU;AAC/D,QAAA,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI;;;;;AAKlC,QAAA,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE;YAC7B,cAAc,CAAC,IAAI,CAAC;YACpB;QACF;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YAC1C,WAAW;AACX,YAAA,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;AAC3B,SAAA,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB,IAAI,CAAC,UAAU,EAAE;QACnB;AACF,IAAA,CAAC;AAED,IAAA,kBAAkB,GAAG,CAAC,KAAa,KAAU;AAC3C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACnD,IAAA,CAAC;IAED,iBAAiB,GAAG,MAAW;AAC7B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACnD,IAAA,CAAC;AAED,IAAA,eAAe,GAAG,CAAC,aAA2B,KAAU;AACtD,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,EAAE,YAAY,IAAI,aAAa,EAAE,KAAK,CAAC;;AAG5E,QAAA,IAAI,EAAE,UAAU,IAAI,aAAa,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;AACpE,YAAA,IAAI,MAAM,IAAI,aAAa,EAAE;AAC3B,gBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,IAAI,EAAE,EAAE,CAAC;gBAC1F;YACF;QACF;;QAGA,IAAI,UAAU,IAAI,aAAa,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE;AACjE,YAAA,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC7C,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,YAAA,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;AAC3B,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;QAC3B;QAEA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;AAC7C,QAAA,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC;AAC7E,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrG;AACF,IAAA,CAAC;;;;AAKD,IAAA,wBAAwB,GAAG,CAAC,KAAiB,EAAE,QAAsB,KAAU;QAC7E,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,QAAQ,EAAE,EAAE,EAAE;AAC7C,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,aAA4B;YACpD,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAgB;AAClF,YAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,GAAG,CAAC;YAEvF,IAAI,aAAa,EAAE;AACjB,gBAAA,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;gBAC5C,aAAa,CAAC,KAAK,CAAC,eAAe;oBACjC,sBAAsB,IAAI,uEAAuE;AACnG,gBAAA,IAAI,EAAE,aAAa,YAAY,gBAAgB,CAAC,EAAE;AAChD,oBAAA,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,IAAI,4BAA4B;gBACxF;YACF;QACF;AACF,IAAA,CAAC;AAED,IAAA,yBAAyB,GAAG,CAAC,KAAiB,EAAE,QAAsB,KAAU;QAC9E,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,QAAQ,EAAE,EAAE,EAAE;AAC7C,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,aAA4B;YACpD,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAgB;YAElF,IAAI,aAAa,EAAE;AACjB,gBAAA,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AAC5C,gBAAA,aAAa,CAAC,KAAK,CAAC,eAAe,GAAG,aAAa;AACnD,gBAAA,IAAI,aAAa,YAAY,gBAAgB,EAAE;AAC7C,oBAAA,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;gBACtC;qBAAO;AACL,oBAAA,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,mCAAmC;gBACjE;YACF;QACF;AACF,IAAA,CAAC;AAED,IAAA,mBAAmB,GAAG,CAAC,KAAiB,EAAE,QAAsB,KAAU;AACxE,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,aAA4B;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,IAAI,4BAA4B;;QAG7E,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;YAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,mCAAmC,CAAgB;YAC1F,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAC/B,oBAAA,YAAY,CAAC,IAAI,CAAC,oBAAoB,EAAG,CAAC;AAC1C,oBAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;gBACrC;gBAEA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAC3B,UAAU,CAAC,MAAK;AACd,oBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AAC5D,oBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU;AAChC,oBAAA,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACtC,oBAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC3B,oBAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACrC,gBAAA,CAAC,EAAE,IAAI,CAAC,uBAAuB,CAAC,CACjC;YACH;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,EAAE;YAChE,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,mBAAmB,CAAgB;YAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,kCAAkC,CAAgB;YACzF,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,sCAAsC,CAAgB;AAChG,YAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,GAAG,CAAC;YAEvF,IAAI,QAAQ,EAAE;AACZ,gBAAA,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;gBACvC,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,sBAAsB,IAAI,0BAA0B;gBAErF,IAAI,QAAQ,EAAE;AACZ,oBAAA,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACvC,oBAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU;gBACnC;gBACA,IAAI,OAAO,EAAE;AACX,oBAAA,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACtC,oBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU;gBAClC;gBACA,IAAI,UAAU,EAAE;AACd,oBAAA,UAAU,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACzC,oBAAA,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU;gBACrC;YACF;QACF;AACF,IAAA,CAAC;AAED,IAAA,oBAAoB,GAAG,CAAC,KAAiB,EAAE,QAAsB,KAAU;AACzE,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,aAA4B;;QAGnD,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;YAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,mCAAmC,CAAgB;YAC1F,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAC/B,oBAAA,YAAY,CAAC,IAAI,CAAC,oBAAoB,EAAG,CAAC;AAC1C,oBAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;gBACrC;AACA,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAElC,gBAAA,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;gBACtC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;AAChC,oBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS;AAC/B,oBAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;gBAC7B;YACF;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,EAAE;YAChE,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,mBAAmB,CAAgB;YAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,kCAAkC,CAAgB;YACzF,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,sCAAsC,CAAgB;YAEhG,IAAI,QAAQ,EAAE;AACZ,gBAAA,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACvC,gBAAA,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,aAAa;gBAE9C,IAAI,QAAQ,EAAE;AACZ,oBAAA,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACvC,oBAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS;gBAClC;gBACA,IAAI,OAAO,EAAE;AACX,oBAAA,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACtC,oBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS;gBACjC;gBACA,IAAI,UAAU,EAAE;AACd,oBAAA,UAAU,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACzC,oBAAA,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS;gBACpC;YACF;QACF;AACF,IAAA,CAAC;;;;AAKD,IAAA,gBAAgB,GAAG,CAAC,KAAqB,KAAU;AACjD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,KAAK;AAC9B,IAAA,CAAC;AAED,IAAA,eAAe,GAAG,CAAC,IAAkB,KAAY;AAC/C,QAAA,IAAI,IAAI,EAAE,EAAE,EAAE;YACZ,OAAO,IAAI,CAAC,EAAE;QAChB;QACA,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;YAC/B,OAAO,IAAI,CAAC,IAAI;QAClB;AAEA,QAAA,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE;AACzB,IAAA,CAAC;AAED,IAAA,0BAA0B,GAAG,CAAC,KAAqB,EAAE,SAAwB,KAAoB;AAC/F,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACnE,gBAAA,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;YAC5B;YACA,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;AAC/C,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC;AAChF,gBAAA,IAAI,MAAM,EAAE,MAAM,EAAE;AAClB,oBAAA,OAAO,MAAM;gBACf;YACF;QACF;AACA,QAAA,OAAO,EAAE;AACX,IAAA,CAAC;AAED,IAAA,8BAA8B,GAAG,CAAC,KAAqB,KAAU;;AAE/D,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;YAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,QAAQ,IAAI,EAAE;;YAG7D,MAAM,sBAAsB,GAC1B,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO;AAC5B,gBAAA,cAAc,EAAE,MAAM;AACtB,gBAAA,IAAI,CAAC,0BAA0B,CAAC,cAAc,CAAC,EAAE,MAAM;gBACvD,IAAI,CAAC,mBAAmB,EAAE;gBAC1B,IAAI,CAAC,iBAAiB,EAAE,KAAK,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE;YAEzD,IAAI,sBAAsB,EAAE;AAC1B,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE;gBACrC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;AACrC,gBAAA,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;gBACrE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AACrC,gBAAA,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC;AACrC,gBAAA,IAAI,CAAC,+BAA+B,CAAC,cAAc,CAAC;gBACpD;YACF;YAEA,IAAI,eAAe,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC;;AAE5D,YAAA,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE;AAC5B,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE;;gBAEjF,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,IAAI,YAAY,KAAK,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,EAAE;AACzG,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE;oBACrC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBACrC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AACrC,oBAAA,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC;AACrC,oBAAA,IAAI,CAAC,+BAA+B,CAAC,cAAc,CAAC;oBACpD;gBACF;;gBAEA,eAAe,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,KAAK,YAAY,CAAC,IAAI,EAAE;YACjF;;AAGA,YAAA,IAAI,eAAe,EAAE,MAAM,EAAE;;AAE3B,gBAAA,IACE,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO;oBAC5B,IAAI,CAAC,iBAAiB,EAAE,KAAK,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE;oBACvD,IAAI,CAAC,0BAA0B,CAAC,cAAc,CAAC,EAAE,MAAM,EACvD;oBACA;gBACF;qBAAO;AACL,oBAAA,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC;oBACvC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;AAC5C,oBAAA,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC;AAC5E,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,IAAI,YAAY,EAAE,KAAK,CAAC;oBAE1E,IAAI,UAAU,IAAI,YAAY,IAAI,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE;wBAC/D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;wBAC5C,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBAC3D;yBAAO;AACL,wBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3B;gBACF;YACF;iBAAO;AACL,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;AAC9B,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3B,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B;YAEA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;QAC5C;AACF,IAAA,CAAC;AAED,IAAA,+BAA+B,CAAC,KAAqB,EAAA;QACnD,IAAI,eAAe,GAAG,KAAK;AAC3B,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACnE,eAAe,GAAG,IAAI;YACxB;YACA,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;gBAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACzE,IAAI,aAAa,EAAE;AACjB,oBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;oBAC7B,eAAe,GAAG,IAAI;gBACxB;YACF;QACF;AACA,QAAA,OAAO,eAAe;IACxB;AAEA,IAAA,uBAAuB,GAAG,CAAC,KAAqB,KAAU;AACxD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,EAAE;QAClD,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,KAAK;AAC5B,YAAA,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;AACnC,YAAA,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC;QAC7C;aAAO;YACL,MAAM,eAAe,GAAG,eAAe,CAAC,oBAAoB,CAAC,eAAe,CAAC;AAC7E,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,eAAe,CAAC;YAC7E,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE;gBAChC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAClD;QACF;AACF,IAAA,CAAC;AAED,IAAA,yBAAyB,GAAG,CAAC,KAAqB,EAAE,eAAuB,KAAoB;QAC7F,MAAM,MAAM,GAAmB,EAAE;AACjC,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,UAAU,GAAG,eAAe,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAe,CAAC;;YAE7E,MAAM,gBAAgB,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC3G,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,eAAe,CAAC;YAE/E,IAAI,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,IAAI,eAAe,EAAE;AAC/E,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBACjB;YACF;YAEA,IAAI,eAAe,GAAmB,EAAE;YACxC,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;gBAC/C,eAAe,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC;YAClF;AAEA,YAAA,IAAI,eAAe,EAAE,MAAM,EAAE;AAC3B,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;YACrD;QACF;AACA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC;AAED,IAAA,qBAAqB,GAAG,CAAC,UAAkB,EAAE,eAAuB,KAAa;QAC/E,MAAM,QAAQ,GAAG;aACd,KAAK,CAAC,GAAG;AACT,aAAA,MAAM,CAAC,IAAI,IAAI,IAAI;aACnB,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC;aACnB,IAAI,CAAC,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,QAAQ,CAAC;AAC9D,IAAA,CAAC;AAED,IAAA,qBAAqB,GAAG,CAAC,MAAc,EAAE,QAAgB,KAAa;QACpE,IAAI,YAAY,GAAG,CAAC;AACpB,QAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AAC3B,YAAA,IAAI,IAAI,KAAK,MAAM,CAAC,YAAY,CAAC,EAAE;AACjC,gBAAA,YAAY,EAAE;YAChB;QACF;AACA,QAAA,OAAO,YAAY,KAAK,MAAM,CAAC,MAAM;AACvC,IAAA,CAAC;AAED,IAAA,6BAA6B,GAAG,CAAC,IAAY,KAAa;QACxD,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;AAC/B,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AACtF,IAAA,CAAC;IAED,cAAc,GAAG,CAAC,CAAS,MAAc,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAEvE,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;IAEA,aAAa,GAAG,CAAC,KAAyB,EAAE,OAAO,GAAG,CAAC,KAAY;QACjE,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE;QACpB,MAAM,QAAQ,GAAG,oCAAoC;QACrD,MAAM,QAAQ,GAAG,2DAA2D;AAE5E,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACxB,IAAI,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACxB,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;AACpB,gBAAA,GAAG,GAAG;qBACH,KAAK,CAAC,EAAE;qBACR,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;qBACd,IAAI,CAAC,EAAE,CAAC;YACb;AACA,YAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3C,YAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3C,YAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC3C,OAAO,CAAA,KAAA,EAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAG;QAC7C;QAEA,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;QACtC,IAAI,QAAQ,EAAE;YACZ,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ;YAC7B,OAAO,CAAA,KAAA,EAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAG;QAC7C;AAEA,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;IAED,mBAAmB,GAAG,MAAa;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AAC/D,QAAA,OAAO,UAAU,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,UAAU,GAAG,EAAE;AAC/D,IAAA,CAAC;AAED,IAAA,oBAAoB,GAAG,CAAC,UAAkB,KAAI;QAC5C,IAAI,GAAG,GAAW,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;;QAE9C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,wFAAwF,EAAE,EAAE,CAAC;QAC/G,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;AAC9B,QAAA,OAAO,GAAG,CAAC,IAAI,EAAE;AACnB,IAAA,CAAC;AAED,IAAA,cAAc,GAAG,CAAC,KAAqB,KAAY;QACjD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5E,IAAA,CAAC;AAED,IAAA,cAAc,GAAG,CAAC,IAAkB,KAAY;AAC9C,QAAA,IAAI,EAAE,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;AACnD,YAAA,OAAO,CAAC;QACV;QAEA,IAAI,KAAK,GAAG,CAAC;AACb,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjC,YAAA,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QACrC;AACA,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;wGA9nBU,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9C7B,wtUA2MA,EAAA,MAAA,EAAA,CAAA,ilJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDhLI,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACP,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACb,cAAc,EAAA,IAAA,EAAA,YAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACd,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAChB,mBAAmB,EAAA,IAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpBA,qBAAmB,yLACnB,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAMN,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAvB5B,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP;wBACP,MAAM;wBACN,OAAO;wBACP,WAAW;wBACX,YAAY;wBACZ,YAAY;wBACZ,aAAa;wBACb,cAAc;wBACd,cAAc;wBACd,aAAa;wBACb,gBAAgB;wBAChB,mBAAmB;wBACnB,oBAAoB;wBACpBA,qBAAmB;wBACnB,eAAe;qBAChB,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wtUAAA,EAAA,MAAA,EAAA,CAAA,ilJAAA,CAAA,EAAA;;;ME3BpC,WAAW,CAAA;;;;AAItB,IAAA,qBAAqB,GAAG,MAAM,CAAC,sBAAsB,CAAC;;;;AAKtD,IAAA,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAa,SAAS,CAAC;AACnD,IAAA,KAAK,GAAG,KAAK,CAAiB,EAAE,CAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAoB;AAC7C,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAA0B;AAClD,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;;;;;AAMvB,IAAA,UAAU,GAAG,MAAM,CAAU,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC;;IAGtF,aAAa,GAAG,MAAM,CAAU,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,CAAC;AAErH,IAAA,OAAO,GAAG,MAAM,CAAU,KAAK,CAAC;;;;IAKhC,iBAAiB,GAAyC,IAAI;AAE9D,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;YACnC,SAAS,CAAC,MAAK;gBACb,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;AACtD,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;;;;IAMA,WAAW,GAAG,MAAW;AACvB,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACtC;QAEA,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AAC1C,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;AACF,IAAA,CAAC;IAED,2BAA2B,GAAG,MAAW;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;YACzB,MAAM,SAAS,GAAG,GAAG;AACrB,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,gBAAA,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;YACtC;YACA,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,WAAW,EAAE;YACpB,CAAC,EAAE,SAAS,CAAC;QACf;aAAO;YACL,IAAI,CAAC,WAAW,EAAE;QACpB;AACF,IAAA,CAAC;IAED,WAAW,GAAG,MAAW;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpB;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;AACzB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB;AACF,IAAA,CAAC;IAED,sBAAsB,GAAG,MAAW;AAClC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,IAAA,CAAC;IAED,sBAAsB,GAAG,MAAW;QAClC,MAAM,SAAS,GAAG,GAAG;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;AACtB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YACtB,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,WAAW,EAAE;YACpB,CAAC,EAAE,SAAS,CAAC;QACf;AACF,IAAA,CAAC;IAED,eAAe,GAAG,MAAW;AAC3B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;AACzB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB;AACF,IAAA,CAAC;IAED,mBAAmB,GAAG,MAAW;AAC/B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;QACA,IAAI,CAAC,WAAW,EAAE;AACpB,IAAA,CAAC;AAED,IAAA,qBAAqB,GAAG,CAAC,MAAe,KAAU;AAChD,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;QAChC;AACF,IAAA,CAAC;AAED,IAAA,QAAQ,GAAG,CAAC,IAAoB,KAAI;AAClC,QAAA,IAAI,IAAI,KAAK,IAAI,EAAE;YACjB,IAAI,CAAC,2BAA2B,EAAE;QACpC;aAAO;YACL,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGzB,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE;gBAClC,IAAI,WAAW,EAAE;oBACf,IAAI,IAAI,EAAE;wBACR,WAAW,CAAC,IAAI,EAAE;oBACpB;yBAAO;wBACL,WAAW,CAAC,KAAK,EAAE;oBACrB;gBACF;YACF;QACF;AACF,IAAA,CAAC;wGA3IU,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,WAAW,+rBCjBxB,yqCAgCA,EAAA,MAAA,EAAA,CAAA,01BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDnBY,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,+BAAE,gBAAgB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAI/C,WAAW,EAAA,UAAA,EAAA,CAAA;kBARvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,OAAA,EAGhB,CAAC,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,CAAC,EAAA,UAAA,EAC/C,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,yqCAAA,EAAA,MAAA,EAAA,CAAA,01BAAA,CAAA,EAAA;;;MEDpC,mBAAmB,CAAA;AAC9B,IAAA,gBAAgB,GAAG,KAAK,CAAU,KAAK,CAAC;AACxC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,CAAC;AAClC,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,CAAC;AACrC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAoB;IAE7C,UAAU,GAAG,MAAM,EAAQ;IAC3B,UAAU,GAAG,MAAM,EAAQ;IAC3B,cAAc,GAAG,MAAM,EAAS;IAEhC,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;AAEA,IAAA,gBAAgB,CAAC,KAAY,EAAA;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;IACjC;wGApBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,0uBCdhC,stBAoBA,EAAA,MAAA,EAAA,CAAA,shBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDVY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,oNAAE,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIjD,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAR/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,OAAA,EAGlB,CAAC,MAAM,EAAE,yBAAyB,EAAE,eAAe,CAAC,EAAA,UAAA,EACjD,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,stBAAA,EAAA,MAAA,EAAA,CAAA,shBAAA,CAAA,EAAA;;;MEMpC,sBAAsB,CAAA;AACjC,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AACxB,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,qBAAqB,GAAG,MAAM,CAAC,sBAAsB,CAAC;;;AAGtD,IAAA,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW;;;;AAKtC,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,CAAC;AACrC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAkB;AACxC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAoB;AAC7C,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAA0B;;IAGlD,WAAW,GAAG,MAAM,EAAkB;IACtC,aAAa,GAAG,MAAM,EAAQ;IAC9B,mBAAmB,GAAG,MAAM,EAAQ;IACpC,mBAAmB,GAAG,MAAM,EAAQ;IACpC,qBAAqB,GAAG,MAAM,EAAsB;;;;AAKpD,IAAA,cAAc,GAAG,MAAM,CAAqB,EAAE,CAAC;AAC/C,IAAA,WAAW,GAAG,MAAM,CAAS,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;;AAG3G,IAAA,oBAAoB,GAAG,MAAM,CAAc,IAAI,GAAG,EAAU,CAAC;AAE7D,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;YACjC,SAAS,CAAC,MAAK;gBACb,MAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,EAAE;gBACpF,IAAI,CAAC,qBAAqB,EAAE;AAC1B,oBAAA,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;gBACnF;AACA,gBAAA,IAAI,CAAC,8BAA8B,CAAC,YAAY,CAAC;AACnD,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,IAAG;AAC/E,YAAA,IAAI,KAAK,YAAY,aAAa,EAAE;;;AAGlC,gBAAA,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AACrE,gBAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,WAAW,EAAE;AACtC,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;oBACjC,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnD;YACF;AACF,QAAA,CAAC,CAAC;IACJ;;;;AAKA,IAAA,iBAAiB,CAAC,OAA2B,EAAA;AAC3C,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,IAAG;AACxC,YAAA,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC;AACjC,YAAA,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AAC1B,gBAAA,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3B;iBAAO;AACL,gBAAA,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;YACxB;AACA,YAAA,OAAO,SAAS;AAClB,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,UAAU,CAAC,OAA2B,EAAA;AACpC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;QAC1B,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC;IACjD;AAEA,IAAA,QAAQ,CAAC,IAA6C,EAAA;AACpD,QAAA,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI;AAClC,QAAA,IAAI,CAAC,IAAI;YAAE;;;;;AAMX,QAAA,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE;YAC7B,cAAc,CAAC,IAAI,CAAC;YACpB;QACF;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YAC1C,WAAW,EAAE,WAAW,IAAI,EAAE;AAC9B,YAAA,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;AAC3B,SAAA,CAAC;;QAGF,IAAI,CAAC,OAAO,EAAE;IAChB;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;;AAGA,IAAA,WAAW,CAAC,IAAkB,EAAA;QAC5B,OAAO,UAAU,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM;IACtD;;AAGA,IAAA,WAAW,CAAC,IAAkB,EAAA;AAC5B,QAAA,OAAO,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,IAAI,EAAE;IACxD;;AAGA,IAAA,OAAO,CAAC,IAAkB,EAAA;AACxB,QAAA,OAAO,MAAM,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,SAAS;IAC/C;;AAGA,IAAA,cAAc,CAAC,IAAkB,EAAA;AAC/B,QAAA,OAAO,CAAC,aAAa,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,GAAG,SAAS,KAAK,EAAE;IACrE;IAEA,gBAAgB,GAAG,MAAY,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;IAC9D,gBAAgB,GAAG,MAAY,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;;;;AAK9D,IAAA,8BAA8B,GAAG,CAAC,KAAqB,KAAU;QAC/D,IAAI,eAAe,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC;AAE5D,QAAA,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE;AAC5B,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE;AACjF,YAAA,eAAe,GAAG,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,KAAK,YAAY,CAAC,IAAI,EAAE;QAC1E;AAEA,QAAA,IAAI,eAAe,EAAE,MAAM,EAAE;AAC3B,YAAA,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC;AACvC,YAAA,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC;YAC5E,MAAM,KAAK,GAAG,YAAY,EAAE,YAAY,IAAI,YAAY,EAAE,KAAK;AAC/D,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;QACxC;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3B,YAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC;AACF,IAAA,CAAC;AAED,IAAA,0BAA0B,GAAG,CAAC,KAAqB,EAAE,SAAwB,KAAoB;AAC/F,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACnE,gBAAA,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;YAC5B;YACA,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;AAC/C,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC;gBAChF,IAAI,MAAM,EAAE,MAAM;AAAE,oBAAA,OAAO,MAAM;YACnC;QACF;AACA,QAAA,OAAO,EAAE;AACX,IAAA,CAAC;AAED,IAAA,6BAA6B,GAAG,CAAC,IAAY,KAAa;AACxD,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,KAAK;AACvB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;AAC5C,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AACtF,IAAA,CAAC;IAED,cAAc,GAAG,CAAC,CAAS,MAAc,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;wGA3K5D,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClBnC,6uJAwGA,EAAA,MAAA,EAAA,CAAA,8mJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1FY,MAAM,uKAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAItD,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;+BACE,2BAA2B,EAAA,UAAA,EACzB,IAAI,EAAA,OAAA,EACP,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,6uJAAA,EAAA,MAAA,EAAA,CAAA,8mJAAA,CAAA,EAAA;;;MECvD,iBAAiB,CAAA;AAC5B,IAAA,qBAAqB,GAAG,MAAM,CAAC,sBAAsB,CAAC;AAEtD,IAAA,KAAK,GAAG,KAAK,CAAiB,EAAE,CAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAoB;AAC7C,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAA0B;;AAGlD,IAAA,aAAa,GAAG,MAAM,CAAU,KAAK,CAAC;AACtC,IAAA,cAAc,GAAG,MAAM,CAAqB,EAAE,CAAC;AAE/C,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;YACnC,SAAS,CAAC,MAAK;gBACb,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;AACtD,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAG,MAAW;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,IAAA,CAAC;AAED,IAAA,QAAQ,GAAG,CAAC,KAAqB,KAAU;AACzC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,IAAA,CAAC;AAED,IAAA,sBAAsB,GAAG,MAAW,EAAE,CAAC;AACvC,IAAA,sBAAsB,GAAG,MAAW,EAAE,CAAC;AACvC,IAAA,eAAe,GAAG,MAAW,EAAE,CAAC;AAChC,IAAA,mBAAmB,GAAG,MAAW,EAAE,CAAC;AACpC,IAAA,uBAAuB,GAAG,CAAC,KAAyB,KAAU;AAC5D,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,IAAA,CAAC;wGAlCU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,idCf9B,+/BA6BA,EAAA,MAAA,EAAA,CAAA,w8BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjBY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,+BAAE,sBAAsB,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,uBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAG3C,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;+BACE,sBAAsB,EAAA,OAAA,EAGvB,CAAC,MAAM,EAAE,YAAY,EAAE,sBAAsB,CAAC,EAAA,UAAA,EAC3C,IAAI,EAAA,QAAA,EAAA,+/BAAA,EAAA,MAAA,EAAA,CAAA,w8BAAA,CAAA,EAAA;;;MEcL,yBAAyB,CAAA;AAC3B,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;AAC3B,IAAA,cAAc,GAAG,MAAM,CAAgB,IAAI,CAAC;AACrD,IAAA,gBAAgB;AAEhB,IAAA,KAAK,GAAG,KAAK,CAAiB,EAAE,CAAC;AACjC,IAAA,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC;AACjB,IAAA,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC;AACtB,IAAA,UAAU,GAAG,KAAK,CAAW,EAAE,CAAC;AAChC,IAAA,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;AACrB,IAAA,aAAa,GAAG,KAAK,CAAqB,OAAO,CAAC;IAClD,QAAQ,GAAG,MAAM,EAAoB;IACrC,YAAY,GAAG,MAAM,EAAgB;AAErC,IAAA,KAAK,GAAG,QAAQ,CAAyB,MAAK;QAC5C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AAC7C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,QAAQ;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE;QACjC,MAAM,KAAK,GAAG,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QAC1E,MAAM,KAAK,GAA2B,EAAE;QAExC,MAAM,MAAM,GAAG,CAAC,KAAqB,EAAE,KAAa,EAAE,SAAmB,KAAU;AACjF,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC;AAC7C,gBAAA,IAAI,CAAC,GAAG;oBAAE;AACV,gBAAA,MAAM,OAAO,GAAG,UAAU,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM;AAC7D,gBAAA,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE;gBAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE;gBACnD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;gBACpC,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI;oBACJ,GAAG;oBACH,KAAK;oBACL,KAAK;AACL,oBAAA,WAAW,EAAE,EAAE,GAAG,KAAK,GAAG,EAAE;oBAC5B,OAAO;AACP,oBAAA,QAAQ,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC;oBAC9D,QAAQ;AACR,oBAAA,YAAY,EAAE,aAAa,IAAI,QAAQ,IAAI,aAAa,KAAK,GAAG;;;;oBAIhE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,+BAA+B,GAAG,6BAA6B,EAAE,EAAE,KAAK,EAAE,CAAC;AAC9G,iBAAA,CAAC;AACF,gBAAA,IAAI,OAAO,IAAI,UAAU,IAAI,IAAI;oBAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;YAC9G;AACF,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;AACpB,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,CAAC;AAEF,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC9D;AAEA,IAAA,UAAU,CAAC,IAAkB,EAAA;QAC3B,IAAI,MAAM,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9C;IAEA,cAAc,CAAC,KAAiB,EAAE,IAAkB,EAAA;QAClD,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B;AAEA,IAAA,eAAe,CAAC,GAAW,EAAA;AACzB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,QAAQ;YAAE;QACvC,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAK;AACtC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5B,YAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;QACnC,CAAC,EAAE,GAAG,CAAC;IACT;AAEA,IAAA,aAAa,CAAC,GAAW,EAAA;QACvB,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG;AAAE,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;IAClE;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;YAAE;AACzC,QAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACnC,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;IACnC;IAEA,YAAY,CAAC,WAAmB,EAAE,QAAgB,EAAA;QAChD,MAAM,SAAS,GAAG,CAAC,IAAY,MAAc,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG,CAAC;AACpF,QAAA,OAAO,WAAW,KAAK,QAAQ,IAAI,SAAS,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC3F;wGA1FW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3BtC,0qEAgDA,EAAA,MAAA,EAAA,CAAA,ovCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1BY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKL,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBARrC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP,CAAC,MAAM,CAAC,EAAA,eAAA,EAGA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,0qEAAA,EAAA,MAAA,EAAA,CAAA,ovCAAA,CAAA,EAAA;;;MEbpC,4BAA4B,CAAA;AACvC,IAAA,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC;AACjB,IAAA,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAU;AACtC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAU;IACjC,QAAQ,GAAG,MAAM,EAAU;wGAJhB,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZzC,gdAcA,EAAA,MAAA,EAAA,CAAA,u4BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDPY,MAAM,wKAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKd,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBARxC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EACtB,IAAI,EAAA,OAAA,EACP,CAAC,MAAM,EAAE,OAAO,CAAC,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,gdAAA,EAAA,MAAA,EAAA,CAAA,u4BAAA,CAAA,EAAA;;;MEuBpC,WAAW,CAAA;AACb,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AACxB,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,gBAAgB,GAAG,MAAM,CAAC,8BAA8B,CAAC;AAElE,IAAA,KAAK,GAAG,KAAK,CAAiB,EAAE,CAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAoB;AAC7C,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAA0B;AAClD,IAAA,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC;AAC3B,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5B,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;AAC9B,IAAA,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;IACvB,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAE/D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,2BAA2B,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,SAAS,GAAG,QAAQ,CAAsB,MACxC,IAAI,CAAC,KAAK;AACP,SAAA,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC;AACrG,SAAA,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAC9B;AACD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,IAAI,CAAC;AACrG,IAAA,YAAY,GAAG,QAAQ,CAAiB,MAAK;AAC3C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,QAAA,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,EAAE;QAC3B,OAAO,UAAU,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,QAAQ,GAAG,CAAC,WAAW,CAAC;AACzG,IAAA,CAAC,CAAC;AACF,IAAA,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU;AAE7C,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;YAC1B,SAAS,CAAC,MAAK;AACb,gBAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpC,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC5D,IAAI,cAAc,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;oBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC;AACrH,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,IAAG;AAC/E,YAAA,IAAI,EAAE,KAAK,YAAY,aAAa,CAAC;gBAAE;YACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtE,IAAI,CAAC,mBAAmB,EAAE;AAC5B,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,IAAkB,EAAA;AAC5B,QAAA,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,GAAG;YAAE;AAEV,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE;AAClC,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;gBACxD,IAAI,CAAC,YAAY,EAAE;gBACnB;YACF;AACA,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;YAC3B;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YAC1D,IAAI,CAAC,YAAY,EAAE;YACnB;QACF;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC;IAC5B;AAEA,IAAA,YAAY,CAAC,IAAkB,EAAA;QAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,YAAY,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE;AAClE,QAAA,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,GAAG;YAAE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC;IAC7C;IAEA,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,YAAY,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;IAC7F;IAEA,iBAAiB,GAAA;QACf,IAAI,CAAC,YAAY,EAAE;IACrB;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,YAAY,EAAE;IACrB;IAEA,mBAAmB,GAAA;QACjB,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA,IAAA,UAAU,CAAC,IAAkB,EAAA;AAC3B,QAAA,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC;YAAE;AACvB,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;;;AAGxE,QAAA,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAClC,YAAA,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,IAAI,CAAC,mBAAmB,EAAE;YAC1B;QACF;AACA,QAAA,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACpD,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;AACnC,YAAA,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;AAC3B,SAAA,CAAC;IACJ;AAEA,IAAA,cAAc,CAAC,IAAkB,EAAA;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC;IAC1C;AAEA,IAAA,UAAU,CAAC,GAAW,EAAE,MAAe,EAAE,OAAO,GAAG,IAAI,EAAA;AACrD,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,OAAO;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAC1F;IAEA,YAAY,CAAC,OAAO,GAAG,IAAI,EAAA;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,OAAO;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC5E;wGAvHW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjCxB,6lIAkFA,EAAA,MAAA,EAAA,CAAA,6hCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7DY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,4BAA4B,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,SAAA,EAAA,cAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAY1G,WAAW,EAAA,UAAA,EAAA,CAAA;kBAfvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,cACb,IAAI,EAAA,OAAA,EACP,CAAC,MAAM,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,eAAe,CAAC,mBAGrG,uBAAuB,CAAC,MAAM,EAAA,IAAA,EAKzC;AACJ,wBAAA,kBAAkB,EAAE,mBAAmB;AACxC,qBAAA,EAAA,QAAA,EAAA,6lIAAA,EAAA,MAAA,EAAA,CAAA,6hCAAA,CAAA,EAAA;;;METU,iBAAiB,CAAA;AACnB,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AACxB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;AAC3B,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,gBAAgB,GAAG,MAAM,CAAC,8BAA8B,CAAC;IAClE,oBAAoB,GAAuB,IAAI;IAC/C,qBAAqB,GAAG,EAAE;AAE1B,IAAA,KAAK,GAAG,KAAK,CAAiB,EAAE,CAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAoB;AAC7C,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAA0B;IAClD,YAAY,GAAG,QAAQ,CAAC,MAAM,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,CAAC;AACnG,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QAC5B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9E,IAAA,CAAC,CAAC;AACF,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;AAC3B,IAAA,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC;AAC1B,IAAA,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;AACvB,IAAA,UAAU,GAAG,MAAM,CAAiB,EAAE,CAAC;AACvC,IAAA,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;IACvB,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/D,IAAA,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU;AAE7C,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,YAAA,SAAS,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACvD,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,IAAG;AAC/E,YAAA,IAAI,EAAE,KAAK,YAAY,aAAa,CAAC;gBAAE;YACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACtE,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACxB,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC7D;AAEA,IAAA,QAAQ,CAAC,OAA4B,EAAA;QACnC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iCAAiC,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC;IACzG;IAEA,YAAY,CAAC,IAAkB,EAAE,OAA4B,EAAA;AAC3D,QAAA,IAAI,MAAM,IAAI,IAAI,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YACpB;QACF;QACA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,OAAO,CAAC;IAC7F;IAEA,UAAU,CAAC,YAAY,GAAG,IAAI,EAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,kBAAkB,EAAE;AACzB,QAAA,IAAI,YAAY;AAAE,YAAA,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE;AACpD,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;IAClC;AAEA,IAAA,cAAc,CAAC,KAAoB,EAAA;AACjC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;YAAE;QAC5B,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA,IAAA,UAAU,CAAC,IAAkB,EAAA;QAC3B,IAAI,MAAM,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC1C;AAEA,IAAA,cAAc,CAAC,IAAkB,EAAA;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC;IAC1C;AAEA,IAAA,UAAU,CAAC,GAAW,EAAE,KAAa,EAAE,KAAqB,EAAE,OAA4B,EAAA;AACxF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;AAC3B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,oBAAoB;AACvB,YAAA,OAAO,YAAY,WAAW,GAAG,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,YAAY,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;AACtI,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;YAC/D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;QAC/C;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;AAEA,IAAA,SAAS,CAAC,IAA6C,EAAA;AACrD,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;;;AAGxE,QAAA,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAClC,YAAA,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,IAAI,CAAC,UAAU,EAAE;YACjB;QACF;QACA,KAAK,IAAI,CAAC;AACP,aAAA,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;aACvG,IAAI,CAAC,SAAS,IAAG;AAChB,YAAA,IAAI,SAAS;gBAAE,IAAI,CAAC,UAAU,EAAE;AAClC,QAAA,CAAC,CAAC;IACN;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,qBAAqB;IACjE;wGAzGW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtB9B,wtHA6EA,EAAA,MAAA,EAAA,CAAA,0tCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5DY,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,yBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,4BAA4B,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,oNAAE,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKtH,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,cACpB,IAAI,EAAA,OAAA,EACP,CAAC,UAAU,EAAE,MAAM,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,eAAe,CAAC,EAAA,eAAA,EAGjH,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wtHAAA,EAAA,MAAA,EAAA,CAAA,0tCAAA,CAAA,EAAA;;;MEApC,WAAW,CAAA;AACb,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AACxB,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,gBAAgB,GAAG,MAAM,CAAC,8BAA8B,CAAC;IAClE,YAAY,GAAG,KAAK;AAEpB,IAAA,KAAK,GAAG,KAAK,CAAiB,EAAE,CAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAoB;AAC7C,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAA0B;AAClD,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;IACvB,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/D,IAAA,aAAa,GAAG,QAAQ,CAAqB,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AACrG,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5E,IAAA,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU;AAC7C,IAAA,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW;AAC/C,IAAA,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW;AAC/C,IAAA,cAAc,GAAG,QAAQ,CAAC,MACxB,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,CACpH;AAED,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,YAAA,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,OAAO,CAAC;YAC3D,SAAS,CAAC,MAAK;gBACb,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,QAAQ,CAAC;gBAClE,IAAI,IAAI,CAAC,YAAY;oBAAE;AACvB,gBAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC1E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,kBAAkB,KAAK,SAAS,GAAG,kBAAkB,IAAI,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC,CAAC;AACxH,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AAC1B,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,IAAG;YAC/E,IAAI,KAAK,YAAY,aAAa;gBAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5G,QAAA,CAAC,CAAC;IACJ;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC;AAChD,QAAA,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;IAC/E;AAEA,IAAA,qBAAqB,CAAC,IAAkB,EAAA;QACtC,IAAI,MAAM,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;aACtC;AACH,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,YAAA,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAClE;IACF;AAEA,IAAA,YAAY,CAAC,IAAkB,EAAA;AAC7B,QAAA,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC;YAAE;AACvB,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;;;AAGpE,QAAA,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAClC,YAAA,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB;QACF;AACA,QAAA,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACpD,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;AACnC,YAAA,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;AAC3B,SAAA,CAAC;IACJ;AAEA,IAAA,cAAc,CAAC,IAAkB,EAAA;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC;IAC1C;wGArEW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBxB,05IAmGA,EAAA,MAAA,EAAA,CAAA,0+BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDpFY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,4BAA4B,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,SAAA,EAAA,cAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAK1G,WAAW,EAAA,UAAA,EAAA,CAAA;kBARvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,cACb,IAAI,EAAA,OAAA,EACP,CAAC,MAAM,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,eAAe,CAAC,EAAA,eAAA,EAGrG,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,05IAAA,EAAA,MAAA,EAAA,CAAA,0+BAAA,CAAA,EAAA;;;MEgBpC,iBAAiB,CAAA;AACnB,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AACxB,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,gBAAgB,GAAG,MAAM,CAAC,8BAA8B,CAAC;AACjD,IAAA,OAAO,GAAG,SAAS,CAAgC,SAAS,CAAC;IAC9E,oBAAoB,GAAuB,IAAI;IAC/C,qBAAqB,GAAG,EAAE;AAE1B,IAAA,KAAK,GAAG,KAAK,CAAiB,EAAE,CAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAoB;AAC7C,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAA0B;AAClD,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5B,IAAA,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;IACvB,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/D,IAAA,aAAa,GAAG,QAAQ,CAAqB,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AACrG,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5E,IAAA,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU;AAC7C,IAAA,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW;AAC/C,IAAA,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW;AAE/C,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;YAC1B,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ;AAC/D,YAAA,SAAS,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAChE,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,IAAG;AAC/E,YAAA,IAAI,EAAE,KAAK,YAAY,aAAa,CAAC;gBAAE;YACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtE,IAAI,CAAC,mBAAmB,EAAE;AAC5B,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC7D;AAEA,IAAA,UAAU,CAAC,OAA4B,EAAA;AACrC,QAAA,IAAI,CAAC,oBAAoB;AACvB,YAAA,OAAO,YAAY;AACjB,kBAAE;AACF,kBAAE,IAAI,CAAC,SAAS,CAAC,aAAa,YAAY;AACxC,sBAAE,IAAI,CAAC,SAAS,CAAC;uBACd,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,IAAI,IAAI,CAAC;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AACxB,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;YAC/D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;QAC/C;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;IAEA,iBAAiB,GAAA;QACf,IAAI,CAAC,YAAY,EAAE;IACrB;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,YAAY,EAAE;IACrB;IAEA,mBAAmB,GAAA;QACjB,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA,IAAA,eAAe,CAAC,KAAoB,EAAA;AAClC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;YAAE;QAC5B,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA,IAAA,YAAY,CAAC,IAAkB,EAAA;AAC7B,QAAA,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC;YAAE;AACvB,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;;;AAGpE,QAAA,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAClC,YAAA,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,IAAI,CAAC,mBAAmB,EAAE;YAC1B;QACF;QACA,KAAK,IAAI,CAAC;AACP,aAAA,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;aACvG,IAAI,CAAC,SAAS,IAAG;AAChB,YAAA,IAAI,SAAS;gBAAE,IAAI,CAAC,mBAAmB,EAAE;AAC3C,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,cAAc,CAAC,IAAkB,EAAA;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC;IAC1C;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAAE;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,kBAAkB,EAAE;AACzB,QAAA,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,GAAG,KAAK,EAAE;AACrE,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;IAClC;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,qBAAqB;IACjE;wGAnGW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClC9B,msIA2FA,EAAA,MAAA,EAAA,CAAA,miCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED9DY,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,yBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,4BAA4B,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,oNAAE,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKtH,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,cACpB,IAAI,EAAA,OAAA,EACP,CAAC,UAAU,EAAE,MAAM,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,eAAe,CAAC,EAAA,eAAA,EAGjH,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,msIAAA,EAAA,MAAA,EAAA,CAAA,miCAAA,CAAA,EAAA;;;MEJpC,iBAAiB,CAAA;;;;AAI5B,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;AACxC,IAAA,kBAAkB,GAAG,MAAM,CAAC,yBAAyB,CAAC;IACtD,oBAAoB,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;;;IAK1E,UAAU,GAAG,KAAK,CAAiB,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC1D,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;;;;AAKzE,IAAA,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ;AACvC,IAAA,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO;AACrC,IAAA,SAAS,GAAG,QAAQ,CAAqC,MAAK;AAC5D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC,GAAG,OAAO,GAAG,SAAS;AACrD,IAAA,CAAC,CAAC;AACF,IAAA,SAAS,GAAG,QAAQ,CAAqC,MAAK;AAC5D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC,GAAG,OAAO,GAAG,SAAS;AACrD,IAAA,CAAC,CAAC;AACF,IAAA,SAAS,GAAG,QAAQ,CAAqC,MAAK;AAC5D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC,GAAG,OAAO,GAAG,SAAS;AACrD,IAAA,CAAC,CAAC;IACF,gBAAgB,GAAG,+BAA+B,CAAC,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,CAAC;AAC/F,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;wGAjCvE,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5B9B,gnDA4CA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDpBY,WAAW,gHAAE,iBAAiB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,2GAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAI/G,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;+BACE,WAAW,EAAA,OAAA,EAGZ,CAAC,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,cAC/G,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,gnDAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA;;;AEvBjD;;;;;;AAMG;AACG,SAAU,cAAc,CAAC,GAAW,EAAA;AACxC,IAAA,MAAM,IAAI,GAAG,CAAC,MAAe;AAC3B,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAoB;AACxE,YAAA,IAAI,MAAM;AAAE,gBAAA,OAAO,MAAM;QAC3B;AAAE,QAAA,MAAM;;QAER;AACA,QAAA,OAAO,IAAI;IACb,CAAC,GAAG;AAEJ,IAAA,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG;AACnE;;ACZA;AAeO,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB,CAAA;;;;AAInB,IAAA,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;AACxC,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;;AAI3B,IAAA,UAAU,GAA6B;AAC9C,QAAA,EAAE,EAAE,OAAO;AACX,QAAA,EAAE,EAAE,OAAO;AACX,QAAA,EAAE,EAAE,OAAO;AACX,QAAA,EAAE,EAAE,OAAO;AACX,QAAA,EAAE,EAAE,OAAO;KACZ;;;;;AAMQ,IAAA,SAAS,GAAG,MAAM,CAAS,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AACnE,IAAA,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ;;;AAI9B,IAAA,QAAQ,GAAG;QAClB,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,sCAAsC,EAAE,IAAI,EAAE,MAAM,EAAE;QAC9E,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,yCAAyC,EAAE,IAAI,EAAE,QAAQ,EAAE;QACpF,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,uCAAuC,EAAE,IAAI,EAAE,OAAO,EAAE;QAC9E,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,0CAA0C,EAAE,IAAI,EAAE,MAAM,EAAE;QACjF,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,uCAAuC,EAAE,IAAI,EAAE,OAAO,EAAE;QACtF,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,6CAA6C,EAAE,IAAI,EAAE,OAAO,EAAE;KAC1E;;;;IAKV,YAAY,GAAA;AACV,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,MAAM,cAAc,GAAG,GAAG,CAAC,iBAAiB,EAAE;AAC9C,QAAA,MAAM,WAAW,GAAG,CAAC,cAAc,GAAG,EAAE;AACxC,QAAA,MAAM,IAAI,GAAG,WAAW,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE;AACxC,QAAA,MAAM,eAAe,GAAG,CAAA,GAAA,EAAM,IAAI,CAAA,EAAG,WAAW,EAAE;AAClD,QAAA,OAAO,eAAe;IACxB;AAEA,IAAA,aAAa,CAAC,IAAU,EAAA;;AAEtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,2BAAA,EAA8B,IAAI,CAAC,MAAM,EAAE,CAAA,CAAE,CAAC;;AAE3E,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,OAAO;AAChE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;AAC9C,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA,CAAC;AACF,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,sCAAsC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAClG,OAAO,CAAA,EAAG,SAAS,CAAA,EAAA,EAAK,IAAI,CAAC,YAAY,EAAE,GAAG;IAChD;wGA3DW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,yECzB9B,sqDA8CA,EAAA,MAAA,EAAA,CAAA,2hKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDhCY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,6FAAE,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,CAAA;;AAWvC,iBAAiB,GAAA,UAAA,CAAA;AAN7B,IAAA,cAAc,CAAC;AACd,QAAA,SAAS,EAAE,iBAAiB;AAC5B,QAAA,IAAI,EAAE,MAAM,cAAc,CAAC,kCAAkC,CAAC;AAC9D,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,KAAK,EAAE,SAAS;KACjB;AACY,CAAA,EAAA,iBAAiB,CA4D7B;4FA5DY,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAb7B,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,MAAM,EAAE,eAAe,EAAE,eAAe,CAAC,EAAA,UAAA,EAGvC,IAAI,EAAA,QAAA,EAAA,sqDAAA,EAAA,MAAA,EAAA,CAAA,2hKAAA,CAAA,EAAA;;;MERL,iBAAiB,CAAA;AACX,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,mBAAmB,GAA2B,MAAM,CAAC,uBAAuB,CAAC;AAE9F,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,OAAO;QACjD,IAAI,OAAO,EAAE;;;YAGX,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7C;;AAEA,QAAA,OAAO,IAAI;IACb;wGAbW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA;;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACHD,MAAM,MAAM,GAAW;AACrB,IAAA;AACE,QAAA,IAAI,EAAE,EAAE;QACR,WAAW,EAAE,CAAC,iBAAiB,CAAC;AAChC,QAAA,SAAS,EAAE,iBAAiB;AAC7B,KAAA;CACF;MAMY,iBAAiB,CAAA;wGAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,0CAFlB,YAAY,CAAA,EAAA,CAAA;yGAEX,iBAAiB,EAAA,OAAA,EAAA,CAHlB,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC7B,YAAY,CAAA,EAAA,CAAA;;4FAEX,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAJ7B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACxC,OAAO,EAAE,CAAC,YAAY,CAAC;AACxB,iBAAA;;;MCRY,UAAU,CAAA;wGAAV,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;yGAAV,UAAU,EAAA,OAAA,EAAA,CAFX,YAAY,EAAE,iBAAiB,CAAA,EAAA,CAAA;yGAE9B,UAAU,EAAA,OAAA,EAAA,CAFX,YAAY,EAAE,iBAAiB,CAAA,EAAA,CAAA;;4FAE9B,UAAU,EAAA,UAAA,EAAA,CAAA;kBAJtB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,iBAAiB,CAAC;AAC3C,iBAAA;;;;;;;;ACED;AAaO,IAAMC,eAAa,GAAnB,MAAM,aAAa,CAAA;;;;AAIf,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AACxB,IAAA,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;AACxC,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;;;;AAM3B,IAAA,GAAG,GAAG,MAAM,CAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;AACrE,IAAA,SAAS,GAAG,MAAM,CAAS,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AACnE,IAAA,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ;;;;AAIvC,IAAA,aAAa,CAAC,IAAU,EAAA;;AAEtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,2BAAA,EAA8B,IAAI,CAAC,MAAM,EAAE,CAAA,CAAE,CAAC;AAC3E,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;AAC/C,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA,CAAC;AACF,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,sCAAsC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACzF;;;;AAKA;;;;AAIG;IACH,MAAM,GAAA;AACJ,QAAA,KAAK,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;IAC9D;wGAxCW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,wECtB1B,qhCAkBA,EAAA,MAAA,EAAA,CAAA,yBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDJY,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,6FAAE,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,CAAA;;AAQzCA,eAAa,GAAA,UAAA,CAAA;AANzB,IAAA,cAAc,CAAC;AACd,QAAA,SAAS,EAAEA,eAAa;AACxB,QAAA,IAAI,EAAE,MAAM,cAAc,CAAC,uCAAuC,CAAC;AACnE,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,KAAK,EAAE,SAAS;KACjB;AACY,CAAA,EAAAA,eAAa,CAyCzB;4FAzCYA,eAAa,EAAA,UAAA,EAAA,CAAA;kBAXzB,SAAS;AAGC,YAAA,IAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAC,QAAQ,EAAE,eAAe,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,qhCAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,CAAA,EAAA;;;AEXhD,MAAMC,QAAM,GAAY,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAED,eAAa,EAAE,CAAC;;MCM1D,cAAc,CAAA;wGAAd,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAHf,YAAY,EAAAD,IAAA,CAAA,YAAA,CAAA,EAAA,CAAA;yGAGX,cAAc,EAAA,OAAA,EAAA,CAHf,YAAY,EAAE,YAAY,CAAC,QAAQ,CAACE,QAAM,CAAC,CAAA,EAAA,CAAA;;4FAG1C,cAAc,EAAA,UAAA,EAAA,CAAA;kBAJ1B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,QAAQ,CAACA,QAAM,CAAC,CAAC;AACtD,oBAAA,OAAO,EAAE,EAAE;AACZ,iBAAA;;;;;;;;ACCD;AAaO,IAAM,aAAa,GAAnB,MAAM,aAAa,CAAA;;;;AAIf,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AACxB,IAAA,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;AACxC,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;;;;AAM3B,IAAA,GAAG,GAAG,MAAM,CAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;AACrE,IAAA,SAAS,GAAG,MAAM,CAAS,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AACnE,IAAA,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ;;;;AAIvC,IAAA,aAAa,CAAC,IAAU,EAAA;;AAEtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,2BAAA,EAA8B,IAAI,CAAC,MAAM,EAAE,CAAA,CAAE,CAAC;AAC3E,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;AAC/C,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA,CAAC;AACF,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,sCAAsC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACzF;;;;AAKA;;;;AAIG;IACH,MAAM,GAAA;AACJ,QAAA,KAAK,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;IAC9D;wGAxCW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,wECtB1B,8/BAiBA,EAAA,MAAA,EAAA,CAAA,yBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDHY,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,6FAAE,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,CAAA;;AAQzC,aAAa,GAAA,UAAA,CAAA;AANzB,IAAA,cAAc,CAAC;AACd,QAAA,SAAS,EAAE,aAAa;AACxB,QAAA,IAAI,EAAE,MAAM,cAAc,CAAC,uCAAuC,CAAC;AACnE,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,KAAK,EAAE,OAAO;KACf;AACY,CAAA,EAAA,aAAa,CAyCzB;4FAzCY,aAAa,EAAA,UAAA,EAAA,CAAA;kBAXzB,SAAS;AAGC,YAAA,IAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAC,QAAQ,EAAE,eAAe,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,8/BAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,CAAA,EAAA;;;AEXhD,MAAMA,QAAM,GAAY,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;;MCM1D,eAAe,CAAA;wGAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,YAHhB,YAAY,EAAAF,IAAA,CAAA,YAAA,CAAA,EAAA,CAAA;yGAGX,eAAe,EAAA,OAAA,EAAA,CAHhB,YAAY,EAAE,YAAY,CAAC,QAAQ,CAACE,QAAM,CAAC,CAAA,EAAA,CAAA;;4FAG1C,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,QAAQ,CAACA,QAAM,CAAC,CAAC;AACtD,oBAAA,OAAO,EAAE,EAAE;AACZ,iBAAA;;;;;;;;ACLD;AACA;AACA;AACA;AACA;AACA,MAAM,iBAAiB,GAAG,EAAE,UAAU,EAAE,oBAAoB,EAAW;AAEhE,MAAM,MAAM,GAAY;AAC7B,IAAA;AACE,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,SAAS,EAAE,MAAM;AACjB,QAAA,UAAU,EAAE,WAAW;AACxB,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,IAAI,EAAE,iBAAiB;AACvB,QAAA,YAAY,EAAE,MAAM,uDAAwB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;AACrE,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,IAAI,EAAE,iBAAiB;AACvB,QAAA,YAAY,EAAE,MAAM,uDAA6B,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC;AAC9E,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,IAAI,EAAE,iBAAiB;AACvB,QAAA,YAAY,EAAE,MAAM,qDAA6B,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC;AAC/E,KAAA;CACF;;MCvBY,cAAc,CAAA;wGAAd,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;yGAAd,cAAc,EAAA,OAAA,EAAA,CAAAF,IAAA,CAAA,YAAA,CAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAHf,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA,EAAA,CAAA;;4FAG5B,cAAc,EAAA,UAAA,EAAA,CAAA;kBAL1B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,EAAE;oBAChB,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACxC,oBAAA,SAAS,EAAE,EAAE;AACd,iBAAA;;;ACPD;;AAEG;;;;"}
1
+ {"version":3,"file":"sdcorejs-angular-modules-layout.mjs","sources":["../../../projects/sdcorejs-angular/modules/layout/components/page/page.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/page/page.component.html","../../../projects/sdcorejs-angular/modules/layout/services/menu/menu.utils.ts","../../../projects/sdcorejs-angular/modules/layout/services/storage/storage.service.ts","../../../projects/sdcorejs-angular/modules/layout/configurations/layout.configuration.ts","../../../projects/sdcorejs-angular/modules/layout/services/responsive/responsive.service.ts","../../../projects/sdcorejs-angular/modules/layout/services/navigation-state/navigation-state.service.ts","../../../projects/sdcorejs-angular/modules/layout/services/layout.service.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/menu.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/utils/menu-path.util.ts","../../../projects/sdcorejs-angular/modules/layout/utils/tab-name.util.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/menu-focus.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/high-light-search.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/user-menu/user-menu.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/user-menu/user-menu.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/user/user.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/user/user.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/user/user.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/user/user.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/shared/menu-tree/menu-tree.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/menu-tree/menu-tree.component.html","../../../projects/sdcorejs-angular/modules/layout/components/shared/search-field/search-field.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/search-field/search-field.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v2/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v2/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v2/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v2/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v3/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v3/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v3/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v3/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/layout-main/layout-main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/layout-main/layout-main.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/home/components/home-page/home-page.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/components/home-page/home-page.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/home/guards/home-redirect.guard.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/home.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/home.module.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/pages/root/root.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/pages/root/root.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/not-found.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/not-found.module.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/pages/root/root.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/pages/root/root.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/forbidden.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/forbidden.module.ts","../../../projects/sdcorejs-angular/modules/layout/layout.routing.ts","../../../projects/sdcorejs-angular/modules/layout/layout.module.ts","../../../projects/sdcorejs-angular/modules/layout/sdcorejs-angular-modules-layout.ts"],"sourcesContent":["import { booleanAttribute, Component, effect, ElementRef, inject, input } from '@angular/core';\n\n@Component({\n selector: 'sd-page',\n templateUrl: './page.component.html',\n styleUrl: './page.component.scss',\n})\nexport class SdPageComponent {\n private el = inject(ElementRef);\n\n title = input<string>('', { alias: 'title' });\n description = input<string>('', { alias: 'description' });\n noHeader = input(false, { transform: booleanAttribute, alias: 'noHeader' });\n\n constructor() {\n effect(() => {\n if (this.title()) {\n this.el.nativeElement.removeAttribute('title');\n }\n });\n }\n}\n","@if (!noHeader()) {\n <div class=\"c-page-header bg-white\">\n <div class=\"p-16 d-flex align-items-center w-full justify-content-between\">\n <div class=\"d-flex\">\n <ng-content select=\"[headerLeft]\">\n <div class=\"d-flex flex-column\">\n <div class=\"T20M\">{{ title() }}</div>\n @if (description()) {\n <div class=\"T14R text-secondary mt-4\">{{ description() }}</div>\n }\n </div>\n </ng-content>\n </div>\n <ng-content select=\"[headerRight]\"></ng-content>\n </div>\n </div>\n}\n\n<div class=\"c-page-wrapper px-0\">\n <div class=\"c-page-content\">\n <ng-content></ng-content>\n </div>\n</div>\n","import { SdLayoutChildrenMenu, SdLayoutMenu, SdLayoutRootMenu } from './menu.model';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\nexport function getMenuStableKey(menu: SdLayoutMenu | null | undefined, ancestors: string[] = []): string {\n if (!menu || typeof menu !== 'object') return '';\n if (typeof menu.id === 'string' && menu.id.trim()) return `id:${menu.id.trim()}`;\n if ('path' in menu && typeof menu.path === 'string' && menu.path.trim()) return `path:${menu.path.trim()}`;\n\n const title = typeof menu.title === 'string' ? menu.title.trim() : '';\n const segments = [...ancestors, title]\n .map(segment => StringUtilities.changeAliasLowerCase(segment).trim().replace(/\\s+/g, '-'))\n .filter(Boolean);\n return segments.length ? `group:${segments.join('/')}` : '';\n}\n\nexport function searchMenuLeaves(menus: SdLayoutMenu[], query: string): SdLayoutRootMenu[] {\n const leaves = flattenMenuLeaves(menus);\n const normalizedQuery = query?.trim();\n if (!normalizedQuery) return leaves;\n return leaves.filter(menu =>\n [menu.title, menu.tooltipTitle].some(value => value && StringUtilities.aliasIncludes(value, normalizedQuery))\n );\n}\n\nexport function selectPrimaryMenuGroups(menus: SdLayoutMenu[], requestedIds: string[] | undefined, maximum = 3): SdLayoutMenu[] {\n const limit = Number.isFinite(maximum) && maximum > 0 ? Math.min(3, Math.floor(maximum)) : 3;\n const byId = new Map(menus.filter(menu => typeof menu.id === 'string').map(menu => [menu.id!, menu]));\n const selected: SdLayoutMenu[] = [];\n const selectedKeys = new Set<string>();\n\n for (const id of requestedIds ?? []) {\n const menu = byId.get(id);\n const key = getMenuStableKey(menu);\n if (!menu || !key || selectedKeys.has(key)) continue;\n selected.push(menu);\n selectedKeys.add(key);\n if (selected.length === limit) return selected;\n }\n\n for (const menu of menus) {\n const key = getMenuStableKey(menu);\n if (!key || selectedKeys.has(key)) continue;\n selected.push(menu);\n selectedKeys.add(key);\n if (selected.length === limit) break;\n }\n return selected;\n}\n\nexport function resolveMenuKeys(menus: SdLayoutMenu[], keys: string[]): (SdLayoutRootMenu | SdLayoutChildrenMenu)[] {\n const menuByKey = new Map<string, SdLayoutMenu>();\n visitMenus(menus, [], (menu, ancestors) => {\n const key = getMenuStableKey(menu, ancestors);\n if (key && !menuByKey.has(key)) menuByKey.set(key, menu);\n });\n return [...new Set(keys)].map(key => menuByKey.get(key)).filter((menu): menu is SdLayoutMenu => !!menu);\n}\n\nexport function flattenMenuLeaves(menus: SdLayoutMenu[]): SdLayoutRootMenu[] {\n const leaves: SdLayoutRootMenu[] = [];\n visitMenus(menus, [], menu => {\n if ('path' in menu && typeof menu.path === 'string' && menu.path) leaves.push(menu);\n });\n return leaves;\n}\n\nfunction visitMenus(\n menus: SdLayoutMenu[] | undefined,\n ancestors: string[],\n visitor: (menu: SdLayoutMenu, ancestors: string[]) => void\n): void {\n for (const menu of menus ?? []) {\n if (!menu || typeof menu !== 'object') continue;\n visitor(menu, ancestors);\n if ('children' in menu && Array.isArray(menu.children)) {\n const title = typeof menu.title === 'string' && menu.title.trim() ? menu.title.trim() : getMenuStableKey(menu, ancestors);\n visitMenus(menu.children, title ? [...ancestors, title] : ancestors, visitor);\n }\n }\n}\n","import { InjectionToken, Injectable, inject } from '@angular/core';\nimport { SdStorage, SdStorageOption, SdStorageService } from '@sdcorejs/angular/services';\nimport { SdLayoutChildrenMenu, SdLayoutMenu } from '../menu/menu.model';\nimport { getMenuStableKey, resolveMenuKeys } from '../menu/menu.utils';\n\n/**\n * Namespace áp cho toàn bộ state layout được persist — hằng chuỗi, hoặc hàm resolve lại mỗi lần đọc\n * (dùng cho danh tính chỉ biết được SAU khi đăng nhập, ví dụ id user hoặc tenant).\n */\nexport type SdLayoutStorageNamespace = string | (() => string | null | undefined);\n\n/**\n * Namespace do consumer cung cấp cho toàn bộ state layout được persist (thường là id user hoặc tenant).\n *\n * why: các key dưới đây là UUID CỐ ĐỊNH, không gắn với ai cả. Trên máy dùng chung, user A đăng xuất\n * rồi user B đăng nhập thì `pinnedMenuKeys` / `recentMenuKeys` / `lastActiveMenuGroupId` của A vẫn\n * còn nguyên trong localStorage và B nhìn thấy đúng những module A đã ghim và vừa truy cập. Cấp\n * namespace theo user/tenant sẽ tách hẳn không gian lưu trữ.\n *\n * ⚠️ `SdLayoutStorageService` là singleton `providedIn: 'root'`, thường được khởi tạo TRƯỚC khi biết\n * người dùng là ai. Vì vậy hãy cấp một **hàm** — nó được gọi lại ở mỗi lần truy cập handle, nên khi\n * danh tính đến (hoặc đổi) thì cả bảy handle tự dựng lại trên namespace mới:\n *\n * ```ts\n * providers: [\n * {\n * provide: SD_LAYOUT_STORAGE_NAMESPACE,\n * useFactory: () => {\n * const auth = inject(SdAuthService);\n * return () => auth.getAuthInfo?.()?.id;\n * },\n * },\n * ];\n * ```\n *\n * Đây là biện pháp bổ sung chứ không thay thế `SdLayoutStorageService.clear()` lúc signout.\n */\nexport const SD_LAYOUT_STORAGE_NAMESPACE = new InjectionToken<SdLayoutStorageNamespace>('sd.layout.storage.namespace');\n\ninterface SdLayoutStorageHandles {\n namespace: string | undefined;\n isShowSidebar: SdStorage<boolean>;\n menuLockStatus: SdStorage<boolean>;\n lastActiveMenuGroupId: SdStorage<string>;\n pinnedMenuGroup: SdStorage<SdLayoutChildrenMenu>;\n pinnedMenuKeys: SdStorage<string[]>;\n recentMenuKeys: SdStorage<string[]>;\n versionStates: SdStorage<Record<string, SdLayoutVersionState>>;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdLayoutStorageService {\n readonly #sdStorageService = inject(SdStorageService);\n readonly #namespaceSource = inject(SD_LAYOUT_STORAGE_NAMESPACE, { optional: true });\n #handles?: SdLayoutStorageHandles;\n\n // why: đọc namespace bằng field initializer là vô nghĩa — service là singleton `providedIn: 'root'`\n // nên nó chạy ở lần inject đầu tiên, thường TRƯỚC khi đăng nhập xong, và factory theo user trả về\n // `undefined` cho cả phiên; biện pháp \"pinned/recent của A không lộ sang B\" quảng cáo trong doc khi\n // đó không bao giờ có hiệu lực. Giải quyết bằng cách resolve LƯỜI ở mỗi lần truy cập handle: khi\n // danh tính đến (hoặc đổi user trong cùng phiên SPA) thì bảy handle được dựng lại trên namespace mới.\n get isShowSidebar(): SdStorage<boolean> {\n return this.#resolveHandles().isShowSidebar;\n }\n\n get menuLockStatus(): SdStorage<boolean> {\n return this.#resolveHandles().menuLockStatus;\n }\n\n get lastActiveMenuGroupId(): SdStorage<string> {\n return this.#resolveHandles().lastActiveMenuGroupId;\n }\n\n get pinnedMenuGroup(): SdStorage<SdLayoutChildrenMenu> {\n return this.#resolveHandles().pinnedMenuGroup;\n }\n\n get pinnedMenuKeys(): SdStorage<string[]> {\n return this.#resolveHandles().pinnedMenuKeys;\n }\n\n get recentMenuKeys(): SdStorage<string[]> {\n return this.#resolveHandles().recentMenuKeys;\n }\n\n get versionStates(): SdStorage<Record<string, SdLayoutVersionState>> {\n return this.#resolveHandles().versionStates;\n }\n\n /**\n * Xoá toàn bộ state layout đã persist.\n *\n * **Consumer PHẢI gọi hàm này trong luồng signout, TRƯỚC khi danh tính bị xoá.** Nếu không,\n * pinned/recent/last-active của user vừa đăng xuất sẽ còn lại trên trình duyệt và hiện ra cho người\n * đăng nhập kế tiếp — rò rỉ tên module nội bộ mà người đó có thể không có quyền thấy.\n *\n * why: khi đã cấu hình `SD_LAYOUT_STORAGE_NAMESPACE` theo user, namespace được resolve NGAY LÚC GỌI.\n * Gọi `clear()` sau khi auth info về `undefined` sẽ xoá nhầm partition không-namespace, còn dữ liệu\n * của user vừa thoát thì vẫn nguyên.\n */\n clear(): void {\n const handles = this.#resolveHandles();\n for (const handle of this.#allHandles(handles)) handle.remove();\n }\n\n // why: namespace rỗng/space phải quy về undefined, nếu không mỗi chuỗi rác lại tạo ra một không\n // gian lưu trữ khác và state của chính user đó biến mất sau khi reload.\n #resolveNamespace(): string | undefined {\n const source = this.#namespaceSource;\n const raw = typeof source === 'function' ? source() : source;\n return typeof raw === 'string' ? raw.trim() || undefined : undefined;\n }\n\n #resolveHandles(): SdLayoutStorageHandles {\n const namespace = this.#resolveNamespace();\n const current = this.#handles;\n if (current && current.namespace === namespace) return current;\n // why: handle cũ phải `destroy()` (KHÔNG phải `remove()`) — chỉ gỡ facade và complete subject,\n // dữ liệu của namespace trước vẫn nằm nguyên để user đó quay lại còn đọc được.\n if (current) for (const handle of this.#allHandles(current)) handle.destroy();\n const next = this.#createHandles(namespace);\n this.#handles = next;\n return next;\n }\n\n #createHandles(namespace: string | undefined): SdLayoutStorageHandles {\n // why: `{ namespace: undefined }` cho ra đúng identity như khi không truyền option (`SdStorageService`\n // không áp namespace mặc định nào), nên app không cấu hình namespace vẫn đọc được state đã persist\n // từ trước — không mất pinned/recent khi nâng cấp thư viện.\n const option: SdStorageOption = { namespace };\n return {\n namespace,\n isShowSidebar: this.#sdStorageService.create('cb07c316-ed6d-4620-9e92-53dbef6aa983', option),\n menuLockStatus: this.#sdStorageService.create('2c2f4816-18b3-4ec3-8177-7b90bff036c3', option),\n lastActiveMenuGroupId: this.#sdStorageService.create('2e6961d0-3380-4a94-a6a1-38837560cd96', option),\n pinnedMenuGroup: this.#sdStorageService.create('e81da122-5dab-4250-b309-64197fb19d44', option),\n pinnedMenuKeys: this.#sdStorageService.create('4bdc7f80-9ff4-4fe0-908f-6c9f7fe4100a', option),\n recentMenuKeys: this.#sdStorageService.create('fb989dc1-f6e7-4b62-a611-861a8f214a51', option),\n versionStates: this.#sdStorageService.create('ca8e4261-fbd4-4209-af88-2dbe278c1a1b', option),\n };\n }\n\n #allHandles(handles: SdLayoutStorageHandles): readonly Pick<SdStorage, 'remove' | 'destroy'>[] {\n return [\n handles.isShowSidebar,\n handles.menuLockStatus,\n handles.lastActiveMenuGroupId,\n handles.pinnedMenuGroup,\n handles.pinnedMenuKeys,\n handles.recentMenuKeys,\n handles.versionStates,\n ];\n }\n\n readPinnedMenuKeys(menus: SdLayoutMenu[]): string[] {\n const storedKeys = this.pinnedMenuKeys.has() ? this.pinnedMenuKeys.get() : this.#getLegacyPinnedKeys();\n const validKeys = this.#resolveValidKeys(menus, storedKeys ?? []);\n if (!this.pinnedMenuKeys.has() || !this.#sameKeys(storedKeys ?? [], validKeys)) {\n this.pinnedMenuKeys.set(validKeys);\n }\n return validKeys;\n }\n\n writePinnedMenuKeys(keys: string[]): void {\n this.pinnedMenuKeys.set([...new Set(keys.filter(Boolean))]);\n }\n\n readRecentMenuKeys(menus: SdLayoutMenu[], maximum = 5): string[] {\n const storedKeys = this.recentMenuKeys.get() ?? [];\n const limit = Number.isFinite(maximum) && maximum > 0 ? Math.floor(maximum) : 5;\n const validKeys = this.#resolveValidKeys(menus, storedKeys).slice(0, limit);\n if (!this.#sameKeys(storedKeys, validKeys)) this.recentMenuKeys.set(validKeys);\n return validKeys;\n }\n\n writeRecentMenuKeys(keys: string[]): void {\n this.recentMenuKeys.set([...new Set(keys.filter(Boolean))]);\n }\n\n readVersionState(version: 1 | 2 | 3): SdLayoutVersionState {\n return this.versionStates.get()?.[String(version)] ?? {};\n }\n\n patchVersionState(version: 1 | 2 | 3, patch: SdLayoutVersionState): SdLayoutVersionState {\n const states = this.versionStates.get() ?? {};\n const nextState = { ...(states[String(version)] ?? {}), ...patch };\n this.versionStates.set({ ...states, [String(version)]: nextState });\n return nextState;\n }\n\n #getLegacyPinnedKeys(): string[] {\n const legacyGroup = this.pinnedMenuGroup.get();\n if (!legacyGroup || !Array.isArray(legacyGroup.children)) return [];\n return legacyGroup.children.map(menu => getMenuStableKey(menu)).filter(Boolean);\n }\n\n #resolveValidKeys(menus: SdLayoutMenu[], keys: string[]): string[] {\n return resolveMenuKeys(menus, keys)\n .map(menu => getMenuStableKey(menu))\n .filter(Boolean);\n }\n\n #sameKeys(left: string[], right: string[]): boolean {\n return left.length === right.length && left.every((key, index) => key === right[index]);\n }\n}\n\nexport interface SdLayoutVersionState {\n activeGroupKey?: string;\n locked?: boolean;\n collapsed?: boolean;\n}\n","import { InjectionToken, Signal } from '@angular/core';\nimport { MaybeAsync } from '@sdcorejs/utils/models';\nimport { Observable } from 'rxjs';\n\n/** Consumer-owned account action invoked without arguments by the shared user menu. */\nexport type SdLayoutAccountAction = () => void | Promise<void>;\n\n/** Notification badge source and the action that opens the consumer's notification experience. */\nexport interface SdLayoutNotificationConfiguration {\n /**\n * Số lượng thông báo chưa đọc. Hỗ trợ giá trị tĩnh hoặc nguồn reactive dài hạn.\n */\n count: number | Signal<number> | Observable<number>;\n\n /**\n * Tác vụ do consumer xử lý khi người dùng chọn thông báo.\n */\n action: SdLayoutAccountAction;\n}\n\nexport interface ISdLayoutConfiguration {\n homeUrl?: string;\n mobileBreakpoint?: number;\n sidebar: ISdSidebarConfiguration | (() => MaybeAsync<ISdSidebarConfiguration>);\n userInfo: SdLayoutUserInfo | (() => MaybeAsync<SdLayoutUserInfo>);\n signout: SdLayoutAccountAction;\n changePassword?: SdLayoutAccountAction;\n\n /**\n * Tác vụ chỉnh sửa hồ sơ do consumer cung cấp.\n */\n updateProfile?: SdLayoutAccountAction;\n\n /**\n * Tác vụ mở thiết lập tài khoản do consumer cung cấp.\n */\n setting?: SdLayoutAccountAction;\n\n /**\n * Cấu hình số lượng và tác vụ thông báo của tài khoản.\n */\n notification?: SdLayoutNotificationConfiguration;\n}\n\n/** Optional role metadata rendered below the user's email when `text` is non-empty. */\nexport interface SdLayoutUserRole {\n text: string;\n /** Icon name resolved by `SdIcon`. */\n icon?: string;\n /** CSS color applied to the role metadata. */\n color?: string;\n}\n\nexport interface SdLayoutUserInfo {\n /**\n * Tên đăng nhập hoặc tên định danh của người dùng.\n * Thường dùng làm định danh rút gọn hoặc fallback hiển thị nếu user chưa cập nhật fullName.\n */\n username?: string;\n\n /**\n * Địa chỉ thư điện tử của người dùng.\n * Thường được hiển thị bên dưới tên người dùng trong popup/menu thông tin tài khoản.\n */\n email?: string;\n\n /**\n * Họ và tên đầy đủ của người dùng.\n * Đây là thông tin được ưu tiên hiển thị chính trên giao diện (VD: góc phải màn hình, lời chào).\n */\n fullName?: string;\n\n /**\n * Hình đại diện (avatar) của người dùng.\n * Nếu để trống, hệ thống sẽ tự động lấy ký tự đầu tiên của fullName hoặc username để tạo avatar mặc định.\n * Hỗ trợ các định dạng: URL (http/https), chuỗi base64 (data:image), hoặc đường dẫn nội bộ.\n */\n avatar?: string;\n\n /**\n * Chức vụ hoặc vai trò hiển thị cùng thông tin người dùng.\n * Không render khi `text` rỗng.\n */\n role?: SdLayoutUserRole;\n}\n\nexport const DEFAULT_LAYOUT_MOBILE_BREAKPOINT = 1024;\n\nexport interface SidebarConfigurationBase {\n brandColor?: string;\n brandLightColor?: string;\n logoUrl?: string;\n defaultTitle?: string;\n pin?: {\n enabled?: boolean;\n };\n}\n\nexport type ISdSidebarConfiguration = SidebarConfigurationV1 | SidebarConfigurationV2 | SidebarConfigurationV3;\n\nexport interface SidebarConfigurationV1 extends SidebarConfigurationBase {\n version: 1;\n\n /**\n * Màu brand chính.\n * Nên sử dụng mã màu #HEX hoặc rgb để hỗ trợ opacity khi hover.\n * Ví dụ: #1890ff, rgb(24,144,255)\n */\n brandColor?: string;\n\n /**\n * Màu brand nhạt (light).\n * Dùng cho background, hover nhẹ.\n */\n brandLightColor?: string;\n\n /**\n * URL logo hiển thị ở sidebar.\n * Nên đặt trong thư mục public hoặc dùng URL CDN.\n */\n logoUrl?: string;\n\n /**\n * Title mặc định của hệ thống.\n * Nếu menu không truyền title thì sẽ dùng giá trị này.\n * @default \"Back Office\"\n */\n defaultTitle?: string;\n\n /**\n * Cấu hình tính năng ghim menu.\n * - `enabled`: bật/tắt tính năng ghim.\n * Hệ thống mặc định là false\n */\n pin?: {\n enabled?: boolean;\n };\n}\n\nexport interface SidebarConfigurationV2 extends SidebarConfigurationBase {\n version: 2;\n interaction?: 'click' | 'hover-lock';\n primaryMenuIds?: string[];\n}\n\nexport interface SidebarConfigurationV3 extends SidebarConfigurationBase {\n version: 3;\n defaultCollapsed?: boolean;\n recent?: {\n enabled?: boolean;\n maxItems?: number;\n };\n}\n\nexport interface ResolvedSidebarRecentConfiguration {\n enabled: boolean;\n maxItems: number;\n}\n\nexport function normalizeLayoutMobileBreakpoint(value: number | undefined): number {\n if (!Number.isFinite(value) || Number(value) <= 0) {\n return DEFAULT_LAYOUT_MOBILE_BREAKPOINT;\n }\n return Math.floor(Number(value));\n}\n\nexport function resolveSidebarV2Interaction(sidebar: SidebarConfigurationV2): 'click' | 'hover-lock' {\n return sidebar.interaction === 'hover-lock' ? 'hover-lock' : 'click';\n}\n\nexport function resolveSidebarV3Recent(sidebar: SidebarConfigurationV3): ResolvedSidebarRecentConfiguration {\n const configuredLimit = sidebar.recent?.maxItems;\n const maxItems = Number.isFinite(configuredLimit) && Number(configuredLimit) > 0 ? Math.floor(Number(configuredLimit)) : 5;\n return {\n enabled: sidebar.recent?.enabled ?? true,\n maxItems,\n };\n}\n\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV1): SidebarConfigurationV1;\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV2): SidebarConfigurationV2;\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV3): SidebarConfigurationV3;\nexport function normalizeSidebarConfiguration(sidebar: ISdSidebarConfiguration): ISdSidebarConfiguration {\n if (sidebar.version === 2) {\n return {\n ...sidebar,\n interaction: resolveSidebarV2Interaction(sidebar),\n primaryMenuIds: [...new Set((sidebar.primaryMenuIds ?? []).filter(id => typeof id === 'string' && id.trim()))].slice(0, 3),\n };\n }\n if (sidebar.version === 3) {\n return {\n ...sidebar,\n defaultCollapsed: sidebar.defaultCollapsed ?? false,\n recent: resolveSidebarV3Recent(sidebar),\n };\n }\n return sidebar;\n}\n\nexport const SD_LAYOUT_CONFIGURATION = new InjectionToken<ISdLayoutConfiguration>('sd.layout.configuration');\n","import { Injectable, inject } from '@angular/core';\nimport { SD_VIEWPORT, SdViewport, SdViewportService } from '@sdcorejs/angular/services/viewport';\nimport { normalizeLayoutMobileBreakpoint } from '../../configurations';\n\nexport type SdLayoutViewport = SdViewport;\nexport const SD_LAYOUT_VIEWPORT = SD_VIEWPORT;\n\n/** @deprecated Prefer `SdViewportService` from `@sdcorejs/angular/services/viewport`. */\n@Injectable({ providedIn: 'root' })\nexport class SdLayoutResponsiveService {\n readonly #viewport = inject(SdViewportService);\n readonly viewportWidth = this.#viewport.width;\n\n isMobile(breakpoint: number): boolean {\n return this.viewportWidth() < normalizeLayoutMobileBreakpoint(breakpoint);\n }\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { ResolvedSidebarRecentConfiguration } from '../../configurations';\nimport { SdLayoutMenu } from '../menu/menu.model';\nimport { getMenuStableKey, resolveMenuKeys } from '../menu/menu.utils';\nimport { SdLayoutStorageService, SdLayoutVersionState } from '../storage/storage.service';\n\n@Injectable({ providedIn: 'root' })\nexport class SdLayoutNavigationStateService {\n readonly #storage = inject(SdLayoutStorageService);\n readonly #menus = signal<SdLayoutMenu[]>([]);\n readonly pinnedKeys = signal<string[]>([]);\n readonly recentKeys = signal<string[]>([]);\n readonly pinnedMenus = computed(() => resolveMenuKeys(this.#menus(), this.pinnedKeys()));\n readonly recentMenus = computed(() => resolveMenuKeys(this.#menus(), this.recentKeys()));\n\n hydrate(menus: SdLayoutMenu[], recentMaximum = 5): void {\n this.#menus.set(menus);\n this.pinnedKeys.set(this.#storage.readPinnedMenuKeys(menus));\n this.recentKeys.set(this.#storage.readRecentMenuKeys(menus, recentMaximum));\n }\n\n togglePinned(menu: SdLayoutMenu): void {\n const key = getMenuStableKey(menu);\n if (!key) return;\n const nextKeys = this.pinnedKeys().includes(key)\n ? this.pinnedKeys().filter(currentKey => currentKey !== key)\n : [...this.pinnedKeys(), key];\n this.pinnedKeys.set(nextKeys);\n this.#storage.writePinnedMenuKeys(nextKeys);\n }\n\n recordRecent(menu: SdLayoutMenu, configuration: ResolvedSidebarRecentConfiguration): void {\n if (!configuration.enabled) return;\n const key = getMenuStableKey(menu);\n if (!key) return;\n const maximum = Number.isFinite(configuration.maxItems) && configuration.maxItems > 0 ? Math.floor(configuration.maxItems) : 5;\n const nextKeys = [key, ...this.recentKeys().filter(currentKey => currentKey !== key)].slice(0, maximum);\n this.recentKeys.set(nextKeys);\n this.#storage.writeRecentMenuKeys(nextKeys);\n }\n\n patchVersionState(version: 1 | 2 | 3, patch: SdLayoutVersionState): void {\n this.#storage.patchVersionState(version, patch);\n }\n\n versionState(version: 1 | 2 | 3): SdLayoutVersionState {\n return this.#storage.readVersionState(version);\n }\n}\n","import { InjectionToken, Injectable, inject, signal } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { resolveMaybeAsync } from '@sdcorejs/utils/models';\nimport { ISdLayoutConfiguration, ISdSidebarConfiguration, SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../configurations';\n\n/**\n * Bật fallback demo của `SdLayoutService` khi KHÔNG provide `SD_LAYOUT_CONFIGURATION`.\n *\n * why: fallback cũ chạy ngầm sau mỗi `console.warn`, nên một app cấu hình thiếu vẫn ship được UI có\n * user \"demo@example.com\" đang đăng nhập cùng nút signout không làm gì — người dùng cuối tin là đã\n * đăng nhập thật. Giờ mặc định là throw; ai thực sự cần demo/playground phải khai báo ý định:\n *\n * ```ts\n * providers: [{ provide: SD_LAYOUT_DEMO_FALLBACK, useValue: true }]\n * ```\n *\n * Cờ nằm ở token riêng chứ không phải field của `ISdLayoutConfiguration`, vì nó phải đọc được ĐÚNG\n * lúc `SD_LAYOUT_CONFIGURATION` vắng mặt — khi đó không có object configuration nào để đọc field.\n */\nexport const SD_LAYOUT_DEMO_FALLBACK = new InjectionToken<boolean>('sd.layout.demo-fallback');\n\n@Injectable({\n providedIn: 'root', // Có thể đổi thành 'any' hoặc khai báo trong mảng providers của LayoutModule tùy kiến trúc của bạn\n})\nexport class SdLayoutService {\n // ==========================================\n // INJECT CONFIGURATIONS\n // ==========================================\n // WHY: optional=true để service tự phát hiện consumer thiếu config và báo lỗi rõ ràng,\n // thay vì để Angular ném NullInjectorError khó đọc từ một component sâu trong cây.\n #layoutConfiguration = inject<ISdLayoutConfiguration | null>(SD_LAYOUT_CONFIGURATION, { optional: true });\n #demoFallback = inject(SD_LAYOUT_DEMO_FALLBACK, { optional: true }) ?? false;\n #i18n = inject(I18nService);\n\n // ==========================================\n // SHARED SIGNALS (STATE)\n // ==========================================\n userInfo = signal<SdLayoutUserInfo | undefined>(undefined);\n sidebar = signal<ISdSidebarConfiguration | undefined>(undefined);\n\n /**\n * Route \"về trang chủ\" của consumer, lấy từ `ISdLayoutConfiguration.homeUrl`.\n * why: các trang lỗi (forbidden / not-found) cần một đích điều hướng thật thay vì reload chính nó.\n */\n readonly homeUrl = this.#layoutConfiguration?.homeUrl?.trim() || '/';\n\n constructor() {\n if (!this.#layoutConfiguration) {\n if (!this.#demoFallback) {\n // why: fail loudly. Im lặng degrade sang mock user là ship ra production một UI nói dối\n // rằng người dùng đã đăng nhập (email demo, signout no-op).\n throw new Error(\n // @i18n-ignore dev-facing error — không cần dịch\n '[SdLayoutService] SD_LAYOUT_CONFIGURATION chưa được provide. ' +\n // @i18n-ignore\n 'Provide token này (xem ISdLayoutConfiguration) để cấu hình user info / sidebar / signout. ' +\n // @i18n-ignore\n 'Nếu đang chạy demo/playground và CHỦ ĐỘNG muốn mock data, provide SD_LAYOUT_DEMO_FALLBACK = true.'\n );\n }\n\n // WHY: chỉ chạy khi consumer chủ động opt-in demo fallback.\n // @i18n-ignore dev-facing console.warn — không cần dịch\n console.warn(\n // @i18n-ignore\n '[SdLayoutService] SD_LAYOUT_CONFIGURATION chưa được inject — đang dùng mock data qua SD_LAYOUT_DEMO_FALLBACK. ' +\n // @i18n-ignore\n 'Tuyệt đối không bật cờ này trên môi trường thật.'\n );\n this.userInfo.set(this.#mockUserInfo());\n this.sidebar.set(this.#mockSidebar());\n return;\n }\n this.#initUserInfo();\n this.#initSidebar();\n }\n\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n #initUserInfo(): void {\n const userInfoConfig = this.#layoutConfiguration!.userInfo;\n if (typeof userInfoConfig === 'function') {\n resolveMaybeAsync(userInfoConfig()).then(userInfo => this.userInfo.set(userInfo));\n } else {\n this.userInfo.set(userInfoConfig);\n }\n }\n\n #initSidebar(): void {\n const sidebarConfig = this.#layoutConfiguration!.sidebar;\n if (typeof sidebarConfig === 'function') {\n resolveMaybeAsync(sidebarConfig()).then(config => this.sidebar.set(config));\n } else {\n this.sidebar.set(sidebarConfig);\n }\n }\n\n #mockUserInfo(): SdLayoutUserInfo {\n return {\n fullName: this.#i18n.t('core.module.layout.mock.user.full-name'),\n email: 'demo@example.com',\n username: 'demo',\n };\n }\n\n #mockSidebar(): ISdSidebarConfiguration {\n return {\n version: 1,\n defaultTitle: 'Back Office',\n };\n }\n}\n","import { Utilities } from '@sdcorejs/utils/fns';\nimport { Injectable, Pipe, PipeTransform, inject } from '@angular/core';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdLayoutMenu, Menus } from '../services/menu/menu.model';\nimport { Params } from '@angular/router';\nimport { SdPermissionService } from '@sdcorejs/angular/modules/permission';\nimport { sdIsExternalHttpUrl, sdParseUrl } from '@sdcorejs/angular/utilities';\n// End\n@Pipe({\n name: 'menu',\n})\n@Injectable({\n providedIn: 'root',\n})\nexport class MenuPipe implements PipeTransform {\n private permissionService = inject(SdPermissionService);\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {}\n transform(menus: SdLayoutMenu[]): SdLayoutMenu[] {\n const results: Menus = [];\n const check = (menu: SdLayoutMenu): SdLayoutMenu | null => {\n if ('children' in menu) {\n const children: Menus = [];\n menu.children?.forEach(childMenu => {\n childMenu = check(childMenu) as SdLayoutMenu;\n if (childMenu) {\n children.push({ ...childMenu, id: this.#getHashIdMenu(childMenu) });\n }\n });\n\n if (!children.length) {\n return null;\n }\n\n return {\n ...menu,\n children,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if ('permission' in menu) {\n // why: code cũ là `const path = menu?.path?.includes('http') ? menu.path : menu.path` — hai\n // nhánh giống hệt nhau nên biến `path` không biến đổi gì, tức phần validate URL đã bị mất.\n // `path` chảy thẳng xuống `window.open()` / `routerLink` của sidebar, nên ở đây validate thật\n // và loại menu có scheme nguy hiểm (`javascript:`, `data:`, `vbscript:`…) — fail closed.\n // Không cần biến trung gian nữa: `path` đi kèm nguyên vẹn trong `{ ...menu }`.\n if (!menu.path || !this.#isSafeMenuPath(menu.path)) {\n return null;\n }\n\n if (\n (typeof menu.permission === 'string' || Array.isArray(menu.permission)) &&\n this.permissionService.hasPermission(menu.permission, menu.permissionKey)\n ) {\n return {\n ...menu,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if (typeof menu.permission === 'boolean' && menu.permission) {\n return {\n ...menu,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if (typeof menu.permission === 'function' && menu.permission()) {\n return {\n ...menu,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n return null;\n }\n\n // why: tới đây menu không có `children` và cũng KHÔNG có key `permission`. Nếu nó vẫn có `path`\n // thì đó là một menu lá điều hướng được, và việc gõ sai key (`permision`, `permissions`) sẽ\n // khiến item hiện với MỌI người — fail open. Chặn ở runtime (fail closed) thay vì siết type\n // `SdLayoutMenu`: menu thường được dựng động từ API/JSON rồi ép `as SdLayoutMenu[]`, nên siết\n // type không bắt được ca đó mà lại thành breaking change cho consumer đang build tĩnh.\n if ('path' in menu) {\n return null;\n }\n\n return {\n ...menu,\n id: Utilities.generateUuid(),\n };\n };\n\n menus?.forEach(menu => {\n menu = check(menu) as SdLayoutMenu;\n if (menu) {\n results.push(menu);\n }\n });\n return results;\n }\n\n /**\n * why: `sdParseUrl` không truyền base nên chỉ parse được URL TUYỆT ĐỐI. Không parse được ⇒ path\n * tương đối ⇒ route nội bộ của app, an toàn. Parse được thì scheme bắt buộc phải là `http(s)`;\n * mọi scheme khác bị loại vì `path` cuối cùng chảy vào `window.open()` của sidebar.\n */\n #isSafeMenuPath = (path: string): boolean => sdParseUrl(path) == null || sdIsExternalHttpUrl(path);\n\n #getHashIdMenu = (menu: SdLayoutMenu): string => {\n const explicitId = typeof menu.id === 'string' ? menu.id.trim() : '';\n if (explicitId) return explicitId;\n\n const extendedMenu = menu as SdLayoutMenu & {\n path?: string;\n permission?: string;\n permissionKey?: string;\n queryParams?: Params;\n };\n const hashKeys: (keyof typeof extendedMenu)[] = [\n 'title',\n 'path',\n 'permission',\n 'permissionKey',\n 'queryParams',\n 'icon',\n 'level',\n 'tooltipTitle',\n ];\n const hashData = hashKeys.reduce(\n (acc, key) => {\n const value = extendedMenu[key];\n if (value !== undefined && value !== null) {\n acc[key as string] = value;\n }\n return acc;\n },\n {} as Record<string, any>\n );\n\n return Object.keys(hashData).length > 0 ? Utilities.hash(hashData) : Utilities.generateUuid();\n };\n}\n","// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdLayoutMenu } from '../services/menu/menu.model';\n// End\n\n/** Thêm '/' ở cuối để so khớp theo segment: '/appointment' không khớp nhầm '/appointments'. */\nexport const normalizeMenuPath = (path: string): string => {\n return path.endsWith('/') ? path : path + '/';\n};\n\n/** Route hiện tại có nằm trong nhánh của `path` không (khớp chính xác hoặc khớp phần đầu). */\nexport const isMenuPathMatch = (routePath: string, path: string): boolean => {\n if (!routePath || !path) {\n return false;\n }\n if (routePath === path) {\n return true;\n }\n return normalizeMenuPath(routePath).startsWith(normalizeMenuPath(path));\n};\n\n/** Mọi path trong cây menu khớp với route hiện tại. */\nexport const collectMatchedMenuPaths = (menus: SdLayoutMenu[] | null | undefined, routePath: string): string[] => {\n const matched: string[] = [];\n const visit = (items: SdLayoutMenu[]): void => {\n for (const item of items) {\n if ('path' in item && isMenuPathMatch(routePath, item.path)) {\n matched.push(item.path);\n }\n if ('children' in item && item.children?.length) {\n visit(item.children);\n }\n }\n };\n visit(menus ?? []);\n return matched;\n};\n\n/**\n * Path khớp sát nhất với route hiện tại trong cả cây menu.\n * Khi cả '/appointment' và '/appointment/cs' cùng khớp route '/appointment/cs',\n * chỉ path dài nhất được coi là active — path còn lại không được highlight.\n * Hoà nhau thì lấy path xuất hiện trước theo thứ tự khai báo.\n */\nexport const resolveActiveMenuPath = (menus: SdLayoutMenu[] | null | undefined, routePath: string): string | null => {\n const matched = collectMatchedMenuPaths(menus, routePath);\n if (!matched.length) {\n return null;\n }\n return matched.reduce((best, path) => (normalizeMenuPath(path).length > normalizeMenuPath(best).length ? path : best));\n};\n\n/** Chính menu này, hoặc bất kỳ menu con nào ở mọi cấp, có đúng path đó. */\nexport const containsMenuPath = (menuItem: SdLayoutMenu, path: string): boolean => {\n if ('path' in menuItem && menuItem.path === path) {\n return true;\n }\n if ('children' in menuItem && menuItem.children?.length) {\n return menuItem.children.some(child => containsMenuPath(child, path));\n }\n return false;\n};\n","import { I18N_MESSAGES, I18N_STORAGE_KEY } from '@sdcorejs/angular/i18n';\nimport { Language } from '@sdcorejs/utils/models';\n\n/**\n * Resolve a translated tab name for `@SdTabComponent`.\n *\n * WHY not I18nService: the decorator runs at module-evaluation time, before\n * Angular's DI exists, so the service cannot be injected. We read the language\n * the app persisted and look the key up in the static catalog instead.\n */\nexport function resolveTabName(key: string): string {\n const lang = ((): Language => {\n try {\n const stored = localStorage.getItem(I18N_STORAGE_KEY) as Language | null;\n if (stored) return stored;\n } catch {\n // localStorage can throw (private mode, SSR shim) — fall back below.\n }\n return 'vi';\n })();\n\n return I18N_MESSAGES[lang]?.[key] ?? I18N_MESSAGES.vi[key] ?? key;\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdLayoutMenu } from '../services';\nimport { containsMenuPath, isMenuPathMatch } from '../utils';\n// End\n@Pipe({\n name: 'menuFocus',\n})\n@Injectable({ providedIn: 'root' })\nexport class MenuFocusPipe implements PipeTransform {\n /**\n * @param activeMenuPath Path khớp sát nhất với route hiện tại (xem `resolveActiveMenuPath`).\n * Truyền vào thì chỉ menu chứa đúng path đó mới focus, nên '/appointment' không sáng khi đang ở\n * '/appointment/cs'. Bỏ trống thì giữ cách khớp phần đầu cũ.\n */\n transform(routePath: string, menuItem: SdLayoutMenu, activeMenuPath?: string | null): boolean {\n if (!routePath) {\n return false;\n }\n if (activeMenuPath !== undefined) {\n return activeMenuPath ? containsMenuPath(menuItem, activeMenuPath) : false;\n }\n if ('children' in menuItem && menuItem.children) {\n return menuItem.children.some(child => {\n return 'path' in child && child.path ? isMenuPathMatch(routePath, child.path) : false;\n });\n }\n return 'path' in menuItem && isMenuPathMatch(routePath, menuItem.path);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\n@Pipe({\n name: 'highLightSearch',\n})\nexport class HighlightSearchPipe implements PipeTransform {\n transform(\n value: string,\n keyword: string,\n args?: {\n color?: string;\n }\n ): string {\n const { color = '#ffff00' } = args ?? {};\n keyword = this.#normalizeValue(keyword);\n if (!keyword || keyword.length < 2) {\n return value;\n }\n value = value?.trim() || '';\n const aliasKeyword = StringUtilities.changeAliasLowerCase(keyword);\n const aliasLowerCaseStr = StringUtilities.changeAliasLowerCase(value);\n\n // Ưu tiên highlight theo chuỗi con liền nhau (khớp trực tiếp với tiêu đề/route)\n const substringHighlight = this.#highlightSubstring(value, aliasLowerCaseStr, aliasKeyword, color);\n if (substringHighlight !== null) {\n return substringHighlight;\n }\n\n // Không có chuỗi con nào khớp -> thử highlight theo ký tự đầu (viết tắt), vd \"sp\" -> \"Sản phẩm\"\n return this.#highlightOrderedInitials(value, aliasLowerCaseStr, aliasKeyword, color) ?? value;\n }\n\n #highlightSubstring = (value: string, aliasLowerCaseStr: string, aliasKeyword: string, color: string): string | null => {\n const regex = new RegExp(aliasKeyword, 'gi'); //'gi' for case insensitive and can use 'g' if you want the search to be case sensitive.\n const strs: string[] = [];\n let previousOffset = 0;\n let hasMatch = false;\n aliasLowerCaseStr.replace(regex, (_, offset) => {\n hasMatch = true;\n strs.push(value.substring(previousOffset, offset));\n strs.push(`<mark style=\"background-color: ${color}\">${value.substring(offset, offset + aliasKeyword.length)}</mark>`);\n previousOffset = offset + aliasKeyword.length;\n return `<mark style=\"background-color: ${color}\">${value.substring(offset, offset + aliasKeyword.length)}</mark>`;\n });\n if (!hasMatch) {\n return null;\n }\n strs.push(value.substring(previousOffset, value.length));\n return strs.join('');\n };\n\n #highlightOrderedInitials = (value: string, aliasLowerCaseStr: string, aliasKeyword: string, color: string): string | null => {\n const wordRegex = /\\S+/g;\n const matchedPositions: number[] = [];\n let matchedCount = 0;\n let wordMatch: RegExpExecArray | null;\n while ((wordMatch = wordRegex.exec(aliasLowerCaseStr))) {\n if (matchedCount >= aliasKeyword.length) {\n break;\n }\n if (wordMatch[0][0] === aliasKeyword[matchedCount]) {\n matchedPositions.push(wordMatch.index);\n matchedCount++;\n }\n }\n if (matchedCount !== aliasKeyword.length) {\n return null;\n }\n\n let result = '';\n let cursor = 0;\n for (const position of matchedPositions) {\n result += value.substring(cursor, position);\n result += `<mark style=\"background-color: ${color}\">${value.charAt(position)}</mark>`;\n cursor = position + 1;\n }\n result += value.substring(cursor);\n return result;\n };\n\n #normalizeValue = (keyword: string) => {\n let str: string = keyword?.toString() ?? '';\n /* eslint-disable no-useless-escape */\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\n str = str.replace(/ + /g, ' ');\n str = str.trim();\n return str;\n };\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n isSignal,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdAvatar } from '@sdcorejs/angular/components';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { isObservable } from 'rxjs';\nimport {\n SD_LAYOUT_CONFIGURATION,\n SdLayoutAccountAction,\n SdLayoutNotificationConfiguration,\n SdLayoutUserInfo,\n} from '../../../configurations';\n\n@Component({\n selector: 'sd-layout-user-menu',\n standalone: true,\n imports: [SdAvatar, SdIcon, SdTranslatePipe],\n templateUrl: './user-menu.component.html',\n styleUrl: './user-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutUserMenuComponent {\n readonly #configuration = inject(SD_LAYOUT_CONFIGURATION, { optional: true });\n readonly #destroyRef = inject(DestroyRef);\n readonly #document = inject(DOCUMENT);\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n private readonly menu = viewChild<ElementRef<HTMLElement>>('menu');\n\n userInfo = input.required<SdLayoutUserInfo>();\n signout = input<SdLayoutAccountAction | undefined>();\n changePassword = input<SdLayoutAccountAction | undefined>();\n updateProfile = input<SdLayoutAccountAction | undefined>();\n setting = input<SdLayoutAccountAction | undefined>();\n notification = input<SdLayoutNotificationConfiguration | undefined>();\n compact = input(false);\n presentation = input<'disclosure' | 'mobile' | 'mobile-inline'>('disclosure');\n opened = output<void>();\n closed = output<void>();\n isOpen = signal(false);\n readonly #observableNotificationCount = signal<number | undefined>(undefined);\n\n avatar = computed(() => {\n const user = this.userInfo();\n return user.avatar || user.fullName || user.username || user.email;\n });\n displayName = computed(() => this.userInfo().fullName || this.userInfo().username || this.userInfo().email || 'User');\n role = computed(() => {\n const role = this.userInfo().role;\n const text = role?.text?.trim();\n return text ? { ...role, text } : undefined;\n });\n signoutAction = computed(() => this.signout() ?? this.#configuration?.signout);\n changePasswordAction = computed(() => this.changePassword() ?? this.#configuration?.changePassword);\n updateProfileAction = computed(() => this.updateProfile() ?? this.#configuration?.updateProfile);\n settingAction = computed(() => this.setting() ?? this.#configuration?.setting);\n notificationConfiguration = computed(() => this.notification() ?? this.#configuration?.notification);\n notificationAction = computed(() => this.notificationConfiguration()?.action);\n notificationCount = computed(() => {\n const source = this.notificationConfiguration()?.count;\n const value = isSignal(source) ? source() : isObservable(source) ? this.#observableNotificationCount() : source;\n return this.#normalizeNotificationCount(value);\n });\n notificationBadge = computed(() => {\n const count = this.notificationCount();\n return count > 99 ? '99+' : count > 0 ? String(count) : undefined;\n });\n\n constructor() {\n // Observable sources may change with component inputs; effect cleanup guarantees one active subscription.\n effect(onCleanup => {\n const source = this.notificationConfiguration()?.count;\n this.#observableNotificationCount.set(undefined);\n if (!isObservable(source)) return;\n\n const subscription = source.subscribe(value => this.#observableNotificationCount.set(value));\n onCleanup(() => subscription.unsubscribe());\n });\n\n effect(() => {\n if (!this.isOpen()) return;\n this.menu()?.nativeElement.querySelector<HTMLButtonElement>('[role=\"menuitem\"]')?.focus();\n });\n\n const onDocumentKeydown = (event: KeyboardEvent): void => {\n if (!this.isOpen() || event.key !== 'Escape') return;\n event.preventDefault();\n this.close();\n };\n const onDocumentPointerDown = (event: PointerEvent): void => {\n if (!this.isOpen()) return;\n const nodeConstructor = this.#document.defaultView?.Node;\n if (!nodeConstructor || !(event.target instanceof nodeConstructor) || this.#host.nativeElement.contains(event.target)) return;\n this.close(false);\n };\n\n this.#document.addEventListener('keydown', onDocumentKeydown);\n this.#document.addEventListener('pointerdown', onDocumentPointerDown);\n this.#destroyRef.onDestroy(() => {\n this.#document.removeEventListener('keydown', onDocumentKeydown);\n this.#document.removeEventListener('pointerdown', onDocumentPointerDown);\n });\n }\n\n open(): void {\n if (this.isOpen()) return;\n this.isOpen.set(true);\n this.opened.emit();\n }\n\n toggle(): void {\n if (this.isOpen()) this.close(false);\n else this.open();\n }\n\n close(restoreFocus = true): void {\n const wasOpen = this.isOpen();\n this.isOpen.set(false);\n if (wasOpen) this.closed.emit();\n if (restoreFocus) this.trigger()?.nativeElement.focus();\n }\n\n onMenuKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key) || !(event.currentTarget instanceof HTMLElement)) return;\n\n const actions = [...event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"menuitem\"]')];\n if (!actions.length) return;\n event.preventDefault();\n const currentIndex = actions.findIndex(action => action === this.#document.activeElement);\n const nextIndex =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? actions.length - 1\n : event.key === 'ArrowDown'\n ? (currentIndex + 1) % actions.length\n : (currentIndex - 1 + actions.length) % actions.length;\n actions[nextIndex].focus();\n }\n\n runChangePassword(): void {\n this.#runAction(this.changePasswordAction());\n }\n\n runSignout(): void {\n this.#runAction(this.signoutAction());\n }\n\n runUpdateProfile(): void {\n this.#runAction(this.updateProfileAction());\n }\n\n runSetting(): void {\n this.#runAction(this.settingAction());\n }\n\n runNotification(): void {\n this.#runAction(this.notificationAction());\n }\n\n #runAction(action: SdLayoutAccountAction | undefined): void {\n action?.();\n this.close();\n }\n\n #normalizeNotificationCount(value: number | undefined): number {\n return Number.isFinite(value) && Number(value) > 0 ? Math.floor(Number(value)) : 0;\n }\n}\n","@let _presentation = presentation();\n@let _role = role();\n@let _notificationBadge = notificationBadge();\n<div class=\"sd-layout-user-menu position-relative\">\n @if (_presentation !== 'disclosure') {\n <div class=\"sd-layout-user-menu__mobile d-flex flex-column gap-8\">\n <div\n data-mobile-account-row\n class=\"sd-layout-user-menu__mobile-row sd-layout-user-menu__mobile--inline d-flex align-items-center gap-8\">\n <div data-user-summary class=\"sd-layout-user-menu__summary d-flex align-items-center gap-8 flex-1\">\n <sd-avatar [src]=\"avatar()\" [size]=\"40\"></sd-avatar>\n <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n @if (userInfo().email) {\n <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n }\n @if (_role) {\n <span\n data-user-role\n class=\"sd-layout-user-menu__role d-flex align-items-center gap-4 T12R text-ellipsis\"\n [style.color]=\"_role.color\">\n @if (_role.icon) {\n <sd-icon [name]=\"_role.icon\"></sd-icon>\n }\n {{ _role.text }}\n </span>\n }\n </span>\n </div>\n @if (signoutAction()) {\n <button\n type=\"button\"\n data-user-action=\"signout\"\n class=\"sd-layout-user-menu__action sd-layout-user-menu__signout d-flex align-items-center gap-8 px-8 py-8 T14R text-left text-error\"\n (click)=\"runSignout()\">\n <sd-icon name=\"logout\"></sd-icon>\n {{ 'core.module.layout.user.logout' | sdTranslate }}\n </button>\n }\n </div>\n\n @if (updateProfileAction() || settingAction() || notificationAction() || changePasswordAction()) {\n <div data-mobile-account-actions class=\"sd-layout-user-menu__mobile-actions d-flex flex-column gap-4\">\n @if (updateProfileAction()) {\n <button\n type=\"button\"\n data-user-action=\"update-profile\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runUpdateProfile()\">\n <sd-icon name=\"edit\"></sd-icon>\n {{ 'core.module.layout.user.update-profile' | sdTranslate }}\n </button>\n }\n @if (settingAction()) {\n <button\n type=\"button\"\n data-user-action=\"setting\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runSetting()\">\n <sd-icon name=\"settings\"></sd-icon>\n {{ 'core.module.layout.user.setting' | sdTranslate }}\n </button>\n }\n @if (notificationAction()) {\n <button\n type=\"button\"\n data-user-action=\"notification\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runNotification()\">\n <sd-icon name=\"notifications\"></sd-icon>\n <span class=\"flex-1\">{{ 'core.module.layout.user.notification' | sdTranslate }}</span>\n @if (_notificationBadge) {\n <span data-notification-badge class=\"sd-layout-user-menu__badge\">{{ _notificationBadge }}</span>\n }\n </button>\n }\n @if (changePasswordAction()) {\n <button\n type=\"button\"\n data-user-action=\"change-password\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runChangePassword()\">\n <sd-icon name=\"lock\"></sd-icon>\n {{ 'core.module.layout.user.change-password' | sdTranslate }}\n </button>\n }\n </div>\n }\n </div>\n } @else {\n <button\n #trigger\n type=\"button\"\n data-user-trigger\n class=\"sd-layout-user-menu__trigger d-flex align-items-center text-left\"\n [class.sd-layout-user-menu__trigger--compact]=\"compact()\"\n [class.w-full]=\"!compact()\"\n [class.gap-8]=\"!compact()\"\n [class.w-56]=\"compact()\"\n [class.gap-0]=\"compact()\"\n aria-haspopup=\"menu\"\n [attr.aria-label]=\"compact() ? displayName() : null\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"toggle()\">\n <sd-avatar [src]=\"avatar()\" [size]=\"compact() ? 32 : 40\"></sd-avatar>\n @if (!compact()) {\n <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n @if (userInfo().email) {\n <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n }\n </span>\n <sd-icon [name]=\"isOpen() ? 'expand_less' : 'expand_more'\"></sd-icon>\n }\n </button>\n\n @if (isOpen()) {\n <div\n #menu\n data-user-menu\n class=\"sd-layout-user-menu__popup d-flex flex-column gap-4 p-8 bg-white border border-black200 rounded-8 mat-elevation-z4\"\n role=\"menu\"\n tabindex=\"-1\"\n (keydown)=\"onMenuKeydown($event)\">\n <div data-user-identity class=\"sd-layout-user-menu__identity d-flex align-items-center gap-8 px-8 py-4\">\n <sd-avatar [src]=\"avatar()\" [size]=\"40\"></sd-avatar>\n <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n @if (userInfo().email) {\n <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n }\n @if (_role) {\n <span\n data-user-role\n class=\"sd-layout-user-menu__role d-flex align-items-center gap-4 T12R text-ellipsis\"\n [style.color]=\"_role.color\">\n @if (_role.icon) {\n <sd-icon [name]=\"_role.icon\"></sd-icon>\n }\n {{ _role.text }}\n </span>\n }\n </span>\n </div>\n @if (updateProfileAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"update-profile\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runUpdateProfile()\">\n <sd-icon name=\"edit\"></sd-icon>\n {{ 'core.module.layout.user.update-profile' | sdTranslate }}\n </button>\n }\n @if (settingAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"setting\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runSetting()\">\n <sd-icon name=\"settings\"></sd-icon>\n {{ 'core.module.layout.user.setting' | sdTranslate }}\n </button>\n }\n @if (notificationAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"notification\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runNotification()\">\n <sd-icon name=\"notifications\"></sd-icon>\n <span class=\"flex-1\">{{ 'core.module.layout.user.notification' | sdTranslate }}</span>\n @if (_notificationBadge) {\n <span data-notification-badge class=\"sd-layout-user-menu__badge\">{{ _notificationBadge }}</span>\n }\n </button>\n }\n @if (changePasswordAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"change-password\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runChangePassword()\">\n <sd-icon name=\"lock\"></sd-icon>\n {{ 'core.module.layout.user.change-password' | sdTranslate }}\n </button>\n }\n @if (signoutAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"signout\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left text-error\"\n (click)=\"runSignout()\">\n <sd-icon name=\"logout\"></sd-icon>\n {{ 'core.module.layout.user.logout' | sdTranslate }}\n </button>\n }\n </div>\n }\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo } from '../../../../configurations';\nimport { SdLayoutUserMenuComponent } from '../../../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'lib-layout-user',\n templateUrl: './user.component.html',\n styleUrl: './user.component.scss',\n imports: [SdIcon, SdLayoutUserMenuComponent, SdTranslatePipe],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LayoutUserComponent {\n isMobileOrTablet = input<boolean>(false);\n isMenuLock = input<boolean>(false);\n isShowSidebar = input<boolean>(false);\n userInfo = input.required<SdLayoutUserInfo>();\n\n menuClosed = output<void>();\n menuOpened = output<void>();\n toggleMenuLock = output<Event>();\n\n onMenuOpened(): void {\n this.menuOpened.emit();\n }\n\n onMenuClosed(): void {\n this.menuClosed.emit();\n }\n\n onToggleMenuLock(event: Event): void {\n this.toggleMenuLock.emit(event);\n }\n}\n","<div class=\"c-layout-user-wrapper\">\n <sd-layout-user-menu\n class=\"c-layout-user-avatar\"\n [userInfo]=\"userInfo()\"\n [compact]=\"true\"\n (opened)=\"onMenuOpened()\"\n (closed)=\"onMenuClosed()\"></sd-layout-user-menu>\n\n @if (!isMobileOrTablet()) {\n <button\n type=\"button\"\n class=\"c-layout-icon-toggle\"\n [attr.aria-label]=\"'core.module.layout.sidebar.toggle' | sdTranslate\"\n (click)=\"onToggleMenuLock($event)\">\n <sd-icon [name]=\"isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left'\"></sd-icon>\n </button>\n }\n</div>\n","import { NestedTreeControl } from '@angular/cdk/tree';\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree';\nimport { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\n\nimport { SdInput, SdSuffixDefDirective } from '@sdcorejs/angular/forms';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdSafeHtmlPipe } from '@sdcorejs/angular/pipes';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\nimport { HighlightSearchPipe, MenuFocusPipe } from '../../../../pipes';\nimport { SdLayoutChildrenMenu, SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutStorageService } from '../../../../services';\nimport { resolveActiveMenuPath } from '../../../../utils';\nimport { LayoutUserComponent } from '../user/user.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-sidebar-v1-panel',\n standalone: true,\n imports: [\n SdIcon,\n SdInput,\n FormsModule,\n CommonModule,\n RouterModule,\n MatTreeModule,\n SdSafeHtmlPipe,\n MatInputModule,\n MenuFocusPipe,\n MatTooltipModule,\n HighlightSearchPipe,\n SdSuffixDefDirective,\n LayoutUserComponent,\n SdTranslatePipe,\n ],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarV1Panel {\n // ==========================================\n // INJECT SERVICES (Thay thế Constructor rườm rà)\n // ==========================================\n #router = inject(Router);\n #layoutStorageService = inject(SdLayoutStorageService);\n #navigationState = inject(SdLayoutNavigationStateService);\n #menuFocusPipe = inject(MenuFocusPipe);\n #i18n = inject(I18nService);\n #window = inject(DOCUMENT).defaultView;\n #destroyRef = inject(DestroyRef); // Dùng để unsubscribe RxJS tự động\n\n // ==========================================\n // SIGNAL INPUTS & OUTPUTS\n // ==========================================\n isShowSidebar = input.required<boolean>();\n menus = input.required<SdLayoutMenu[]>();\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n isMobile = input(false);\n expandSideBar = output<void>();\n popupUserMenuClosed = output<void>();\n popupUserMenuOpened = output<void>();\n showSideBar = output<boolean | null>();\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\n currentPath = signal<string>(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\n searchText = signal<string>('');\n titleMenuGroup = signal<string | undefined>('');\n idMenuGroupActive = signal<string | undefined>('');\n menusByGroup = signal<SdLayoutMenu[]>([]);\n #hoveredMenuNodeKey = signal<string | null>(null);\n #pinIconHoverTimerId = signal<ReturnType<typeof setTimeout> | null>(null);\n // why: `title` của nhóm ghim là nhãn HIỂN THỊ (đổ vào `titleMenuGroup` trên header), không phải\n // id — phải dịch. Tính trong computed nên đổi ngôn ngữ là tiêu đề nhóm đổi theo.\n pinnedMenuGroup = computed<SdLayoutChildrenMenu>(() => ({\n id: 'pinned-menu-group',\n title: this.#i18n.t('core.module.layout.sidebar.pinned'),\n children: this.#navigationState.pinnedMenus(),\n }));\n\n // ==========================================\n // COMPUTED STATE\n // ==========================================\n totalMenuInMenusByGroup = computed(() => this.#getTotalMenus(this.menusByGroup()));\n logoUrl = computed(() => this.sidebar().logoUrl?.trim() || undefined);\n pinnedNodeKeys = computed(() => new Set(this.pinnedMenuGroup().children?.map(m => this.#getMenuNodeKey(m)) ?? []));\n isPinnedMenuGroupActive = computed(() => this.idMenuGroupActive() === this.pinnedMenuGroup().id);\n // Path khớp sát nhất trong nhánh menu đang hiển thị. Nhờ nó '/appointment' hết sáng khi đang ở '/appointment/cs'.\n activeMenuPath = computed(() => resolveActiveMenuPath(this.menusByGroup(), this.currentPath()));\n\n // ==========================================\n // DATA STRUCTURES\n // ==========================================\n #pinIconHoverTimerDelay = 300;\n #isFirstBindingMenu = signal<boolean>(true);\n dataSource = new MatTreeNestedDataSource<SdLayoutMenu>();\n treeControl = new NestedTreeControl<SdLayoutMenu>(node => ('children' in node && node.children?.length ? node.children : []));\n\n constructor() {\n this.#setupEffects();\n this.#setupSubscriptions();\n }\n\n #setupEffects(): void {\n effect(() => {\n const currentMenus = this.menus();\n untracked(() => {\n this.#navigationState.hydrate(currentMenus);\n const lastActiveMenuGroupId = this.#layoutStorageService.lastActiveMenuGroupId.get();\n const pinnedGroup = this.pinnedMenuGroup();\n const isPinEnabled = this.sidebar()?.pin?.enabled;\n // Xử lý khi lần đầu vào web (nếu chưa có active group)\n if (!lastActiveMenuGroupId || (lastActiveMenuGroupId === pinnedGroup?.id && !isPinEnabled)) {\n // Ưu tiên pinnedGroup nếu đủ điều kiện, còn không lấy menu đầu tiền dev khai báo\n const targetId = isPinEnabled && pinnedGroup?.children?.length ? pinnedGroup?.id : currentMenus?.[0]?.id;\n this.#layoutStorageService.lastActiveMenuGroupId.set(targetId ?? '');\n }\n\n this.#bindingMenuGroupByCurrentPath(currentMenus);\n this.#isFirstBindingMenu.set(false);\n });\n });\n }\n\n #setupSubscriptions(): void {\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (event instanceof NavigationEnd) {\n const currentPath = event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '';\n if (this.currentPath() !== currentPath) {\n this.currentPath.set(currentPath);\n this.#bindingMenuGroupByCurrentPath(this.menus());\n }\n }\n });\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n hasChild = (_: number, node: SdLayoutMenu): boolean => 'children' in node && !!node.children?.length;\n\n onToggleMenuNode = (menu: SdLayoutMenu): void => {\n this.treeControl.toggle(menu);\n };\n\n menuNodeHref = (node: { path: string; queryParams?: Params }): string => {\n if (sdIsExternalHttpUrl(node.path)) return node.path;\n return this.#router.serializeUrl(\n this.#router.createUrlTree([node.path.split('?')[0]], {\n queryParams: node.queryParams ?? {},\n })\n );\n };\n\n onMenuNodeClick = (event: MouseEvent, node: { path: string; queryParams?: Params }): void => {\n event.preventDefault();\n this.navigate({ path: node.path, queryParams: node.queryParams ?? {} });\n };\n\n // why: giữ public keyboard handler cũ để không làm thay đổi declaration API.\n onMenuNodeKeydown = (event: KeyboardEvent, node: { path: string; queryParams: Params }): void => {\n if (event.target !== event.currentTarget) return;\n // why: chặn Space cuộn trang.\n event.preventDefault();\n this.navigate({ path: node.path, queryParams: node.queryParams ?? {} });\n };\n\n // why: giữ public keyboard handler cũ; native branch button now owns keyboard activation.\n onToggleMenuNodeKeydown = (event: KeyboardEvent, menu: SdLayoutMenu): void => {\n if (event.target !== event.currentTarget) return;\n event.preventDefault();\n this.onToggleMenuNode(menu);\n };\n\n isPinnedNode = (node: SdLayoutMenu): boolean => this.pinnedNodeKeys().has(this.#getMenuNodeKey(node));\n isHoveredNode = (node: SdLayoutMenu): boolean => this.#hoveredMenuNodeKey() === this.#getMenuNodeKey(node);\n\n expandPinnedGroup = (): void => {\n const group = this.pinnedMenuGroup();\n this.idMenuGroupActive.set(group.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(group.id || '');\n this.titleMenuGroup.set(group.title);\n this.#setMenusByGroup(group.children ?? []);\n this.searchText.set('');\n this.expandSideBar.emit();\n };\n\n onTogglePin = (event: MouseEvent, node: SdLayoutMenu): void => {\n event.stopPropagation();\n this.#navigationState.togglePinned(node);\n };\n\n #onExpandAllMenuNodes = (menus: SdLayoutMenu[]): void => {\n menus?.forEach(menu => {\n this.treeControl.expand(menu);\n if ('children' in menu && menu.children?.length) {\n this.#onExpandAllMenuNodes(menu.children);\n }\n });\n };\n\n #onCollapseAllMenuNodes = (menus: SdLayoutMenu[]): void => {\n menus?.forEach(menu => {\n this.treeControl.collapse(menu);\n if ('children' in menu && menu.children?.length) {\n this.#onCollapseAllMenuNodes(menu.children);\n }\n });\n };\n\n toggleMenuLock(event: Event): void {\n event.stopPropagation();\n this.isMenuLock.update(v => !v);\n this.#layoutStorageService.menuLockStatus?.set(this.isMenuLock());\n this.showSideBar.emit(this.isMenuLock());\n }\n\n openHomePage = (): void => {\n this.#router.navigateByUrl('/layout/home');\n this.searchText.set('');\n this.#layoutStorageService.lastActiveMenuGroupId.set('');\n };\n\n onUserMenuClosed = (): void => this.popupUserMenuClosed.emit();\n\n onUserMenuOpened = (): void => this.popupUserMenuOpened.emit();\n\n navigate = (args: { path: string; queryParams: Params }): void => {\n const { path, queryParams } = args;\n // why: `path.includes('http')` là substring test chứ không phải scheme test — chuỗi\n // `javascript:fetch(...)//http` lọt qua rồi chạy như script trong chính origin của app.\n // `sdIsExternalHttpUrl` parse URL thật, `sdOpenExternal` từ chối scheme lạ và luôn gắn\n // `noopener,noreferrer` (chặn reverse tabnabbing qua `window.opener`).\n if (sdIsExternalHttpUrl(path)) {\n sdOpenExternal(path);\n return;\n }\n this.#router.navigate([path.split('?')[0]], {\n queryParams,\n state: { switchTab: true },\n });\n\n if (this.isMobile()) {\n this.#closeMenu();\n }\n };\n\n onFilterSearchText = (event: string): void => {\n this.searchText.set(event);\n this.#filterMenuBySearchText(this.menusByGroup());\n };\n\n onClearSearchText = (): void => {\n this.searchText.set('');\n this.#filterMenuBySearchText(this.menusByGroup());\n };\n\n expandMenuGroup = (menuGroupNode: SdLayoutMenu): void => {\n this.titleMenuGroup.set(menuGroupNode?.tooltipTitle || menuGroupNode?.title);\n\n // Case 1: Menu không có children\n if (!('children' in menuGroupNode && menuGroupNode.children?.length)) {\n if ('path' in menuGroupNode) {\n this.navigate({ path: menuGroupNode.path, queryParams: menuGroupNode?.queryParams ?? {} });\n return;\n }\n }\n\n // Case 2: Menu có children\n if ('children' in menuGroupNode && menuGroupNode.children?.length) {\n this.#setMenusByGroup(menuGroupNode.children);\n this.searchText.set('');\n this.onFilterSearchText('');\n this.expandSideBar.emit();\n }\n\n this.idMenuGroupActive.set(menuGroupNode?.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(menuGroupNode?.id || '');\n if (!this.currentPath()) {\n this.currentPath.set(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\n }\n };\n\n // ==========================================\n // CỤM HOVER MENU GROUP & NODE\n // ==========================================\n onMouseOverMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\n if (this.idMenuGroupActive() !== menuNode?.id) {\n const menuGroup = event.currentTarget as HTMLElement;\n const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\n const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\n\n if (menuGroupIcon) {\n menuGroupIcon.style.transition = 'all 0.15s';\n menuGroupIcon.style.backgroundColor =\n brandLightColorOpacity || 'color-mix(in srgb, var(--sd-primary-light, #d7e3ff) 60%, transparent)';\n if (!(menuGroupIcon instanceof HTMLImageElement)) {\n menuGroupIcon.style.color = this.sidebar()?.brandColor || 'var(--sd-primary, #005cbb)';\n }\n }\n }\n };\n\n onMouseLeaveMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\n if (this.idMenuGroupActive() !== menuNode?.id) {\n const menuGroup = event.currentTarget as HTMLElement;\n const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\n\n if (menuGroupIcon) {\n menuGroupIcon.style.transition = 'all 0.15s';\n menuGroupIcon.style.backgroundColor = 'transparent';\n if (menuGroupIcon instanceof HTMLImageElement) {\n menuGroupIcon.style.opacity = '0.55';\n } else {\n menuGroupIcon.style.color = 'var(--sd-text-secondary, #44474f)';\n }\n }\n }\n };\n\n onMouseOverMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\n const menuNode = event.currentTarget as HTMLElement;\n const brandColor = this.sidebar()?.brandColor || 'var(--sd-primary, #005cbb)';\n\n // Nếu có bật config pin menu\n if (this.sidebar()?.pin?.enabled) {\n const iconPin = menuNode.querySelector('.c-menu-node-description-icon-pin') as HTMLElement;\n if (iconPin) {\n if (this.#pinIconHoverTimerId()) {\n clearTimeout(this.#pinIconHoverTimerId()!);\n this.#pinIconHoverTimerId.set(null);\n }\n\n this.#pinIconHoverTimerId.set(\n setTimeout(() => {\n this.#hoveredMenuNodeKey.set(this.#getMenuNodeKey(menuItem));\n iconPin.style.color = brandColor;\n iconPin.style.transition = 'all 0.15s';\n iconPin.style.opacity = '1';\n this.#pinIconHoverTimerId.set(null);\n }, this.#pinIconHoverTimerDelay)\n );\n }\n }\n\n if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem, this.activeMenuPath())) {\n const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\n const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\n const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\n const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\n\n if (menuNode) {\n menuNode.style.transition = 'all 0.15s';\n menuNode.style.backgroundColor = brandLightColorOpacity || 'rgba(248, 249, 250, 0.6)';\n\n if (iconMenu) {\n iconMenu.style.transition = 'all 0.15s';\n iconMenu.style.color = brandColor;\n }\n if (content) {\n content.style.transition = 'all 0.15s';\n content.style.color = brandColor;\n }\n if (iconExpand) {\n iconExpand.style.transition = 'all 0.15s';\n iconExpand.style.color = brandColor;\n }\n }\n }\n };\n\n onMouseLeaveMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\n const menuNode = event.currentTarget as HTMLElement;\n\n // Nếu có bật config pin menu\n if (this.sidebar()?.pin?.enabled) {\n const iconPin = menuNode.querySelector('.c-menu-node-description-icon-pin') as HTMLElement;\n if (iconPin) {\n if (this.#pinIconHoverTimerId()) {\n clearTimeout(this.#pinIconHoverTimerId()!);\n this.#pinIconHoverTimerId.set(null);\n }\n this.#hoveredMenuNodeKey.set(null);\n\n iconPin.style.transition = 'all 0.15s';\n if (!this.isPinnedNode(menuItem)) {\n iconPin.style.color = '#8C8C8C';\n iconPin.style.opacity = '0';\n }\n }\n }\n\n if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem, this.activeMenuPath())) {\n const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\n const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\n const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\n\n if (menuNode) {\n menuNode.style.transition = 'all 0.15s';\n menuNode.style.backgroundColor = 'transparent';\n\n if (iconMenu) {\n iconMenu.style.transition = 'all 0.15s';\n iconMenu.style.color = '#8C8C8C';\n }\n if (content) {\n content.style.transition = 'all 0.15s';\n content.style.color = '#1F1F1F';\n }\n if (iconExpand) {\n iconExpand.style.transition = 'all 0.15s';\n iconExpand.style.color = '#8C8C8C';\n }\n }\n }\n };\n\n // ==========================================\n // PRIVATE LOGIC\n // ==========================================\n #setMenusByGroup = (menus: SdLayoutMenu[]): void => {\n this.menusByGroup.set(menus);\n this.dataSource.data = menus;\n };\n\n #getMenuNodeKey = (node: SdLayoutMenu): string => {\n if (node?.id) {\n return node.id;\n }\n if ('path' in node && node.path) {\n return node.path;\n }\n\n return node.title || '';\n };\n\n #getMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): SdLayoutMenu[] => {\n const activePath = resolveActiveMenuPath(menus, this.currentPath());\n if (!activePath) {\n return [];\n }\n const menuGroup = this.#findMenuGroupByPath(menus, activePath);\n return menuGroup ? [menuGroup] : [];\n };\n\n #findMenuGroupByPath = (menus: SdLayoutMenu[], activePath: string, menuGroup?: SdLayoutMenu): SdLayoutMenu | null => {\n for (const menu of menus) {\n if ('path' in menu && menu.path === activePath) {\n return menuGroup ?? menu;\n }\n if ('children' in menu && menu.children?.length) {\n const result = this.#findMenuGroupByPath(menu.children, activePath, menuGroup ?? menu);\n if (result) {\n return result;\n }\n }\n }\n return null;\n };\n\n #bindingMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): void => {\n // Chỉ bindingGroup mới khi người dùng không searchText\n if (!this.#getValidSearchText()) {\n const pinnedChildren = this.pinnedMenuGroup()?.children ?? [];\n\n // Ưu tiên: Current path khớp với item trong pinMenuGroup thì lần đầu vào trang sẽ hiện pinnedMenuGroup\n const isPinnedPathMatchValid =\n this.sidebar()?.pin?.enabled &&\n pinnedChildren?.length &&\n this.#getMenuGroupByCurrentPath(pinnedChildren)?.length &&\n this.#isFirstBindingMenu() &&\n this.idMenuGroupActive() !== this.pinnedMenuGroup()?.id;\n\n if (isPinnedPathMatchValid) {\n const pinned = this.pinnedMenuGroup();\n this.idMenuGroupActive.set(pinned.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(pinned.id ?? '');\n this.titleMenuGroup.set(pinned.title);\n this.#setMenusByGroup(pinnedChildren);\n this.#expandParentNodesByCurrentPath(pinnedChildren);\n return;\n }\n\n let menuGroupByPath = this.#getMenuGroupByCurrentPath(menus);\n // Nếu không tìm được path nào khớp với menu\n if (!menuGroupByPath?.length) {\n const lastActiveId = this.#layoutStorageService.lastActiveMenuGroupId.get() || '';\n // Nếu có pinned group thì hiện mậc định là pinnedMenuGroup\n if (this.sidebar()?.pin?.enabled && lastActiveId === this.pinnedMenuGroup()?.id && pinnedChildren?.length) {\n const pinned = this.pinnedMenuGroup();\n this.idMenuGroupActive.set(pinned.id);\n this.titleMenuGroup.set(pinned.title);\n this.#setMenusByGroup(pinnedChildren);\n this.#expandParentNodesByCurrentPath(pinnedChildren);\n return;\n }\n // Nếu không có pinnedMenuGroup thì menuGroup lấy từ thao tác cuối cùng của người dùng\n menuGroupByPath = this.menus()?.filter(menu => menu?.id === lastActiveId) || [];\n }\n\n // Kiểm tra lại menuGroupPath đã thực sự tìm được chưa?\n if (menuGroupByPath?.length) {\n // Nếu user đang ở pinedGroup và curentPath có chứa trong pinnedMenuGroup thì return luôn, không chuyển sang menuGroup mới\n if (\n this.sidebar()?.pin?.enabled &&\n this.idMenuGroupActive() === this.pinnedMenuGroup()?.id &&\n this.#getMenuGroupByCurrentPath(pinnedChildren)?.length\n ) {\n return;\n } else {\n const matchedGroup = menuGroupByPath[0];\n this.idMenuGroupActive.set(matchedGroup?.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(matchedGroup?.id || '');\n this.titleMenuGroup.set(matchedGroup?.tooltipTitle || matchedGroup?.title);\n\n if ('children' in matchedGroup && matchedGroup.children?.length) {\n this.menusByGroup.set(matchedGroup.children);\n this.#expandParentNodesByCurrentPath(this.menusByGroup());\n } else {\n this.menusByGroup.set([]);\n }\n }\n } else {\n this.idMenuGroupActive.set('');\n this.titleMenuGroup.set('');\n this.menusByGroup.set([]);\n }\n\n this.dataSource.data = this.menusByGroup();\n }\n };\n\n #expandParentNodesByCurrentPath(menus: SdLayoutMenu[]): boolean {\n const activePath = resolveActiveMenuPath(menus, this.currentPath());\n return activePath ? this.#expandParentNodesByPath(menus, activePath) : false;\n }\n\n #expandParentNodesByPath(menus: SdLayoutMenu[], activePath: string): boolean {\n let shouldPropagate = false;\n for (const menu of menus) {\n if ('path' in menu && menu.path === activePath) {\n shouldPropagate = true;\n }\n if ('children' in menu && menu.children?.length) {\n const childHasMatch = this.#expandParentNodesByPath(menu.children, activePath);\n if (childHasMatch) {\n this.treeControl.expand(menu);\n shouldPropagate = true;\n }\n }\n }\n return shouldPropagate;\n }\n\n #filterMenuBySearchText = (menus: SdLayoutMenu[]): void => {\n const validSearchText = this.#getValidSearchText();\n if (!validSearchText) {\n this.dataSource.data = menus;\n this.#onCollapseAllMenuNodes(menus);\n this.#expandParentNodesByCurrentPath(menus);\n } else {\n const aliasSearchText = StringUtilities.changeAliasLowerCase(validSearchText);\n this.dataSource.data = this.#getMenuByAliasSearchText(menus, aliasSearchText);\n if (this.dataSource.data?.length) {\n this.#onExpandAllMenuNodes(this.dataSource.data);\n }\n }\n };\n\n #getMenuByAliasSearchText = (menus: SdLayoutMenu[], aliasSearchText: string): SdLayoutMenu[] => {\n const result: SdLayoutMenu[] = [];\n for (const menu of menus) {\n const aliasTitle = StringUtilities.changeAliasLowerCase(menu.title as string);\n // why: hỗ trợ search theo route (path) và search theo ký tự đầu (viết tắt) bên cạnh search theo tiêu đề\n const matchByRoutePath = 'path' in menu && !!menu.path && menu.path.toLowerCase().includes(aliasSearchText);\n const matchByInitials = this.#matchesTitleInitials(aliasTitle, aliasSearchText);\n\n if (aliasTitle.includes(aliasSearchText) || matchByRoutePath || matchByInitials) {\n result.push(menu);\n continue;\n }\n\n let matchedChildren: SdLayoutMenu[] = [];\n if ('children' in menu && menu.children?.length) {\n matchedChildren = this.#getMenuByAliasSearchText(menu.children, aliasSearchText);\n }\n\n if (matchedChildren?.length) {\n result.push({ ...menu, children: matchedChildren });\n }\n }\n return result;\n };\n\n #matchesTitleInitials = (aliasTitle: string, aliasSearchText: string): boolean => {\n const initials = aliasTitle\n .split(' ')\n .filter(word => word)\n .map(word => word[0])\n .join('');\n return this.#isOrderedSubsequence(aliasSearchText, initials);\n };\n\n #isOrderedSubsequence = (needle: string, haystack: string): boolean => {\n let matchedCount = 0;\n for (const char of haystack) {\n if (char === needle[matchedCount]) {\n matchedCount++;\n }\n }\n return matchedCount === needle.length;\n };\n\n #closeMenu(): void {\n this.showSideBar.emit(null);\n }\n\n #convertColor = (input: string | undefined, opacity = 1): string => {\n if (!input) {\n return '';\n }\n\n input = input.trim();\n const hexRegex = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\n const rgbRegex = /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/i;\n\n if (hexRegex.test(input)) {\n let hex = input.slice(1);\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map(c => c + c)\n .join('');\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n\n const rgbMatch = input.match(rgbRegex);\n if (rgbMatch) {\n const [_, r, g, b] = rgbMatch;\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n\n return input;\n };\n\n #getValidSearchText = (): string => {\n const normalized = this.#normalizeSearchText(this.searchText());\n return normalized && normalized.length >= 2 ? normalized : '';\n };\n\n #normalizeSearchText = (searchText: string) => {\n let str: string = searchText?.toString() ?? '';\n /* eslint-disable no-useless-escape */\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\n str = str.replace(/ + /g, ' ');\n return str.trim();\n };\n\n #getTotalMenus = (menus: SdLayoutMenu[]): number => {\n return menus.reduce((total, menu) => total + this.#countMenuNode(menu), 0);\n };\n\n #countMenuNode = (menu: SdLayoutMenu): number => {\n if (!('children' in menu) || !menu.children?.length) {\n return 1;\n }\n\n let count = 1;\n for (const child of menu.children) {\n count += this.#countMenuNode(child);\n }\n return count;\n };\n}\n","@let _userInfo = userInfo();\n@let _sidebar = sidebar();\n\n@if (_userInfo && _sidebar) {\n <div class=\"wrapper\" [style.height]=\"isMobile() ? '100dvh' : '100%'\">\n <div class=\"c-header\">\n <div class=\"c-logo\">\n <a\n href=\"/layout/home\"\n [attr.aria-label]=\"'core.module.layout.home.tab-name' | sdTranslate\"\n (click)=\"$event.preventDefault(); openHomePage()\">\n @if (logoUrl(); as _logoUrl) {\n <img alt=\"\" [src]=\"_logoUrl\" />\n } @else {\n <sd-icon name=\"apps\"></sd-icon>\n }\n </a>\n </div>\n <div class=\"c-title-menu-group\" [class.d-none]=\"!isShowSidebar()\">\n <span>{{ titleMenuGroup() || _sidebar.defaultTitle || 'Back Office' }}</span>\n </div>\n </div>\n <div class=\"c-body\">\n <div class=\"c-menu\">\n <div class=\"c-menu-group\">\n @if (_sidebar?.pin?.enabled && pinnedMenuGroup().children?.length) {\n <button\n type=\"button\"\n [attr.aria-label]=\"'core.module.layout.sidebar.pinned' | sdTranslate\"\n (mouseenter)=\"onMouseOverMenuGroupNode($event, pinnedMenuGroup())\"\n (mouseleave)=\"onMouseLeaveMenuGroupNode($event, pinnedMenuGroup())\"\n (click)=\"expandPinnedGroup()\"\n [matTooltip]=\"'core.module.layout.sidebar.pinned' | sdTranslate\"\n [matTooltipClass]=\"'c-tooltip-menu-group-7a22ab15-0083-4d4c-9c0c-00a30bc8c140'\"\n [matTooltipPosition]=\"'right'\"\n style=\"padding: 0; margin: 0; border: none; background-color: transparent\">\n <sd-icon\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n color: isPinnedMenuGroupActive()\n ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n : 'var(--sd-text-secondary, #44474f)',\n backgroundColor: isPinnedMenuGroupActive()\n ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n : 'transparent',\n }\"\n name=\"push_pin\"></sd-icon>\n </button>\n }\n @for (nodeMenuGroup of menus(); track nodeMenuGroup.id) {\n <button\n type=\"button\"\n [attr.aria-label]=\"nodeMenuGroup.tooltipTitle || nodeMenuGroup.title\"\n (mouseenter)=\"onMouseOverMenuGroupNode($event, nodeMenuGroup)\"\n (mouseleave)=\"onMouseLeaveMenuGroupNode($event, nodeMenuGroup)\"\n (click)=\"expandMenuGroup(nodeMenuGroup)\"\n [matTooltip]=\"nodeMenuGroup.tooltipTitle || nodeMenuGroup.title\"\n [matTooltipClass]=\"'c-tooltip-menu-group-7a22ab15-0083-4d4c-9c0c-00a30bc8c140'\"\n [matTooltipPosition]=\"'right'\"\n style=\"padding: 0; margin: 0; border: none; background-color: transparent\">\n @if (nodeMenuGroup.iconUrl) {\n <span\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n backgroundColor:\n idMenuGroupActive() === nodeMenuGroup?.id\n ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n : 'transparent',\n }\">\n <img width=\"24px\" height=\"24px\" [src]=\"nodeMenuGroup.iconUrl\" [alt]=\"nodeMenuGroup.title\" />\n </span>\n } @else {\n <sd-icon\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n color:\n idMenuGroupActive() === nodeMenuGroup?.id\n ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n : 'var(--sd-text-secondary, #44474f)',\n backgroundColor:\n idMenuGroupActive() === nodeMenuGroup?.id\n ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n : 'transparent',\n }\"\n [name]=\"nodeMenuGroup.icon || 'widgets'\"></sd-icon>\n }\n </button>\n }\n </div>\n <div class=\"c-menu-tree\" [class.d-none]=\"!isShowSidebar()\" [attr.inert]=\"!isShowSidebar() ? '' : null\">\n @if (totalMenuInMenusByGroup() > 10) {\n <div style=\"padding: 0px 4px\" class=\"c-menu-tree-search\">\n <sd-input\n size=\"sm\"\n [placeholder]=\"'core.module.layout.sidebar.search' | sdTranslate\"\n [autoId]=\"'layout-v1-menu-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"onFilterSearchText($event)\">\n <ng-template sdSuffixDef>\n @if (searchText()) {\n <sd-icon class=\"c-search-prefix-icon cancel\" (click)=\"onClearSearchText()\" name=\"cancel\"></sd-icon>\n } @else {\n <sd-icon class=\"c-search-prefix-icon search\" name=\"search\"></sd-icon>\n }\n </ng-template>\n </sd-input>\n </div>\n }\n <div class=\"c-menu-tree-container\">\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" [style.backgroundColor]=\"'transparent'\">\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: !hasChild\">\n <div\n class=\"c-menu-node\"\n (mouseenter)=\"onMouseOverMenuNode($event, node)\"\n (mouseleave)=\"onMouseLeaveMenuNode($event, node)\"\n [ngStyle]=\"{\n backgroundColor:\n (currentPath() | menuFocus: node : activeMenuPath()) ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)' : 'transparent',\n }\">\n <div class=\"c-menu-node-description\" [class.d-none]=\"!isShowSidebar()\">\n <a\n class=\"c-menu-node-description-content\"\n [href]=\"menuNodeHref(node)\"\n [attr.aria-current]=\"(currentPath() | menuFocus: node : activeMenuPath()) ? 'page' : null\"\n (click)=\"onMenuNodeClick($event, node)\"\n [ngStyle]=\"{\n color:\n (currentPath() | menuFocus: node : activeMenuPath())\n ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n : 'var(--sd-text, #1a1b1f)',\n }\"\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></a>\n\n <!-- why: nút ghim trước đây là <sd-icon (click)> — custom element không nhận\n focus bàn phím và không có tên khả truy cập, nên không ghim được bằng phím.\n Đổi sang <button type=\"button\"> + aria-pressed, giống pattern đã dùng ở\n `shared/menu-tree`. -->\n @if (_sidebar?.pin?.enabled) {\n <button\n type=\"button\"\n class=\"c-menu-node-description-icon-pin\"\n [style.opacity]=\"isPinnedNode(node) || isHoveredNode(node) ? '1' : null\"\n [style.color]=\"\n isPinnedNode(node) || isHoveredNode(node) ? sidebar().brandColor || 'var(--sd-primary, #005cbb)' : null\n \"\n [attr.aria-pressed]=\"isPinnedNode(node)\"\n [attr.aria-label]=\"\n (isPinnedNode(node) ? 'core.module.layout.menu.unpin' : 'core.module.layout.menu.pin')\n | sdTranslate: { title: node.title }\n \"\n (click)=\"onTogglePin($event, node)\">\n <sd-icon name=\"push_pin\"></sd-icon>\n </button>\n }\n </div>\n </div>\n </mat-nested-tree-node>\n\n <mat-nested-tree-node\n *matTreeNodeDef=\"let node; when: hasChild\"\n [class]=\"{ expanded: treeControl.isExpanded(node), isfocus: currentPath() | menuFocus: node : activeMenuPath() }\">\n <div class=\"c-menu-node\" (mouseenter)=\"onMouseOverMenuNode($event, node)\" (mouseleave)=\"onMouseLeaveMenuNode($event, node)\">\n <div class=\"d-flex align-items-center\" style=\"gap: 10px; width: 100%\">\n <button\n type=\"button\"\n [class.d-none]=\"!isShowSidebar()\"\n class=\"c-menu-node-description\"\n [attr.aria-expanded]=\"treeControl.isExpanded(node)\"\n (click)=\"onToggleMenuNode(node)\">\n <span\n class=\"c-menu-node-description-content\"\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></span>\n <sd-icon\n aria-hidden=\"true\"\n class=\"c-menu-node-description-icon-expand\"\n [name]=\"treeControl.isExpanded(node) ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-icon>\n </button>\n </div>\n </div>\n <div class=\"c-menu-node-group p-0\" role=\"group\" [class.d-none]=\"!treeControl.isExpanded(node)\">\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n </mat-nested-tree-node>\n </mat-tree>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"c-footer\">\n <lib-layout-user\n [userInfo]=\"_userInfo\"\n [isMobileOrTablet]=\"isMobile()\"\n (menuOpened)=\"onUserMenuOpened()\"\n (menuClosed)=\"onUserMenuClosed()\"\n [isShowSidebar]=\"isShowSidebar()\"\n (toggleMenuLock)=\"toggleMenuLock($event)\">\n </lib-layout-user>\n </div>\n\n <div class=\"c-vertical\"></div>\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, inject, input, signal, untracked, viewChild } from '@angular/core';\nimport { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\n\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../services';\nimport { SdSidebarV1Panel } from './components/sidebar/sidebar.component';\n\n@Component({\n selector: 'sd-sidebar-v1',\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n imports: [MatSidenavModule, CommonModule, SdSidebarV1Panel],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarV1 {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #layoutStorageService = inject(SdLayoutStorageService);\n\n // ==========================================\n // VIEW CHILD & INPUTS\n // ==========================================\n sidenav = viewChild.required<MatSidenav>('sidenav');\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n isMobile = input(false);\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n // Trạng thái khóa menu (luôn mở rộng hay không)\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\n\n // Trạng thái hiển thị (mở/đóng) của Sidenav\n isShowSidebar = signal<boolean>(this.isMobile() ? false : (this.#layoutStorageService.menuLockStatus?.get() ?? true));\n\n onhover = signal<boolean>(false);\n\n // ==========================================\n // PRIVATE TIMERS\n // ==========================================\n #timerMouseInMenu: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n // EFFECT: Tự động đồng bộ isShowSidebar vào storage service mỗi khi nó thay đổi\n effect(() => {\n const isShow = this.isShowSidebar();\n untracked(() => {\n this.#layoutStorageService.isShowSidebar.set(isShow);\n });\n });\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n\n #mouseLeave = (): void => {\n if (this.#timerMouseInMenu) {\n clearTimeout(this.#timerMouseInMenu);\n }\n\n if (this.onhover() && this.isShowSidebar()) {\n this.isShowSidebar.set(false);\n this.onhover.set(false);\n }\n };\n\n #handleMouseLeaveTransition = (): void => {\n if (!this.isShowSidebar()) {\n const delayTime = 400;\n if (this.#timerMouseInMenu) {\n clearTimeout(this.#timerMouseInMenu);\n }\n setTimeout(() => {\n this.#mouseLeave();\n }, delayTime);\n } else {\n this.#mouseLeave();\n }\n };\n\n openSidebar = (): void => {\n if (!this.isMobile()) {\n return;\n }\n\n if (!this.isShowSidebar()) {\n this.isShowSidebar.set(true);\n this.onhover.set(true);\n }\n };\n\n onPopupOfSideBarOpened = (): void => {\n this.onhover.set(false);\n this.isShowSidebar.set(true);\n };\n\n onPopupOfSideBarClosed = (): void => {\n const delayTime = 500;\n if (!this.isMenuLock()) {\n this.onhover.set(true);\n setTimeout(() => {\n this.#mouseLeave();\n }, delayTime);\n }\n };\n\n onExpandSideBar = (): void => {\n if (this.isMobile()) {\n return;\n }\n if (!this.isShowSidebar()) {\n this.isShowSidebar.set(true);\n this.onhover.set(true);\n }\n };\n\n onMouseleaveSideBar = (): void => {\n if (this.isMobile()) {\n return;\n }\n this.#mouseLeave();\n };\n\n onSidenavOpenedChange = (opened: boolean): void => {\n if (this.isMobile()) {\n this.isShowSidebar.set(opened);\n }\n };\n\n onToggle = (data: boolean | null) => {\n if (data === null) {\n this.#handleMouseLeaveTransition();\n } else {\n this.#mouseLeave();\n this.isShowSidebar.set(data);\n this.isMenuLock.set(data);\n\n // Desktop keeps the Material drawer mounted as a 60px rail; mobile still opens and closes the overlay.\n if (this.isMobile()) {\n const sidenavComp = this.sidenav();\n if (sidenavComp) {\n if (data) {\n sidenavComp.open();\n } else {\n sidenavComp.close();\n }\n }\n }\n }\n };\n}\n","<mat-sidenav-container class=\"c-layout-wrapper\">\n <mat-sidenav\n #sidenav\n [opened]=\"!isMobile() || isShowSidebar()\"\n (openedChange)=\"onSidenavOpenedChange($event)\"\n class=\"c-layout-sidebar\"\n [class.is-expanded]=\"isShowSidebar()\"\n (click)=\"openSidebar()\"\n (mouseleave)=\"onMouseleaveSideBar()\"\n [mode]=\"isMobile() ? 'over' : 'side'\"\n [fixedInViewport]=\"isMobile()\">\n <sd-sidebar-v1-panel\n [menus]=\"menus()\"\n [userInfo]=\"userInfo()\"\n [sidebar]=\"sidebar()\"\n [isMobile]=\"isMobile()\"\n [isShowSidebar]=\"isShowSidebar()\"\n (showSideBar)=\"onToggle($event)\"\n (expandSideBar)=\"onExpandSideBar()\"\n (popupUserMenuOpened)=\"onPopupOfSideBarOpened()\"\n (popupUserMenuClosed)=\"onPopupOfSideBarClosed()\">\n </sd-sidebar-v1-panel>\n </mat-sidenav>\n\n <mat-sidenav-content class=\"c-layout-content\" [class.isShowSidebar]=\"isMenuLock()\">\n <mat-drawer-container class=\"c-mat-drawer-container\">\n <mat-drawer-content>\n <ng-content></ng-content>\n </mat-drawer-content>\n </mat-drawer-container>\n </mat-sidenav-content>\n</mat-sidenav-container>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo } from '../../../../configurations';\nimport { SdLayoutUserMenuComponent } from '../../../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'lib-layout-user',\n templateUrl: './user.component.html',\n styleUrl: './user.component.scss',\n imports: [SdIcon, SdLayoutUserMenuComponent, SdTranslatePipe],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LayoutUserComponent {\n isMobileOrTablet = input<boolean>(false);\n isMenuLock = input<boolean>(false);\n isShowSidebar = input<boolean>(false);\n userInfo = input.required<SdLayoutUserInfo>();\n\n menuClosed = output<void>();\n menuOpened = output<void>();\n toggleMenuLock = output<Event>();\n\n onMenuOpened(): void {\n this.menuOpened.emit();\n }\n\n onMenuClosed(): void {\n this.menuClosed.emit();\n }\n\n onToggleMenuLock(event: Event): void {\n this.toggleMenuLock.emit(event);\n }\n}\n","@if (isMobileOrTablet()) {\n <sd-layout-user-menu [userInfo]=\"userInfo()\" presentation=\"mobile\"></sd-layout-user-menu>\n} @else {\n <div class=\"c-layout-user-wrapper\">\n <sd-layout-user-menu\n class=\"c-layout-user-avatar\"\n [userInfo]=\"userInfo()\"\n [compact]=\"true\"\n (opened)=\"onMenuOpened()\"\n (closed)=\"onMenuClosed()\"></sd-layout-user-menu>\n\n <button\n type=\"button\"\n class=\"c-layout-icon-toggle\"\n [attr.aria-label]=\"'core.module.layout.sidebar.toggle' | sdTranslate\"\n (click)=\"onToggleMenuLock($event)\">\n <sd-icon [name]=\"isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left'\"></sd-icon>\n </button>\n </div>\n}\n","import { CommonModule, DOCUMENT } from '@angular/common';\nimport { Component, DestroyRef, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\n\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../../../services';\nimport { resolveActiveMenuPath } from '../../../../utils';\nimport { LayoutUserComponent } from '../user/user.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-sidebar-mobile-overlay',\n standalone: true,\n imports: [SdIcon, CommonModule, RouterModule, LayoutUserComponent],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n})\nexport class SdSidebarMobileOverlay {\n #router = inject(Router);\n #destroyRef = inject(DestroyRef);\n #layoutStorageService = inject(SdLayoutStorageService);\n // why: các sidebar anh em đều lấy window qua DOCUMENT.defaultView; đọc global `window` trực tiếp\n // sẽ throw khi render phía server (SSR) vì global đó không tồn tại.\n #window = inject(DOCUMENT).defaultView;\n\n // ==========================================\n // INPUTS & OUTPUTS\n // ==========================================\n isShowSidebar = input<boolean>(false);\n menus = input.required<SdLayoutMenu[]>();\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n\n // showSideBar(null) = đóng sidebar (tương thích với onToggle của main component)\n showSideBar = output<boolean | null>();\n expandSideBar = output<void>();\n popupUserMenuOpened = output<void>();\n popupUserMenuClosed = output<void>();\n titleMenuGroupChanged = output<string | undefined>();\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n titleMenuGroup = signal<string | undefined>('');\n currentPath = signal<string>(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\n\n // Lưu danh sách ID các menu group đang được mở\n expandedMobileGroups = signal<Set<string>>(new Set<string>());\n\n constructor() {\n // Bind title khi menus thay đổi\n effect(() => {\n const currentMenus = this.menus();\n untracked(() => {\n const lastActiveMenuGroupId = this.#layoutStorageService.lastActiveMenuGroupId.get();\n if (!lastActiveMenuGroupId) {\n this.#layoutStorageService.lastActiveMenuGroupId.set(currentMenus?.[0]?.id ?? '');\n }\n this.#bindingMenuGroupByCurrentPath(currentMenus);\n });\n });\n\n // Bind title khi điều hướng\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (event instanceof NavigationEnd) {\n // why: giống sidebar v1 desktop — lấy path từ chính sự kiện router thay vì đọc global\n // `window.location`, để component chạy được cả khi không có global window (SSR).\n const currentPath = event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '';\n if (this.currentPath() !== currentPath) {\n this.currentPath.set(currentPath);\n this.#bindingMenuGroupByCurrentPath(this.menus());\n }\n }\n });\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n toggleMobileGroup(groupId: string | undefined): void {\n if (!groupId) return;\n this.expandedMobileGroups.update(groups => {\n const newGroups = new Set(groups);\n if (newGroups.has(groupId)) {\n newGroups.delete(groupId);\n } else {\n newGroups.add(groupId);\n }\n return newGroups;\n });\n }\n\n isExpanded(groupId: string | undefined): boolean {\n if (!groupId) return false;\n return this.expandedMobileGroups().has(groupId);\n }\n\n navigate(args: { path?: string; queryParams?: Params }): void {\n const { path, queryParams } = args;\n if (!path) return;\n\n // why: `path.includes('http')` là substring test chứ không phải scheme test —\n // `javascript:fetch(...)//http` lọt qua rồi chạy như script trong chính origin của app. Ngoài ra\n // `window.open(path)` cũ không truyền `noopener` nên tab mới giữ được `window.opener` và có thể\n // điều hướng ngược tab gốc (reverse tabnabbing). `sdOpenExternal` luôn gắn `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(path)) {\n sdOpenExternal(path);\n return;\n }\n\n this.#router.navigate([path.split('?')[0]], {\n queryParams: queryParams ?? {},\n state: { switchTab: true },\n });\n\n // Sau khi điều hướng trên mobile, tự động đóng sidebar\n this.onClose();\n }\n\n onClose(): void {\n this.showSideBar.emit(null);\n }\n\n // Kiểm tra menu có children (là SdLayoutChildrenMenu)\n hasChildren(menu: SdLayoutMenu): boolean {\n return 'children' in menu && !!menu.children?.length;\n }\n\n // Lấy danh sách children an toàn (type-safe)\n getChildren(menu: SdLayoutMenu): SdLayoutMenu[] {\n return 'children' in menu ? (menu.children ?? []) : [];\n }\n\n // Lấy path an toàn từ leaf menu (SdLayoutRootMenu)\n getPath(menu: SdLayoutMenu): string | undefined {\n return 'path' in menu ? menu.path : undefined;\n }\n\n // Lấy queryParams an toàn từ leaf menu\n getQueryParams(menu: SdLayoutMenu): Params {\n return ('queryParams' in menu ? menu.queryParams : undefined) ?? {};\n }\n\n onUserMenuOpened = (): void => this.popupUserMenuOpened.emit();\n onUserMenuClosed = (): void => this.popupUserMenuClosed.emit();\n\n // ==========================================\n // PRIVATE LOGIC\n // ==========================================\n #bindingMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): void => {\n let menuGroupByPath = this.#getMenuGroupByCurrentPath(menus);\n\n if (!menuGroupByPath?.length) {\n const lastActiveId = this.#layoutStorageService.lastActiveMenuGroupId.get() || '';\n menuGroupByPath = menus?.filter(menu => menu?.id === lastActiveId) || [];\n }\n\n if (menuGroupByPath?.length) {\n const matchedGroup = menuGroupByPath[0];\n this.#layoutStorageService.lastActiveMenuGroupId.set(matchedGroup?.id || '');\n const title = matchedGroup?.tooltipTitle || matchedGroup?.title;\n this.titleMenuGroup.set(title);\n this.titleMenuGroupChanged.emit(title);\n } else {\n this.titleMenuGroup.set('');\n this.titleMenuGroupChanged.emit('');\n }\n };\n\n #getMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): SdLayoutMenu[] => {\n // Nhiều menu cùng khớp route thì chỉ path sát nhất được chọn, tránh nhận nhầm group của path cha\n const activePath = resolveActiveMenuPath(menus, this.currentPath());\n if (!activePath) return [];\n const menuGroup = this.#findMenuGroupByPath(menus, activePath);\n return menuGroup ? [menuGroup] : [];\n };\n\n #findMenuGroupByPath = (menus: SdLayoutMenu[], activePath: string, menuGroup?: SdLayoutMenu): SdLayoutMenu | null => {\n for (const menu of menus) {\n if ('path' in menu && menu.path === activePath) {\n return menuGroup ?? menu;\n }\n if ('children' in menu && menu.children?.length) {\n const result = this.#findMenuGroupByPath(menu.children, activePath, menuGroup ?? menu);\n if (result) return result;\n }\n }\n return null;\n };\n}\n","@let _userInfo = userInfo();\n@let _sidebar = sidebar();\n\n@if (_userInfo && _sidebar) {\n <div\n class=\"m-backdrop\"\n [class.m-backdrop--visible]=\"isShowSidebar()\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onClose()\"\n (keydown.escape)=\"onClose()\">\n </div>\n\n <div class=\"m-wrapper\" [class.m-wrapper--open]=\"isShowSidebar()\">\n <div class=\"m-header\">\n <div class=\"m-title-group\">\n @if (_sidebar.logoUrl) {\n <img class=\"m-logo\" alt=\"logo\" [src]=\"_sidebar.logoUrl\" />\n }\n <span class=\"m-title\">{{ titleMenuGroup() || _sidebar.defaultTitle || 'Back Office' }}</span>\n </div>\n <button class=\"m-close-btn\" (click)=\"onClose()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </div>\n\n <div class=\"m-user-section\">\n <lib-layout-user\n [userInfo]=\"_userInfo\"\n [isMobileOrTablet]=\"true\"\n (menuOpened)=\"onUserMenuOpened()\"\n (menuClosed)=\"onUserMenuClosed()\">\n </lib-layout-user>\n </div>\n\n <div class=\"m-menu-list\">\n @for (group of menus(); track group.id) {\n <div class=\"m-menu-card\">\n <button class=\"m-card-header\" (click)=\"toggleMobileGroup(group.id)\">\n <div class=\"m-card-header-left\">\n @if (group.iconUrl) {\n <img class=\"m-group-icon\" [src]=\"group.iconUrl\" [alt]=\"group.title\" />\n } @else {\n <sd-icon class=\"m-group-icon\" [name]=\"group.icon || 'widgets'\"></sd-icon>\n }\n <span class=\"m-group-title\">{{ group.title }}</span>\n </div>\n <sd-icon class=\"m-expand-icon\" [name]=\"expandedMobileGroups().has(group.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-icon>\n </button>\n\n @if (expandedMobileGroups().has(group.id ?? '') && hasChildren(group)) {\n <div class=\"m-card-body\">\n @for (child of getChildren(group); track child.id) {\n @if (hasChildren(child)) {\n <div class=\"m-sub-group\">\n <button class=\"m-sub-group-header\" (click)=\"toggleMobileGroup(child.id)\">\n <div class=\"m-item-left\">\n @if (child.iconUrl) {\n <img class=\"m-item-icon-img\" [src]=\"child.iconUrl\" alt=\"icon\" />\n } @else {\n <sd-icon class=\"m-item-icon\" [name]=\"child.icon || 'folder'\"></sd-icon>\n }\n <span class=\"m-item-title\">{{ child.title }}</span>\n </div>\n <sd-icon class=\"m-expand-icon\" [name]=\"expandedMobileGroups().has(child.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-icon>\n </button>\n @if (expandedMobileGroups().has(child.id ?? '')) {\n @for (subChild of getChildren(child); track subChild.id) {\n <button class=\"m-menu-item m-menu-item--indented\"\n (click)=\"navigate({ path: getPath(subChild), queryParams: getQueryParams(subChild) })\">\n <div class=\"m-item-left\">\n @if (subChild.iconUrl) {\n <img class=\"m-item-icon-img\" [src]=\"subChild.iconUrl\" alt=\"icon\" />\n } @else {\n <sd-icon class=\"m-item-icon\" [name]=\"subChild.icon || 'insert_drive_file'\"></sd-icon>\n }\n <span class=\"m-item-title\">{{ subChild.title }}</span>\n </div>\n <sd-icon class=\"m-nav-icon\" name=\"chevron_right\"></sd-icon>\n </button>\n }\n }\n </div>\n } @else {\n <button class=\"m-menu-item\" (click)=\"navigate({ path: getPath(child), queryParams: getQueryParams(child) })\">\n <div class=\"m-item-left\">\n @if (child.iconUrl) {\n <img class=\"m-item-icon-img\" [src]=\"child.iconUrl\" alt=\"icon\" />\n } @else {\n <sd-icon class=\"m-item-icon\" [name]=\"child.icon || 'insert_drive_file'\"></sd-icon>\n }\n <span class=\"m-item-title\">{{ child.title }}</span>\n </div>\n <sd-icon class=\"m-nav-icon\" name=\"chevron_right\"></sd-icon>\n </button>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, effect, inject, input, signal, untracked } from '@angular/core';\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../services';\nimport { SdSidebarMobileOverlay } from './components/sidebar/sidebar.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-sidebar-mobile-v1',\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n imports: [SdIcon, CommonModule, SdSidebarMobileOverlay],\n standalone: true,\n})\nexport class SdSidebarMobileV1 {\n #layoutStorageService = inject(SdLayoutStorageService);\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n\n // Sidebar luôn bắt đầu đóng trên mobile\n isShowSidebar = signal<boolean>(false);\n titleMenuGroup = signal<string | undefined>('');\n\n constructor() {\n effect(() => {\n const isShow = this.isShowSidebar();\n untracked(() => {\n this.#layoutStorageService.isShowSidebar.set(isShow);\n });\n });\n }\n\n openSidebar = (): void => {\n this.isShowSidebar.set(true);\n };\n\n onToggle = (_data: boolean | null): void => {\n this.isShowSidebar.set(false);\n };\n\n onPopupOfSideBarOpened = (): void => {};\n onPopupOfSideBarClosed = (): void => {};\n onExpandSideBar = (): void => {};\n onMouseleaveSideBar = (): void => {};\n onTitleMenuGroupChanged = (title: string | undefined): void => {\n this.titleMenuGroup.set(title);\n };\n}\n","<div class=\"c-mobile-layout\">\n <div class=\"c-mobile-topbar\">\n <div class=\"c-topbar-brand\">\n @if (sidebar().logoUrl) {\n <img class=\"c-topbar-logo\" [src]=\"sidebar().logoUrl\" alt=\"logo\" />\n }\n <span class=\"c-topbar-title\">{{ titleMenuGroup() || sidebar().defaultTitle || 'Back Office' }}</span>\n </div>\n <button class=\"c-hamburger-btn\" (click)=\"openSidebar()\">\n <sd-icon name=\"menu\"></sd-icon>\n </button>\n </div>\n\n <div class=\"c-mobile-content\">\n <ng-content></ng-content>\n </div>\n\n <sd-sidebar-mobile-overlay\n [menus]=\"menus()\"\n [userInfo]=\"userInfo()\"\n [sidebar]=\"sidebar()\"\n [isShowSidebar]=\"isShowSidebar()\"\n (showSideBar)=\"onToggle($event)\"\n (expandSideBar)=\"onExpandSideBar()\"\n (popupUserMenuOpened)=\"onPopupOfSideBarOpened()\"\n (popupUserMenuClosed)=\"onPopupOfSideBarClosed()\"\n (titleMenuGroupChanged)=\"onTitleMenuGroupChanged($event)\">\n </sd-sidebar-mobile-overlay>\n</div>\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, input, output, signal } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutMenu, SdLayoutRootMenu, getMenuStableKey, searchMenuLeaves } from '../../../services';\nimport { resolveActiveMenuPath } from '../../../utils';\n\ninterface SdLayoutMenuTreeNode {\n menu: SdLayoutMenu;\n key: string;\n title: string;\n depth: number;\n paddingLeft: number;\n isGroup: boolean;\n isActive: boolean;\n isPinned: boolean;\n isPinVisible: boolean;\n /** Accessible name of the pin toggle — already i18n-resolved with the menu title interpolated. */\n pinLabel: string;\n}\n\n@Component({\n selector: 'sd-layout-menu-tree',\n standalone: true,\n imports: [SdIcon],\n templateUrl: './menu-tree.component.html',\n styleUrl: './menu-tree.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutMenuTreeComponent {\n readonly #destroyRef = inject(DestroyRef);\n readonly #i18n = inject(I18nService);\n readonly #hoveredPinKey = signal<string | null>(null);\n #pinHoverTimerId: ReturnType<typeof setTimeout> | undefined;\n\n menus = input<SdLayoutMenu[]>([]);\n query = input('');\n activePath = input('');\n pinnedKeys = input<string[]>([]);\n showPin = input(true);\n pinVisibility = input<'hover' | 'always'>('hover');\n navigate = output<SdLayoutRootMenu>();\n togglePinned = output<SdLayoutMenu>();\n\n nodes = computed<SdLayoutMenuTreeNode[]>(() => {\n const pinnedKeys = new Set(this.pinnedKeys());\n const hoveredPinKey = this.#hoveredPinKey();\n const alwaysShowPin = this.pinVisibility() === 'always';\n const query = this.query().trim();\n const menus = query ? searchMenuLeaves(this.menus(), query) : this.menus();\n // Nhiều menu cùng khớp route thì chỉ path sát nhất sáng: ở '/appointment/cs' thì '/appointment' không sáng nữa\n const activeMenuPath = resolveActiveMenuPath(menus, this.activePath());\n const nodes: SdLayoutMenuTreeNode[] = [];\n\n const append = (items: SdLayoutMenu[], depth: number, ancestors: string[]): void => {\n for (const menu of items) {\n const key = getMenuStableKey(menu, ancestors);\n if (!key) continue;\n const isGroup = 'children' in menu && !!menu.children?.length;\n const path = 'path' in menu ? menu.path : '';\n const title = menu.title ?? menu.tooltipTitle ?? '';\n const isPinned = pinnedKeys.has(key);\n nodes.push({\n menu,\n key,\n title,\n depth,\n paddingLeft: 12 + depth * 16,\n isGroup,\n isActive: !!path && path === activeMenuPath,\n isPinned,\n isPinVisible: alwaysShowPin || isPinned || hoveredPinKey === key,\n // why: template cũ nối `'Pin ' + node.title` — chuỗi tiếng Anh cứng và ép trật tự\n // \"động từ trước tên\" của tiếng Anh lên mọi ngôn ngữ. Nội suy `{title}` để catalog tự\n // quyết định vị trí. Tính trong `nodes` computed nên tự cập nhật khi đổi ngôn ngữ.\n pinLabel: this.#i18n.t(isPinned ? 'core.module.layout.menu.unpin' : 'core.module.layout.menu.pin', { title }),\n });\n if (isGroup && 'children' in menu) append(menu.children ?? [], depth + 1, [...ancestors, menu.title ?? key]);\n }\n };\n\n append(menus, 0, []);\n return nodes;\n });\n\n constructor() {\n this.#destroyRef.onDestroy(() => this.#clearPinHoverTimer());\n }\n\n onNavigate(menu: SdLayoutMenu): void {\n if ('path' in menu) this.navigate.emit(menu);\n }\n\n onTogglePinned(event: MouseEvent, menu: SdLayoutMenu): void {\n event.stopPropagation();\n this.togglePinned.emit(menu);\n }\n\n onPinHoverStart(key: string): void {\n if (this.pinVisibility() === 'always') return;\n this.#clearPinHoverTimer();\n this.#pinHoverTimerId = setTimeout(() => {\n this.#hoveredPinKey.set(key);\n this.#pinHoverTimerId = undefined;\n }, 300);\n }\n\n onPinHoverEnd(key: string): void {\n this.#clearPinHoverTimer();\n if (this.#hoveredPinKey() === key) this.#hoveredPinKey.set(null);\n }\n\n #clearPinHoverTimer(): void {\n if (this.#pinHoverTimerId === undefined) return;\n clearTimeout(this.#pinHoverTimerId);\n this.#pinHoverTimerId = undefined;\n }\n}\n","<nav class=\"d-flex flex-column gap-4\" aria-label=\"Navigation menu\">\n @for (node of nodes(); track node.key) {\n @if (node.isGroup) {\n <div class=\"sd-layout-menu-tree__group d-flex align-items-center gap-8 T12M text-black400\" [style.padding-left.px]=\"node.paddingLeft\">\n <sd-icon [name]=\"node.menu.icon || 'folder'\"></sd-icon>\n <span class=\"text-ellipsis\">{{ node.title }}</span>\n </div>\n } @else {\n <div\n class=\"sd-layout-menu-tree__route d-flex align-items-center gap-4\"\n (mouseenter)=\"onPinHoverStart(node.key)\"\n (mouseleave)=\"onPinHoverEnd(node.key)\">\n <button\n type=\"button\"\n class=\"sd-layout-menu-tree__route-button d-flex align-items-center gap-8 flex-1 text-left T14R\"\n data-menu-route\n [attr.data-menu-key]=\"node.key\"\n [attr.aria-current]=\"node.isActive ? 'page' : null\"\n [class.sd-layout-menu-tree__route-button--active]=\"node.isActive\"\n [style.padding-left.px]=\"node.paddingLeft\"\n (click)=\"onNavigate(node.menu)\">\n @if (node.menu.iconUrl) {\n <img class=\"sd-layout-menu-tree__icon-image\" [src]=\"node.menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"node.menu.icon || 'chevron_right'\"></sd-icon>\n }\n <span class=\"text-ellipsis\">{{ node.title }}</span>\n </button>\n @if (showPin()) {\n <button\n type=\"button\"\n class=\"sd-layout-menu-tree__pin d-flex align-items-center justify-content-center\"\n [class.sd-layout-menu-tree__pin--visible]=\"node.isPinVisible\"\n [attr.data-pin-key]=\"node.key\"\n [attr.aria-label]=\"node.pinLabel\"\n [attr.aria-pressed]=\"node.isPinned\"\n (click)=\"onTogglePinned($event, node.menu)\">\n <sd-icon name=\"push_pin\"></sd-icon>\n </button>\n }\n </div>\n }\n } @empty {\n <div class=\"d-flex flex-column align-items-center justify-content-center gap-12 p-24 text-black400 T14R\">\n Không tìm thấy menu phù hợp\n </div>\n }\n</nav>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SdInput } from '@sdcorejs/angular/forms';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-layout-search-field',\n standalone: true,\n imports: [SdIcon, SdInput],\n templateUrl: './search-field.component.html',\n styleUrl: './search-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutSearchFieldComponent {\n model = input('');\n placeholder = input.required<string>();\n autoId = input.required<string>();\n sdChange = output<string>();\n}\n","<div\n data-layout-search\n class=\"sd-layout-search-field sd-layout-search-field--soft-pill d-flex align-items-center gap-8\">\n <sd-icon class=\"sd-layout-search-field__icon\" name=\"search\"></sd-icon>\n <sd-input\n class=\"sd-layout-search-field__control\"\n size=\"sm\"\n hideInlineError\n [placeholder]=\"placeholder()\"\n [autoId]=\"autoId()\"\n [model]=\"model()\"\n (sdChange)=\"sdChange.emit($event)\">\n </sd-input>\n</div>\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\nimport { SdLayoutUserInfo, SidebarConfigurationV2, resolveSidebarV2Interaction } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, getMenuStableKey } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\ninterface SidebarV2RailItem {\n menu: SdLayoutMenu;\n key: string;\n title: string;\n}\n\n@Component({\n selector: 'sd-sidebar-v2',\n standalone: true,\n imports: [SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent, SdTranslatePipe],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // why: Escape-để-đóng-flyout gom về HOST. Trước đây handler nằm trên div bọc và trên <section>\n // flyout — cả hai đều không focusable nên chỉ chạy nhờ event nổi bọt từ con, đồng thời khai\n // interaction handler trên phần tử không nhận được focus. Host là tổ tiên của tất cả nên hành vi\n // giữ nguyên hệt như cũ.\n host: {\n '(keydown.escape)': 'closeFromEscape()',\n },\n})\nexport class SdSidebarV2 {\n readonly #router = inject(Router);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV2>();\n activeGroupKey = signal('');\n isFlyoutOpen = signal(false);\n isFlyoutLocked = signal(false);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n\n interaction = computed(() => resolveSidebarV2Interaction(this.sidebar()));\n railItems = computed<SidebarV2RailItem[]>(() =>\n this.menus()\n .map(menu => ({ menu, key: getMenuStableKey(menu), title: menu.tooltipTitle || menu.title || 'Menu' }))\n .filter(item => !!item.key)\n );\n activeGroup = computed(() => this.railItems().find(item => item.key === this.activeGroupKey())?.menu);\n contextMenus = computed<SdLayoutMenu[]>(() => {\n const activeGroup = this.activeGroup();\n if (!activeGroup) return [];\n return 'children' in activeGroup && activeGroup.children?.length ? activeGroup.children : [activeGroup];\n });\n pinnedKeys = this.#navigationState.pinnedKeys;\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n untracked(() => {\n this.#navigationState.hydrate(menus);\n const persistedState = this.#navigationState.versionState(2);\n if (persistedState.activeGroupKey && !this.activeGroupKey()) this.activeGroupKey.set(persistedState.activeGroupKey);\n });\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (!(event instanceof NavigationEnd)) return;\n this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n this.closeFromNavigation();\n });\n }\n\n selectGroup(menu: SdLayoutMenu): void {\n const key = getMenuStableKey(menu);\n if (!key) return;\n\n if (this.interaction() === 'click') {\n if (this.activeGroupKey() === key && this.isFlyoutOpen()) {\n this.#closeFlyout();\n return;\n }\n this.#openGroup(key, false);\n return;\n }\n\n if (this.activeGroupKey() === key && this.isFlyoutLocked()) {\n this.#closeFlyout();\n return;\n }\n this.#openGroup(key, true);\n }\n\n previewGroup(menu: SdLayoutMenu): void {\n if (this.interaction() !== 'hover-lock' || this.isFlyoutLocked()) return;\n const key = getMenuStableKey(menu);\n if (key) this.#openGroup(key, false, false);\n }\n\n leaveFlyout(): void {\n if (this.interaction() === 'hover-lock' && !this.isFlyoutLocked()) this.#closeFlyout(false);\n }\n\n closeFromBackdrop(): void {\n this.#closeFlyout();\n }\n\n closeFromEscape(): void {\n this.#closeFlyout();\n }\n\n closeFromNavigation(): void {\n this.#closeFlyout();\n }\n\n onNavigate(menu: SdLayoutMenu): void {\n if (!('path' in menu)) return;\n this.#navigationState.recordRecent(menu, { enabled: true, maxItems: 5 });\n // why: `includes('http')` là substring test — `javascript:fetch(...)//http` lọt qua và chạy như\n // script trong origin của app. Parse URL thật rồi mới mở, kèm `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(menu.path)) {\n sdOpenExternal(menu.path);\n this.closeFromNavigation();\n return;\n }\n void this.#router.navigate([menu.path.split('?')[0]], {\n queryParams: menu.queryParams ?? {},\n state: { switchTab: true },\n });\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n\n #openGroup(key: string, locked: boolean, persist = true): void {\n this.activeGroupKey.set(key);\n this.isFlyoutOpen.set(true);\n this.isFlyoutLocked.set(locked);\n this.searchText.set('');\n if (persist) this.#navigationState.patchVersionState(2, { activeGroupKey: key, locked });\n }\n\n #closeFlyout(persist = true): void {\n this.isFlyoutOpen.set(false);\n this.isFlyoutLocked.set(false);\n this.searchText.set('');\n if (persist) this.#navigationState.patchVersionState(2, { locked: false });\n }\n}\n","<!-- why: `(keydown.escape)` được gom lên HOST của component (xem `host` trong main.component.ts).\n Trước đây nó nằm trên div bọc và trên <section> flyout — cả hai đều KHÔNG focusable nên chỉ\n \"chạy nhờ\" event nổi bọt từ con, đồng thời khiến markup khai báo interaction handler trên\n phần tử không nhận được focus. Host là tổ tiên của tất cả nên hành vi giữ nguyên. -->\n<div class=\"sd-sidebar-v2\">\n <aside class=\"sd-sidebar-v2__rail d-flex flex-column align-items-center gap-8 py-12 bg-white border-right border-black200\">\n <button type=\"button\" class=\"sd-sidebar-v2__brand d-flex align-items-center justify-content-center\" [attr.aria-label]=\"'core.module.layout.home.tab-name' | sdTranslate\">\n @if (sidebar().logoUrl) {\n <img class=\"sd-sidebar-v2__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n } @else {\n <sd-icon name=\"apps\"></sd-icon>\n }\n </button>\n\n <nav class=\"d-flex flex-column align-items-center gap-4 flex-1\" [attr.aria-label]=\"'core.module.layout.sidebar.menu-groups' | sdTranslate\">\n @for (item of railItems(); track item.key) {\n <button\n type=\"button\"\n class=\"sd-sidebar-v2__rail-action d-flex flex-column align-items-center justify-content-center gap-4\"\n [attr.data-v2-group-key]=\"item.key\"\n [attr.aria-label]=\"item.title\"\n [attr.aria-expanded]=\"activeGroupKey() === item.key && isFlyoutOpen()\"\n [class.sd-sidebar-v2__rail-action--active]=\"activeGroupKey() === item.key\"\n (click)=\"selectGroup(item.menu)\"\n (mouseenter)=\"previewGroup(item.menu)\"\n (focus)=\"previewGroup(item.menu)\">\n @if (item.menu.iconUrl) {\n <img class=\"sd-sidebar-v2__rail-icon\" [src]=\"item.menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"item.menu.icon || 'widgets'\"></sd-icon>\n }\n <span class=\"sd-sidebar-v2__rail-label text-ellipsis\">{{ item.title }}</span>\n </button>\n }\n </nav>\n\n <sd-layout-user-menu [userInfo]=\"userInfo()\" [compact]=\"true\"></sd-layout-user-menu>\n </aside>\n\n @if (isFlyoutOpen()) {\n <button\n type=\"button\"\n class=\"sd-sidebar-v2__backdrop\"\n [attr.aria-label]=\"'core.module.layout.sidebar.close-menu' | sdTranslate\"\n (click)=\"closeFromBackdrop()\"\n (keydown.escape)=\"closeFromEscape()\"></button>\n <section\n class=\"sd-sidebar-v2__flyout d-flex flex-column bg-white border-right border-black200 mat-elevation-z4\"\n role=\"region\"\n [attr.aria-label]=\"activeGroup()?.title || 'Menu'\"\n (mouseleave)=\"leaveFlyout()\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n <span class=\"T16M text-ellipsis\">{{ activeGroup()?.title || sidebar().defaultTitle || 'Menu' }}</span>\n @if (isFlyoutLocked()) {\n <sd-icon name=\"lock\"></sd-icon>\n }\n </header>\n <div class=\"p-12\">\n <sd-layout-search-field\n [placeholder]=\"'core.module.layout.sidebar.search-in-group' | sdTranslate\"\n [autoId]=\"'layout-v2-context-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-layout-search-field>\n </div>\n <div class=\"flex-1 overflow-auto px-8 pb-12\">\n <sd-layout-menu-tree\n [menus]=\"contextMenus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"onNavigate($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </div>\n </section>\n }\n\n <main class=\"sd-sidebar-v2__content\" data-v2-content data-content-offset=\"rail\">\n <ng-content></ng-content>\n </main>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\nimport { SdLayoutUserInfo, SidebarConfigurationV2 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, getMenuStableKey, selectPrimaryMenuGroups } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'sd-sidebar-mobile-v2',\n standalone: true,\n imports: [A11yModule, SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent, SdTranslatePipe],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarMobileV2 {\n readonly #router = inject(Router);\n readonly #i18n = inject(I18nService);\n readonly #document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n #restoreFocusElement: HTMLElement | null = null;\n #previousBodyOverflow = '';\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV2>();\n primaryMenus = computed(() => selectPrimaryMenuGroups(this.menus(), this.sidebar().primaryMenuIds));\n overflowMenus = computed(() => {\n const primaryKeys = new Set(this.primaryMenus().map(menu => getMenuStableKey(menu)));\n return this.menus().filter(menu => !primaryKeys.has(getMenuStableKey(menu)));\n });\n isSheetOpen = signal(false);\n sheetGroupKey = signal('');\n sheetTitle = signal('');\n sheetMenus = signal<SdLayoutMenu[]>([]);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n pinnedKeys = this.#navigationState.pinnedKeys;\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n untracked(() => this.#navigationState.hydrate(menus));\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (!(event instanceof NavigationEnd)) return;\n this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n this.closeSheet(false);\n });\n this.#destroyRef.onDestroy(() => this.#releaseBodyScroll());\n }\n\n openMore(trigger?: EventTarget | null): void {\n this.#openSheet('more', this.#i18n.t('core.module.layout.sidebar.more'), this.overflowMenus(), trigger);\n }\n\n activateMenu(menu: SdLayoutMenu, trigger?: EventTarget | null): void {\n if ('path' in menu) {\n this.#navigate(menu);\n return;\n }\n this.#openSheet(getMenuStableKey(menu), menu.title || 'Menu', menu.children ?? [], trigger);\n }\n\n closeSheet(restoreFocus = true): void {\n if (!this.isSheetOpen()) return;\n this.isSheetOpen.set(false);\n this.searchText.set('');\n this.#releaseBodyScroll();\n if (restoreFocus) this.#restoreFocusElement?.focus();\n this.#restoreFocusElement = null;\n }\n\n onSheetKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n this.closeSheet();\n }\n\n onNavigate(menu: SdLayoutMenu): void {\n if ('path' in menu) this.#navigate(menu);\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n\n #openSheet(key: string, title: string, menus: SdLayoutMenu[], trigger?: EventTarget | null): void {\n this.sheetGroupKey.set(key);\n this.sheetTitle.set(title);\n this.sheetMenus.set(menus);\n this.searchText.set('');\n this.#restoreFocusElement =\n trigger instanceof HTMLElement ? trigger : this.#document.activeElement instanceof HTMLElement ? this.#document.activeElement : null;\n if (!this.isSheetOpen()) {\n this.#previousBodyOverflow = this.#document.body.style.overflow;\n this.#document.body.style.overflow = 'hidden';\n }\n this.isSheetOpen.set(true);\n }\n\n #navigate(menu: Extract<SdLayoutMenu, { path: string }>): void {\n this.#navigationState.recordRecent(menu, { enabled: true, maxItems: 5 });\n // why: `includes('http')` là substring test — `javascript:fetch(...)//http` lọt qua và chạy như\n // script trong origin của app. Parse URL thật rồi mới mở, kèm `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(menu.path)) {\n sdOpenExternal(menu.path);\n this.closeSheet();\n return;\n }\n void this.#router\n .navigate([menu.path.split('?')[0]], { queryParams: menu.queryParams ?? {}, state: { switchTab: true } })\n .then(navigated => {\n if (navigated) this.closeSheet();\n });\n }\n\n #releaseBodyScroll(): void {\n this.#document.body.style.overflow = this.#previousBodyOverflow;\n }\n}\n","<div class=\"sd-sidebar-mobile-v2 d-flex flex-column\">\n <main class=\"sd-sidebar-mobile-v2__content flex-1 overflow-auto\">\n <ng-content></ng-content>\n </main>\n\n <nav class=\"sd-sidebar-mobile-v2__bar d-flex align-items-stretch bg-white border-top border-black200\" [attr.aria-label]=\"'core.module.layout.sidebar.primary-nav' | sdTranslate\">\n @for (menu of primaryMenus(); track menu.id || menu.title) {\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v2__bar-action d-flex flex-column align-items-center justify-content-center gap-4 flex-1\"\n [attr.data-mobile-menu-key]=\"menu.id ? 'id:' + menu.id : null\"\n [attr.aria-label]=\"menu.tooltipTitle || menu.title || 'Menu'\"\n [attr.aria-expanded]=\"sheetGroupKey() === (menu.id ? 'id:' + menu.id : '') && isSheetOpen()\"\n (click)=\"activateMenu(menu, $event.currentTarget)\">\n @if (menu.iconUrl) {\n <img class=\"sd-sidebar-mobile-v2__icon\" [src]=\"menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"menu.icon || 'widgets'\"></sd-icon>\n }\n <span class=\"sd-sidebar-mobile-v2__label text-ellipsis\">{{ menu.tooltipTitle || menu.title }}</span>\n </button>\n }\n @if (overflowMenus().length) {\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v2__bar-action d-flex flex-column align-items-center justify-content-center gap-4 flex-1\"\n [attr.aria-label]=\"'core.module.layout.sidebar.more-menu' | sdTranslate\"\n [attr.aria-expanded]=\"sheetGroupKey() === 'more' && isSheetOpen()\"\n (click)=\"openMore($event.currentTarget)\">\n <sd-icon name=\"more_horiz\"></sd-icon>\n <span class=\"sd-sidebar-mobile-v2__label\">{{ 'core.module.layout.sidebar.more' | sdTranslate }}</span>\n </button>\n }\n </nav>\n\n @if (isSheetOpen()) {\n <button type=\"button\" class=\"sd-sidebar-mobile-v2__backdrop\" [attr.aria-label]=\"'core.module.layout.sidebar.close-menu' | sdTranslate\" (click)=\"closeSheet()\"></button>\n <section\n data-v2-sheet\n class=\"sd-sidebar-mobile-v2__sheet d-flex flex-column bg-white rounded-top-16 mat-elevation-z8\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"sheetTitle()\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n (keydown)=\"onSheetKeydown($event)\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n <span class=\"T16M text-ellipsis\">{{ sheetTitle() }}</span>\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v2__close d-flex align-items-center justify-content-center\"\n [attr.aria-label]=\"'core.common.close' | sdTranslate\"\n (click)=\"closeSheet()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </header>\n <div class=\"d-flex flex-column gap-12 p-12 overflow-auto\">\n <sd-layout-user-menu presentation=\"mobile-inline\" [userInfo]=\"userInfo()\"></sd-layout-user-menu>\n <sd-layout-search-field\n [placeholder]=\"'core.module.layout.sidebar.search-in-menu' | sdTranslate\"\n [autoId]=\"'layout-v2-mobile-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-layout-search-field>\n <sd-layout-menu-tree\n [menus]=\"sheetMenus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n pinVisibility=\"always\"\n (navigate)=\"onNavigate($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </div>\n </section>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\nimport { SdLayoutUserInfo, SidebarConfigurationV3, resolveSidebarV3Recent } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutRootMenu, getMenuStableKey, searchMenuLeaves } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n@Component({\n selector: 'sd-sidebar-v3',\n standalone: true,\n imports: [SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent, SdTranslatePipe],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarV3 {\n readonly #router = inject(Router);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n #initialized = false;\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV3>();\n isCollapsed = signal(false);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n searchResults = computed<SdLayoutRootMenu[]>(() => searchMenuLeaves(this.menus(), this.searchText()));\n recentConfiguration = computed(() => resolveSidebarV3Recent(this.sidebar()));\n pinnedKeys = this.#navigationState.pinnedKeys;\n pinnedMenus = this.#navigationState.pinnedMenus;\n recentMenus = this.#navigationState.recentMenus;\n collapsedItems = computed(() =>\n this.menus().map(menu => ({ menu, key: getMenuStableKey(menu), title: menu.tooltipTitle || menu.title || 'Menu' }))\n );\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n const sidebar = this.sidebar();\n const recentConfiguration = resolveSidebarV3Recent(sidebar);\n untracked(() => {\n this.#navigationState.hydrate(menus, recentConfiguration.maxItems);\n if (this.#initialized) return;\n const persistedCollapsed = this.#navigationState.versionState(3).collapsed;\n this.isCollapsed.set(typeof persistedCollapsed === 'boolean' ? persistedCollapsed : (sidebar.defaultCollapsed ?? false));\n this.#initialized = true;\n });\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (event instanceof NavigationEnd) this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n });\n }\n\n toggleCollapsed(): void {\n this.isCollapsed.update(collapsed => !collapsed);\n this.#navigationState.patchVersionState(3, { collapsed: this.isCollapsed() });\n }\n\n activateCollapsedMenu(menu: SdLayoutMenu): void {\n if ('path' in menu) this.navigateMenu(menu);\n else {\n this.isCollapsed.set(false);\n this.#navigationState.patchVersionState(3, { collapsed: false });\n }\n }\n\n navigateMenu(menu: SdLayoutMenu): void {\n if (!('path' in menu)) return;\n this.#navigationState.recordRecent(menu, this.recentConfiguration());\n // why: `includes('http')` là substring test — `javascript:fetch(...)//http` lọt qua và chạy như\n // script trong origin của app. Parse URL thật rồi mới mở, kèm `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(menu.path)) {\n sdOpenExternal(menu.path);\n return;\n }\n void this.#router.navigate([menu.path.split('?')[0]], {\n queryParams: menu.queryParams ?? {},\n state: { switchTab: true },\n });\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n}\n","<div class=\"sd-sidebar-v3\" [class.sd-sidebar-v3--collapsed]=\"isCollapsed()\">\n <aside\n class=\"sd-sidebar-v3__drawer d-flex flex-column bg-white border-right border-black200\"\n data-v3-sidebar\n [attr.data-collapsed]=\"isCollapsed()\">\n <header\n data-v3-header\n class=\"sd-sidebar-v3__header d-flex align-items-center gap-8 p-12 border-bottom border-black200\"\n [class.sd-sidebar-v3__header--collapsed]=\"isCollapsed()\"\n [class.justify-content-between]=\"!isCollapsed()\"\n [class.justify-content-center]=\"isCollapsed()\">\n @if (!isCollapsed()) {\n <div data-v3-brand class=\"d-flex align-items-center gap-8 overflow-hidden\">\n @if (sidebar().logoUrl) {\n <img class=\"sd-sidebar-v3__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n } @else {\n <sd-icon name=\"apps\"></sd-icon>\n }\n <span class=\"T16M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n </div>\n }\n <button\n type=\"button\"\n class=\"sd-sidebar-v3__icon-action d-flex align-items-center justify-content-center\"\n [attr.aria-label]=\"isCollapsed() ? 'Mở rộng sidebar' : 'Thu gọn sidebar'\"\n [attr.aria-expanded]=\"!isCollapsed()\"\n (click)=\"toggleCollapsed()\">\n <sd-icon [name]=\"isCollapsed() ? 'chevron_right' : 'chevron_left'\"></sd-icon>\n </button>\n </header>\n\n @if (isCollapsed()) {\n <nav class=\"d-flex flex-column align-items-center gap-4 p-8 flex-1\" aria-label=\"Menu thu gọn\">\n @for (item of collapsedItems(); track item.key) {\n <button\n type=\"button\"\n class=\"sd-sidebar-v3__collapsed-action d-flex align-items-center justify-content-center\"\n [attr.aria-label]=\"item.title\"\n (click)=\"activateCollapsedMenu(item.menu)\">\n @if (item.menu.iconUrl) {\n <img class=\"sd-sidebar-v3__logo\" [src]=\"item.menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"item.menu.icon || 'widgets'\"></sd-icon>\n }\n </button>\n }\n </nav>\n } @else {\n <div class=\"p-12\">\n <sd-layout-search-field\n placeholder=\"Tìm trong tất cả menu\"\n [autoId]=\"'layout-v3-global-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-layout-search-field>\n </div>\n <div class=\"sd-sidebar-v3__navigation d-flex flex-column gap-16 flex-1 overflow-auto px-8 pb-12\">\n @if (pinnedMenus().length) {\n <section data-v3-pinned class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">{{ 'core.module.layout.sidebar.pinned' | sdTranslate }}</h2>\n <sd-layout-menu-tree\n [menus]=\"pinnedMenus()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n @if (recentConfiguration().enabled && recentMenus().length) {\n <section data-v3-recent class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">{{ 'core.module.layout.sidebar.recent' | sdTranslate }}</h2>\n <sd-layout-menu-tree [menus]=\"recentMenus()\" [activePath]=\"activePath()\" [showPin]=\"false\" (navigate)=\"navigateMenu($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n <section class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">{{ 'core.module.layout.sidebar.all-menu' | sdTranslate }}</h2>\n <sd-layout-menu-tree\n [menus]=\"menus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n </div>\n }\n\n <div class=\"p-8 border-top border-black200\">\n <sd-layout-user-menu [userInfo]=\"userInfo()\" [compact]=\"isCollapsed()\"></sd-layout-user-menu>\n </div>\n </aside>\n\n <main class=\"sd-sidebar-v3__content\">\n <ng-content></ng-content>\n </main>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\nimport { SdLayoutUserInfo, SidebarConfigurationV3, resolveSidebarV3Recent } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutRootMenu, searchMenuLeaves } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n@Component({\n selector: 'sd-sidebar-mobile-v3',\n standalone: true,\n imports: [A11yModule, SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent, SdTranslatePipe],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarMobileV3 {\n readonly #router = inject(Router);\n readonly #document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n #restoreFocusElement: HTMLElement | null = null;\n #previousBodyOverflow = '';\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV3>();\n isDrawerOpen = signal(false);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n searchResults = computed<SdLayoutRootMenu[]>(() => searchMenuLeaves(this.menus(), this.searchText()));\n recentConfiguration = computed(() => resolveSidebarV3Recent(this.sidebar()));\n pinnedKeys = this.#navigationState.pinnedKeys;\n pinnedMenus = this.#navigationState.pinnedMenus;\n recentMenus = this.#navigationState.recentMenus;\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n const maximum = resolveSidebarV3Recent(this.sidebar()).maxItems;\n untracked(() => this.#navigationState.hydrate(menus, maximum));\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (!(event instanceof NavigationEnd)) return;\n this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n this.closeFromNavigation();\n });\n this.#destroyRef.onDestroy(() => this.#releaseBodyScroll());\n }\n\n openDrawer(trigger?: EventTarget | null): void {\n this.#restoreFocusElement =\n trigger instanceof HTMLElement\n ? trigger\n : this.#document.activeElement instanceof HTMLElement\n ? this.#document.activeElement\n : (this.trigger()?.nativeElement ?? null);\n if (!this.isDrawerOpen()) {\n this.#previousBodyOverflow = this.#document.body.style.overflow;\n this.#document.body.style.overflow = 'hidden';\n }\n this.isDrawerOpen.set(true);\n }\n\n closeFromBackdrop(): void {\n this.#closeDrawer();\n }\n\n closeFromEscape(): void {\n this.#closeDrawer();\n }\n\n closeFromNavigation(): void {\n this.#closeDrawer();\n }\n\n onDrawerKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n this.closeFromEscape();\n }\n\n navigateMenu(menu: SdLayoutMenu): void {\n if (!('path' in menu)) return;\n this.#navigationState.recordRecent(menu, this.recentConfiguration());\n // why: `includes('http')` là substring test — `javascript:fetch(...)//http` lọt qua và chạy như\n // script trong origin của app. Parse URL thật rồi mới mở, kèm `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(menu.path)) {\n sdOpenExternal(menu.path);\n this.closeFromNavigation();\n return;\n }\n void this.#router\n .navigate([menu.path.split('?')[0]], { queryParams: menu.queryParams ?? {}, state: { switchTab: true } })\n .then(navigated => {\n if (navigated) this.closeFromNavigation();\n });\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n\n #closeDrawer(): void {\n if (!this.isDrawerOpen()) return;\n this.isDrawerOpen.set(false);\n this.searchText.set('');\n this.#releaseBodyScroll();\n (this.#restoreFocusElement ?? this.trigger()?.nativeElement)?.focus();\n this.#restoreFocusElement = null;\n }\n\n #releaseBodyScroll(): void {\n this.#document.body.style.overflow = this.#previousBodyOverflow;\n }\n}\n","<div class=\"sd-sidebar-mobile-v3 d-flex flex-column\">\n <header\n class=\"sd-sidebar-mobile-v3__topbar d-flex align-items-center justify-content-between gap-8 px-16 bg-white border-bottom border-black200\">\n <div class=\"d-flex align-items-center gap-8 overflow-hidden\">\n @if (sidebar().logoUrl) {\n <img class=\"sd-sidebar-mobile-v3__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n }\n <span class=\"T16M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n </div>\n <button\n #trigger\n type=\"button\"\n data-v3-mobile-trigger\n class=\"sd-sidebar-mobile-v3__icon-action d-flex align-items-center justify-content-center\"\n aria-label=\"Mở menu\"\n [attr.aria-expanded]=\"isDrawerOpen()\"\n (click)=\"openDrawer($event.currentTarget)\">\n <sd-icon name=\"menu\"></sd-icon>\n </button>\n </header>\n\n <main class=\"flex-1 overflow-auto\">\n <ng-content></ng-content>\n </main>\n\n @if (isDrawerOpen()) {\n <button type=\"button\" class=\"sd-sidebar-mobile-v3__backdrop\" aria-label=\"Đóng menu\" (click)=\"closeFromBackdrop()\"></button>\n <aside\n class=\"sd-sidebar-mobile-v3__drawer d-flex flex-column bg-white mat-elevation-z8\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Menu chính\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n (keydown)=\"onDrawerKeydown($event)\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n <span class=\"T18M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v3__icon-action d-flex align-items-center justify-content-center\"\n aria-label=\"Đóng menu\"\n (click)=\"closeFromBackdrop()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </header>\n <div class=\"sd-sidebar-mobile-v3__navigation d-flex flex-column gap-16 flex-1 overflow-auto p-12\">\n <sd-layout-user-menu presentation=\"mobile-inline\" [userInfo]=\"userInfo()\"></sd-layout-user-menu>\n <div class=\"sd-sidebar-mobile-v3__search bg-white\">\n <sd-layout-search-field\n placeholder=\"Tìm trong tất cả menu\"\n [autoId]=\"'layout-v3-mobile-global-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-layout-search-field>\n </div>\n @if (pinnedMenus().length) {\n <section data-v3-mobile-pinned class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">{{ 'core.module.layout.sidebar.pinned' | sdTranslate }}</h2>\n <sd-layout-menu-tree\n [menus]=\"pinnedMenus()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n pinVisibility=\"always\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n @if (recentConfiguration().enabled && recentMenus().length) {\n <section data-v3-mobile-recent class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">{{ 'core.module.layout.sidebar.recent' | sdTranslate }}</h2>\n <sd-layout-menu-tree [menus]=\"recentMenus()\" [activePath]=\"activePath()\" [showPin]=\"false\" (navigate)=\"navigateMenu($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n <section class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">{{ 'core.module.layout.sidebar.all-menu' | sdTranslate }}</h2>\n <sd-layout-menu-tree\n [menus]=\"menus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n pinVisibility=\"always\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n </div>\n </aside>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n// Import nội bộ trong module layout\nimport { SdLayoutMenu, SdLayoutResponsiveService, SdLayoutService } from '../../services';\nimport { MenuPipe } from '../../pipes';\nimport { SdSidebarV1 } from '../sidebar-v1/main.component';\nimport { SdSidebarMobileV1 } from '../sidebar-mobile-v1/main.component';\nimport { SdSidebarV2 } from '../sidebar-v2/main.component';\nimport { SdSidebarMobileV2 } from '../sidebar-mobile-v2/main.component';\nimport { SdSidebarV3 } from '../sidebar-v3/main.component';\nimport { SdSidebarMobileV3 } from '../sidebar-mobile-v3/main.component';\nimport {\n SD_LAYOUT_CONFIGURATION,\n SidebarConfigurationV1,\n SidebarConfigurationV2,\n SidebarConfigurationV3,\n normalizeLayoutMobileBreakpoint,\n} from '../../configurations';\n\n@Component({\n selector: 'sd-layout',\n templateUrl: './layout-main.component.html',\n styleUrl: './layout-main.component.scss',\n imports: [SdSidebarV1, SdSidebarMobileV1, SdSidebarV2, SdSidebarMobileV2, SdSidebarV3, SdSidebarMobileV3, NgTemplateOutlet],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutComponent {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #menuPipe = inject(MenuPipe);\n #layoutService = inject(SdLayoutService);\n #responsiveService = inject(SdLayoutResponsiveService);\n #layoutConfiguration = inject(SD_LAYOUT_CONFIGURATION, { optional: true });\n\n // ==========================================\n // SIGNAL INPUTS\n // ==========================================\n menusInput = input<SdLayoutMenu[]>([], { alias: 'menus' });\n menus = computed(() => this.#menuPipe.transform(this.menusInput() || []));\n\n // ==========================================\n // CONSUME SHARED STATE\n // ==========================================\n userInfo = this.#layoutService.userInfo;\n sidebar = this.#layoutService.sidebar;\n sidebarV1 = computed<SidebarConfigurationV1 | undefined>(() => {\n const sidebar = this.sidebar();\n return sidebar?.version === 1 ? sidebar : undefined;\n });\n sidebarV2 = computed<SidebarConfigurationV2 | undefined>(() => {\n const sidebar = this.sidebar();\n return sidebar?.version === 2 ? sidebar : undefined;\n });\n sidebarV3 = computed<SidebarConfigurationV3 | undefined>(() => {\n const sidebar = this.sidebar();\n return sidebar?.version === 3 ? sidebar : undefined;\n });\n mobileBreakpoint = normalizeLayoutMobileBreakpoint(this.#layoutConfiguration?.mobileBreakpoint);\n isMobile = computed(() => this.#responsiveService.isMobile(this.mobileBreakpoint));\n}\n","<ng-template #projectedContent>\n <ng-content></ng-content>\n</ng-template>\n\n@let _userInfo = userInfo();\n@let _sidebarV1 = sidebarV1();\n@let _sidebarV2 = sidebarV2();\n@let _sidebarV3 = sidebarV3();\n\n@if (_userInfo && _sidebarV1) {\n @if (!isMobile()) {\n <sd-sidebar-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV1\" [isMobile]=\"false\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-v1>\n } @else {\n <sd-sidebar-mobile-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV1\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-mobile-v1>\n }\n}\n\n@if (_userInfo && _sidebarV3) {\n @if (!isMobile()) {\n <sd-sidebar-v3 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV3\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-v3>\n } @else {\n <sd-sidebar-mobile-v3 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV3\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-mobile-v3>\n }\n}\n\n@if (_userInfo && _sidebarV2) {\n @if (!isMobile()) {\n <sd-sidebar-v2 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV2\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-v2>\n } @else {\n <sd-sidebar-mobile-v2 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV2\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-mobile-v2>\n }\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { SdTabComponent } from '@sdcorejs/angular/components';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { Language } from '@sdcorejs/utils/models';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService } from '../../../../services';\nimport { resolveTabName } from '../../../../utils';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n// End\n\n@Component({\n selector: 'app-home-page',\n imports: [SdIcon, SdPageComponent, SdTranslatePipe],\n templateUrl: './home-page.component.html',\n styleUrl: './home-page.component.scss',\n standalone: true,\n})\n@SdTabComponent({\n component: HomePageComponent,\n name: () => resolveTabName('core.module.layout.home.tab-name'),\n icon: 'home',\n color: 'primary',\n})\nexport class HomePageComponent {\n // ==========================================\n // INJECT SERVICES (Modern Angular)\n // ==========================================\n readonly #layoutService = inject(SdLayoutService);\n readonly #i18n = inject(I18nService);\n\n // Map Language code → BCP 47 locale tag dùng cho Intl date formatting\n // WHY: must be declared before todayInfo — field init runs top-to-bottom; #getTodayInfo reads #localeMap.\n readonly #localeMap: Record<Language, string> = {\n vi: 'vi-VN',\n en: 'en-US',\n ja: 'ja-JP',\n ko: 'ko-KR',\n zh: 'zh-CN',\n };\n\n // ==========================================\n // SIGNALS (STATE)\n // ==========================================\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n userInfo = this.#layoutService.userInfo;\n\n // WHY: static data, không cần signal. `storage` + `schema` thay cho `database` + `account_tree`\n // để đảm bảo render trên mọi version của Material Icons mặc định.\n readonly features = [\n { icon: 'storage', key: 'core.module.layout.home.feature.data', area: 'data' },\n { icon: 'insights', key: 'core.module.layout.home.feature.reports', area: 'report' },\n { icon: 'group', key: 'core.module.layout.home.feature.users', area: 'users' },\n { icon: 'schema', key: 'core.module.layout.home.feature.workflow', area: 'flow' },\n { icon: 'verified_user', key: 'core.module.layout.home.feature.audit', area: 'audit' },\n { icon: 'hub', key: 'core.module.layout.home.feature.integration', area: 'integ' },\n ] as const;\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n\n #getTimezone() {\n const now = new Date();\n const timezoneOffset = now.getTimezoneOffset();\n const offsetHours = -timezoneOffset / 60;\n const sign = offsetHours >= 0 ? '+' : '';\n const simpleGmtString = `GMT${sign}${offsetHours}`;\n return simpleGmtString;\n }\n\n #getTodayInfo(date: Date) {\n // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n // WHY: dùng locale theo ngôn ngữ hiện tại để định dạng số (dd/mm/yyyy vs mm/dd/yyyy ...)\n const locale = this.#localeMap[this.#i18n.language()] ?? 'vi-VN';\n const dateStr = date.toLocaleDateString(locale, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n const formatted = this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n return `${formatted} (${this.#getTimezone()})`;\n }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n <div class=\"d-flex flex-column\" headerLeft>\n <div class=\"font-weight-medium fs-20\">\n {{ 'core.module.layout.greeting.hello' | sdTranslate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}\n </div>\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n </div>\n\n <div class=\"wrapper\">\n <div class=\"bento\">\n <!-- Hero -->\n <div class=\"card hero-card\">\n <div class=\"hero-ring ring-3\"></div>\n <div class=\"hero-ring ring-2\"></div>\n <div class=\"hero-ring ring-1\"></div>\n <div class=\"hero-core\">\n <sd-icon class=\"hero-icon\" name=\"space_dashboard\"></sd-icon>\n </div>\n <div class=\"hero-decoration\">\n <span class=\"dot d1\"></span>\n <span class=\"dot d2\"></span>\n <span class=\"dot d3\"></span>\n </div>\n </div>\n\n <!-- Features -->\n @for (feature of features; track feature.key; let i = $index) {\n <div\n class=\"card feature-card\"\n [class.feature-wide]=\"feature.area === 'audit' || feature.area === 'integ'\"\n [style.gridArea]=\"feature.area\"\n [style.animation-delay.ms]=\"(i + 1) * 80\"\n >\n <div class=\"feature-accent\"></div>\n <div class=\"feature-content\">\n <div class=\"feature-icon-wrap\">\n <sd-icon class=\"feature-icon\" [name]=\"feature.icon\"></sd-icon>\n </div>\n <span class=\"feature-label\">{{ feature.key | sdTranslate }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n</sd-page>\n","import { inject, Injectable } from '@angular/core';\nimport { CanActivate, Router } from '@angular/router';\n\n// Giả sử bạn có một service để đọc config\nimport { ISdLayoutConfiguration, SD_LAYOUT_CONFIGURATION } from '../../../configurations';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HomeRedirectGuard implements CanActivate {\n private readonly router = inject(Router);\n private readonly layoutConfiguration: ISdLayoutConfiguration = inject(SD_LAYOUT_CONFIGURATION);\n\n async canActivate() {\n const homeUrl = this.layoutConfiguration?.homeUrl;\n if (homeUrl) {\n // Nếu có config homeUrl, tạo một UrlTree để redirect\n // Đây là cách redirect chính thống từ trong guard\n return this.router.createUrlTree([homeUrl]);\n }\n // Nếu không có homeUrl, cho phép kích hoạt route\n return true;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { HomePageComponent } from './components/home-page/home-page.component';\nimport { HomeRedirectGuard } from './guards/home-redirect.guard';\n\nconst routes: Routes = [\n {\n path: '',\n canActivate: [HomeRedirectGuard],\n component: HomePageComponent,\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class HomeRoutingModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HomeRoutingModule } from './home.routing';\n\n@NgModule({\n declarations: [],\n imports: [CommonModule, HomeRoutingModule],\n})\nexport class HomeModule {}\n","import { Component, inject, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { SdButton, SdTabComponent } from '@sdcorejs/angular/components';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService } from '../../../../services';\nimport { resolveTabName } from '../../../../utils';\n// End\n\n@Component({\n templateUrl: './root.component.html',\n styleUrl: './root.component.scss',\n imports: [SdButton, SdPageComponent, SdTranslatePipe],\n})\n@SdTabComponent({\n component: RootComponent,\n name: () => resolveTabName('core.module.layout.not-found.tab-name'),\n icon: 'search_off',\n color: 'warning',\n})\nexport class RootComponent {\n // ==========================================\n // INJECT SERVICES (Modern Angular)\n // ==========================================\n readonly #route = inject(ActivatedRoute);\n readonly #router = inject(Router);\n readonly #layoutService = inject(SdLayoutService);\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // SIGNALS (STATE)\n // ==========================================\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n userInfo = this.#layoutService.userInfo;\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n #getTodayInfo(date: Date): string {\n // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n const dateStr = date.toLocaleDateString('vi-VN', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n return this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n }\n\n // ==========================================\n // PUBLIC METHODS\n // ==========================================\n /**\n * why: `window.location.href = ''` vừa là global thô (throw khi SSR vì không có `window`), vừa chỉ\n * reload lại đúng trang lỗi này thay vì rời khỏi nó — trong khi nút mang nhãn \"Quay lại trang chủ\".\n * Điều hướng bằng Router tới `homeUrl` mà consumer đã khai trong SD_LAYOUT_CONFIGURATION.\n */\n reload(): void {\n void this.#router.navigateByUrl(this.#layoutService.homeUrl);\n }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n <div class=\"d-flex flex-column\" headerLeft>\n <div class=\"font-weight-medium fs-20\">{{ 'core.module.layout.greeting.hello' | sdTranslate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}</div>\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n </div>\n\n <div class=\"h-full d-flex flex-column align-items-center\">\n <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\n <img alt=\"not-found\" class=\"sd-image-not-found\" />\n <span class=\"T16M mt-24\">{{ 'core.module.layout.not-found.title' | sdTranslate }}</span>\n <span class=\"T16R text-secondary mt-4\">\n {{ 'core.module.layout.not-found.message' | sdTranslate }}\n </span>\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" [title]=\"'core.module.layout.not-found.back' | sdTranslate\" prefixIcon=\"arrow_back\"> </sd-button>\n </div>\n </div>\n</sd-page>\n","import { Route } from '@angular/router';\nimport { RootComponent } from './pages/root/root.component';\n\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './not-found.routing';\n\n@NgModule({\n imports: [CommonModule, RouterModule.forChild(Routes)],\n exports: [],\n})\nexport class NotFoundModule {}\n","import { Component, inject, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { SdButton, SdTabComponent } from '@sdcorejs/angular/components';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService } from '../../../../services';\nimport { resolveTabName } from '../../../../utils';\n// End\n\n@Component({\n templateUrl: './root.component.html',\n styleUrl: './root.component.scss',\n imports: [SdButton, SdPageComponent, SdTranslatePipe],\n})\n@SdTabComponent({\n component: RootComponent,\n name: () => resolveTabName('core.module.layout.forbidden.tab-name'),\n icon: 'block',\n color: 'error',\n})\nexport class RootComponent {\n // ==========================================\n // INJECT SERVICES (Modern Angular)\n // ==========================================\n readonly #route = inject(ActivatedRoute);\n readonly #router = inject(Router);\n readonly #layoutService = inject(SdLayoutService);\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // SIGNALS (STATE)\n // ==========================================\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n userInfo = this.#layoutService.userInfo;\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n #getTodayInfo(date: Date): string {\n // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n const dateStr = date.toLocaleDateString('vi-VN', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n return this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n }\n\n // ==========================================\n // PUBLIC METHODS\n // ==========================================\n /**\n * why: `window.location.href = ''` vừa là global thô (throw khi SSR vì không có `window`), vừa chỉ\n * reload lại đúng trang lỗi này thay vì rời khỏi nó — trong khi nút mang nhãn \"Về trang chủ\".\n * Điều hướng bằng Router tới `homeUrl` mà consumer đã khai trong SD_LAYOUT_CONFIGURATION.\n */\n reload(): void {\n void this.#router.navigateByUrl(this.#layoutService.homeUrl);\n }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n <div class=\"d-flex flex-column\" headerLeft>\n <div class=\"font-weight-medium fs-20\">{{ 'core.module.layout.greeting.hello' | sdTranslate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}</div>\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n </div>\n <div class=\"h-full d-flex flex-column align-items-center\">\n <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\n <img alt=\"forbidden\" class=\"sd-image-forbidden\" />\n <span class=\"T16M mt-24\">{{ 'core.module.layout.forbidden.title' | sdTranslate }}</span>\n <span class=\"T14R text-secondary mt-4\"\n >{{ 'core.module.layout.forbidden.message' | sdTranslate }}</span\n >\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" [title]=\"'core.module.layout.forbidden.back-home' | sdTranslate\"> </sd-button>\n </div>\n </div>\n</sd-page>\n","import { Route } from '@angular/router';\nimport { RootComponent } from './pages/root/root.component';\n\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './forbidden.routing';\n\n@NgModule({\n imports: [CommonModule, RouterModule.forChild(Routes)],\n exports: [],\n})\nexport class ForbiddenModule {}\n","import { Route } from '@angular/router';\nimport { SD_PERMISSION_PUBLIC } from '@sdcorejs/angular/modules/permission';\n\n// why: `SdPermissionGuard.canActivateChild` từ chối mọi route không khai báo `data.permission`. Ba\n// trang built-in dưới đây là hạ tầng của layout (home / 404 / 403), ai đăng nhập cũng phải vào được —\n// đặc biệt `forbidden`, vì `onForbiden` thường điều hướng chính vào nó: thiếu khai báo ở đây thì\n// trang 403 tự bị chặn và app rơi vào vòng lặp redirect. Nói tường minh bằng `SD_PERMISSION_PUBLIC`.\n// Route con `path: ''` trong từng module kế thừa `data` này (chiến lược `emptyOnly` mặc định).\nconst PUBLIC_ROUTE_DATA = { permission: SD_PERMISSION_PUBLIC } as const;\n\nexport const Routes: Route[] = [\n {\n path: '',\n pathMatch: 'full',\n redirectTo: 'not-found',\n },\n {\n path: 'home',\n data: PUBLIC_ROUTE_DATA,\n loadChildren: () => import('./modules/home').then(m => m.HomeModule),\n },\n {\n path: 'not-found',\n data: PUBLIC_ROUTE_DATA,\n loadChildren: () => import('./modules/not-found').then(m => m.NotFoundModule),\n },\n {\n path: 'forbidden',\n data: PUBLIC_ROUTE_DATA,\n loadChildren: () => import('./modules/forbidden').then(m => m.ForbiddenModule),\n },\n];\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './layout.routing';\n@NgModule({\n declarations: [],\n imports: [RouterModule.forChild(Routes)],\n providers: [],\n})\nexport class SdLayoutModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["LayoutUserComponent","i1","RootComponent","Routes"],"mappings":"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"}