@c8y/ngx-components 1018.503.22 → 1018.503.26

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.
Files changed (85) hide show
  1. package/api/services.d.ts +1 -1
  2. package/core/common/permissions.service.d.ts +2 -2
  3. package/core/forms/validation-pattern.d.ts +4 -0
  4. package/esm2020/api/services.mjs +2 -2
  5. package/esm2020/assets-navigator/asset-node.service.mjs +9 -3
  6. package/esm2020/context-dashboard/add-dashboard.factory.mjs +10 -3
  7. package/esm2020/context-dashboard/context-dashboard.service.mjs +11 -3
  8. package/esm2020/context-dashboard/dashboard-detail.component.mjs +7 -2
  9. package/esm2020/context-dashboard/report-dashboard/report-dashboard-list.component.mjs +4 -2
  10. package/esm2020/core/bottom-drawer/bottom-drawer.service.mjs +1 -1
  11. package/esm2020/core/common/permissions.service.mjs +2 -2
  12. package/esm2020/core/common/user-preferences/user-preferences.service.mjs +6 -2
  13. package/esm2020/core/forms/validation-pattern.mjs +5 -1
  14. package/esm2020/core/user/user-edit.component.mjs +1 -1
  15. package/esm2020/files-repository/files-repository.guard.mjs +6 -5
  16. package/esm2020/replace-device/replace-device.service.mjs +13 -5
  17. package/esm2020/repository/configuration/device-tab/configuration-preview.component.mjs +11 -3
  18. package/esm2020/sub-assets/add-group/add-group.component.mjs +7 -2
  19. package/esm2020/sub-assets/groups.component.mjs +5 -2
  20. package/esm2020/sub-assets/sub-assets.component.mjs +7 -2
  21. package/esm2020/sub-assets/sub-assets.service.mjs +12 -6
  22. package/esm2020/trusted-certificates/crl/crl-check-settings.component.mjs +39 -0
  23. package/esm2020/trusted-certificates/crl/crl-settings.component.mjs +109 -0
  24. package/esm2020/trusted-certificates/crl/crl-settings.module.mjs +46 -0
  25. package/esm2020/trusted-certificates/factories/tabs.factory.mjs +36 -0
  26. package/esm2020/trusted-certificates/factories/trusted-certificates-navigation.factory.mjs +26 -0
  27. package/esm2020/trusted-certificates/index.mjs +4 -4
  28. package/esm2020/trusted-certificates/{add-trusted-certificate.component.mjs → list/add-trusted-certificate.component.mjs} +1 -1
  29. package/esm2020/trusted-certificates/list/trusted-certificate-list.component.mjs +184 -0
  30. package/esm2020/trusted-certificates/list/trusted-certificate-list.module.mjs +54 -0
  31. package/esm2020/trusted-certificates/list/trusted-certificate.model.mjs +36 -0
  32. package/esm2020/trusted-certificates/trusted-certificates.module.mjs +24 -35
  33. package/fesm2015/c8y-ngx-components-api.mjs +3 -2
  34. package/fesm2015/c8y-ngx-components-api.mjs.map +1 -1
  35. package/fesm2015/c8y-ngx-components-assets-navigator.mjs +8 -2
  36. package/fesm2015/c8y-ngx-components-assets-navigator.mjs.map +1 -1
  37. package/fesm2015/c8y-ngx-components-context-dashboard.mjs +28 -6
  38. package/fesm2015/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  39. package/fesm2015/c8y-ngx-components-files-repository.mjs +5 -4
  40. package/fesm2015/c8y-ngx-components-files-repository.mjs.map +1 -1
  41. package/fesm2015/c8y-ngx-components-replace-device.mjs +13 -5
  42. package/fesm2015/c8y-ngx-components-replace-device.mjs.map +1 -1
  43. package/fesm2015/c8y-ngx-components-repository-configuration.mjs +10 -2
  44. package/fesm2015/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  45. package/fesm2015/c8y-ngx-components-sub-assets.mjs +27 -8
  46. package/fesm2015/c8y-ngx-components-sub-assets.mjs.map +1 -1
  47. package/fesm2015/c8y-ngx-components-trusted-certificates.mjs +329 -86
  48. package/fesm2015/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  49. package/fesm2015/c8y-ngx-components.mjs +10 -2
  50. package/fesm2015/c8y-ngx-components.mjs.map +1 -1
  51. package/fesm2020/c8y-ngx-components-api.mjs +3 -2
  52. package/fesm2020/c8y-ngx-components-api.mjs.map +1 -1
  53. package/fesm2020/c8y-ngx-components-assets-navigator.mjs +8 -2
  54. package/fesm2020/c8y-ngx-components-assets-navigator.mjs.map +1 -1
  55. package/fesm2020/c8y-ngx-components-context-dashboard.mjs +28 -6
  56. package/fesm2020/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  57. package/fesm2020/c8y-ngx-components-files-repository.mjs +5 -4
  58. package/fesm2020/c8y-ngx-components-files-repository.mjs.map +1 -1
  59. package/fesm2020/c8y-ngx-components-replace-device.mjs +13 -5
  60. package/fesm2020/c8y-ngx-components-replace-device.mjs.map +1 -1
  61. package/fesm2020/c8y-ngx-components-repository-configuration.mjs +10 -2
  62. package/fesm2020/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  63. package/fesm2020/c8y-ngx-components-sub-assets.mjs +27 -8
  64. package/fesm2020/c8y-ngx-components-sub-assets.mjs.map +1 -1
  65. package/fesm2020/c8y-ngx-components-trusted-certificates.mjs +314 -85
  66. package/fesm2020/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  67. package/fesm2020/c8y-ngx-components.mjs +10 -2
  68. package/fesm2020/c8y-ngx-components.mjs.map +1 -1
  69. package/locales/locales.pot +48 -0
  70. package/package.json +1 -1
  71. package/replace-device/replace-device.service.d.ts +3 -1
  72. package/trusted-certificates/crl/crl-check-settings.component.d.ts +18 -0
  73. package/trusted-certificates/crl/crl-settings.component.d.ts +28 -0
  74. package/trusted-certificates/crl/crl-settings.module.d.ts +13 -0
  75. package/trusted-certificates/factories/tabs.factory.d.ts +10 -0
  76. package/trusted-certificates/index.d.ts +3 -3
  77. package/trusted-certificates/{trusted-certificates.component.d.ts → list/trusted-certificate-list.component.d.ts} +4 -4
  78. package/trusted-certificates/list/trusted-certificate-list.module.d.ts +15 -0
  79. package/trusted-certificates/trusted-certificates.module.d.ts +4 -10
  80. package/esm2020/trusted-certificates/trusted-certificate.model.mjs +0 -36
  81. package/esm2020/trusted-certificates/trusted-certificates-navigation.factory.mjs +0 -26
  82. package/esm2020/trusted-certificates/trusted-certificates.component.mjs +0 -184
  83. /package/trusted-certificates/{trusted-certificates-navigation.factory.d.ts → factories/trusted-certificates-navigation.factory.d.ts} +0 -0
  84. /package/trusted-certificates/{add-trusted-certificate.component.d.ts → list/add-trusted-certificate.component.d.ts} +0 -0
  85. /package/trusted-certificates/{trusted-certificate.model.d.ts → list/trusted-certificate.model.d.ts} +0 -0
@@ -26,10 +26,11 @@ class FilesRepositoryGuard {
26
26
  * @returns True, if the feature should be active.
27
27
  */
28
28
  canActivate() {
29
- return this.permissions.hasAnyRole([
30
- Permissions.ROLE_INVENTORY_READ,
31
- Permissions.ROLE_INVENTORY_ADMIN
32
- ]);
29
+ return (this.permissions.hasRole(Permissions.ROLE_INVENTORY_READ) ||
30
+ this.permissions.hasAllRoles([
31
+ Permissions.ROLE_MANAGED_OBJECT_READ,
32
+ Permissions.ROLE_BINARY_READ
33
+ ]));
33
34
  }
34
35
  }
