{"version":3,"file":"sdcorejs-angular-modules-permission.mjs","sources":["../../../projects/sdcorejs-angular/modules/permission/src/configurations/permission.configuration.ts","../../../projects/sdcorejs-angular/modules/permission/src/services/permission.service.ts","../../../projects/sdcorejs-angular/modules/permission/src/directives/permission.directive.ts","../../../projects/sdcorejs-angular/modules/permission/src/guards/permission.guard.ts","../../../projects/sdcorejs-angular/modules/permission/sdcorejs-angular-modules-permission.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { MaybeAsync } from '@sdcorejs/utils/models';\n\n/**\n * Cấu hình trung tâm cho module permission.\n *\n * Luồng hoạt động chính:\n * 1. `loadPermissions(key?)` ở service được gọi để lấy danh sách mã quyền theo từng `key` cấu hình.\n * 2. Guard/service đối chiếu mã quyền theo route metadata.\n * 3. Khi không đủ quyền, callback `onForbiden()` sẽ được gọi (nếu có).\n *\n * Lưu ý:\n * - `SD_PERMISSION_CONFIGURATION` hỗ trợ cả cấu hình đơn và mảng cấu hình (`multi: true`).\n * - Nếu cần tạm bỏ qua kiểm tra quyền (POC/UAT cục bộ), đặt `disabled = true`.\n */\nexport interface ISdPermissionConfiguration {\n  /**\n   * Khóa định danh cấu hình.\n   * Dùng để phân biệt khi hệ thống mở rộng theo nhiều profile permission.\n   *\n   * Lưu ý: `undefined` cũng được xem là một key hợp lệ (cấu hình mặc định).\n   */\n  key?: string;\n\n  /**\n   * Bật/tắt kiểm tra permission toàn cục.\n   * - `true`: bỏ qua kiểm tra quyền.\n   * - `false | undefined`: kiểm tra quyền theo cấu hình route.\n   */\n  disabled?: boolean;\n\n  /**\n   * Trả về danh sách mã quyền của user hiện tại.\n   * Có thể đồng bộ hoặc bất đồng bộ.\n   *\n   * Ví dụ giá trị trả về:\n   * - `['PRODUCT_C_EMPLOYEE_VIEW', 'PRODUCT_C_EMPLOYEE_UPDATE']`\n   */\n  loadPermissions: () => MaybeAsync<string[]>;\n\n  /**\n   * Callback xử lý khi user không có quyền truy cập URL hiện tại.\n   * Thường dùng để điều hướng sang trang forbidden hoặc hiển thị thông báo.\n   *\n   * Giữ nguyên tên `onForbiden` để tương thích API hiện tại.\n   */\n  onForbiden?: () => void;\n\n  /**\n   * Cung cấp access token hiện tại cho các tác vụ liên quan permission.\n   * Hỗ trợ trả về đồng bộ, Promise hoặc Observable.\n   */\n  getToken?: () => MaybeAsync<string | undefined | null>;\n}\n\n/**\n * InjectionToken cho cấu hình permission.\n *\n * Ví dụ provider:\n * {\n *   provide: SD_PERMISSION_CONFIGURATION,\n *   useValue: {\n *     disabled: false,\n *     loadPermissions: () => ['SAMPLE_C_EMPLOYEE_VIEW'],\n *     onForbiden: () => router.navigateByUrl('/layout/forbidden')\n *   }\n * }\n */\nexport const SD_PERMISSION_CONFIGURATION = new InjectionToken<ISdPermissionConfiguration | ISdPermissionConfiguration[]>(\n  'sd-permission.configuration'\n);\n","import { inject, Injectable } from '@angular/core';\nimport { SdCache, SdCacheService } from '@sdcorejs/angular/services/cache';\nimport { ArrayUtilities } from '@sdcorejs/angular/utilities/extensions';\nimport { ISdPermissionConfiguration, SD_PERMISSION_CONFIGURATION } from '../configurations';\nimport { MaybeAsync, resolveMaybeAsync } from '@sdcorejs/utils/models';\n\n@Injectable({ providedIn: 'root' })\nexport class SdPermissionService {\n  #permissionMapByKey: Record<string, Record<string, boolean>> = {};\n  readonly #configuration = inject<ISdPermissionConfiguration | ISdPermissionConfiguration[]>(SD_PERMISSION_CONFIGURATION);\n  readonly #cacheService = inject(SdCacheService);\n  #permissionsByKey: SdCache<Record<string, string[]>> = this.#cacheService.create<Record<string, string[]>>(\n    '212a51fa-38d5-43b2-bd46-922d85950ba3',\n    {\n      type: 'session',\n      default: {},\n    }\n  );\n  readonly #loadedKeys = new Set<string>();\n\n  constructor() {\n    this.#validateDuplicateConfigKeys();\n  }\n\n  #getConfigurations = (): ISdPermissionConfiguration[] => {\n    const config = this.#configuration;\n    if (!config) {\n      return [];\n    }\n    return Array.isArray(config) ? config : [config];\n  };\n\n  #normalizeKey = (key?: string): string => {\n    return key === undefined ? '__undefined__' : key;\n  };\n\n  #validateDuplicateConfigKeys = (): void => {\n    const seen = new Set<string>();\n    for (const config of this.#getConfigurations()) {\n      const normalizedKey = this.#normalizeKey(config.key);\n      if (seen.has(normalizedKey)) {\n        const keyLabel = config.key === undefined ? 'undefined' : config.key;\n        throw new Error(`[Permission] Duplicate permission configuration key: ${keyLabel}`);\n      }\n      seen.add(normalizedKey);\n    }\n  };\n\n  #getConfigurationByKey = (key?: string): ISdPermissionConfiguration | undefined => {\n    return this.#getConfigurations().find(config => config.key === key);\n  };\n\n  #getEffectivePermissionKey = (key?: string): string | undefined => {\n    if (this.#getConfigurationByKey(key)) {\n      return key;\n    }\n\n    // Portal-level config uses key = undefined and acts as default fallback\n    if (key !== undefined && this.#getConfigurationByKey(undefined)) {\n      return undefined;\n    }\n\n    return key;\n  };\n\n  #setPermissionsForKey = (normalizedKey: string, permissions: string[]): void => {\n    const distinctPermissions = ArrayUtilities.distinct(permissions || []);\n    const current = this.#permissionsByKey.get() || {};\n    this.#permissionsByKey.set({\n      ...current,\n      [normalizedKey]: distinctPermissions,\n    });\n\n    const permissionMap: Record<string, boolean> = {};\n    distinctPermissions.forEach(permission => {\n      permissionMap[permission] = true;\n    });\n    this.#permissionMapByKey[normalizedKey] = permissionMap;\n  };\n\n  loadPermissions = async (key?: string): Promise<string[]> => {\n    const effectiveKey = this.#getEffectivePermissionKey(key);\n    const normalizedKey = this.#normalizeKey(effectiveKey);\n    if (this.#loadedKeys.has(normalizedKey)) {\n      return this.#permissionsByKey.get()?.[normalizedKey] || [];\n    }\n\n    const configuration = this.#getConfigurationByKey(effectiveKey);\n    if (!configuration) {\n      this.#setPermissionsForKey(normalizedKey, []);\n      this.#loadedKeys.add(normalizedKey);\n      return [];\n    }\n\n    try {\n      const permissions: string[] = await resolveMaybeAsync(configuration.loadPermissions());\n      this.#setPermissionsForKey(normalizedKey, permissions || []);\n    } catch (err) {\n      console.error(err);\n      this.#setPermissionsForKey(normalizedKey, []);\n    } finally {\n      this.#loadedKeys.add(normalizedKey);\n    }\n\n    return this.#permissionsByKey.get()?.[normalizedKey] || [];\n  };\n\n  loadAllPermissions = async (): Promise<void> => {\n    const configurations = this.#getConfigurations();\n    if (!configurations.length) {\n      await this.loadPermissions(undefined);\n      return;\n    }\n\n    await Promise.all(configurations.map(config => this.loadPermissions(config.key)));\n  };\n\n  hasPermission = (permission: string | string[], key?: string) => {\n    if (!permission?.toString()) {\n      return true;\n    }\n\n    const effectiveKey = this.#getEffectivePermissionKey(key);\n    const configuration = this.#getConfigurationByKey(effectiveKey);\n    if (configuration?.disabled) {\n      return true;\n    }\n\n    const normalizedKey = this.#normalizeKey(effectiveKey);\n    const permissionMap = this.#permissionMapByKey[normalizedKey] || {};\n    const permissions = Array.isArray(permission) ? permission : [permission];\n    return permissions.some(val => permissionMap[val]);\n  };\n\n  getToken = async (key?: string) => {\n    const effectiveKey = this.#getEffectivePermissionKey(key);\n    const getToken = this.#getConfigurationByKey(effectiveKey)?.getToken as (() => MaybeAsync<string | undefined | null>) | undefined;\n    if (!getToken) {\n      throw new Error('[Permission] Method getToken');\n    }\n\n    const token = await resolveMaybeAsync(getToken());\n    if (token === '') {\n      return undefined;\n    }\n    return token;\n  };\n\n  decodeToken = async <T>(key?: string): Promise<T | null> => {\n    const token = await this.getToken(key);\n    if (!token) {\n      return null;\n    }\n    try {\n      const payload = token.split('.')[1];\n      const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n      const jsonPayload = decodeURIComponent(\n        atob(base64)\n          .split('')\n          .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\n          .join('')\n      );\n      return JSON.parse(jsonPayload);\n    } catch (error) {\n      console.error('Invalid token', error);\n      return null;\n    }\n  };\n}\n","import { Directive, effect, inject, input, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { SdPermissionService } from '../services';\n\n@Directive({\n  selector: '[sdPermission]',\n})\nexport class SdPermissionDirective {\n  readonly #templateRef: TemplateRef<Record<string, never>> = inject(TemplateRef);\n  readonly #viewContainerRef = inject(ViewContainerRef);\n  readonly #permissionService = inject(SdPermissionService);\n\n  // Nếu là mảng thì chỉ cần có 1 permission trong mảng đó xem như có quyền\n  readonly sdPermission = input<string | string[] | undefined | null>(undefined);\n  readonly sdPermissionKey = input<string | undefined>(undefined);\n\n  constructor() {\n    effect(() => {\n      const permission = this.sdPermission();\n      const permissionKey = this.sdPermissionKey();\n\n      this.#viewContainerRef.clear();\n\n      // Nếu không gắn permission thì render\n      if (!permission?.toString()) {\n        this.#viewContainerRef.createEmbeddedView(this.#templateRef);\n        return;\n      }\n\n      // Kiểm tra permission theo key (nếu có)\n      if (this.#permissionService.hasPermission(permission, permissionKey)) {\n        this.#viewContainerRef.createEmbeddedView(this.#templateRef);\n      }\n    });\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, CanActivateChild, RouterStateSnapshot } from '@angular/router';\nimport { ISdPermissionConfiguration, SD_PERMISSION_CONFIGURATION } from '../configurations';\nimport { SdPermissionService } from '../services';\n\n@Injectable({ providedIn: 'root' })\nexport class SdPermissionGuard implements CanActivate, CanActivateChild {\n  private readonly configuration: ISdPermissionConfiguration | ISdPermissionConfiguration[] = inject(SD_PERMISSION_CONFIGURATION);\n  private readonly permissionService = inject(SdPermissionService);\n\n  #getConfigurations = (): ISdPermissionConfiguration[] => {\n    const config = this.configuration;\n    if (!config) {\n      return [];\n    }\n    return Array.isArray(config) ? config : [config];\n  };\n\n  canActivate = async (next: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n    // Guard ở layer portal: preload toàn bộ permission theo tất cả key đã cấu hình\n    await this.permissionService.loadAllPermissions().catch(console.error);\n    return true;\n  };\n\n  canActivateChild = async (activatedRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n    const permission = activatedRoute.data['permission'];\n    const permissionKey = activatedRoute.data?.['permissionKey'] as string | undefined;\n    if (this.permissionService.hasPermission(permission, permissionKey)) {\n      return true;\n    }\n\n    const configurations = this.#getConfigurations();\n    const onForbiden = configurations\n      .filter(config => config.key === permissionKey || (permissionKey !== undefined && config.key === undefined))\n      .map(config => config.onForbiden)\n      .find(val => !!val);\n    onForbiden?.();\n    return false;\n  };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAuDA;;;;;;;;;;;;AAYG;MACU,2BAA2B,GAAG,IAAI,cAAc,CAC3D,6BAA6B;;MC9DlB,mBAAmB,CAAA;IAC9B,mBAAmB,GAA4C,EAAE;AACxD,IAAA,cAAc,GAAG,MAAM,CAA4D,2BAA2B,CAAC;AAC/G,IAAA,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC;IAC/C,iBAAiB,GAAsC,IAAI,CAAC,aAAa,CAAC,MAAM,CAC9E,sCAAsC,EACtC;AACE,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,OAAO,EAAE,EAAE;AACZ,KAAA,CACF;AACQ,IAAA,WAAW,GAAG,IAAI,GAAG,EAAU;AAExC,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,4BAA4B,EAAE;IACrC;IAEA,kBAAkB,GAAG,MAAmC;AACtD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc;QAClC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,EAAE;QACX;AACA,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;AAClD,IAAA,CAAC;AAED,IAAA,aAAa,GAAG,CAAC,GAAY,KAAY;QACvC,OAAO,GAAG,KAAK,SAAS,GAAG,eAAe,GAAG,GAAG;AAClD,IAAA,CAAC;IAED,4BAA4B,GAAG,MAAW;AACxC,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;QAC9B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;AACpD,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;AAC3B,gBAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,KAAK,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC,GAAG;AACpE,gBAAA,MAAM,IAAI,KAAK,CAAC,wDAAwD,QAAQ,CAAA,CAAE,CAAC;YACrF;AACA,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QACzB;AACF,IAAA,CAAC;AAED,IAAA,sBAAsB,GAAG,CAAC,GAAY,KAA4C;AAChF,QAAA,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC;AACrE,IAAA,CAAC;AAED,IAAA,0BAA0B,GAAG,CAAC,GAAY,KAAwB;AAChE,QAAA,IAAI,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE;AACpC,YAAA,OAAO,GAAG;QACZ;;QAGA,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE;AAC/D,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC;AAED,IAAA,qBAAqB,GAAG,CAAC,aAAqB,EAAE,WAAqB,KAAU;QAC7E,MAAM,mBAAmB,GAAG,cAAc,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;QACtE,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE;AAClD,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;AACzB,YAAA,GAAG,OAAO;YACV,CAAC,aAAa,GAAG,mBAAmB;AACrC,SAAA,CAAC;QAEF,MAAM,aAAa,GAA4B,EAAE;AACjD,QAAA,mBAAmB,CAAC,OAAO,CAAC,UAAU,IAAG;AACvC,YAAA,aAAa,CAAC,UAAU,CAAC,GAAG,IAAI;AAClC,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,GAAG,aAAa;AACzD,IAAA,CAAC;AAED,IAAA,eAAe,GAAG,OAAO,GAAY,KAAuB;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC;QACzD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;QACtD,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;AACvC,YAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE;QAC5D;QAEA,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC;QAC/D,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,EAAE,CAAC;AAC7C,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC;AACnC,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI;YACF,MAAM,WAAW,GAAa,MAAM,iBAAiB,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;YACtF,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,WAAW,IAAI,EAAE,CAAC;QAC9D;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;AAClB,YAAA,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,EAAE,CAAC;QAC/C;gBAAU;AACR,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC;QACrC;AAEA,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE;AAC5D,IAAA,CAAC;IAED,kBAAkB,GAAG,YAA0B;AAC7C,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAChD,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;AAC1B,YAAA,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;YACrC;QACF;QAEA,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACnF,IAAA,CAAC;AAED,IAAA,aAAa,GAAG,CAAC,UAA6B,EAAE,GAAY,KAAI;AAC9D,QAAA,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;AAC3B,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC;QACzD,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC;AAC/D,QAAA,IAAI,aAAa,EAAE,QAAQ,EAAE;AAC3B,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,IAAI,EAAE;AACnE,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,CAAC,UAAU,CAAC;AACzE,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;AACpD,IAAA,CAAC;AAED,IAAA,QAAQ,GAAG,OAAO,GAAY,KAAI;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,EAAE,QAAqE;QACjI,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;QACjD;QAEA,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,CAAC;AACjD,QAAA,IAAI,KAAK,KAAK,EAAE,EAAE;AAChB,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,OAAU,GAAY,KAAuB;QACzD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACnC,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAC5D,YAAA,MAAM,WAAW,GAAG,kBAAkB,CACpC,IAAI,CAAC,MAAM;iBACR,KAAK,CAAC,EAAE;AACR,iBAAA,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAC9D,iBAAA,IAAI,CAAC,EAAE,CAAC,CACZ;AACD,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QAChC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC;AACrC,YAAA,OAAO,IAAI;QACb;AACF,IAAA,CAAC;wGAhKU,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA;;4FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCArB,qBAAqB,CAAA;AACvB,IAAA,YAAY,GAAuC,MAAM,CAAC,WAAW,CAAC;AACtE,IAAA,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC5C,IAAA,kBAAkB,GAAG,MAAM,CAAC,mBAAmB,CAAC;;AAGhD,IAAA,YAAY,GAAG,KAAK,CAAuC,SAAS,wDAAC;AACrE,IAAA,eAAe,GAAG,KAAK,CAAqB,SAAS,2DAAC;AAE/D,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE;AACtC,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE;AAE5C,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE;;AAG9B,YAAA,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;gBAC3B,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC5D;YACF;;YAGA,IAAI,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE;gBACpE,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC;YAC9D;AACF,QAAA,CAAC,CAAC;IACJ;wGA3BW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC3B,iBAAA;;;MCCY,iBAAiB,CAAA;AACX,IAAA,aAAa,GAA8D,MAAM,CAAC,2BAA2B,CAAC;AAC9G,IAAA,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC;IAEhE,kBAAkB,GAAG,MAAmC;AACtD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa;QACjC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,EAAE;QACX;AACA,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;AAClD,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,OAAO,IAA4B,EAAE,KAA0B,KAAI;;AAE/E,QAAA,MAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AACtE,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AAED,IAAA,gBAAgB,GAAG,OAAO,cAAsC,EAAE,KAA0B,KAAI;QAC9F,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;QACpD,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,GAAG,eAAe,CAAuB;QAClF,IAAI,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE;AACnE,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE;QAChD,MAAM,UAAU,GAAG;aAChB,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,KAAK,aAAa,KAAK,aAAa,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC;aAC1G,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU;aAC/B,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;QACrB,UAAU,IAAI;AACd,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;wGAhCU,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,cADJ,MAAM,EAAA,CAAA;;4FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACLlC;;AAEG;;;;"}