35
36
  FilesRepositoryGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: FilesRepositoryGuard, deps: [{ token: i3.Permissions }], target: i0.ɵɵFactoryTarget.Injectable });
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-files-repository.mjs","sources":["../../files-repository/files-repository.guard.ts","../../files-repository/files-repository-navigation.factory.ts","../../files-repository/files-repository-product-experience.constants.ts","../../files-repository/files-repository-upload.component.ts","../../files-repository/files-repository-upload.component.html","../../files-repository/files-repository.service.ts","../../files-repository/files-repository.component.ts","../../files-repository/files-repository.component.html","../../files-repository/files-repository.module.ts","../../files-repository/c8y-ngx-components-files-repository.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { Permissions } from '@c8y/ngx-components';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FilesRepositoryGuard implements CanActivate {\n constructor(private permissions: Permissions) {}\n\n /**\n * Checks if files repository should be active,\n * i.e. whether the current tenant can read or admin files in repository.\n *\n * @returns True, if the feature should be active.\n */\n canActivate(): boolean {\n return this.permissions.hasAnyRole([\n Permissions.ROLE_INVENTORY_READ,\n Permissions.ROLE_INVENTORY_ADMIN\n ]);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\nimport { FilesRepositoryGuard } from './files-repository.guard';\n\n@Injectable({ providedIn: 'root' })\nexport class FilesRepositoryNavigationFactory implements NavigatorNodeFactory {\n private navs: NavigatorNode[] = [];\n\n constructor(private filesRepositoryGuard: FilesRepositoryGuard) {}\n\n async get(): Promise<NavigatorNode[]> {\n if (this.filesRepositoryGuard.canActivate()) {\n if (!this.navs.length) {\n this.navs.push(\n new NavigatorNode({\n parent: gettext('Management'),\n label: gettext('Files repository'),\n icon: 'c8y-archive',\n path: 'files',\n routerLinkExact: false,\n priority: 1000\n })\n );\n }\n }\n return this.navs;\n }\n}\n","export const PRODUCT_EXPERIENCE = {\n EVENTS: {\n FILE_REPOSITORY_UPLOAD: 'filesRepositoryUpload'\n },\n COMPONENTS: {\n FILE_REPOSITORY_UPLOAD_COMPONENT: 'files-repository-upload'\n },\n RESULTS: {\n UPLOAD_ITEM_SUCCESS: 'fileUploadSuccess',\n UPLOAD_ITEM_FAILED: 'fileUploadFailed'\n }\n};\n","import { Component, Output } from '@angular/core';\nimport { EventEmitter } from '@angular/core';\nimport {\n AlertService,\n GainsightService,\n FilesService,\n gettext,\n IFetchWithProgress\n} from '@c8y/ngx-components';\nimport { PRODUCT_EXPERIENCE } from './files-repository-product-experience.constants';\nimport { Observable, Subscription, combineLatest } from 'rxjs';\n\n@Component({\n selector: 'c8y-files-repository-upload',\n templateUrl: './files-repository-upload.component.html'\n})\nexport class FilesRepositoryUploadComponent {\n /** Emits an event when modal is closed. `uploaded` indicates if any files were uploaded. */\n @Output() onClose: EventEmitter<{ uploaded: boolean }> = new EventEmitter();\n isLoading = false;\n dropFilesHereMessage: string = gettext('Drop files here');\n filesToUpload: File[];\n uploadProgress: IFetchWithProgress[];\n uploadProgress$: Observable<IFetchWithProgress[]>;\n uploadSubscription: Subscription;\n\n constructor(\n private alertService: AlertService,\n private gainsightService: GainsightService,\n private filesService: FilesService\n ) {}\n\n async upload(): Promise<void> {\n this.isLoading = true;\n this.uploadProgress$ = combineLatest(\n this.filesToUpload.map(file => this.filesService.uploadFileWithProgress$(file))\n );\n\n this.uploadSubscription = this.uploadProgress$.subscribe(\n uploadProgress => {\n this.uploadProgress = uploadProgress;\n },\n e => {\n if (e) {\n this.alertService.addServerFailure(e);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE.EVENTS.FILE_REPOSITORY_UPLOAD, {\n component: PRODUCT_EXPERIENCE.COMPONENTS.FILE_REPOSITORY_UPLOAD_COMPONENT,\n action: PRODUCT_EXPERIENCE.RESULTS.UPLOAD_ITEM_FAILED\n });\n }\n this.isLoading = false;\n },\n () => {\n this.alertService.success(gettext('File(s) uploaded.'));\n this.onClose.emit({ uploaded: true });\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE.EVENTS.FILE_REPOSITORY_UPLOAD, {\n component: PRODUCT_EXPERIENCE.COMPONENTS.FILE_REPOSITORY_UPLOAD_COMPONENT,\n action: PRODUCT_EXPERIENCE.RESULTS.UPLOAD_ITEM_SUCCESS\n });\n }\n );\n }\n\n onFileDroppedEvent(event: File[]): void {\n if (event && event.length > 0) {\n this.filesToUpload = event;\n }\n }\n}\n","<div class=\"c8y-viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"upload\"></i>\n <h4\n id=\"modal-title\"\n translate\n >\n Upload files\n </h4>\n </div>\n <div class=\"modal-inner-scroll\">\n <div\n class=\"modal-body\"\n id=\"modal-body\"\n >\n <c8y-file-picker-form-control\n #filePicker\n [uploadInProgress]=\"isLoading\"\n (dropped)=\"onFileDroppedEvent($event)\"\n [uploadProgress]=\"uploadProgress\"\n ></c8y-file-picker-form-control>\n </div>\n </div>\n <div class=\"card-footer separator d-flex j-c-center\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"onClose.emit({ uploaded: false })\"\n [disabled]=\"isLoading\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary btn-form\"\n title=\"{{ 'Upload' | translate }}\"\n type=\"button\"\n (click)=\"upload()\"\n [disabled]=\"!filePicker.valid || isLoading\"\n translate\n data-cy=\"c8y-files-repository-upload--upload\"\n >\n Upload\n </button>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { QueriesUtil } from '@c8y/client';\nimport { InventoryService } from '@c8y/client';\nimport { gettext, Pagination, SortOrder, Column, Row } from '@c8y/ngx-components';\nimport { transform, has } from 'lodash-es';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FilesRepositoryService {\n queriesUtil: QueriesUtil;\n baseQuery = { __has: 'c8y_IsBinary' };\n constructor(private inventoryService: InventoryService) {\n this.queriesUtil = new QueriesUtil();\n }\n\n getPagination(): Pagination {\n return {\n pageSize: 10,\n currentPage: 1\n };\n }\n\n hasApplicationStorageFragment(file: Row): boolean {\n return has(file, 'c8y_applications_storage');\n }\n\n getColumns(): Column[] {\n return [\n {\n name: 'name',\n header: gettext('Name'),\n path: 'name',\n filterable: true,\n sortable: true,\n sortOrder: 'asc' as SortOrder\n },\n {\n name: 'type',\n header: gettext('Type'),\n path: 'type',\n filterable: true,\n sortable: true\n },\n {\n name: 'length',\n header: gettext('Size'),\n path: 'length',\n filterable: false,\n sortable: true\n },\n {\n name: 'owner',\n header: gettext('Owner'),\n path: 'owner',\n filterable: true,\n sortable: true\n },\n {\n name: 'lastUpdated',\n header: gettext('Last update'),\n path: 'lastUpdated',\n filterable: false,\n sortable: true\n }\n ];\n }\n\n /** Returns array with items id where item has not c8y_applications_storage fragment. */\n getDeletableItemsIds(selectedItemsIds: string[], dataFromDataGrid: Array<any>): string[] {\n const selectedItemsWithoutApplications = [];\n dataFromDataGrid.forEach(item => {\n selectedItemsIds.forEach(selectedItemId => {\n if (selectedItemId === item.id && !this.hasApplicationStorageFragment(item)) {\n selectedItemsWithoutApplications.push(selectedItemId);\n }\n });\n });\n\n return selectedItemsWithoutApplications;\n }\n\n /** Returns the total number of items (with no filters based on columns setup). */\n async getTotal(): Promise<number> {\n const filters = {\n query: this.queriesUtil.buildQuery(this.baseQuery),\n pageSize: 1,\n withTotalPages: true\n };\n return (await this.inventoryService.list(filters)).paging.totalPages;\n }\n\n /** Returns data for current columns and pagination setup. */\n async getData(columns: Column[], pagination: Pagination, searchText = '') {\n // build filters based on columns and pagination\n const filters = {\n text: searchText,\n ...this.getFilters(columns, pagination)\n };\n // execute inventory query for the list of managed objects\n\n return this.inventoryService.list(filters);\n }\n\n /** Returns the number of items matching current columns and pagination setup. */\n async getCount(columns: Column[], pagination: Pagination) {\n const filters = {\n // build filters based on columns and pagination\n ...this.getFilters(columns, pagination),\n // but we only need the number of items, not the items themselves\n pageSize: 1,\n currentPage: 1\n };\n return (await this.inventoryService.list(filters)).paging.totalPages;\n }\n\n /** Returns filters for given columns and pagination setup. */\n private getFilters(columns: Column[], pagination: Pagination) {\n return {\n query: this.getQueryString(columns),\n pageSize: pagination.pageSize,\n currentPage: pagination.currentPage,\n withChildren: false,\n withTotalPages: true\n };\n }\n\n /** Returns a query string based on columns setup. */\n private getQueryString(columns: Column[]): string {\n let fullQuery = this.getQueryObj(columns);\n fullQuery = this.queriesUtil.addAndFilter(fullQuery, this.baseQuery);\n return this.queriesUtil.buildQuery(fullQuery);\n }\n\n /** Returns a query object based on columns setup. */\n private getQueryObj(columns: Column[]) {\n return transform(columns, (query, column) => this.addColumnQuery(query, column), {\n __filter: {},\n __orderby: []\n });\n }\n\n /** Extends given query with a part based on the setup of given column. */\n private addColumnQuery(query, column: Column): void {\n // when a column is marked as filterable\n if (column.filterable) {\n // in the case of default filtering form, `filterPredicate` will contain the string entered by a user\n if (column.filterPredicate) {\n // so we use it as the expected value, * allow to search for it anywhere in the property\n query.__filter[column.path] = `*${column.filterPredicate}*`;\n }\n\n // in the case of custom filtering form, we're storing the query in `externalFilterQuery.query`\n if (column.externalFilterQuery) {\n query = this.queriesUtil.addAndFilter(query, column.externalFilterQuery.query);\n }\n }\n\n // when a column is sortable and has a specified sorting order\n if (column.sortable && column.sortOrder) {\n // add sorting condition for the configured column `path`\n query.__orderby.push({\n [column.path]: column.sortOrder === 'asc' ? 1 : -1\n });\n }\n\n return query;\n }\n}\n","import { Component, EventEmitter, ViewChild } from '@angular/core';\nimport { IManagedObjectBinary, InventoryBinaryService } from '@c8y/client';\nimport { Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport {\n gettext,\n Pagination,\n DisplayOptions,\n Column,\n Row,\n Status,\n LoadMoreMode,\n ServerSideDataResult,\n DataSourceModifier,\n BuiltInActionType,\n ActionControl,\n BulkActionControl,\n ModalService,\n AlertService,\n FilesService,\n ServerSideDataCallback,\n DataGridComponent\n} from '@c8y/ngx-components';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { FilesRepositoryUploadComponent } from './files-repository-upload.component';\nimport { FilesRepositoryService } from './files-repository.service';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'c8y-files-repository',\n templateUrl: './files-repository.component.html'\n})\nexport class FilesRepositoryComponent {\n @ViewChild(DataGridComponent, { static: true }) dataGrid: DataGridComponent;\n destroy$: Subject<boolean> = new Subject<boolean>();\n title: string = gettext('Files repository');\n managementTitle: string = gettext('Management');\n loadMoreItemsLabel: string = gettext('Load more files');\n loadingItemsLabel: string = gettext('Loading files…');\n\n isLoading = true;\n\n displayOptions: DisplayOptions = {\n bordered: false,\n striped: true,\n filter: true,\n gridHeader: true\n };\n\n columns: Column[] = this.filesRepositoryService.getColumns();\n pagination: Pagination = this.filesRepositoryService.getPagination();\n infiniteScroll: LoadMoreMode = 'auto';\n serverSideDataCallback: ServerSideDataCallback;\n returnedDataSize: number;\n selectable = true;\n actionControls: ActionControl[] = [\n {\n text: gettext('Delete'),\n icon: 'trash',\n type: BuiltInActionType.Delete,\n showIf: selectedItem =>\n !this.filesRepositoryService.hasApplicationStorageFragment(selectedItem),\n callback: selectedItem => this.onDeleteItem(selectedItem)\n },\n {\n text: gettext('Download'),\n icon: 'download',\n type: BuiltInActionType.Export,\n callback: selectedItem => this.onDownloadItem(selectedItem as IManagedObjectBinary)\n }\n ];\n bulkActionControls: BulkActionControl[] = [\n {\n type: BuiltInActionType.Delete,\n callback: selectedItemIds => this.onDeleteItems(selectedItemIds)\n }\n ];\n\n refresh: EventEmitter<any> = new EventEmitter<any>();\n\n constructor(\n private filesRepositoryService: FilesRepositoryService,\n private inventoryBinaryService: InventoryBinaryService,\n private modalService: ModalService,\n private alertService: AlertService,\n private bsModalService: BsModalService,\n private fileService: FilesService,\n private translateService: TranslateService\n ) {\n // we're setting up `serverSideDataCallback` to execute a method from this component with bound `this`\n this.serverSideDataCallback = this.onDataSourceModifier.bind(this);\n }\n\n async onDataSourceModifier(\n dataSourceModifier: DataSourceModifier\n ): Promise<ServerSideDataResult> {\n const { res, data, paging } = await this.filesRepositoryService.getData(\n dataSourceModifier.columns,\n dataSourceModifier.pagination,\n dataSourceModifier.searchText\n );\n\n const filteredSize: number = await this.filesRepositoryService.getCount(\n dataSourceModifier.columns,\n dataSourceModifier.pagination\n );\n const size: number = await this.filesRepositoryService.getTotal();\n const serverSideDataResult: ServerSideDataResult = { res, data, paging, filteredSize, size };\n this.isLoading = false;\n this.returnedDataSize = serverSideDataResult.size;\n\n return serverSideDataResult;\n }\n\n async onDeleteItem(selectedItem: Row) {\n return this.deleteItemsWithConfirmation([selectedItem.id], {\n title: gettext('Delete file'),\n body: this.translateService.instant(\n gettext('You are about to delete file \"{{ name }}\". Do you want to proceed?'),\n selectedItem\n ),\n successText: gettext('File deleted.')\n });\n }\n\n async onDeleteItems(selectedItemsIds: string[]) {\n const dataGridDataSourceData = await this.dataGrid.dataSource.data$.pipe(take(1)).toPromise();\n const deletableItemsIds = this.filesRepositoryService.getDeletableItemsIds(\n selectedItemsIds,\n dataGridDataSourceData\n );\n let body: string;\n if (deletableItemsIds.length < selectedItemsIds.length) {\n body = gettext(`\n You are about to delete the selected files.\n Note: the selected files of type \"c8y_applications_storage_*\" won't be deleted though\n - such files can be deleted only from the \"Activity log\" of the associated application.\n Do you want to proceed?\n `);\n } else {\n body = gettext('You are about to delete the selected files. Do you want to proceed?');\n }\n\n return this.deleteItemsWithConfirmation(deletableItemsIds, {\n title: gettext('Delete files'),\n body,\n successText: gettext('Files deleted.')\n });\n }\n\n async onDownloadItem(selectedItem: IManagedObjectBinary) {\n return this.fileService.download(selectedItem);\n }\n\n openFileUploadComponent() {\n const modalOptions: ModalOptions<FilesRepositoryUploadComponent> = {\n class: 'modal-sm',\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n ignoreBackdropClick: true\n };\n const modalRef = this.bsModalService.show(FilesRepositoryUploadComponent, modalOptions);\n modalRef.content.onClose.pipe(takeUntil(this.destroy$)).subscribe(({ uploaded }) => {\n if (uploaded) {\n this.refresh.emit();\n }\n modalRef.hide();\n });\n }\n\n private async deleteItemsWithConfirmation(\n selectedItemsIds: string[],\n options: { title: string; body: string; successText: string }\n ) {\n try {\n await this.confirmItemsDeletion(options);\n this.isLoading = true;\n const promises = selectedItemsIds.map(selectedItemId =>\n this.inventoryBinaryService.delete(selectedItemId)\n );\n await Promise.all(promises);\n this.alertService.success(options.successText);\n this.refresh.next();\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n } finally {\n this.isLoading = false;\n }\n }\n\n private async confirmItemsDeletion({ title, body }: { title: string; body: string }) {\n const status = Status.DANGER;\n const labels = { ok: gettext('Delete'), cancel: gettext('Cancel') };\n await this.modalService.confirm(title, body, status, labels);\n }\n}\n","<c8y-title>\n {{ title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n [label]=\"managementTitle | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"title | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Upload files' | translate }}\"\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_CREATE']; allowAny: true\"\n (click)=\"openFileUploadComponent()\"\n data-cy=\"c8y-files-repository--open-file-upload-component\"\n >\n <i c8yIcon=\"upload\"></i>\n {{ 'Upload files' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/administration/#files\"></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [displayOptions]=\"displayOptions\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [infiniteScroll]=\"infiniteScroll\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [actionControls]=\"actionControls\"\n [selectable]=\"selectable\"\n [showSearch]=\"true\"\n [refresh]=\"refresh\"\n [bulkActionControls]=\"bulkActionControls\"\n >\n <div class=\"c8y-empty-state\">\n <ng-container *ngIf=\"isLoading\">\n <c8y-loading></c8y-loading>\n </ng-container>\n <ng-container>\n <div class=\"text-center list-group\">\n <h1\n class=\"c8y-icon-duocolor\"\n c8yIcon=\"c8y-archive\"\n ></h1>\n <h3 translate>No files to display.</h3>\n <div\n class=\"text-center\"\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_CREATE']\"\n >\n <p translate>Add a new file by clicking below.</p>\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n (click)=\"openFileUploadComponent()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Upload file' | translate }}\n </button>\n </p>\n </div>\n </div>\n </ng-container>\n </div>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }}\">\n <div class=\"d-flex j-c-between a-i-center\">\n {{ context.value }}\n <c8y-file-preview\n class=\"m-l-auto\"\n [mo]=\"context.item\"\n >\n <button\n class=\"btn btn-emphasis btn-icon\"\n [title]=\"'Preview file' | translate\"\n type=\"button\"\n customButton\n >\n <i c8yIcon=\"search\"></i>\n </button>\n </c8y-file-preview>\n </div>\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"length\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }} B\">\n {{ context.value | bytes }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"lastUpdated\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | c8yDate }}\">\n {{ context.value | c8yDate }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { CoreModule, hookNavigator, hookRoute, DropAreaModule } from '@c8y/ngx-components';\nimport { FilesRepositoryNavigationFactory } from './files-repository-navigation.factory';\nimport { FilesRepositoryComponent } from './files-repository.component';\nimport { FilesRepositoryUploadComponent } from './files-repository-upload.component';\nimport { FilesRepositoryService } from './files-repository.service';\nimport { FilesRepositoryGuard } from './files-repository.guard';\nimport { FilePreviewModule } from '@c8y/ngx-components/file-preview';\n\n@NgModule({\n imports: [RouterModule, CoreModule, DropAreaModule, FilePreviewModule],\n exports: [],\n declarations: [FilesRepositoryComponent, FilesRepositoryUploadComponent],\n providers: [\n FilesRepositoryGuard,\n hookNavigator(FilesRepositoryNavigationFactory),\n hookRoute(\n {\n path: 'files',\n component: FilesRepositoryComponent,\n canActivate: [FilesRepositoryGuard]\n },\n { multi: true }\n ),\n FilesRepositoryService\n ]\n})\nexport class FilesRepositoryModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i1.FilesRepositoryGuard","i1.FilesRepositoryService","i2"],"mappings":";;;;;;;;;;;;;;;;;MAOa,oBAAoB,CAAA;AAC/B,IAAA,WAAA,CAAoB,WAAwB,EAAA;AAAxB,QAAA,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;KAAI;AAEhD;;;;;AAKG;IACH,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;AACjC,YAAA,WAAW,CAAC,mBAAmB;AAC/B,YAAA,WAAW,CAAC,oBAAoB;AACjC,SAAA,CAAC,CAAC;KACJ;;iHAdU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,oBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA,CAAA;2FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MCDY,gCAAgC,CAAA;AAG3C,IAAA,WAAA,CAAoB,oBAA0C,EAAA;AAA1C,QAAA,IAAoB,CAAA,oBAAA,GAApB,oBAAoB,CAAsB;AAFtD,QAAA,IAAI,CAAA,IAAA,GAAoB,EAAE,CAAC;KAE+B;IAE5D,GAAG,GAAA;;AACP,YAAA,IAAI,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,EAAE;AAC3C,gBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACrB,oBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CACZ,IAAI,aAAa,CAAC;AAChB,wBAAA,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;AAC7B,wBAAA,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC;AAClC,wBAAA,IAAI,EAAE,aAAa;AACnB,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,eAAe,EAAE,KAAK;AACtB,wBAAA,QAAQ,EAAE,IAAI;AACf,qBAAA,CAAC,CACH,CAAC;AACH,iBAAA;AACF,aAAA;YACD,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB,CAAA,CAAA;AAAA,KAAA;;6HArBU,gCAAgC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAhC,gCAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gCAAgC,cADnB,MAAM,EAAA,CAAA,CAAA;2FACnB,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAD5C,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ACJ3B,MAAM,kBAAkB,GAAG;AAChC,IAAA,MAAM,EAAE;AACN,QAAA,sBAAsB,EAAE,uBAAuB;AAChD,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,gCAAgC,EAAE,yBAAyB;AAC5D,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,mBAAmB,EAAE,mBAAmB;AACxC,QAAA,kBAAkB,EAAE,kBAAkB;AACvC,KAAA;CACF;;MCKY,8BAA8B,CAAA;AAUzC,IAAA,WAAA,CACU,YAA0B,EAC1B,gBAAkC,EAClC,YAA0B,EAAA;AAF1B,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AAClC,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;;AAX1B,QAAA,IAAA,CAAA,OAAO,GAAwC,IAAI,YAAY,EAAE,CAAC;AAC5E,QAAA,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;AAClB,QAAA,IAAA,CAAA,oBAAoB,GAAW,OAAO,CAAC,iBAAiB,CAAC,CAAC;KAUtD;IAEE,MAAM,GAAA;;AACV,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,eAAe,GAAG,aAAa,CAClC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAChF,CAAC;YAEF,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CACtD,cAAc,IAAG;AACf,gBAAA,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;aACtC,EACD,CAAC,IAAG;AACF,gBAAA,IAAI,CAAC,EAAE;AACL,oBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;oBACtC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,sBAAsB,EAAE;AACnF,wBAAA,SAAS,EAAE,kBAAkB,CAAC,UAAU,CAAC,gCAAgC;AACzE,wBAAA,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,kBAAkB;AACtD,qBAAA,CAAC,CAAC;AACJ,iBAAA;AACD,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxB,EACD,MAAK;gBACH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBACxD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,sBAAsB,EAAE;AACnF,oBAAA,SAAS,EAAE,kBAAkB,CAAC,UAAU,CAAC,gCAAgC;AACzE,oBAAA,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,mBAAmB;AACvD,iBAAA,CAAC,CAAC;AACL,aAAC,CACF,CAAC;SACH,CAAA,CAAA;AAAA,KAAA;AAED,IAAA,kBAAkB,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AAC5B,SAAA;KACF;;2HAnDU,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,8BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,oGChB3C,osCA+CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,8BAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,yBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FD/Ba,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAJ1C,SAAS;+BACE,6BAA6B,EAAA,QAAA,EAAA,osCAAA,EAAA,CAAA;6JAK7B,OAAO,EAAA,CAAA;sBAAhB,MAAM;;;METI,sBAAsB,CAAA;AAGjC,IAAA,WAAA,CAAoB,gBAAkC,EAAA;AAAlC,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QADtD,IAAA,CAAA,SAAS,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;AAEpC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;KACtC;IAED,aAAa,GAAA;QACX,OAAO;AACL,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,WAAW,EAAE,CAAC;SACf,CAAC;KACH;AAED,IAAA,6BAA6B,CAAC,IAAS,EAAA;AACrC,QAAA,OAAO,GAAG,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;KAC9C;IAED,UAAU,GAAA;QACR,OAAO;AACL,YAAA;AACE,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;AACvB,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,SAAS,EAAE,KAAkB;AAC9B,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;AACvB,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;AACvB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;AACxB,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC;AAC9B,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA;SACF,CAAC;KACH;;IAGD,oBAAoB,CAAC,gBAA0B,EAAE,gBAA4B,EAAA;QAC3E,MAAM,gCAAgC,GAAG,EAAE,CAAC;AAC5C,QAAA,gBAAgB,CAAC,OAAO,CAAC,IAAI,IAAG;AAC9B,YAAA,gBAAgB,CAAC,OAAO,CAAC,cAAc,IAAG;AACxC,gBAAA,IAAI,cAAc,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,EAAE;AAC3E,oBAAA,gCAAgC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACvD,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,gCAAgC,CAAC;KACzC;;IAGK,QAAQ,GAAA;;AACZ,YAAA,MAAM,OAAO,GAAG;gBACd,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;AAClD,gBAAA,QAAQ,EAAE,CAAC;AACX,gBAAA,cAAc,EAAE,IAAI;aACrB,CAAC;AACF,YAAA,OAAO,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;SACtE,CAAA,CAAA;AAAA,KAAA;;AAGK,IAAA,OAAO,CAAC,OAAiB,EAAE,UAAsB,EAAE,UAAU,GAAG,EAAE,EAAA;;;AAEtE,YAAA,MAAM,OAAO,GAAA,MAAA,CAAA,MAAA,CAAA,EACX,IAAI,EAAE,UAAU,EACb,EAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CACxC,CAAC;;YAGF,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAC5C,CAAA,CAAA;AAAA,KAAA;;IAGK,QAAQ,CAAC,OAAiB,EAAE,UAAsB,EAAA;;YACtD,MAAM,OAAO,mCAER,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA,EAAA;;AAEvC,gBAAA,QAAQ,EAAE,CAAC,EACX,WAAW,EAAE,CAAC,GACf,CAAC;AACF,YAAA,OAAO,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;SACtE,CAAA,CAAA;AAAA,KAAA;;IAGO,UAAU,CAAC,OAAiB,EAAE,UAAsB,EAAA;QAC1D,OAAO;AACL,YAAA,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YACnC,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,WAAW,EAAE,UAAU,CAAC,WAAW;AACnC,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,cAAc,EAAE,IAAI;SACrB,CAAC;KACH;;AAGO,IAAA,cAAc,CAAC,OAAiB,EAAA;QACtC,IAAI,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAC1C,QAAA,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;KAC/C;;AAGO,IAAA,WAAW,CAAC,OAAiB,EAAA;AACnC,QAAA,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;AAC/E,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,SAAS,EAAE,EAAE;AACd,SAAA,CAAC,CAAC;KACJ;;IAGO,cAAc,CAAC,KAAK,EAAE,MAAc,EAAA;;QAE1C,IAAI,MAAM,CAAC,UAAU,EAAE;;YAErB,IAAI,MAAM,CAAC,eAAe,EAAE;;AAE1B,gBAAA,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAI,CAAA,EAAA,MAAM,CAAC,eAAe,GAAG,CAAC;AAC7D,aAAA;;YAGD,IAAI,MAAM,CAAC,mBAAmB,EAAE;AAC9B,gBAAA,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAChF,aAAA;AACF,SAAA;;AAGD,QAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE;;AAEvC,YAAA,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;AACnB,gBAAA,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AACnD,aAAA,CAAC,CAAC;AACJ,SAAA;AAED,QAAA,OAAO,KAAK,CAAC;KACd;;mHA9JU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,sBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA,CAAA;2FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MCwBY,wBAAwB,CAAA;AAgDnC,IAAA,WAAA,CACU,sBAA8C,EAC9C,sBAA8C,EAC9C,YAA0B,EAC1B,YAA0B,EAC1B,cAA8B,EAC9B,WAAyB,EACzB,gBAAkC,EAAA;AANlC,QAAA,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAAwB;AAC9C,QAAA,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAAwB;AAC9C,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;AAC9B,QAAA,IAAW,CAAA,WAAA,GAAX,WAAW,CAAc;AACzB,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AArD5C,QAAA,IAAA,CAAA,QAAQ,GAAqB,IAAI,OAAO,EAAW,CAAC;AACpD,QAAA,IAAA,CAAA,KAAK,GAAW,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC5C,QAAA,IAAA,CAAA,eAAe,GAAW,OAAO,CAAC,YAAY,CAAC,CAAC;AAChD,QAAA,IAAA,CAAA,kBAAkB,GAAW,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACxD,QAAA,IAAA,CAAA,iBAAiB,GAAW,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAEtD,QAAA,IAAS,CAAA,SAAA,GAAG,IAAI,CAAC;QAEjB,IAAA,CAAA,cAAc,GAAmB;AAC/B,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,UAAU,EAAE,IAAI;SACjB,CAAC;QAEF,IAAA,CAAA,OAAO,GAAa,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,CAAC;QAC7D,IAAA,CAAA,UAAU,GAAe,IAAI,CAAC,sBAAsB,CAAC,aAAa,EAAE,CAAC;AACrE,QAAA,IAAc,CAAA,cAAA,GAAiB,MAAM,CAAC;AAGtC,QAAA,IAAU,CAAA,UAAA,GAAG,IAAI,CAAC;QAClB,IAAA,CAAA,cAAc,GAAoB;AAChC,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC;AACvB,gBAAA,IAAI,EAAE,OAAO;gBACb,IAAI,EAA0B,QAAA;AAC9B,gBAAA,MAAM,EAAE,YAAY,IAClB,CAAC,IAAI,CAAC,sBAAsB,CAAC,6BAA6B,CAAC,YAAY,CAAC;gBAC1E,QAAQ,EAAE,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;AAC1D,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC;AACzB,gBAAA,IAAI,EAAE,UAAU;gBAChB,IAAI,EAA0B,QAAA;gBAC9B,QAAQ,EAAE,YAAY,IAAI,IAAI,CAAC,cAAc,CAAC,YAAoC,CAAC;AACpF,aAAA;SACF,CAAC;QACF,IAAA,CAAA,kBAAkB,GAAwB;AACxC,YAAA;gBACE,IAAI,EAA0B,QAAA;gBAC9B,QAAQ,EAAE,eAAe,IAAI,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC;AACjE,aAAA;SACF,CAAC;AAEF,QAAA,IAAA,CAAA,OAAO,GAAsB,IAAI,YAAY,EAAO,CAAC;;QAYnD,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACpE;AAEK,IAAA,oBAAoB,CACxB,kBAAsC,EAAA;;YAEtC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,CACrE,kBAAkB,CAAC,OAAO,EAC1B,kBAAkB,CAAC,UAAU,EAC7B,kBAAkB,CAAC,UAAU,CAC9B,CAAC;AAEF,YAAA,MAAM,YAAY,GAAW,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CACrE,kBAAkB,CAAC,OAAO,EAC1B,kBAAkB,CAAC,UAAU,CAC9B,CAAC;YACF,MAAM,IAAI,GAAW,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;AAClE,YAAA,MAAM,oBAAoB,GAAyB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAC7F,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,gBAAgB,GAAG,oBAAoB,CAAC,IAAI,CAAC;AAElD,YAAA,OAAO,oBAAoB,CAAC;SAC7B,CAAA,CAAA;AAAA,KAAA;AAEK,IAAA,YAAY,CAAC,YAAiB,EAAA;;YAClC,OAAO,IAAI,CAAC,2BAA2B,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE;AACzD,gBAAA,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC;AAC7B,gBAAA,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CACjC,OAAO,CAAC,oEAAoE,CAAC,EAC7E,YAAY,CACb;AACD,gBAAA,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC;AACtC,aAAA,CAAC,CAAC;SACJ,CAAA,CAAA;AAAA,KAAA;AAEK,IAAA,aAAa,CAAC,gBAA0B,EAAA;;YAC5C,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC9F,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,CAAC,oBAAoB,CACxE,gBAAgB,EAChB,sBAAsB,CACvB,CAAC;AACF,YAAA,IAAI,IAAY,CAAC;AACjB,YAAA,IAAI,iBAAiB,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE;gBACtD,IAAI,GAAG,OAAO,CAAC,CAAA;;;;;AAKd,MAAA,CAAA,CAAC,CAAC;AACJ,aAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,GAAG,OAAO,CAAC,qEAAqE,CAAC,CAAC;AACvF,aAAA;AAED,YAAA,OAAO,IAAI,CAAC,2BAA2B,CAAC,iBAAiB,EAAE;AACzD,gBAAA,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC;gBAC9B,IAAI;AACJ,gBAAA,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC;AACvC,aAAA,CAAC,CAAC;SACJ,CAAA,CAAA;AAAA,KAAA;AAEK,IAAA,cAAc,CAAC,YAAkC,EAAA;;YACrD,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;SAChD,CAAA,CAAA;AAAA,KAAA;IAED,uBAAuB,GAAA;AACrB,QAAA,MAAM,YAAY,GAAiD;AACjE,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,eAAe,EAAE,YAAY;AAC7B,YAAA,cAAc,EAAE,aAAa;AAC7B,YAAA,mBAAmB,EAAE,IAAI;SAC1B,CAAC;AACF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,8BAA8B,EAAE,YAAY,CAAC,CAAC;QACxF,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAI;AACjF,YAAA,IAAI,QAAQ,EAAE;AACZ,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACrB,aAAA;YACD,QAAQ,CAAC,IAAI,EAAE,CAAC;AAClB,SAAC,CAAC,CAAC;KACJ;IAEa,2BAA2B,CACvC,gBAA0B,EAC1B,OAA6D,EAAA;;YAE7D,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AACzC,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,gBAAA,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,cAAc,IAClD,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,cAAc,CAAC,CACnD,CAAC;AACF,gBAAA,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC5B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAC/C,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACrB,aAAA;AAAC,YAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,EAAE,EAAE;AACN,oBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AACxC,iBAAA;AACF,aAAA;AAAS,oBAAA;AACR,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACxB,aAAA;SACF,CAAA,CAAA;AAAA,KAAA;AAEa,IAAA,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAmC,EAAA;;AACjF,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC7B,YAAA,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;AACpE,YAAA,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;SAC9D,CAAA,CAAA;AAAA,KAAA;;qHApKU,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAE,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;yGAAxB,wBAAwB,EAAA,QAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACxB,iBAAiB,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjC9B,smHAmHA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,wBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,oBAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,eAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,aAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,SAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FDnFa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAJpC,SAAS;+BACE,sBAAsB,EAAA,QAAA,EAAA,smHAAA,EAAA,CAAA;4RAIgB,QAAQ,EAAA,CAAA;sBAAvD,SAAS;gBAAC,IAAA,EAAA,CAAA,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;;;MELnC,qBAAqB,CAAA;;kHAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;mHAArB,qBAAqB,EAAA,YAAA,EAAA,CAfjB,wBAAwB,EAAE,8BAA8B,CAAA,EAAA,OAAA,EAAA,CAF7D,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,CAAA,EAAA,CAAA,CAAA;AAiB1D,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,EAdrB,SAAA,EAAA;QACT,oBAAoB;QACpB,aAAa,CAAC,gCAAgC,CAAC;AAC/C,QAAA,SAAS,CACP;AACE,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,SAAS,EAAE,wBAAwB;YACnC,WAAW,EAAE,CAAC,oBAAoB,CAAC;AACpC,SAAA,EACD,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB;QACD,sBAAsB;AACvB,KAAA,EAAA,OAAA,EAAA,CAfS,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,CAAA,EAAA,CAAA,CAAA;2FAiB1D,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAlBjC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,CAAC;AACtE,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,YAAY,EAAE,CAAC,wBAAwB,EAAE,8BAA8B,CAAC;AACxE,oBAAA,SAAS,EAAE;wBACT,oBAAoB;wBACpB,aAAa,CAAC,gCAAgC,CAAC;AAC/C,wBAAA,SAAS,CACP;AACE,4BAAA,IAAI,EAAE,OAAO;AACb,4BAAA,SAAS,EAAE,wBAAwB;4BACnC,WAAW,EAAE,CAAC,oBAAoB,CAAC;AACpC,yBAAA,EACD,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB;wBACD,sBAAsB;AACvB,qBAAA;iBACF,CAAA;;;AC3BD;;AAEG;;;;"}
1
+ {"version":3,"file":"c8y-ngx-components-files-repository.mjs","sources":["../../files-repository/files-repository.guard.ts","../../files-repository/files-repository-navigation.factory.ts","../../files-repository/files-repository-product-experience.constants.ts","../../files-repository/files-repository-upload.component.ts","../../files-repository/files-repository-upload.component.html","../../files-repository/files-repository.service.ts","../../files-repository/files-repository.component.ts","../../files-repository/files-repository.component.html","../../files-repository/files-repository.module.ts","../../files-repository/c8y-ngx-components-files-repository.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { Permissions } from '@c8y/ngx-components';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FilesRepositoryGuard implements CanActivate {\n constructor(private permissions: Permissions) {}\n\n /**\n * Checks if files repository should be active,\n * i.e. whether the current tenant can read or admin files in repository.\n *\n * @returns True, if the feature should be active.\n */\n canActivate(): boolean {\n return (\n this.permissions.hasRole(Permissions.ROLE_INVENTORY_READ) ||\n this.permissions.hasAllRoles([\n Permissions.ROLE_MANAGED_OBJECT_READ,\n Permissions.ROLE_BINARY_READ\n ])\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\nimport { FilesRepositoryGuard } from './files-repository.guard';\n\n@Injectable({ providedIn: 'root' })\nexport class FilesRepositoryNavigationFactory implements NavigatorNodeFactory {\n private navs: NavigatorNode[] = [];\n\n constructor(private filesRepositoryGuard: FilesRepositoryGuard) {}\n\n async get(): Promise<NavigatorNode[]> {\n if (this.filesRepositoryGuard.canActivate()) {\n if (!this.navs.length) {\n this.navs.push(\n new NavigatorNode({\n parent: gettext('Management'),\n label: gettext('Files repository'),\n icon: 'c8y-archive',\n path: 'files',\n routerLinkExact: false,\n priority: 1000\n })\n );\n }\n }\n return this.navs;\n }\n}\n","export const PRODUCT_EXPERIENCE = {\n EVENTS: {\n FILE_REPOSITORY_UPLOAD: 'filesRepositoryUpload'\n },\n COMPONENTS: {\n FILE_REPOSITORY_UPLOAD_COMPONENT: 'files-repository-upload'\n },\n RESULTS: {\n UPLOAD_ITEM_SUCCESS: 'fileUploadSuccess',\n UPLOAD_ITEM_FAILED: 'fileUploadFailed'\n }\n};\n","import { Component, Output } from '@angular/core';\nimport { EventEmitter } from '@angular/core';\nimport {\n AlertService,\n GainsightService,\n FilesService,\n gettext,\n IFetchWithProgress\n} from '@c8y/ngx-components';\nimport { PRODUCT_EXPERIENCE } from './files-repository-product-experience.constants';\nimport { Observable, Subscription, combineLatest } from 'rxjs';\n\n@Component({\n selector: 'c8y-files-repository-upload',\n templateUrl: './files-repository-upload.component.html'\n})\nexport class FilesRepositoryUploadComponent {\n /** Emits an event when modal is closed. `uploaded` indicates if any files were uploaded. */\n @Output() onClose: EventEmitter<{ uploaded: boolean }> = new EventEmitter();\n isLoading = false;\n dropFilesHereMessage: string = gettext('Drop files here');\n filesToUpload: File[];\n uploadProgress: IFetchWithProgress[];\n uploadProgress$: Observable<IFetchWithProgress[]>;\n uploadSubscription: Subscription;\n\n constructor(\n private alertService: AlertService,\n private gainsightService: GainsightService,\n private filesService: FilesService\n ) {}\n\n async upload(): Promise<void> {\n this.isLoading = true;\n this.uploadProgress$ = combineLatest(\n this.filesToUpload.map(file => this.filesService.uploadFileWithProgress$(file))\n );\n\n this.uploadSubscription = this.uploadProgress$.subscribe(\n uploadProgress => {\n this.uploadProgress = uploadProgress;\n },\n e => {\n if (e) {\n this.alertService.addServerFailure(e);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE.EVENTS.FILE_REPOSITORY_UPLOAD, {\n component: PRODUCT_EXPERIENCE.COMPONENTS.FILE_REPOSITORY_UPLOAD_COMPONENT,\n action: PRODUCT_EXPERIENCE.RESULTS.UPLOAD_ITEM_FAILED\n });\n }\n this.isLoading = false;\n },\n () => {\n this.alertService.success(gettext('File(s) uploaded.'));\n this.onClose.emit({ uploaded: true });\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE.EVENTS.FILE_REPOSITORY_UPLOAD, {\n component: PRODUCT_EXPERIENCE.COMPONENTS.FILE_REPOSITORY_UPLOAD_COMPONENT,\n action: PRODUCT_EXPERIENCE.RESULTS.UPLOAD_ITEM_SUCCESS\n });\n }\n );\n }\n\n onFileDroppedEvent(event: File[]): void {\n if (event && event.length > 0) {\n this.filesToUpload = event;\n }\n }\n}\n","<div class=\"c8y-viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"upload\"></i>\n <h4\n id=\"modal-title\"\n translate\n >\n Upload files\n </h4>\n </div>\n <div class=\"modal-inner-scroll\">\n <div\n class=\"modal-body\"\n id=\"modal-body\"\n >\n <c8y-file-picker-form-control\n #filePicker\n [uploadInProgress]=\"isLoading\"\n (dropped)=\"onFileDroppedEvent($event)\"\n [uploadProgress]=\"uploadProgress\"\n ></c8y-file-picker-form-control>\n </div>\n </div>\n <div class=\"card-footer separator d-flex j-c-center\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"onClose.emit({ uploaded: false })\"\n [disabled]=\"isLoading\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary btn-form\"\n title=\"{{ 'Upload' | translate }}\"\n type=\"button\"\n (click)=\"upload()\"\n [disabled]=\"!filePicker.valid || isLoading\"\n translate\n data-cy=\"c8y-files-repository-upload--upload\"\n >\n Upload\n </button>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { QueriesUtil } from '@c8y/client';\nimport { InventoryService } from '@c8y/client';\nimport { gettext, Pagination, SortOrder, Column, Row } from '@c8y/ngx-components';\nimport { transform, has } from 'lodash-es';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FilesRepositoryService {\n queriesUtil: QueriesUtil;\n baseQuery = { __has: 'c8y_IsBinary' };\n constructor(private inventoryService: InventoryService) {\n this.queriesUtil = new QueriesUtil();\n }\n\n getPagination(): Pagination {\n return {\n pageSize: 10,\n currentPage: 1\n };\n }\n\n hasApplicationStorageFragment(file: Row): boolean {\n return has(file, 'c8y_applications_storage');\n }\n\n getColumns(): Column[] {\n return [\n {\n name: 'name',\n header: gettext('Name'),\n path: 'name',\n filterable: true,\n sortable: true,\n sortOrder: 'asc' as SortOrder\n },\n {\n name: 'type',\n header: gettext('Type'),\n path: 'type',\n filterable: true,\n sortable: true\n },\n {\n name: 'length',\n header: gettext('Size'),\n path: 'length',\n filterable: false,\n sortable: true\n },\n {\n name: 'owner',\n header: gettext('Owner'),\n path: 'owner',\n filterable: true,\n sortable: true\n },\n {\n name: 'lastUpdated',\n header: gettext('Last update'),\n path: 'lastUpdated',\n filterable: false,\n sortable: true\n }\n ];\n }\n\n /** Returns array with items id where item has not c8y_applications_storage fragment. */\n getDeletableItemsIds(selectedItemsIds: string[], dataFromDataGrid: Array<any>): string[] {\n const selectedItemsWithoutApplications = [];\n dataFromDataGrid.forEach(item => {\n selectedItemsIds.forEach(selectedItemId => {\n if (selectedItemId === item.id && !this.hasApplicationStorageFragment(item)) {\n selectedItemsWithoutApplications.push(selectedItemId);\n }\n });\n });\n\n return selectedItemsWithoutApplications;\n }\n\n /** Returns the total number of items (with no filters based on columns setup). */\n async getTotal(): Promise<number> {\n const filters = {\n query: this.queriesUtil.buildQuery(this.baseQuery),\n pageSize: 1,\n withTotalPages: true\n };\n return (await this.inventoryService.list(filters)).paging.totalPages;\n }\n\n /** Returns data for current columns and pagination setup. */\n async getData(columns: Column[], pagination: Pagination, searchText = '') {\n // build filters based on columns and pagination\n const filters = {\n text: searchText,\n ...this.getFilters(columns, pagination)\n };\n // execute inventory query for the list of managed objects\n\n return this.inventoryService.list(filters);\n }\n\n /** Returns the number of items matching current columns and pagination setup. */\n async getCount(columns: Column[], pagination: Pagination) {\n const filters = {\n // build filters based on columns and pagination\n ...this.getFilters(columns, pagination),\n // but we only need the number of items, not the items themselves\n pageSize: 1,\n currentPage: 1\n };\n return (await this.inventoryService.list(filters)).paging.totalPages;\n }\n\n /** Returns filters for given columns and pagination setup. */\n private getFilters(columns: Column[], pagination: Pagination) {\n return {\n query: this.getQueryString(columns),\n pageSize: pagination.pageSize,\n currentPage: pagination.currentPage,\n withChildren: false,\n withTotalPages: true\n };\n }\n\n /** Returns a query string based on columns setup. */\n private getQueryString(columns: Column[]): string {\n let fullQuery = this.getQueryObj(columns);\n fullQuery = this.queriesUtil.addAndFilter(fullQuery, this.baseQuery);\n return this.queriesUtil.buildQuery(fullQuery);\n }\n\n /** Returns a query object based on columns setup. */\n private getQueryObj(columns: Column[]) {\n return transform(columns, (query, column) => this.addColumnQuery(query, column), {\n __filter: {},\n __orderby: []\n });\n }\n\n /** Extends given query with a part based on the setup of given column. */\n private addColumnQuery(query, column: Column): void {\n // when a column is marked as filterable\n if (column.filterable) {\n // in the case of default filtering form, `filterPredicate` will contain the string entered by a user\n if (column.filterPredicate) {\n // so we use it as the expected value, * allow to search for it anywhere in the property\n query.__filter[column.path] = `*${column.filterPredicate}*`;\n }\n\n // in the case of custom filtering form, we're storing the query in `externalFilterQuery.query`\n if (column.externalFilterQuery) {\n query = this.queriesUtil.addAndFilter(query, column.externalFilterQuery.query);\n }\n }\n\n // when a column is sortable and has a specified sorting order\n if (column.sortable && column.sortOrder) {\n // add sorting condition for the configured column `path`\n query.__orderby.push({\n [column.path]: column.sortOrder === 'asc' ? 1 : -1\n });\n }\n\n return query;\n }\n}\n","import { Component, EventEmitter, ViewChild } from '@angular/core';\nimport { IManagedObjectBinary, InventoryBinaryService } from '@c8y/client';\nimport { Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport {\n gettext,\n Pagination,\n DisplayOptions,\n Column,\n Row,\n Status,\n LoadMoreMode,\n ServerSideDataResult,\n DataSourceModifier,\n BuiltInActionType,\n ActionControl,\n BulkActionControl,\n ModalService,\n AlertService,\n FilesService,\n ServerSideDataCallback,\n DataGridComponent\n} from '@c8y/ngx-components';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { FilesRepositoryUploadComponent } from './files-repository-upload.component';\nimport { FilesRepositoryService } from './files-repository.service';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'c8y-files-repository',\n templateUrl: './files-repository.component.html'\n})\nexport class FilesRepositoryComponent {\n @ViewChild(DataGridComponent, { static: true }) dataGrid: DataGridComponent;\n destroy$: Subject<boolean> = new Subject<boolean>();\n title: string = gettext('Files repository');\n managementTitle: string = gettext('Management');\n loadMoreItemsLabel: string = gettext('Load more files');\n loadingItemsLabel: string = gettext('Loading files…');\n\n isLoading = true;\n\n displayOptions: DisplayOptions = {\n bordered: false,\n striped: true,\n filter: true,\n gridHeader: true\n };\n\n columns: Column[] = this.filesRepositoryService.getColumns();\n pagination: Pagination = this.filesRepositoryService.getPagination();\n infiniteScroll: LoadMoreMode = 'auto';\n serverSideDataCallback: ServerSideDataCallback;\n returnedDataSize: number;\n selectable = true;\n actionControls: ActionControl[] = [\n {\n text: gettext('Delete'),\n icon: 'trash',\n type: BuiltInActionType.Delete,\n showIf: selectedItem =>\n !this.filesRepositoryService.hasApplicationStorageFragment(selectedItem),\n callback: selectedItem => this.onDeleteItem(selectedItem)\n },\n {\n text: gettext('Download'),\n icon: 'download',\n type: BuiltInActionType.Export,\n callback: selectedItem => this.onDownloadItem(selectedItem as IManagedObjectBinary)\n }\n ];\n bulkActionControls: BulkActionControl[] = [\n {\n type: BuiltInActionType.Delete,\n callback: selectedItemIds => this.onDeleteItems(selectedItemIds)\n }\n ];\n\n refresh: EventEmitter<any> = new EventEmitter<any>();\n\n constructor(\n private filesRepositoryService: FilesRepositoryService,\n private inventoryBinaryService: InventoryBinaryService,\n private modalService: ModalService,\n private alertService: AlertService,\n private bsModalService: BsModalService,\n private fileService: FilesService,\n private translateService: TranslateService\n ) {\n // we're setting up `serverSideDataCallback` to execute a method from this component with bound `this`\n this.serverSideDataCallback = this.onDataSourceModifier.bind(this);\n }\n\n async onDataSourceModifier(\n dataSourceModifier: DataSourceModifier\n ): Promise<ServerSideDataResult> {\n const { res, data, paging } = await this.filesRepositoryService.getData(\n dataSourceModifier.columns,\n dataSourceModifier.pagination,\n dataSourceModifier.searchText\n );\n\n const filteredSize: number = await this.filesRepositoryService.getCount(\n dataSourceModifier.columns,\n dataSourceModifier.pagination\n );\n const size: number = await this.filesRepositoryService.getTotal();\n const serverSideDataResult: ServerSideDataResult = { res, data, paging, filteredSize, size };\n this.isLoading = false;\n this.returnedDataSize = serverSideDataResult.size;\n\n return serverSideDataResult;\n }\n\n async onDeleteItem(selectedItem: Row) {\n return this.deleteItemsWithConfirmation([selectedItem.id], {\n title: gettext('Delete file'),\n body: this.translateService.instant(\n gettext('You are about to delete file \"{{ name }}\". Do you want to proceed?'),\n selectedItem\n ),\n successText: gettext('File deleted.')\n });\n }\n\n async onDeleteItems(selectedItemsIds: string[]) {\n const dataGridDataSourceData = await this.dataGrid.dataSource.data$.pipe(take(1)).toPromise();\n const deletableItemsIds = this.filesRepositoryService.getDeletableItemsIds(\n selectedItemsIds,\n dataGridDataSourceData\n );\n let body: string;\n if (deletableItemsIds.length < selectedItemsIds.length) {\n body = gettext(`\n You are about to delete the selected files.\n Note: the selected files of type \"c8y_applications_storage_*\" won't be deleted though\n - such files can be deleted only from the \"Activity log\" of the associated application.\n Do you want to proceed?\n `);\n } else {\n body = gettext('You are about to delete the selected files. Do you want to proceed?');\n }\n\n return this.deleteItemsWithConfirmation(deletableItemsIds, {\n title: gettext('Delete files'),\n body,\n successText: gettext('Files deleted.')\n });\n }\n\n async onDownloadItem(selectedItem: IManagedObjectBinary) {\n return this.fileService.download(selectedItem);\n }\n\n openFileUploadComponent() {\n const modalOptions: ModalOptions<FilesRepositoryUploadComponent> = {\n class: 'modal-sm',\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n ignoreBackdropClick: true\n };\n const modalRef = this.bsModalService.show(FilesRepositoryUploadComponent, modalOptions);\n modalRef.content.onClose.pipe(takeUntil(this.destroy$)).subscribe(({ uploaded }) => {\n if (uploaded) {\n this.refresh.emit();\n }\n modalRef.hide();\n });\n }\n\n private async deleteItemsWithConfirmation(\n selectedItemsIds: string[],\n options: { title: string; body: string; successText: string }\n ) {\n try {\n await this.confirmItemsDeletion(options);\n this.isLoading = true;\n const promises = selectedItemsIds.map(selectedItemId =>\n this.inventoryBinaryService.delete(selectedItemId)\n );\n await Promise.all(promises);\n this.alertService.success(options.successText);\n this.refresh.next();\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n } finally {\n this.isLoading = false;\n }\n }\n\n private async confirmItemsDeletion({ title, body }: { title: string; body: string }) {\n const status = Status.DANGER;\n const labels = { ok: gettext('Delete'), cancel: gettext('Cancel') };\n await this.modalService.confirm(title, body, status, labels);\n }\n}\n","<c8y-title>\n {{ title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n [label]=\"managementTitle | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"title | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Upload files' | translate }}\"\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_CREATE']; allowAny: true\"\n (click)=\"openFileUploadComponent()\"\n data-cy=\"c8y-files-repository--open-file-upload-component\"\n >\n <i c8yIcon=\"upload\"></i>\n {{ 'Upload files' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/administration/#files\"></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [displayOptions]=\"displayOptions\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [infiniteScroll]=\"infiniteScroll\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [actionControls]=\"actionControls\"\n [selectable]=\"selectable\"\n [showSearch]=\"true\"\n [refresh]=\"refresh\"\n [bulkActionControls]=\"bulkActionControls\"\n >\n <div class=\"c8y-empty-state\">\n <ng-container *ngIf=\"isLoading\">\n <c8y-loading></c8y-loading>\n </ng-container>\n <ng-container>\n <div class=\"text-center list-group\">\n <h1\n class=\"c8y-icon-duocolor\"\n c8yIcon=\"c8y-archive\"\n ></h1>\n <h3 translate>No files to display.</h3>\n <div\n class=\"text-center\"\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_CREATE']\"\n >\n <p translate>Add a new file by clicking below.</p>\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n (click)=\"openFileUploadComponent()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Upload file' | translate }}\n </button>\n </p>\n </div>\n </div>\n </ng-container>\n </div>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }}\">\n <div class=\"d-flex j-c-between a-i-center\">\n {{ context.value }}\n <c8y-file-preview\n class=\"m-l-auto\"\n [mo]=\"context.item\"\n >\n <button\n class=\"btn btn-emphasis btn-icon\"\n [title]=\"'Preview file' | translate\"\n type=\"button\"\n customButton\n >\n <i c8yIcon=\"search\"></i>\n </button>\n </c8y-file-preview>\n </div>\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"length\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }} B\">\n {{ context.value | bytes }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"lastUpdated\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | c8yDate }}\">\n {{ context.value | c8yDate }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { CoreModule, hookNavigator, hookRoute, DropAreaModule } from '@c8y/ngx-components';\nimport { FilesRepositoryNavigationFactory } from './files-repository-navigation.factory';\nimport { FilesRepositoryComponent } from './files-repository.component';\nimport { FilesRepositoryUploadComponent } from './files-repository-upload.component';\nimport { FilesRepositoryService } from './files-repository.service';\nimport { FilesRepositoryGuard } from './files-repository.guard';\nimport { FilePreviewModule } from '@c8y/ngx-components/file-preview';\n\n@NgModule({\n imports: [RouterModule, CoreModule, DropAreaModule, FilePreviewModule],\n exports: [],\n declarations: [FilesRepositoryComponent, FilesRepositoryUploadComponent],\n providers: [\n FilesRepositoryGuard,\n hookNavigator(FilesRepositoryNavigationFactory),\n hookRoute(\n {\n path: 'files',\n component: FilesRepositoryComponent,\n canActivate: [FilesRepositoryGuard]\n },\n { multi: true }\n ),\n FilesRepositoryService\n ]\n})\nexport class FilesRepositoryModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i1.FilesRepositoryGuard","i1.FilesRepositoryService","i2"],"mappings":";;;;;;;;;;;;;;;;;MAOa,oBAAoB,CAAA;AAC/B,IAAA,WAAA,CAAoB,WAAwB,EAAA;AAAxB,QAAA,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;KAAI;AAEhD;;;;;AAKG;IACH,WAAW,GAAA;QACT,QACE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC;AACzD,YAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;AAC3B,gBAAA,WAAW,CAAC,wBAAwB;AACpC,gBAAA,WAAW,CAAC,gBAAgB;AAC7B,aAAA,CAAC,EACF;KACH;;iHAjBU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,oBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA,CAAA;2FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MCDY,gCAAgC,CAAA;AAG3C,IAAA,WAAA,CAAoB,oBAA0C,EAAA;AAA1C,QAAA,IAAoB,CAAA,oBAAA,GAApB,oBAAoB,CAAsB;AAFtD,QAAA,IAAI,CAAA,IAAA,GAAoB,EAAE,CAAC;KAE+B;IAE5D,GAAG,GAAA;;AACP,YAAA,IAAI,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,EAAE;AAC3C,gBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACrB,oBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CACZ,IAAI,aAAa,CAAC;AAChB,wBAAA,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;AAC7B,wBAAA,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC;AAClC,wBAAA,IAAI,EAAE,aAAa;AACnB,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,eAAe,EAAE,KAAK;AACtB,wBAAA,QAAQ,EAAE,IAAI;AACf,qBAAA,CAAC,CACH,CAAC;AACH,iBAAA;AACF,aAAA;YACD,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB,CAAA,CAAA;AAAA,KAAA;;6HArBU,gCAAgC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAhC,gCAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gCAAgC,cADnB,MAAM,EAAA,CAAA,CAAA;2FACnB,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAD5C,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ACJ3B,MAAM,kBAAkB,GAAG;AAChC,IAAA,MAAM,EAAE;AACN,QAAA,sBAAsB,EAAE,uBAAuB;AAChD,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,gCAAgC,EAAE,yBAAyB;AAC5D,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,mBAAmB,EAAE,mBAAmB;AACxC,QAAA,kBAAkB,EAAE,kBAAkB;AACvC,KAAA;CACF;;MCKY,8BAA8B,CAAA;AAUzC,IAAA,WAAA,CACU,YAA0B,EAC1B,gBAAkC,EAClC,YAA0B,EAAA;AAF1B,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AAClC,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;;AAX1B,QAAA,IAAA,CAAA,OAAO,GAAwC,IAAI,YAAY,EAAE,CAAC;AAC5E,QAAA,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;AAClB,QAAA,IAAA,CAAA,oBAAoB,GAAW,OAAO,CAAC,iBAAiB,CAAC,CAAC;KAUtD;IAEE,MAAM,GAAA;;AACV,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,eAAe,GAAG,aAAa,CAClC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAChF,CAAC;YAEF,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CACtD,cAAc,IAAG;AACf,gBAAA,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;aACtC,EACD,CAAC,IAAG;AACF,gBAAA,IAAI,CAAC,EAAE;AACL,oBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;oBACtC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,sBAAsB,EAAE;AACnF,wBAAA,SAAS,EAAE,kBAAkB,CAAC,UAAU,CAAC,gCAAgC;AACzE,wBAAA,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,kBAAkB;AACtD,qBAAA,CAAC,CAAC;AACJ,iBAAA;AACD,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACxB,EACD,MAAK;gBACH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBACxD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,sBAAsB,EAAE;AACnF,oBAAA,SAAS,EAAE,kBAAkB,CAAC,UAAU,CAAC,gCAAgC;AACzE,oBAAA,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,mBAAmB;AACvD,iBAAA,CAAC,CAAC;AACL,aAAC,CACF,CAAC;SACH,CAAA,CAAA;AAAA,KAAA;AAED,IAAA,kBAAkB,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AAC5B,SAAA;KACF;;2HAnDU,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,8BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,oGChB3C,osCA+CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,8BAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,yBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FD/Ba,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAJ1C,SAAS;+BACE,6BAA6B,EAAA,QAAA,EAAA,osCAAA,EAAA,CAAA;6JAK7B,OAAO,EAAA,CAAA;sBAAhB,MAAM;;;METI,sBAAsB,CAAA;AAGjC,IAAA,WAAA,CAAoB,gBAAkC,EAAA;AAAlC,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QADtD,IAAA,CAAA,SAAS,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;AAEpC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;KACtC;IAED,aAAa,GAAA;QACX,OAAO;AACL,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,WAAW,EAAE,CAAC;SACf,CAAC;KACH;AAED,IAAA,6BAA6B,CAAC,IAAS,EAAA;AACrC,QAAA,OAAO,GAAG,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;KAC9C;IAED,UAAU,GAAA;QACR,OAAO;AACL,YAAA;AACE,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;AACvB,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,SAAS,EAAE,KAAkB;AAC9B,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;AACvB,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;AACvB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;AACxB,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC;AAC9B,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA;SACF,CAAC;KACH;;IAGD,oBAAoB,CAAC,gBAA0B,EAAE,gBAA4B,EAAA;QAC3E,MAAM,gCAAgC,GAAG,EAAE,CAAC;AAC5C,QAAA,gBAAgB,CAAC,OAAO,CAAC,IAAI,IAAG;AAC9B,YAAA,gBAAgB,CAAC,OAAO,CAAC,cAAc,IAAG;AACxC,gBAAA,IAAI,cAAc,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,EAAE;AAC3E,oBAAA,gCAAgC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACvD,iBAAA;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,gCAAgC,CAAC;KACzC;;IAGK,QAAQ,GAAA;;AACZ,YAAA,MAAM,OAAO,GAAG;gBACd,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;AAClD,gBAAA,QAAQ,EAAE,CAAC;AACX,gBAAA,cAAc,EAAE,IAAI;aACrB,CAAC;AACF,YAAA,OAAO,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;SACtE,CAAA,CAAA;AAAA,KAAA;;AAGK,IAAA,OAAO,CAAC,OAAiB,EAAE,UAAsB,EAAE,UAAU,GAAG,EAAE,EAAA;;;AAEtE,YAAA,MAAM,OAAO,GAAA,MAAA,CAAA,MAAA,CAAA,EACX,IAAI,EAAE,UAAU,EACb,EAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CACxC,CAAC;;YAGF,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAC5C,CAAA,CAAA;AAAA,KAAA;;IAGK,QAAQ,CAAC,OAAiB,EAAE,UAAsB,EAAA;;YACtD,MAAM,OAAO,mCAER,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA,EAAA;;AAEvC,gBAAA,QAAQ,EAAE,CAAC,EACX,WAAW,EAAE,CAAC,GACf,CAAC;AACF,YAAA,OAAO,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;SACtE,CAAA,CAAA;AAAA,KAAA;;IAGO,UAAU,CAAC,OAAiB,EAAE,UAAsB,EAAA;QAC1D,OAAO;AACL,YAAA,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YACnC,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,WAAW,EAAE,UAAU,CAAC,WAAW;AACnC,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,cAAc,EAAE,IAAI;SACrB,CAAC;KACH;;AAGO,IAAA,cAAc,CAAC,OAAiB,EAAA;QACtC,IAAI,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAC1C,QAAA,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;KAC/C;;AAGO,IAAA,WAAW,CAAC,OAAiB,EAAA;AACnC,QAAA,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;AAC/E,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,SAAS,EAAE,EAAE;AACd,SAAA,CAAC,CAAC;KACJ;;IAGO,cAAc,CAAC,KAAK,EAAE,MAAc,EAAA;;QAE1C,IAAI,MAAM,CAAC,UAAU,EAAE;;YAErB,IAAI,MAAM,CAAC,eAAe,EAAE;;AAE1B,gBAAA,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAI,CAAA,EAAA,MAAM,CAAC,eAAe,GAAG,CAAC;AAC7D,aAAA;;YAGD,IAAI,MAAM,CAAC,mBAAmB,EAAE;AAC9B,gBAAA,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAChF,aAAA;AACF,SAAA;;AAGD,QAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE;;AAEvC,YAAA,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;AACnB,gBAAA,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AACnD,aAAA,CAAC,CAAC;AACJ,SAAA;AAED,QAAA,OAAO,KAAK,CAAC;KACd;;mHA9JU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,sBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA,CAAA;2FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MCwBY,wBAAwB,CAAA;AAgDnC,IAAA,WAAA,CACU,sBAA8C,EAC9C,sBAA8C,EAC9C,YAA0B,EAC1B,YAA0B,EAC1B,cAA8B,EAC9B,WAAyB,EACzB,gBAAkC,EAAA;AANlC,QAAA,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAAwB;AAC9C,QAAA,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAAwB;AAC9C,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;AAC9B,QAAA,IAAW,CAAA,WAAA,GAAX,WAAW,CAAc;AACzB,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AArD5C,QAAA,IAAA,CAAA,QAAQ,GAAqB,IAAI,OAAO,EAAW,CAAC;AACpD,QAAA,IAAA,CAAA,KAAK,GAAW,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC5C,QAAA,IAAA,CAAA,eAAe,GAAW,OAAO,CAAC,YAAY,CAAC,CAAC;AAChD,QAAA,IAAA,CAAA,kBAAkB,GAAW,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACxD,QAAA,IAAA,CAAA,iBAAiB,GAAW,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAEtD,QAAA,IAAS,CAAA,SAAA,GAAG,IAAI,CAAC;QAEjB,IAAA,CAAA,cAAc,GAAmB;AAC/B,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,UAAU,EAAE,IAAI;SACjB,CAAC;QAEF,IAAA,CAAA,OAAO,GAAa,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,CAAC;QAC7D,IAAA,CAAA,UAAU,GAAe,IAAI,CAAC,sBAAsB,CAAC,aAAa,EAAE,CAAC;AACrE,QAAA,IAAc,CAAA,cAAA,GAAiB,MAAM,CAAC;AAGtC,QAAA,IAAU,CAAA,UAAA,GAAG,IAAI,CAAC;QAClB,IAAA,CAAA,cAAc,GAAoB;AAChC,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC;AACvB,gBAAA,IAAI,EAAE,OAAO;gBACb,IAAI,EAA0B,QAAA;AAC9B,gBAAA,MAAM,EAAE,YAAY,IAClB,CAAC,IAAI,CAAC,sBAAsB,CAAC,6BAA6B,CAAC,YAAY,CAAC;gBAC1E,QAAQ,EAAE,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;AAC1D,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC;AACzB,gBAAA,IAAI,EAAE,UAAU;gBAChB,IAAI,EAA0B,QAAA;gBAC9B,QAAQ,EAAE,YAAY,IAAI,IAAI,CAAC,cAAc,CAAC,YAAoC,CAAC;AACpF,aAAA;SACF,CAAC;QACF,IAAA,CAAA,kBAAkB,GAAwB;AACxC,YAAA;gBACE,IAAI,EAA0B,QAAA;gBAC9B,QAAQ,EAAE,eAAe,IAAI,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC;AACjE,aAAA;SACF,CAAC;AAEF,QAAA,IAAA,CAAA,OAAO,GAAsB,IAAI,YAAY,EAAO,CAAC;;QAYnD,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACpE;AAEK,IAAA,oBAAoB,CACxB,kBAAsC,EAAA;;YAEtC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,CACrE,kBAAkB,CAAC,OAAO,EAC1B,kBAAkB,CAAC,UAAU,EAC7B,kBAAkB,CAAC,UAAU,CAC9B,CAAC;AAEF,YAAA,MAAM,YAAY,GAAW,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CACrE,kBAAkB,CAAC,OAAO,EAC1B,kBAAkB,CAAC,UAAU,CAC9B,CAAC;YACF,MAAM,IAAI,GAAW,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;AAClE,YAAA,MAAM,oBAAoB,GAAyB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAC7F,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,gBAAgB,GAAG,oBAAoB,CAAC,IAAI,CAAC;AAElD,YAAA,OAAO,oBAAoB,CAAC;SAC7B,CAAA,CAAA;AAAA,KAAA;AAEK,IAAA,YAAY,CAAC,YAAiB,EAAA;;YAClC,OAAO,IAAI,CAAC,2BAA2B,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE;AACzD,gBAAA,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC;AAC7B,gBAAA,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CACjC,OAAO,CAAC,oEAAoE,CAAC,EAC7E,YAAY,CACb;AACD,gBAAA,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC;AACtC,aAAA,CAAC,CAAC;SACJ,CAAA,CAAA;AAAA,KAAA;AAEK,IAAA,aAAa,CAAC,gBAA0B,EAAA;;YAC5C,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC9F,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,CAAC,oBAAoB,CACxE,gBAAgB,EAChB,sBAAsB,CACvB,CAAC;AACF,YAAA,IAAI,IAAY,CAAC;AACjB,YAAA,IAAI,iBAAiB,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE;gBACtD,IAAI,GAAG,OAAO,CAAC,CAAA;;;;;AAKd,MAAA,CAAA,CAAC,CAAC;AACJ,aAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,GAAG,OAAO,CAAC,qEAAqE,CAAC,CAAC;AACvF,aAAA;AAED,YAAA,OAAO,IAAI,CAAC,2BAA2B,CAAC,iBAAiB,EAAE;AACzD,gBAAA,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC;gBAC9B,IAAI;AACJ,gBAAA,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC;AACvC,aAAA,CAAC,CAAC;SACJ,CAAA,CAAA;AAAA,KAAA;AAEK,IAAA,cAAc,CAAC,YAAkC,EAAA;;YACrD,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;SAChD,CAAA,CAAA;AAAA,KAAA;IAED,uBAAuB,GAAA;AACrB,QAAA,MAAM,YAAY,GAAiD;AACjE,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,eAAe,EAAE,YAAY;AAC7B,YAAA,cAAc,EAAE,aAAa;AAC7B,YAAA,mBAAmB,EAAE,IAAI;SAC1B,CAAC;AACF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,8BAA8B,EAAE,YAAY,CAAC,CAAC;QACxF,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAI;AACjF,YAAA,IAAI,QAAQ,EAAE;AACZ,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACrB,aAAA;YACD,QAAQ,CAAC,IAAI,EAAE,CAAC;AAClB,SAAC,CAAC,CAAC;KACJ;IAEa,2BAA2B,CACvC,gBAA0B,EAC1B,OAA6D,EAAA;;YAE7D,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AACzC,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,gBAAA,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,cAAc,IAClD,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,cAAc,CAAC,CACnD,CAAC;AACF,gBAAA,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC5B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAC/C,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACrB,aAAA;AAAC,YAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,EAAE,EAAE;AACN,oBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AACxC,iBAAA;AACF,aAAA;AAAS,oBAAA;AACR,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACxB,aAAA;SACF,CAAA,CAAA;AAAA,KAAA;AAEa,IAAA,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAmC,EAAA;;AACjF,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC7B,YAAA,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;AACpE,YAAA,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;SAC9D,CAAA,CAAA;AAAA,KAAA;;qHApKU,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAE,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;yGAAxB,wBAAwB,EAAA,QAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACxB,iBAAiB,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjC9B,smHAmHA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,wBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,oBAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,eAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,aAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,SAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FDnFa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAJpC,SAAS;+BACE,sBAAsB,EAAA,QAAA,EAAA,smHAAA,EAAA,CAAA;4RAIgB,QAAQ,EAAA,CAAA;sBAAvD,SAAS;gBAAC,IAAA,EAAA,CAAA,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;;;MELnC,qBAAqB,CAAA;;kHAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;mHAArB,qBAAqB,EAAA,YAAA,EAAA,CAfjB,wBAAwB,EAAE,8BAA8B,CAAA,EAAA,OAAA,EAAA,CAF7D,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,CAAA,EAAA,CAAA,CAAA;AAiB1D,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,EAdrB,SAAA,EAAA;QACT,oBAAoB;QACpB,aAAa,CAAC,gCAAgC,CAAC;AAC/C,QAAA,SAAS,CACP;AACE,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,SAAS,EAAE,wBAAwB;YACnC,WAAW,EAAE,CAAC,oBAAoB,CAAC;AACpC,SAAA,EACD,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB;QACD,sBAAsB;AACvB,KAAA,EAAA,OAAA,EAAA,CAfS,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,CAAA,EAAA,CAAA,CAAA;2FAiB1D,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAlBjC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,CAAC;AACtE,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,YAAY,EAAE,CAAC,wBAAwB,EAAE,8BAA8B,CAAC;AACxE,oBAAA,SAAS,EAAE;wBACT,oBAAoB;wBACpB,aAAa,CAAC,gCAAgC,CAAC;AAC/C,wBAAA,SAAS,CACP;AACE,4BAAA,IAAI,EAAE,OAAO;AACb,4BAAA,SAAS,EAAE,wBAAwB;4BACnC,WAAW,EAAE,CAAC,oBAAoB,CAAC;AACpC,yBAAA,EACD,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB;wBACD,sBAAsB;AACvB,qBAAA;iBACF,CAAA;;;AC3BD;;AAEG;;;;"}
@@ -7,12 +7,18 @@ import { isNil } from 'lodash-es';
7
7
  import { Subject } from 'rxjs';
8
8
  import { takeUntil } from 'rxjs/operators';
9
9
 
10
- const REQUIRED_ROLES = [
11
- Permissions.ROLE_INVENTORY_READ,
12
- Permissions.ROLE_INVENTORY_ADMIN,
10
+ const REQUIRED_IDENTITY_ROLES = [
13
11
  Permissions.ROLE_IDENTITY_READ,
14
12
  Permissions.ROLE_IDENTITY_ADMIN
15
13
  ];
14
+ const REQUIRED_INVENTORY_ROLES = [
15
+ Permissions.ROLE_INVENTORY_READ,
16
+ Permissions.ROLE_INVENTORY_ADMIN
17
+ ];
18
+ const REQUIRED_MANAGED_OBJECT_ROLES = [
19
+ Permissions.ROLE_MANAGED_OBJECT_READ,
20
+ Permissions.ROLE_MANAGED_OBJECT_ADMIN
21
+ ];
16
22
  class ReplaceDeviceService {
17
23
  constructor(permissions, breadcrumbService, drawerService) {
18
24
  this.permissions = permissions;
@@ -21,7 +27,9 @@ class ReplaceDeviceService {
21
27
  this.destroyed$ = new Subject();
22
28
  }
23
29
  canShowReplaceDevice(device) {
24
- return (this.permissions.hasAllRoles(REQUIRED_ROLES) &&
30
+ return ((this.permissions.hasAllRoles(REQUIRED_INVENTORY_ROLES) ||
31
+ this.permissions.hasAllRoles(REQUIRED_MANAGED_OBJECT_ROLES)) &&
32
+ this.permissions.hasAllRoles(REQUIRED_IDENTITY_ROLES) &&
25
33
  !isNil(device.c8y_IsDevice) &&
26
34
  isNil(device.c8y_IsLwm2mDevice));
27
35
  }
@@ -64,5 +72,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImpor
64
72
  * Generated bundle index. Do not edit.
65
73
  */
66
74
 
67
- export { REQUIRED_ROLES, ReplaceDeviceService };
75
+ export { REQUIRED_IDENTITY_ROLES, REQUIRED_INVENTORY_ROLES, REQUIRED_MANAGED_OBJECT_ROLES, ReplaceDeviceService };
68
76
  //# sourceMappingURL=c8y-ngx-components-replace-device.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-replace-device.mjs","sources":["../../replace-device/replace-device.service.ts","../../replace-device/c8y-ngx-components-replace-device.ts"],"sourcesContent":["import { Injectable, OnDestroy } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { BottomDrawerService, BreadcrumbService, gettext, Permissions } from '@c8y/ngx-components';\nimport { isNil } from 'lodash-es';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nexport const REQUIRED_ROLES = [\n Permissions.ROLE_INVENTORY_READ,\n Permissions.ROLE_INVENTORY_ADMIN,\n Permissions.ROLE_IDENTITY_READ,\n Permissions.ROLE_IDENTITY_ADMIN\n];\n\n@Injectable({ providedIn: 'root' })\nexport class ReplaceDeviceService implements OnDestroy {\n private destroyed$ = new Subject<void>();\n\n constructor(\n private permissions: Permissions,\n private breadcrumbService: BreadcrumbService,\n private drawerService: BottomDrawerService\n ) {}\n\n canShowReplaceDevice(device: IManagedObject): boolean {\n return (\n this.permissions.hasAllRoles(REQUIRED_ROLES) &&\n !isNil(device.c8y_IsDevice) &&\n isNil(device.c8y_IsLwm2mDevice)\n );\n }\n\n async openDrawer(deviceToReplace: IManagedObject, closeCallback?: () => void) {\n const { ReplaceDeviceWizardComponent } = await import(\n '@c8y/ngx-components/replace-device-wizard'\n );\n const drawerRef = this.drawerService.openDrawer(ReplaceDeviceWizardComponent, {\n initialState: { deviceToReplace }\n });\n this.appendBreadcrumbs();\n drawerRef.onClosed$.pipe(takeUntil(this.destroyed$)).subscribe(() => {\n this.removeBreadcrumbs();\n if (typeof closeCallback === 'function') {\n closeCallback();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n\n private appendBreadcrumbs(): void {\n this.breadcrumbService.state.forEach(\n bc => (bc.items = [...bc.items, { label: gettext('Replace device'), path: undefined }])\n );\n this.breadcrumbService.refresh();\n }\n\n private removeBreadcrumbs(): void {\n this.breadcrumbService.state.forEach(bc => bc.items?.pop());\n this.breadcrumbService.refresh();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-replace-device.mjs","sources":["../../replace-device/replace-device.service.ts","../../replace-device/c8y-ngx-components-replace-device.ts"],"sourcesContent":["import { Injectable, OnDestroy } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { BottomDrawerService, BreadcrumbService, gettext, Permissions } from '@c8y/ngx-components';\nimport { isNil } from 'lodash-es';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nexport const REQUIRED_IDENTITY_ROLES = [\n Permissions.ROLE_IDENTITY_READ,\n Permissions.ROLE_IDENTITY_ADMIN\n];\nexport const REQUIRED_INVENTORY_ROLES = [\n Permissions.ROLE_INVENTORY_READ,\n Permissions.ROLE_INVENTORY_ADMIN\n];\nexport const REQUIRED_MANAGED_OBJECT_ROLES = [\n Permissions.ROLE_MANAGED_OBJECT_READ,\n Permissions.ROLE_MANAGED_OBJECT_ADMIN\n];\n\n@Injectable({ providedIn: 'root' })\nexport class ReplaceDeviceService implements OnDestroy {\n private destroyed$ = new Subject<void>();\n\n constructor(\n private permissions: Permissions,\n private breadcrumbService: BreadcrumbService,\n private drawerService: BottomDrawerService\n ) {}\n\n canShowReplaceDevice(device: IManagedObject): boolean {\n return (\n (this.permissions.hasAllRoles(REQUIRED_INVENTORY_ROLES) ||\n this.permissions.hasAllRoles(REQUIRED_MANAGED_OBJECT_ROLES)) &&\n this.permissions.hasAllRoles(REQUIRED_IDENTITY_ROLES) &&\n !isNil(device.c8y_IsDevice) &&\n isNil(device.c8y_IsLwm2mDevice)\n );\n }\n\n async openDrawer(deviceToReplace: IManagedObject, closeCallback?: () => void) {\n const { ReplaceDeviceWizardComponent } = await import(\n '@c8y/ngx-components/replace-device-wizard'\n );\n const drawerRef = this.drawerService.openDrawer(ReplaceDeviceWizardComponent, {\n initialState: { deviceToReplace }\n });\n this.appendBreadcrumbs();\n drawerRef.onClosed$.pipe(takeUntil(this.destroyed$)).subscribe(() => {\n this.removeBreadcrumbs();\n if (typeof closeCallback === 'function') {\n closeCallback();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n\n private appendBreadcrumbs(): void {\n this.breadcrumbService.state.forEach(\n bc => (bc.items = [...bc.items, { label: gettext('Replace device'), path: undefined }])\n );\n this.breadcrumbService.refresh();\n }\n\n private removeBreadcrumbs(): void {\n this.breadcrumbService.state.forEach(bc => bc.items?.pop());\n this.breadcrumbService.refresh();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -400,10 +400,18 @@ class ConfigurationPreviewComponent {
400
400
  });
401
401
  }
402
402
  hasPermission() {
403
- return this.user.hasAnyRole(this.appState.currentUser.value, [
403
+ return (this.user.hasAnyRole(this.appState.currentUser.value, [
404
404
  Permissions.ROLE_INVENTORY_ADMIN,
405
405
  Permissions.ROLE_INVENTORY_CREATE
406
- ]);
406
+ ]) ||
407
+ (this.user.hasAnyRole(this.appState.currentUser.value, [
408
+ Permissions.ROLE_MANAGED_OBJECT_ADMIN,
409
+ Permissions.ROLE_MANAGED_OBJECT_CREATE
410
+ ]) &&
411
+ this.user.hasAnyRole(this.appState.currentUser.value, [
412
+ Permissions.ROLE_BINARY_ADMIN,
413
+ Permissions.ROLE_BINARY_CREATE
414
+ ])));
407
415
  }
408
416
  ngOnDestroy() {
409
417
  if (this.operationsSubscription) {