@yuuvis/app-drive 0.7.3

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 (107) hide show
  1. package/README.md +47 -0
  2. package/esm2022/extensions/index.mjs +2 -0
  3. package/esm2022/extensions/lib/extensions.module.mjs +35 -0
  4. package/esm2022/extensions/lib/extensions.service.mjs +44 -0
  5. package/esm2022/extensions/lib/object-config.defaults.mjs +19 -0
  6. package/esm2022/extensions/yuuvis-app-drive-extensions.mjs +5 -0
  7. package/esm2022/index.mjs +5 -0
  8. package/esm2022/lib/actions/copy-link/copy-link.action.mjs +40 -0
  9. package/esm2022/lib/actions/index.mjs +7 -0
  10. package/esm2022/lib/actions/manage-versions/manage-versions.action.mjs +33 -0
  11. package/esm2022/lib/actions/manage-versions/manage-versions.component.mjs +105 -0
  12. package/esm2022/lib/actions/paste/paste.action.mjs +41 -0
  13. package/esm2022/lib/actions/rename/rename.action.mjs +31 -0
  14. package/esm2022/lib/actions/rename/rename.component.mjs +42 -0
  15. package/esm2022/lib/actions/rename/rename.validator.mjs +23 -0
  16. package/esm2022/lib/actions/updateContent/update.content.action.mjs +52 -0
  17. package/esm2022/lib/components/add-button/add-button-overlay/add-button-overlay.component.mjs +109 -0
  18. package/esm2022/lib/components/add-button/add-button.component.mjs +39 -0
  19. package/esm2022/lib/components/breadcrumb/breadcrumb.component.mjs +74 -0
  20. package/esm2022/lib/components/folder-tree/folder-tree.component.mjs +89 -0
  21. package/esm2022/lib/components/index.mjs +10 -0
  22. package/esm2022/lib/components/object-name/object-name.component.mjs +60 -0
  23. package/esm2022/lib/components/overlay/create-folder/create-folder.component.mjs +48 -0
  24. package/esm2022/lib/components/paste-from-clipboard/paste-from-clipboard.component.mjs +28 -0
  25. package/esm2022/lib/components/ribbon/ribbon.component.mjs +102 -0
  26. package/esm2022/lib/components/search-filter/date-range-picker/date-range-picker.component.mjs +38 -0
  27. package/esm2022/lib/components/search-filter/search-filter.component.mjs +429 -0
  28. package/esm2022/lib/components/sort/sort.component.mjs +156 -0
  29. package/esm2022/lib/components/versions-list/tile/tile.component.mjs +60 -0
  30. package/esm2022/lib/components/versions-list/versions-list.component.mjs +94 -0
  31. package/esm2022/lib/container/drive/drive.component.mjs +116 -0
  32. package/esm2022/lib/drive.icons.mjs +16 -0
  33. package/esm2022/lib/drive.schema.mjs +49 -0
  34. package/esm2022/lib/lib.routes.mjs +17 -0
  35. package/esm2022/lib/pages/files/files.component.mjs +377 -0
  36. package/esm2022/lib/pages/object/object.component.mjs +200 -0
  37. package/esm2022/lib/services/drive/drive.interface.mjs +14 -0
  38. package/esm2022/lib/services/drive/drive.service.mjs +437 -0
  39. package/esm2022/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.component.mjs +158 -0
  40. package/esm2022/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.interface.mjs +2 -0
  41. package/esm2022/lib/services/drive/versions/versions.mapping.mjs +42 -0
  42. package/esm2022/lib/services/index.mjs +5 -0
  43. package/esm2022/lib/services/providers/drive.providers.mjs +10 -0
  44. package/esm2022/lib/services/resolver/files.resolver.mjs +12 -0
  45. package/esm2022/lib/services/resolver/index.mjs +3 -0
  46. package/esm2022/lib/services/resolver/versions.route.resolver.mjs +10 -0
  47. package/esm2022/lib/services/stored-query/stored-query.data.mjs +25 -0
  48. package/esm2022/lib/services/stored-query/stored-query.interface.mjs +2 -0
  49. package/esm2022/lib/services/stored-query/stored-query.service.mjs +41 -0
  50. package/esm2022/lib/services/tokens/breadcrumb-max-depth.token.mjs +3 -0
  51. package/esm2022/lib/services/tokens/index.mjs +2 -0
  52. package/esm2022/yuuvis-app-drive.mjs +5 -0
  53. package/extensions/README.md +3 -0
  54. package/extensions/index.d.ts +1 -0
  55. package/extensions/lib/extensions.module.d.ts +6 -0
  56. package/extensions/lib/extensions.service.d.ts +7 -0
  57. package/extensions/lib/object-config.defaults.d.ts +2 -0
  58. package/fesm2022/yuuvis-app-drive-extensions.mjs +99 -0
  59. package/fesm2022/yuuvis-app-drive-extensions.mjs.map +1 -0
  60. package/fesm2022/yuuvis-app-drive.mjs +2945 -0
  61. package/fesm2022/yuuvis-app-drive.mjs.map +1 -0
  62. package/index.d.ts +4 -0
  63. package/lib/actions/copy-link/copy-link.action.d.ts +18 -0
  64. package/lib/actions/index.d.ts +6 -0
  65. package/lib/actions/manage-versions/manage-versions.action.d.ts +17 -0
  66. package/lib/actions/manage-versions/manage-versions.component.d.ts +32 -0
  67. package/lib/actions/paste/paste.action.d.ts +17 -0
  68. package/lib/actions/rename/rename.action.d.ts +17 -0
  69. package/lib/actions/rename/rename.component.d.ts +12 -0
  70. package/lib/actions/rename/rename.validator.d.ts +5 -0
  71. package/lib/actions/updateContent/update.content.action.d.ts +18 -0
  72. package/lib/components/add-button/add-button-overlay/add-button-overlay.component.d.ts +26 -0
  73. package/lib/components/add-button/add-button.component.d.ts +12 -0
  74. package/lib/components/breadcrumb/breadcrumb.component.d.ts +25 -0
  75. package/lib/components/folder-tree/folder-tree.component.d.ts +13 -0
  76. package/lib/components/index.d.ts +8 -0
  77. package/lib/components/object-name/object-name.component.d.ts +21 -0
  78. package/lib/components/overlay/create-folder/create-folder.component.d.ts +12 -0
  79. package/lib/components/paste-from-clipboard/paste-from-clipboard.component.d.ts +13 -0
  80. package/lib/components/ribbon/ribbon.component.d.ts +24 -0
  81. package/lib/components/search-filter/date-range-picker/date-range-picker.component.d.ts +13 -0
  82. package/lib/components/search-filter/search-filter.component.d.ts +23 -0
  83. package/lib/components/sort/sort.component.d.ts +31 -0
  84. package/lib/components/versions-list/tile/tile.component.d.ts +14 -0
  85. package/lib/components/versions-list/versions-list.component.d.ts +17 -0
  86. package/lib/container/drive/drive.component.d.ts +36 -0
  87. package/lib/drive.icons.d.ts +15 -0
  88. package/lib/drive.schema.d.ts +23 -0
  89. package/lib/lib.routes.d.ts +2 -0
  90. package/lib/pages/files/files.component.d.ts +101 -0
  91. package/lib/pages/object/object.component.d.ts +35 -0
  92. package/lib/services/drive/drive.interface.d.ts +62 -0
  93. package/lib/services/drive/drive.service.d.ts +64 -0
  94. package/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.component.d.ts +31 -0
  95. package/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.interface.d.ts +8 -0
  96. package/lib/services/drive/versions/versions.mapping.d.ts +2 -0
  97. package/lib/services/index.d.ts +4 -0
  98. package/lib/services/providers/drive.providers.d.ts +7 -0
  99. package/lib/services/resolver/files.resolver.d.ts +2 -0
  100. package/lib/services/resolver/index.d.ts +2 -0
  101. package/lib/services/resolver/versions.route.resolver.d.ts +2 -0
  102. package/lib/services/stored-query/stored-query.data.d.ts +5 -0
  103. package/lib/services/stored-query/stored-query.interface.d.ts +5 -0
  104. package/lib/services/stored-query/stored-query.service.d.ts +10 -0
  105. package/lib/services/tokens/breadcrumb-max-depth.token.d.ts +2 -0
  106. package/lib/services/tokens/index.d.ts +1 -0
  107. package/package.json +41 -0
@@ -0,0 +1,49 @@
1
+ // Mapping schema for this apps backend schema
2
+ import { SystemType } from '@yuuvis/client-core';
3
+ // eslint-disable-next-line @nx/enforce-module-boundaries
4
+ import { marker } from '@colsen1991/ngx-translate-extract-marker';
5
+ import { APP_DRIVE_ICONS } from './drive.icons';
6
+ // use marker to extract the labels for the app schema types
7
+ // make sure to provide a marker for each type/flavor ID
8
+ marker('io.yuuvis.app.drive.folder');
9
+ marker('io.yuuvis.app.drive.file');
10
+ export const FS_PROPERTIES = {
11
+ name: 'appOsdrive:fileName'
12
+ };
13
+ export const FS_SOTS = {
14
+ object: 'appOsdrive:file'
15
+ };
16
+ export const APP_PREFIX = 'appDrive:';
17
+ export const APP_ID = 'io.yuuvis.app.drive';
18
+ export const APP_SCHEMA = {
19
+ id: APP_ID,
20
+ name: 'OS Drive',
21
+ icon: '<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M340-320h300q50 0 85-35t35-85q0-50-35-85t-85-35q-8-58-53-99t-101-41q-51 0-92.5 26T332-600q-57 5-94.5 43.5T200-460q0 58 41 99t99 41Zm0-80q-25 0-42.5-17.5T280-460q0-25 17.5-42.5T340-520h60v-20q0-33 23.5-56.5T480-620q33 0 56.5 23.5T560-540v60h80q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400H340ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>',
22
+ types: {
23
+ folder: {
24
+ id: `${APP_ID}.folder`,
25
+ icon: APP_DRIVE_ICONS.folder,
26
+ objectType: SystemType.FOLDER,
27
+ sots: [FS_SOTS.object]
28
+ },
29
+ file: {
30
+ id: `${APP_ID}.file`,
31
+ icon: APP_DRIVE_ICONS.file,
32
+ objectType: SystemType.DOCUMENT,
33
+ sots: [FS_SOTS.object]
34
+ }
35
+ },
36
+ flavors: []
37
+ };
38
+ export const APP_ACTIONS = {
39
+ rename: 'app.drive.action.rename',
40
+ paste: 'app.drive.action.paste',
41
+ copyLink: 'app.drive.action.copy.link',
42
+ contentUpdate: 'app.drive.action.content.update',
43
+ manageVersions: 'app.drive.action.manage-versions'
44
+ };
45
+ export const ACTION_CONTEXT = {
46
+ subjectProperty: FS_PROPERTIES.name,
47
+ appId: APP_ID
48
+ };
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmUuc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcHBzL2RyaXZlL3NyYy9saWIvZHJpdmUuc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhDQUE4QztBQUU5QyxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLHFCQUFxQixDQUFDO0FBRXBFLHlEQUF5RDtBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdoRCw0REFBNEQ7QUFDNUQsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0FBQ3JDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBRW5DLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUMzQixJQUFJLEVBQUUscUJBQXFCO0NBQzVCLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUc7SUFDckIsTUFBTSxFQUFFLGlCQUFpQjtDQUMxQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQztBQUN0QyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUM7QUFFNUMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFzRTtJQUMzRixFQUFFLEVBQUUsTUFBTTtJQUNWLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSw4cUJBQThxQjtJQUNwckIsS0FBSyxFQUFFO1FBQ0wsTUFBTSxFQUFFO1lBQ04sRUFBRSxFQUFFLEdBQUcsTUFBTSxTQUFTO1lBQ3RCLElBQUksRUFBRSxlQUFlLENBQUMsTUFBTTtZQUM1QixVQUFVLEVBQUUsVUFBVSxDQUFDLE1BQU07WUFDN0IsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUN2QjtRQUNELElBQUksRUFBRTtZQUNKLEVBQUUsRUFBRSxHQUFHLE1BQU0sT0FBTztZQUNwQixJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUk7WUFDMUIsVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1lBQy9CLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7U0FDdkI7S0FDRjtJQUNELE9BQU8sRUFBRSxFQUFFO0NBQ1osQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRztJQUN6QixNQUFNLEVBQUUseUJBQXlCO0lBQ2pDLEtBQUssRUFBRSx3QkFBd0I7SUFDL0IsUUFBUSxFQUFFLDRCQUE0QjtJQUN0QyxhQUFhLEVBQUUsaUNBQWlDO0lBQ2hELGNBQWMsRUFBRSxrQ0FBa0M7Q0FDbkQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBa0I7SUFDM0MsZUFBZSxFQUFFLGFBQWEsQ0FBQyxJQUFJO0lBQ25DLEtBQUssRUFBRSxNQUFNO0NBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIE1hcHBpbmcgc2NoZW1hIGZvciB0aGlzIGFwcHMgYmFja2VuZCBzY2hlbWFcblxuaW1wb3J0IHsgU3lzdGVtVHlwZSwgVmlydHVhbE9iamVjdFR5cGUgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IEFwcFNjaGVtYSB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBueC9lbmZvcmNlLW1vZHVsZS1ib3VuZGFyaWVzXG5pbXBvcnQgeyBtYXJrZXIgfSBmcm9tICdAY29sc2VuMTk5MS9uZ3gtdHJhbnNsYXRlLWV4dHJhY3QtbWFya2VyJztcbmltcG9ydCB7IEFQUF9EUklWRV9JQ09OUyB9IGZyb20gJy4vZHJpdmUuaWNvbnMnO1xuaW1wb3J0IHsgQWN0aW9uQ29udGV4dCB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWZyYW1ld29yay9hY3Rpb25zJztcblxuLy8gdXNlIG1hcmtlciB0byBleHRyYWN0IHRoZSBsYWJlbHMgZm9yIHRoZSBhcHAgc2NoZW1hIHR5cGVzXG4vLyBtYWtlIHN1cmUgdG8gcHJvdmlkZSBhIG1hcmtlciBmb3IgZWFjaCB0eXBlL2ZsYXZvciBJRFxubWFya2VyKCdpby55dXV2aXMuYXBwLmRyaXZlLmZvbGRlcicpO1xubWFya2VyKCdpby55dXV2aXMuYXBwLmRyaXZlLmZpbGUnKTtcblxuZXhwb3J0IGNvbnN0IEZTX1BST1BFUlRJRVMgPSB7XG4gIG5hbWU6ICdhcHBPc2RyaXZlOmZpbGVOYW1lJ1xufTtcbmV4cG9ydCBjb25zdCBGU19TT1RTID0ge1xuICBvYmplY3Q6ICdhcHBPc2RyaXZlOmZpbGUnXG59O1xuXG5leHBvcnQgY29uc3QgQVBQX1BSRUZJWCA9ICdhcHBEcml2ZTonO1xuZXhwb3J0IGNvbnN0IEFQUF9JRCA9ICdpby55dXV2aXMuYXBwLmRyaXZlJztcblxuZXhwb3J0IGNvbnN0IEFQUF9TQ0hFTUE6IEFwcFNjaGVtYTx7IGZvbGRlcjogVmlydHVhbE9iamVjdFR5cGU7IGZpbGU6IFZpcnR1YWxPYmplY3RUeXBlIH0+ID0ge1xuICBpZDogQVBQX0lELFxuICBuYW1lOiAnT1MgRHJpdmUnLFxuICBpY29uOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0XCI+PHBhdGggZD1cIk0zNDAtMzIwaDMwMHE1MCAwIDg1LTM1dDM1LTg1cTAtNTAtMzUtODV0LTg1LTM1cS04LTU4LTUzLTk5dC0xMDEtNDFxLTUxIDAtOTIuNSAyNlQzMzItNjAwcS01NyA1LTk0LjUgNDMuNVQyMDAtNDYwcTAgNTggNDEgOTl0OTkgNDFabTAtODBxLTI1IDAtNDIuNS0xNy41VDI4MC00NjBxMC0yNSAxNy41LTQyLjVUMzQwLTUyMGg2MHYtMjBxMC0zMyAyMy41LTU2LjVUNDgwLTYyMHEzMyAwIDU2LjUgMjMuNVQ1NjAtNTQwdjYwaDgwcTE3IDAgMjguNSAxMS41VDY4MC00NDBxMCAxNy0xMS41IDI4LjVUNjQwLTQwMEgzNDBaTTQ4MC04MHEtODMgMC0xNTYtMzEuNVQxOTctMTk3cS01NC01NC04NS41LTEyN1Q4MC00ODBxMC04MyAzMS41LTE1NlQxOTctNzYzcTU0LTU0IDEyNy04NS41VDQ4MC04ODBxODMgMCAxNTYgMzEuNVQ3NjMtNzYzcTU0IDU0IDg1LjUgMTI3VDg4MC00ODBxMCA4My0zMS41IDE1NlQ3NjMtMTk3cS01NCA1NC0xMjcgODUuNVQ0ODAtODBabTAtODBxMTM0IDAgMjI3LTkzdDkzLTIyN3EwLTEzNC05My0yMjd0LTIyNy05M3EtMTM0IDAtMjI3IDkzdC05MyAyMjdxMCAxMzQgOTMgMjI3dDIyNyA5M1ptMC0zMjBaXCIvPjwvc3ZnPicsXG4gIHR5cGVzOiB7XG4gICAgZm9sZGVyOiB7XG4gICAgICBpZDogYCR7QVBQX0lEfS5mb2xkZXJgLFxuICAgICAgaWNvbjogQVBQX0RSSVZFX0lDT05TLmZvbGRlcixcbiAgICAgIG9iamVjdFR5cGU6IFN5c3RlbVR5cGUuRk9MREVSLFxuICAgICAgc290czogW0ZTX1NPVFMub2JqZWN0XVxuICAgIH0sXG4gICAgZmlsZToge1xuICAgICAgaWQ6IGAke0FQUF9JRH0uZmlsZWAsXG4gICAgICBpY29uOiBBUFBfRFJJVkVfSUNPTlMuZmlsZSxcbiAgICAgIG9iamVjdFR5cGU6IFN5c3RlbVR5cGUuRE9DVU1FTlQsXG4gICAgICBzb3RzOiBbRlNfU09UUy5vYmplY3RdXG4gICAgfVxuICB9LFxuICBmbGF2b3JzOiBbXVxufTtcblxuZXhwb3J0IGNvbnN0IEFQUF9BQ1RJT05TID0ge1xuICByZW5hbWU6ICdhcHAuZHJpdmUuYWN0aW9uLnJlbmFtZScsXG4gIHBhc3RlOiAnYXBwLmRyaXZlLmFjdGlvbi5wYXN0ZScsXG4gIGNvcHlMaW5rOiAnYXBwLmRyaXZlLmFjdGlvbi5jb3B5LmxpbmsnLFxuICBjb250ZW50VXBkYXRlOiAnYXBwLmRyaXZlLmFjdGlvbi5jb250ZW50LnVwZGF0ZScsXG4gIG1hbmFnZVZlcnNpb25zOiAnYXBwLmRyaXZlLmFjdGlvbi5tYW5hZ2UtdmVyc2lvbnMnXG59O1xuXG5leHBvcnQgY29uc3QgQUNUSU9OX0NPTlRFWFQ6IEFjdGlvbkNvbnRleHQgPSB7XG4gIHN1YmplY3RQcm9wZXJ0eTogRlNfUFJPUEVSVElFUy5uYW1lLFxuICBhcHBJZDogQVBQX0lEXG59O1xuIl19
@@ -0,0 +1,17 @@
1
+ import { DriveFrameComponent } from './container/drive/drive.component';
2
+ import { FilesPageComponent } from './pages/files/files.component';
3
+ import { ObjectPageComponent } from './pages/object/object.component';
4
+ import { filesResolver } from './services/resolver';
5
+ export const YuuvisDriveRoutes = [
6
+ {
7
+ path: '',
8
+ component: DriveFrameComponent,
9
+ children: [
10
+ { path: 'files', redirectTo: 'files/root' },
11
+ { path: 'files/:id', component: FilesPageComponent, resolve: { filesResolver } },
12
+ { path: 'object/:id', component: ObjectPageComponent },
13
+ { path: '', redirectTo: 'files/root', pathMatch: 'full' }
14
+ ]
15
+ }
16
+ ];
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLnJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXBwcy9kcml2ZS9zcmMvbGliL2xpYi5yb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFZO0lBQ3hDO1FBQ0UsSUFBSSxFQUFFLEVBQUU7UUFDUixTQUFTLEVBQUUsbUJBQW1CO1FBQzlCLFFBQVEsRUFBRTtZQUNSLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFO1lBQzNDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLEVBQUU7WUFDaEYsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRTtZQUN0RCxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFO1NBQzFEO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRHJpdmVGcmFtZUNvbXBvbmVudCB9IGZyb20gJy4vY29udGFpbmVyL2RyaXZlL2RyaXZlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWxlc1BhZ2VDb21wb25lbnQgfSBmcm9tICcuL3BhZ2VzL2ZpbGVzL2ZpbGVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPYmplY3RQYWdlQ29tcG9uZW50IH0gZnJvbSAnLi9wYWdlcy9vYmplY3Qvb2JqZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBmaWxlc1Jlc29sdmVyIH0gZnJvbSAnLi9zZXJ2aWNlcy9yZXNvbHZlcic7XG5cbmV4cG9ydCBjb25zdCBZdXV2aXNEcml2ZVJvdXRlczogUm91dGVbXSA9IFtcbiAge1xuICAgIHBhdGg6ICcnLFxuICAgIGNvbXBvbmVudDogRHJpdmVGcmFtZUNvbXBvbmVudCxcbiAgICBjaGlsZHJlbjogW1xuICAgICAgeyBwYXRoOiAnZmlsZXMnLCByZWRpcmVjdFRvOiAnZmlsZXMvcm9vdCcgfSxcbiAgICAgIHsgcGF0aDogJ2ZpbGVzLzppZCcsIGNvbXBvbmVudDogRmlsZXNQYWdlQ29tcG9uZW50LCByZXNvbHZlOiB7IGZpbGVzUmVzb2x2ZXIgfSB9LFxuICAgICAgeyBwYXRoOiAnb2JqZWN0LzppZCcsIGNvbXBvbmVudDogT2JqZWN0UGFnZUNvbXBvbmVudCB9LFxuICAgICAgeyBwYXRoOiAnJywgcmVkaXJlY3RUbzogJ2ZpbGVzL3Jvb3QnLCBwYXRoTWF0Y2g6ICdmdWxsJyB9XG4gICAgXVxuICB9XG5dO1xuIl19
@@ -0,0 +1,377 @@
1
+ import { AsyncPipe, NgClass } from '@angular/common';
2
+ import { Component, computed, effect, HostBinding, inject, input, signal, untracked, viewChild } from '@angular/core';
3
+ import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
4
+ import { ActivatedRoute, Router, RouterModule } from '@angular/router';
5
+ import { AppCacheService, BaseObjectTypeField, ClipboardService, DeviceService, DmsService, EventService, ObjectConfigService, Operator, SystemType, TranslateModule, TranslateService, YuvEventType } from '@yuuvis/client-core';
6
+ import { ActionsService, BASE_ACTION } from '@yuuvis/client-framework/actions';
7
+ import { FileDropZoneDirective } from '@yuuvis/client-framework/common';
8
+ import { YUV_ICONS } from '@yuuvis/client-framework/icons';
9
+ import { MultiObjectSummaryComponent, ObjectSummaryComponent } from '@yuuvis/client-framework/object-summary';
10
+ import { SimpleSearchComponent } from '@yuuvis/client-framework/simple-search';
11
+ import { TileConfigTriggerComponent, TileListComponent } from '@yuuvis/client-framework/tile-list';
12
+ import { ShellService } from '@yuuvis/client-shell-core';
13
+ import { ICONS, YvcIconModule } from '@yuuvis/components/icon';
14
+ import { SplitViewComponent, YvcSplitViewModule } from '@yuuvis/components/split-view';
15
+ import { finalize, map, tap } from 'rxjs';
16
+ import { BreadcrumbComponent, SortComponent } from '../../components';
17
+ import { AddButtonComponent } from '../../components/add-button/add-button.component';
18
+ import { FolderTreeComponent } from '../../components/folder-tree/folder-tree.component';
19
+ import { RibbonComponent } from '../../components/ribbon/ribbon.component';
20
+ import { APP_DRIVE_ICONS } from '../../drive.icons';
21
+ import { ACTION_CONTEXT, APP_ID, APP_SCHEMA } from '../../drive.schema';
22
+ import { DRIVE_EVENT, DRIVE_QUERY_FOLDER_ID, DRIVE_ROOT_FOLDER_ID } from '../../services/drive/drive.interface';
23
+ import { DriveService } from '../../services/drive/drive.service';
24
+ import { STORED_QUERY_ID_PREFIX } from '../../services/stored-query/stored-query.data';
25
+ import { StoredQueryService } from '../../services/stored-query/stored-query.service';
26
+ import { SearchFilterComponent } from '../../components/search-filter/search-filter.component';
27
+ import * as i0 from "@angular/core";
28
+ import * as i1 from "@yuuvis/components/icon";
29
+ import * as i2 from "@yuuvis/client-core";
30
+ import * as i3 from "@yuuvis/components/split-view";
31
+ const components = [
32
+ TileListComponent,
33
+ BreadcrumbComponent,
34
+ FolderTreeComponent,
35
+ ObjectSummaryComponent,
36
+ TileConfigTriggerComponent,
37
+ RibbonComponent,
38
+ AddButtonComponent,
39
+ SimpleSearchComponent,
40
+ MultiObjectSummaryComponent,
41
+ SortComponent,
42
+ SearchFilterComponent
43
+ ];
44
+ const module = [YvcIconModule, TranslateModule, RouterModule, YvcSplitViewModule];
45
+ export class FilesPageComponent {
46
+ #LAYOUT_SETTINGS_STORAGE_KEY;
47
+ #objectConfigService;
48
+ #device;
49
+ #eventService;
50
+ #appCache;
51
+ #highlightStyles;
52
+ #routeIdEffect;
53
+ constructor() {
54
+ this.tileList = viewChild('tileList');
55
+ this.#LAYOUT_SETTINGS_STORAGE_KEY = 'yuv.app.drive.files.layout';
56
+ this.shellService = inject(ShellService);
57
+ this.dmsService = inject(DmsService);
58
+ this.drive = inject(DriveService);
59
+ this.route = inject(ActivatedRoute);
60
+ this.router = inject(Router);
61
+ this.translate = inject(TranslateService);
62
+ this.storedQueryService = inject(StoredQueryService);
63
+ this.clipboard = inject(ClipboardService);
64
+ this.actionsService = inject(ActionsService);
65
+ this.#objectConfigService = inject(ObjectConfigService);
66
+ this.#device = inject(DeviceService);
67
+ this.#eventService = inject(EventService);
68
+ this.ERROR_CODE = {
69
+ NOT_FOUND: '404',
70
+ // pattern: {HTTP_STATUS_CODE}-{SERVICE_ERROR_CODE}
71
+ INVALID_ID: '422-2912'
72
+ };
73
+ this.#appCache = inject(AppCacheService);
74
+ this.objectConfigBucket = APP_SCHEMA.id;
75
+ this.splitViewCmp = viewChild.required(SplitViewComponent);
76
+ this.selected = signal(undefined);
77
+ this.fileDropSummaryDisabled = computed(() => !this.selected()?.permissions?.writeContent);
78
+ this.disableCreate = false;
79
+ this.actions = this.drive.state$.actions;
80
+ this.selection = this.drive.state$.selection;
81
+ this.busy = this.drive.state$.busy;
82
+ this.flavorChips = this.shellService.getObjectFlavors();
83
+ this.selectionActions = computed(() => ({ selection: this.selection(), actions: this.actions() }));
84
+ this.emptyMode = signal(null);
85
+ // error code when loading the object failed. This will be used
86
+ // to determine a proper error message to display
87
+ this.error = signal(undefined);
88
+ this.configTypeOptions = {
89
+ folder: { bucket: APP_ID, type: APP_SCHEMA.types['folder'] },
90
+ file: { bucket: APP_ID, type: APP_SCHEMA.types['file'] }
91
+ };
92
+ this.searchFocused = false;
93
+ this.enableDetails = signal(true);
94
+ this.enableTree = signal(true);
95
+ this.tileConfigBucketLabel = this.translate.instant('yuv.app.drive.tile-config.bucket');
96
+ this.smallScreenLayout = signal(false);
97
+ this.sortOptionsAvailable = signal(true);
98
+ this.id = input(null);
99
+ this.highlightStyles$ = this.clipboard.clipboard$(APP_ID).pipe(takeUntilDestroyed(), map((c) => {
100
+ return c && c.mode && c.objects?.length
101
+ ? [
102
+ {
103
+ cssStyles: this.#highlightStyles[c?.mode],
104
+ ids: c.objects.map((o) => o.id)
105
+ }
106
+ ]
107
+ : [];
108
+ }));
109
+ this.#highlightStyles = {
110
+ cut: { opacity: 0.5 }
111
+ };
112
+ this.#routeIdEffect = effect(() => {
113
+ const param = this.id() || undefined;
114
+ untracked(async () => {
115
+ if (param === DRIVE_QUERY_FOLDER_ID) {
116
+ this.emptyMode.set(DRIVE_QUERY_FOLDER_ID);
117
+ return;
118
+ }
119
+ this.emptyMode.set(param === DRIVE_ROOT_FOLDER_ID ? DRIVE_ROOT_FOLDER_ID : null);
120
+ this.error.set(undefined);
121
+ this.disableCreate = false;
122
+ this.currentFolderID = param;
123
+ this.drive.updateCurrentFolder(this.currentFolderID);
124
+ this.selected.set(undefined);
125
+ this.currentFolder = undefined;
126
+ if (this.currentFolderID === DRIVE_ROOT_FOLDER_ID)
127
+ this.currentFolderID = undefined;
128
+ if (this.currentFolderID) {
129
+ this.dmsService.getDmsObject(this.currentFolderID).subscribe({
130
+ next: (o) => {
131
+ this.currentFolder = o;
132
+ this._setFolderQuery(this.#getTitle(o));
133
+ },
134
+ error: (e) => {
135
+ console.error('Error getting folder', e);
136
+ this.#processLoadError(e);
137
+ }
138
+ });
139
+ }
140
+ else
141
+ this._setFolderQuery(this.translate.instant('yuv.app.drive.folder-tree.mydrive'));
142
+ });
143
+ });
144
+ this.tileListOptions = {
145
+ actionContext: ACTION_CONTEXT,
146
+ configTypes: Object.values(APP_SCHEMA.types),
147
+ configFlavors: [...this.shellService.getObjectFlavors(), ...APP_SCHEMA.flavors.filter((f) => !f.applicableTo).map((f) => ({ ...f, app: APP_ID }))]
148
+ };
149
+ this.query = this.drive.state$.query;
150
+ this.queryTitle = this.drive.state$.queryTitle;
151
+ this.icons = {
152
+ ...APP_DRIVE_ICONS,
153
+ sort: APP_DRIVE_ICONS.sort,
154
+ back: YUV_ICONS.back,
155
+ attention: YUV_ICONS.attention,
156
+ refresh: YUV_ICONS.refresh,
157
+ clear: ICONS.clear
158
+ };
159
+ this.drive.events$.pipe(takeUntilDestroyed()).subscribe({
160
+ next: (e) => {
161
+ if (e === DRIVE_EVENT.refresh) {
162
+ this.refresh();
163
+ }
164
+ }
165
+ });
166
+ this.#device.screenChange$.pipe(takeUntilDestroyed()).subscribe({
167
+ next: (s) => {
168
+ this.smallScreenLayout.set(s.size === 's' && s.orientation === 'portrait');
169
+ this.enableDetails.set(!this.smallScreenLayout());
170
+ }
171
+ });
172
+ toObservable(this.drive.state$.selection)
173
+ .pipe(takeUntilDestroyed())
174
+ .subscribe({
175
+ next: (sel) => {
176
+ if (sel?.length === 0) {
177
+ this.tileList()?.clearSelection(true);
178
+ this.selected.set(undefined);
179
+ }
180
+ }
181
+ });
182
+ this.route.queryParamMap.pipe(takeUntilDestroyed()).subscribe({
183
+ next: (p) => {
184
+ this.sortOptionsAvailable.set(true);
185
+ if (this.route.snapshot.params['id'] === DRIVE_QUERY_FOLDER_ID) {
186
+ const q = p.get('q');
187
+ this.disableCreate = true;
188
+ // check if the query is a stored query
189
+ if (q?.startsWith(STORED_QUERY_ID_PREFIX)) {
190
+ const sq = this.storedQueryService.getStoredQuery(q);
191
+ if (sq) {
192
+ this.drive.updateQuery(sq.query, sq.label);
193
+ this.sortOptionsAvailable.set(false);
194
+ return;
195
+ }
196
+ }
197
+ else if (q) {
198
+ this.sortOptionsAvailable.set(true);
199
+ try {
200
+ const sq = JSON.parse(decodeURIComponent(q));
201
+ sq.filters = (sq.filters || []).filter((f) => f.f !== BaseObjectTypeField.PARENT_ID);
202
+ this.drive.updateQuery(sq, this.translate.instant('yuv.app.drive.files.search.result.title'));
203
+ return;
204
+ }
205
+ catch (e) {
206
+ console.error('Error parsing query', e);
207
+ }
208
+ }
209
+ }
210
+ }
211
+ });
212
+ this.#eventService
213
+ .on(YuvEventType.DMS_OBJECT_UPDATED)
214
+ .pipe(takeUntilDestroyed(), tap((e) => {
215
+ this.tileList()?.updateTileList([e.data]);
216
+ e.data.id === this.selected()?.id && this.selected.set(e.data);
217
+ }))
218
+ .subscribe();
219
+ }
220
+ onFilterQueryChange(q) {
221
+ this.drive.updateQuery(q, this.translate.instant('yuv.app.drive.files.search.result.title'));
222
+ this.drive.setSelection([]);
223
+ }
224
+ #processLoadError(e) {
225
+ if (`${e.status}` !== this.ERROR_CODE.NOT_FOUND) {
226
+ this.error.set(`${e.status}-${e.error?.serviceErrorCode || ''}`);
227
+ }
228
+ else
229
+ this.error.set(this.ERROR_CODE.NOT_FOUND);
230
+ }
231
+ #getTitle(o) {
232
+ const cfgType = o.isFolder ? this.configTypeOptions['folder'] : this.configTypeOptions['file'];
233
+ const oc = this.#objectConfigService.getResolvedObjectConfig(o.data, cfgType.type, cfgType.bucket, true);
234
+ return oc.title.value;
235
+ }
236
+ onDelete() {
237
+ const deleteAction = this.actions().find((a) => a.id === BASE_ACTION.delete);
238
+ if (deleteAction)
239
+ deleteAction.run(this.drive.state$.selection());
240
+ }
241
+ _setFolderQuery(queryTitle) {
242
+ this.drive.updateQuery({
243
+ filters: [{ f: BaseObjectTypeField.PARENT_ID, o: Operator.EQUAL, v1: this.currentFolderID || null }]
244
+ }, queryTitle);
245
+ }
246
+ onContextmenu({ event }) {
247
+ event.preventDefault();
248
+ this.actionsService.openContextMenu(this.actions, (a) => a.run(this.selection()), { x: event.x, y: event.y });
249
+ }
250
+ onFileDrop(files) {
251
+ this.drive.setBusy(true);
252
+ this.drive.checkNamesAndUpload(files).subscribe({ complete: () => this.drive.setBusy(false) });
253
+ }
254
+ onFileUpdateDrop(file) {
255
+ const dmsObject = this.selected();
256
+ if (dmsObject) {
257
+ this.drive.setBusy(true);
258
+ this.drive
259
+ .uploadContent(dmsObject.id, file[0])
260
+ .pipe(finalize(() => this.drive.setBusy(false)))
261
+ .subscribe();
262
+ }
263
+ }
264
+ itemFocused(tile) {
265
+ // console.log(tile);
266
+ }
267
+ itemClicked(tile) {
268
+ if (this.smallScreenLayout())
269
+ this.itemDoubleClicked(tile);
270
+ }
271
+ onCopy(tiles) {
272
+ this.clipboard.addObjects(tiles.map((t) => t.dmsObject), 'copy', APP_ID);
273
+ }
274
+ onCut(tiles) {
275
+ this.clipboard.addObjects(tiles.map((t) => t.dmsObject), 'cut', APP_ID);
276
+ }
277
+ onQuerySubmit(q) {
278
+ // in order to keep the query in the url as short as
279
+ // possible we'll get rid of the fields because they could be
280
+ // re-applied later on
281
+ q.fields = undefined;
282
+ this.router.navigate(['..', 'query'], {
283
+ queryParams: { q: encodeURIComponent(JSON.stringify(q)) },
284
+ relativeTo: this.route
285
+ });
286
+ }
287
+ selectionChanged(tiles) {
288
+ if (tiles.length === 1)
289
+ this.loadDetails(tiles[0].id);
290
+ else {
291
+ this.selected.set(undefined);
292
+ if (tiles.length === 0) {
293
+ this.drive.setSelection([]);
294
+ }
295
+ else {
296
+ this.drive.setBusy(true);
297
+ this.dmsService.getDmsObjects(tiles.map((i) => i.id)).subscribe({
298
+ next: (o) => {
299
+ this.drive.setBusy(false);
300
+ this.drive.setSelection(o);
301
+ }
302
+ });
303
+ }
304
+ }
305
+ }
306
+ itemDoubleClicked(tile) {
307
+ if (tile.instanceData) {
308
+ this.drive.setBusy(true);
309
+ const nav = tile.instanceData[BaseObjectTypeField.BASE_TYPE_ID] === SystemType.FOLDER ? ['..'] : ['../..', 'object'];
310
+ this.router.navigate([...nav, tile.instanceData[BaseObjectTypeField.OBJECT_ID]], { relativeTo: this.route }).then(() => this.drive.setBusy(false));
311
+ }
312
+ }
313
+ loadDetails(id) {
314
+ this.shellService.addBusy();
315
+ // load the dms object
316
+ this.dmsService.getDmsObject(id).subscribe({
317
+ next: (o) => {
318
+ this.selected.set(o);
319
+ this.shellService.removeBusy();
320
+ this.drive.setSelection([o]);
321
+ }
322
+ });
323
+ }
324
+ clearSelection() {
325
+ this.drive.setSelection([]);
326
+ }
327
+ openParent() {
328
+ if (this.currentFolder) {
329
+ this.drive.setBusy(true);
330
+ this.router
331
+ .navigate(['..', this.currentFolder.data[BaseObjectTypeField.PARENT_ID] || DRIVE_ROOT_FOLDER_ID], {
332
+ relativeTo: this.route,
333
+ replaceUrl: true
334
+ })
335
+ .then(() => this.drive.setBusy(false));
336
+ }
337
+ }
338
+ setBusy(busy) {
339
+ this.drive.setBusy(busy);
340
+ }
341
+ refresh() {
342
+ this.tileList()?.refresh();
343
+ this.drive.setSelection([]);
344
+ }
345
+ onLayoutSettingsChange(e) {
346
+ this.#appCache.setItem(this.#LAYOUT_SETTINGS_STORAGE_KEY, e).subscribe();
347
+ }
348
+ #applyLayoutSettings(settings) {
349
+ this.splitViewCmp().applyLayoutSettings(settings);
350
+ }
351
+ ngAfterViewInit() {
352
+ this.#appCache.getItem(this.#LAYOUT_SETTINGS_STORAGE_KEY).subscribe({
353
+ next: (ls) => {
354
+ if (ls) {
355
+ this.enableDetails.set(ls.areas[2]?.visible);
356
+ this.enableTree.set(ls.areas[0]?.visible);
357
+ this.#applyLayoutSettings(ls);
358
+ }
359
+ }
360
+ });
361
+ }
362
+ ngOnDestroy() {
363
+ this.clipboard.clear(APP_ID);
364
+ }
365
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilesPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
366
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FilesPageComponent, isStandalone: true, selector: "ymd-files", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.smallScreen": "smallScreenLayout()", "class.searchFocused": "this.searchFocused" } }, viewQueries: [{ propertyName: "tileList", first: true, predicate: ["tileList"], descendants: true, isSignal: true }, { propertyName: "splitViewCmp", first: true, predicate: SplitViewComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<header>\n <!-- navigation bar -->\n <nav [attr.aria-label]=\"'yuv.app.drive.files.naviagtion.aria.label' | translate\">\n <div class=\"nav\">\n <button class=\"back\" [disabled]=\"!currentFolder\" title=\"{{ 'yuv.app.drive.files.nav.back.tooltip' | translate }}\" (click)=\"openParent()\">\n <yvc-icon [svg]=\"icons.back\"></yvc-icon>\n </button>\n <button class=\"refresh\" title=\"{{ 'yuv.app.drive.files.nav.refresh.tooltip' | translate }}\" (click)=\"refresh()\">\n <yvc-icon [svg]=\"icons.refresh\"></yvc-icon>\n </button>\n </div>\n\n @if (!query()?.term) {\n <ymd-breadcrumb></ymd-breadcrumb>\n } @else {\n <div class=\"breadcrumb\"></div>\n }\n <div class=\"search\">\n <yuv-simple-search [query]=\"query()\" (querySubmit)=\"onQuerySubmit($event)\"></yuv-simple-search>\n <!-- TODO: enable again once drive search needs to be a little bit more sophisticated -->\n <!-- <ymd-drive-search (focused)=\"searchFocused = $event\"></ymd-drive-search> -->\n </div>\n </nav>\n\n <!-- ribbon with actions and options -->\n <ymd-ribbon [objects]=\"selection()\" [busy]=\"busy()\" [enableClipboard]=\"true\">\n <ng-template #primaryActions>\n <ymd-add-button [disabled]=\"disableCreate\"></ymd-add-button>\n </ng-template>\n\n <ng-template #secondaryActions>\n <div class=\"options\">\n @if (!smallScreenLayout()) {\n <button\n class=\"toggle-tree toggle\"\n [ngClass]=\"{ enabled: enableTree() }\"\n title=\"{{ 'yuv.app.drive.files.toggletree.tooltip' | translate }}\"\n (click)=\"enableTree.set(!enableTree())\"\n >\n <yvc-icon [svg]=\"icons.toggleLeft\"></yvc-icon>\n </button>\n <button\n class=\"toggle-details toggle\"\n [ngClass]=\"{ enabled: enableDetails() }\"\n title=\"{{ 'yuv.app.drive.files.toggledetails.tooltip' | translate }}\"\n (click)=\"enableDetails.set(!enableDetails())\"\n >\n <yvc-icon [svg]=\"icons.toggleRight\"></yvc-icon>\n </button>\n }\n <yuv-tile-config-trigger\n [icon]=\"icons.settings\"\n [bucket]=\"objectConfigBucket\"\n [bucketLabel]=\"tileConfigBucketLabel\"\n [options]=\"tileListOptions\"\n ></yuv-tile-config-trigger>\n </div>\n </ng-template>\n </ymd-ribbon>\n</header>\n\n<yvc-split-view [gutterSize]=\"1\" (layoutSettingsChange)=\"onLayoutSettingsChange($event)\">\n <!-- folder tree -->\n <ng-template yvcSplitArea [size]=\"20\" [visible]=\"enableTree() && !smallScreenLayout()\">\n <ymd-folder-tree yuvFocusable=\"Tree\"></ymd-folder-tree>\n </ng-template>\n\n <!-- files -->\n <ng-template yvcSplitArea [size]=\"60\">\n @let err = error();\n @if (err) {\n <div class=\"error\">\n <p>\n <yvc-icon [svg]=\"icons.attention\"></yvc-icon>\n @switch (err) {\n @case (ERROR_CODE.NOT_FOUND) {\n {{ 'yuv.app.drive.files.error.load.not-found' | translate }}\n }\n @case (ERROR_CODE.INVALID_ID) {\n {{ 'yuv.app.drive.files.error.load.invalid-id' | translate }}\n }\n @default {\n {{ 'yuv.app.drive.files.error.load' | translate }}\n }\n }\n </p>\n </div>\n } @else {\n <div class=\"files\" [yuvFileDropZone]=\"{ label: 'yuv.app.drive.files.dropzone.label' | translate }\" (fileDrop)=\"onFileDrop($event)\">\n <header class=\"files-header\">\n <h1>{{ queryTitle() }}</h1>\n @if (query()?.term) {\n <ymd-search-filter [query]=\"query()\" (queryChange)=\"onFilterQueryChange($event)\"></ymd-search-filter>\n }\n @if (sortOptionsAvailable()) {\n <ymd-sort />\n }\n <div class=\"flavors\">\n <!-- TODO: enable again once flavors/aspects are supported -->\n <!-- @for (f of flavorChips; track f.id) {\n <yuv-flavor-chip [ngClass]=\"{ active: f.id === appliedFlavor?.id }\" [flavor]=\"f\" (click)=\"appliedFlavor = f\"></yuv-flavor-chip>\n }-->\n </div>\n </header>\n\n <yuv-tile-list\n #tileList\n class=\"staggered\"\n [attr.aria-label]=\"'yuv.app.drive.files.content.aria.label' | translate\"\n [attr.aria-busy]=\"busy()\"\n [attr.role]=\"'listbox'\"\n (keydown.delete)=\"onDelete()\"\n [bucket]=\"objectConfigBucket\"\n [multiselect]=\"true\"\n [query]=\"query()\"\n [flavor]=\"appliedFlavor\"\n [options]=\"tileListOptions\"\n (itemDblClick)=\"itemDoubleClicked($event)\"\n (itemSelect)=\"itemClicked($event)\"\n (selectionChange)=\"selectionChanged($event)\"\n (copy)=\"onCopy($event)\"\n (cut)=\"onCut($event)\"\n (busy)=\"setBusy($event)\"\n (ctxMenu)=\"onContextmenu($event)\"\n [highlights]=\"highlightStyles$ | async\"\n >\n <div #empty>\n @if (emptyMode() === 'root') {\n <p class=\"empty\">{{ 'yuv.app.drive.files.content.empty.root.list' | translate }}</p>\n } @else if (emptyMode() === 'query') {\n <p class=\"empty\">{{ 'yuv.app.drive.files.content.empty.query.list' | translate }}</p>\n } @else {\n <p class=\"empty\">{{ 'yuv.app.drive.files.content.empty.list' | translate }}</p>\n }\n </div>\n </yuv-tile-list>\n </div>\n }\n </ng-template>\n\n <!-- details -->\n <ng-template yvcSplitArea [size]=\"20\" [visible]=\"enableDetails()\">\n @let selectedItem = selected();\n @if (enableDetails() && selectedItem) {\n @if (selectedItem?.isFolder) {\n <yuv-object-summary [configType]=\"configTypeOptions['folder']\" [dmsObject]=\"selectedItem\"></yuv-object-summary>\n } @else {\n <yuv-object-summary\n [configType]=\"configTypeOptions['file']\"\n [dmsObject]=\"selectedItem\"\n [yuvFileDropZone]=\"{ label: 'yuv.app.drive.files.dropzone.content.replace.label' | translate }\"\n [fileDropDisabled]=\"fileDropSummaryDisabled()\"\n (fileDrop)=\"onFileUpdateDrop($event)\"\n ></yuv-object-summary>\n }\n } @else {\n @let sel = selection();\n @if (sel && sel.length > 0) {\n <yuv-multi-object-summary [headline]=\"'yuv.app.drive.multiselected.details' | translate: { count: selection().length }\"></yuv-multi-object-summary>\n } @else if (tileList()?.items?.length === 0) {\n <!-- TODO: CHOULD HAVE A DIFFERENT MESSAGE FOR EMPTY RESULTS EMPTY FOR NOW -->\n <div class=\"message\">{{ 'yuv.app.drive.empty.results.details.message' | translate }}</div>\n } @else {\n <div class=\"message\">{{ 'yuv.app.drive.unselected.details' | translate }}</div>\n }\n }\n </ng-template>\n</yvc-split-view>\n", styles: [":host{--files-button-padding: calc(var(--app-pane-padding) / 4);--files-button-border-radius: 2px;--files-button-gap: calc(var(--app-pane-padding) / 4);--files-icon-size: 20px;height:100%;overflow:hidden;display:flex;flex-flow:column}:host.searchFocused header>nav .search{grid-column:-1/-3}:host header{flex:0 0 auto}:host header>nav{background-color:var(--app-drive-header-background);border-block-end:1px solid var(--panel-divider-color);display:grid;grid-template-columns:auto 1fr 1fr auto;align-items:center;gap:calc(var(--app-pane-padding) / 2);padding:calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 2)}:host header>nav .nav{grid-column:1/2;grid-row:1;display:flex;align-items:center;gap:var(--files-button-gap)}:host header>nav .nav button{padding:var(--files-button-padding);border-radius:var(--files-button-border-radius)}:host header>nav .nav button yvc-icon{--icon-size: var(--files-icon-size)}:host header>nav .breadcrumb{grid-column:2/4;grid-row:1;align-self:stretch;display:flex;align-items:center;border-radius:var(--files-button-border-radius);padding:0 .5em;border:1px solid var(--panel-divider-color)}:host header>nav .search{grid-column:-1/-2;grid-row:1;z-index:1}:host yvc-split-view{flex:1;animation:fade-in .3s ease-in-out}:host ymd-ribbon{--ribbon-button-padding: var(--files-button-padding);--ribbon-button-border-radius: var(--files-button-border-radius);--ribbon-button-gap: var(--files-button-gap);--ribbon-icon-size: var(--files-icon-size)}:host ymd-ribbon .options{grid-area:options;display:flex;gap:var(--files-button-gap);align-items:center}:host ymd-ribbon .options yuv-tile-config-trigger{--icon-size: var(--files-icon-size);--button-padding: var(--files-button-padding)}:host ymd-ribbon .options button{padding:var(--files-button-padding);border-radius:var(--files-button-border-radius)}:host ymd-ribbon .options button yvc-icon{--icon-size: var(--files-icon-size)}:host ymd-ribbon .options button.toggle.enabled{background-color:var(--item-focus-background-color)}:host main{height:100%;overflow:hidden;display:flex;flex-flow:column}:host main yvc-master-details{flex:1;overflow:hidden;box-sizing:border-box}:host .error{display:grid;justify-items:center;align-items:center;height:100%;padding:0 2rem;text-align:center;color:var(--text-color-caption)}:host .error p{max-width:31ch;line-height:1.5em;display:grid;justify-items:center}:host .error p yvc-icon{--icon-size: 48px;display:block;margin-block-end:1rem}:host .files{display:flex;flex-flow:column;overflow:hidden;height:100%}:host .files header{flex:0 0 auto;padding:var(--app-pane-padding);display:grid;grid-template-columns:2fr max-content;grid-template-rows:auto auto 1fr;gap:0;grid-auto-flow:row;grid-template-areas:\"title sort\" \"searchfilter searchfilter\" \"flavours flavours\"}:host .files header h1{grid-area:title;margin:0;padding:0;font-size:var(--font-title);font-weight:400;text-overflow:ellipsis;overflow:hidden}:host .files header .flavors{grid-area:flavors;display:flex;gap:2px;justify-content:flex-end;padding:calc(var(--app-pane-padding) / 4)}:host .files header .flavors yuv-flavor-chip{font-size:var(--font-hint);cursor:pointer;--flavor-background: var(--panel-background);--flavor-icon-size: 16px}:host .files header .flavors yuv-flavor-chip:hover{--flavor-border-color: var(--color-accent)}:host .files header ymd-sort{grid-area:sort}:host .files header ymd-search-filter{grid-area:searchfilter}:host .files yuv-tile-list{flex:1;overflow:hidden}:host .message{display:grid;justify-items:center;align-items:center;height:100%;padding:0 2rem;text-align:center;color:var(--text-color-caption)}:host .message p{max-width:31ch;line-height:1.5em}:host yvc-split-view{height:100%;box-sizing:border-box}:host ymd-folder-tree,:host yuv-object-summary{height:100%;overflow-y:auto;box-sizing:border-box}:host yuv-tile-list{--tile-border: 1px solid var(--panel-divider-color);--tile-border-width: 0 0 1px 0;--tile-padding: calc(var(--app-pane-padding) / 2);--tile-icon-size: 18px;--tile-action-icon-size: 18px;--paging-background: var(--panel-background-lightgrey)}:host p.empty{color:var(--text-color-caption)}:host .details{height:100%}:host .details yuv-object-details{height:100%}:host.smallScreen yuv-tile-list{--tile-padding: var(--app-pane-padding) !important}@keyframes fade-in{0%{opacity:0}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: YvcIconModule }, { kind: "component", type: i1.Icon, selector: "yvc-icon", inputs: ["label", "svg", "svgSrc"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: YvcSplitViewModule }, { kind: "component", type: i3.SplitViewComponent, selector: "yvc-split-view", inputs: ["direction", "gutterSize", "restrictMove", "disabled", "gutterDblClickDuration", "layoutSettingsID"], outputs: ["layoutSettingsChange", "dragStart", "dragEnd", "gutterClick", "gutterDblClick"] }, { kind: "directive", type: i3.SplitAreaDirective, selector: "[yvcSplitArea]", inputs: ["size", "order", "minSize", "maxSize", "panelClass", "visible"] }, { kind: "component", type: TileListComponent, selector: "yuv-tile-list", inputs: ["bucket", "multiselect", "options", "flavor", "query", "preselect", "highlights"], outputs: ["itemSelect", "copy", "cut", "busy", "queryResult", "selectionChange", "itemDblClick", "ctxMenu"] }, { kind: "component", type: BreadcrumbComponent, selector: "ymd-breadcrumb" }, { kind: "component", type: FolderTreeComponent, selector: "ymd-folder-tree" }, { kind: "component", type: ObjectSummaryComponent, selector: "yuv-object-summary", inputs: ["actions", "dmsObject", "objectId", "configType"] }, { kind: "component", type: TileConfigTriggerComponent, selector: "yuv-tile-config-trigger", inputs: ["icon", "bucket", "bucketLabel", "options"] }, { kind: "component", type: RibbonComponent, selector: "ymd-ribbon", inputs: ["busy", "enableClipboard", "objects", "excludeActions"] }, { kind: "component", type: AddButtonComponent, selector: "ymd-add-button", inputs: ["disabled"] }, { kind: "component", type: SimpleSearchComponent, selector: "yuv-simple-search", inputs: ["targets", "query"], outputs: ["querySubmit", "targetSelectionChanged", "queryChange", "typeAggregation"] }, { kind: "component", type: MultiObjectSummaryComponent, selector: "yuv-multi-object-summary", inputs: ["headline"] }, { kind: "component", type: SortComponent, selector: "ymd-sort", outputs: ["sortChanged"] }, { kind: "component", type: SearchFilterComponent, selector: "ymd-search-filter", inputs: ["query"], outputs: ["queryChange"] }, { kind: "directive", type: FileDropZoneDirective, selector: "[yuvFileDropZone]", inputs: ["yuvFileDropZone", "fileDropDisabled"], outputs: ["fileDrop", "fileDropOver"] }] }); }
367
+ }
368
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilesPageComponent, decorators: [{
369
+ type: Component,
370
+ args: [{ selector: 'ymd-files', standalone: true, imports: [NgClass, AsyncPipe, ...module, ...components, FileDropZoneDirective], host: {
371
+ '[class.smallScreen]': 'smallScreenLayout()'
372
+ }, template: "<header>\n <!-- navigation bar -->\n <nav [attr.aria-label]=\"'yuv.app.drive.files.naviagtion.aria.label' | translate\">\n <div class=\"nav\">\n <button class=\"back\" [disabled]=\"!currentFolder\" title=\"{{ 'yuv.app.drive.files.nav.back.tooltip' | translate }}\" (click)=\"openParent()\">\n <yvc-icon [svg]=\"icons.back\"></yvc-icon>\n </button>\n <button class=\"refresh\" title=\"{{ 'yuv.app.drive.files.nav.refresh.tooltip' | translate }}\" (click)=\"refresh()\">\n <yvc-icon [svg]=\"icons.refresh\"></yvc-icon>\n </button>\n </div>\n\n @if (!query()?.term) {\n <ymd-breadcrumb></ymd-breadcrumb>\n } @else {\n <div class=\"breadcrumb\"></div>\n }\n <div class=\"search\">\n <yuv-simple-search [query]=\"query()\" (querySubmit)=\"onQuerySubmit($event)\"></yuv-simple-search>\n <!-- TODO: enable again once drive search needs to be a little bit more sophisticated -->\n <!-- <ymd-drive-search (focused)=\"searchFocused = $event\"></ymd-drive-search> -->\n </div>\n </nav>\n\n <!-- ribbon with actions and options -->\n <ymd-ribbon [objects]=\"selection()\" [busy]=\"busy()\" [enableClipboard]=\"true\">\n <ng-template #primaryActions>\n <ymd-add-button [disabled]=\"disableCreate\"></ymd-add-button>\n </ng-template>\n\n <ng-template #secondaryActions>\n <div class=\"options\">\n @if (!smallScreenLayout()) {\n <button\n class=\"toggle-tree toggle\"\n [ngClass]=\"{ enabled: enableTree() }\"\n title=\"{{ 'yuv.app.drive.files.toggletree.tooltip' | translate }}\"\n (click)=\"enableTree.set(!enableTree())\"\n >\n <yvc-icon [svg]=\"icons.toggleLeft\"></yvc-icon>\n </button>\n <button\n class=\"toggle-details toggle\"\n [ngClass]=\"{ enabled: enableDetails() }\"\n title=\"{{ 'yuv.app.drive.files.toggledetails.tooltip' | translate }}\"\n (click)=\"enableDetails.set(!enableDetails())\"\n >\n <yvc-icon [svg]=\"icons.toggleRight\"></yvc-icon>\n </button>\n }\n <yuv-tile-config-trigger\n [icon]=\"icons.settings\"\n [bucket]=\"objectConfigBucket\"\n [bucketLabel]=\"tileConfigBucketLabel\"\n [options]=\"tileListOptions\"\n ></yuv-tile-config-trigger>\n </div>\n </ng-template>\n </ymd-ribbon>\n</header>\n\n<yvc-split-view [gutterSize]=\"1\" (layoutSettingsChange)=\"onLayoutSettingsChange($event)\">\n <!-- folder tree -->\n <ng-template yvcSplitArea [size]=\"20\" [visible]=\"enableTree() && !smallScreenLayout()\">\n <ymd-folder-tree yuvFocusable=\"Tree\"></ymd-folder-tree>\n </ng-template>\n\n <!-- files -->\n <ng-template yvcSplitArea [size]=\"60\">\n @let err = error();\n @if (err) {\n <div class=\"error\">\n <p>\n <yvc-icon [svg]=\"icons.attention\"></yvc-icon>\n @switch (err) {\n @case (ERROR_CODE.NOT_FOUND) {\n {{ 'yuv.app.drive.files.error.load.not-found' | translate }}\n }\n @case (ERROR_CODE.INVALID_ID) {\n {{ 'yuv.app.drive.files.error.load.invalid-id' | translate }}\n }\n @default {\n {{ 'yuv.app.drive.files.error.load' | translate }}\n }\n }\n </p>\n </div>\n } @else {\n <div class=\"files\" [yuvFileDropZone]=\"{ label: 'yuv.app.drive.files.dropzone.label' | translate }\" (fileDrop)=\"onFileDrop($event)\">\n <header class=\"files-header\">\n <h1>{{ queryTitle() }}</h1>\n @if (query()?.term) {\n <ymd-search-filter [query]=\"query()\" (queryChange)=\"onFilterQueryChange($event)\"></ymd-search-filter>\n }\n @if (sortOptionsAvailable()) {\n <ymd-sort />\n }\n <div class=\"flavors\">\n <!-- TODO: enable again once flavors/aspects are supported -->\n <!-- @for (f of flavorChips; track f.id) {\n <yuv-flavor-chip [ngClass]=\"{ active: f.id === appliedFlavor?.id }\" [flavor]=\"f\" (click)=\"appliedFlavor = f\"></yuv-flavor-chip>\n }-->\n </div>\n </header>\n\n <yuv-tile-list\n #tileList\n class=\"staggered\"\n [attr.aria-label]=\"'yuv.app.drive.files.content.aria.label' | translate\"\n [attr.aria-busy]=\"busy()\"\n [attr.role]=\"'listbox'\"\n (keydown.delete)=\"onDelete()\"\n [bucket]=\"objectConfigBucket\"\n [multiselect]=\"true\"\n [query]=\"query()\"\n [flavor]=\"appliedFlavor\"\n [options]=\"tileListOptions\"\n (itemDblClick)=\"itemDoubleClicked($event)\"\n (itemSelect)=\"itemClicked($event)\"\n (selectionChange)=\"selectionChanged($event)\"\n (copy)=\"onCopy($event)\"\n (cut)=\"onCut($event)\"\n (busy)=\"setBusy($event)\"\n (ctxMenu)=\"onContextmenu($event)\"\n [highlights]=\"highlightStyles$ | async\"\n >\n <div #empty>\n @if (emptyMode() === 'root') {\n <p class=\"empty\">{{ 'yuv.app.drive.files.content.empty.root.list' | translate }}</p>\n } @else if (emptyMode() === 'query') {\n <p class=\"empty\">{{ 'yuv.app.drive.files.content.empty.query.list' | translate }}</p>\n } @else {\n <p class=\"empty\">{{ 'yuv.app.drive.files.content.empty.list' | translate }}</p>\n }\n </div>\n </yuv-tile-list>\n </div>\n }\n </ng-template>\n\n <!-- details -->\n <ng-template yvcSplitArea [size]=\"20\" [visible]=\"enableDetails()\">\n @let selectedItem = selected();\n @if (enableDetails() && selectedItem) {\n @if (selectedItem?.isFolder) {\n <yuv-object-summary [configType]=\"configTypeOptions['folder']\" [dmsObject]=\"selectedItem\"></yuv-object-summary>\n } @else {\n <yuv-object-summary\n [configType]=\"configTypeOptions['file']\"\n [dmsObject]=\"selectedItem\"\n [yuvFileDropZone]=\"{ label: 'yuv.app.drive.files.dropzone.content.replace.label' | translate }\"\n [fileDropDisabled]=\"fileDropSummaryDisabled()\"\n (fileDrop)=\"onFileUpdateDrop($event)\"\n ></yuv-object-summary>\n }\n } @else {\n @let sel = selection();\n @if (sel && sel.length > 0) {\n <yuv-multi-object-summary [headline]=\"'yuv.app.drive.multiselected.details' | translate: { count: selection().length }\"></yuv-multi-object-summary>\n } @else if (tileList()?.items?.length === 0) {\n <!-- TODO: CHOULD HAVE A DIFFERENT MESSAGE FOR EMPTY RESULTS EMPTY FOR NOW -->\n <div class=\"message\">{{ 'yuv.app.drive.empty.results.details.message' | translate }}</div>\n } @else {\n <div class=\"message\">{{ 'yuv.app.drive.unselected.details' | translate }}</div>\n }\n }\n </ng-template>\n</yvc-split-view>\n", styles: [":host{--files-button-padding: calc(var(--app-pane-padding) / 4);--files-button-border-radius: 2px;--files-button-gap: calc(var(--app-pane-padding) / 4);--files-icon-size: 20px;height:100%;overflow:hidden;display:flex;flex-flow:column}:host.searchFocused header>nav .search{grid-column:-1/-3}:host header{flex:0 0 auto}:host header>nav{background-color:var(--app-drive-header-background);border-block-end:1px solid var(--panel-divider-color);display:grid;grid-template-columns:auto 1fr 1fr auto;align-items:center;gap:calc(var(--app-pane-padding) / 2);padding:calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 2)}:host header>nav .nav{grid-column:1/2;grid-row:1;display:flex;align-items:center;gap:var(--files-button-gap)}:host header>nav .nav button{padding:var(--files-button-padding);border-radius:var(--files-button-border-radius)}:host header>nav .nav button yvc-icon{--icon-size: var(--files-icon-size)}:host header>nav .breadcrumb{grid-column:2/4;grid-row:1;align-self:stretch;display:flex;align-items:center;border-radius:var(--files-button-border-radius);padding:0 .5em;border:1px solid var(--panel-divider-color)}:host header>nav .search{grid-column:-1/-2;grid-row:1;z-index:1}:host yvc-split-view{flex:1;animation:fade-in .3s ease-in-out}:host ymd-ribbon{--ribbon-button-padding: var(--files-button-padding);--ribbon-button-border-radius: var(--files-button-border-radius);--ribbon-button-gap: var(--files-button-gap);--ribbon-icon-size: var(--files-icon-size)}:host ymd-ribbon .options{grid-area:options;display:flex;gap:var(--files-button-gap);align-items:center}:host ymd-ribbon .options yuv-tile-config-trigger{--icon-size: var(--files-icon-size);--button-padding: var(--files-button-padding)}:host ymd-ribbon .options button{padding:var(--files-button-padding);border-radius:var(--files-button-border-radius)}:host ymd-ribbon .options button yvc-icon{--icon-size: var(--files-icon-size)}:host ymd-ribbon .options button.toggle.enabled{background-color:var(--item-focus-background-color)}:host main{height:100%;overflow:hidden;display:flex;flex-flow:column}:host main yvc-master-details{flex:1;overflow:hidden;box-sizing:border-box}:host .error{display:grid;justify-items:center;align-items:center;height:100%;padding:0 2rem;text-align:center;color:var(--text-color-caption)}:host .error p{max-width:31ch;line-height:1.5em;display:grid;justify-items:center}:host .error p yvc-icon{--icon-size: 48px;display:block;margin-block-end:1rem}:host .files{display:flex;flex-flow:column;overflow:hidden;height:100%}:host .files header{flex:0 0 auto;padding:var(--app-pane-padding);display:grid;grid-template-columns:2fr max-content;grid-template-rows:auto auto 1fr;gap:0;grid-auto-flow:row;grid-template-areas:\"title sort\" \"searchfilter searchfilter\" \"flavours flavours\"}:host .files header h1{grid-area:title;margin:0;padding:0;font-size:var(--font-title);font-weight:400;text-overflow:ellipsis;overflow:hidden}:host .files header .flavors{grid-area:flavors;display:flex;gap:2px;justify-content:flex-end;padding:calc(var(--app-pane-padding) / 4)}:host .files header .flavors yuv-flavor-chip{font-size:var(--font-hint);cursor:pointer;--flavor-background: var(--panel-background);--flavor-icon-size: 16px}:host .files header .flavors yuv-flavor-chip:hover{--flavor-border-color: var(--color-accent)}:host .files header ymd-sort{grid-area:sort}:host .files header ymd-search-filter{grid-area:searchfilter}:host .files yuv-tile-list{flex:1;overflow:hidden}:host .message{display:grid;justify-items:center;align-items:center;height:100%;padding:0 2rem;text-align:center;color:var(--text-color-caption)}:host .message p{max-width:31ch;line-height:1.5em}:host yvc-split-view{height:100%;box-sizing:border-box}:host ymd-folder-tree,:host yuv-object-summary{height:100%;overflow-y:auto;box-sizing:border-box}:host yuv-tile-list{--tile-border: 1px solid var(--panel-divider-color);--tile-border-width: 0 0 1px 0;--tile-padding: calc(var(--app-pane-padding) / 2);--tile-icon-size: 18px;--tile-action-icon-size: 18px;--paging-background: var(--panel-background-lightgrey)}:host p.empty{color:var(--text-color-caption)}:host .details{height:100%}:host .details yuv-object-details{height:100%}:host.smallScreen yuv-tile-list{--tile-padding: var(--app-pane-padding) !important}@keyframes fade-in{0%{opacity:0}}\n"] }]
373
+ }], ctorParameters: () => [], propDecorators: { searchFocused: [{
374
+ type: HostBinding,
375
+ args: ['class.searchFocused']
376
+ }] } });
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcHBzL2RyaXZlL3NyYy9saWIvcGFnZXMvZmlsZXMvZmlsZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcHBzL2RyaXZlL3NyYy9saWIvcGFnZXMvZmlsZXMvZmlsZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVyRCxPQUFPLEVBQWlCLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGNBQWMsRUFBWSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakYsT0FBTyxFQUNMLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBR2hCLGFBQWEsRUFFYixVQUFVLEVBQ1YsWUFBWSxFQUNaLG1CQUFtQixFQUNuQixRQUFRLEVBR1IsVUFBVSxFQUNWLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNiLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFVLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0QsT0FBTyxFQUFFLDJCQUEyQixFQUFFLHNCQUFzQixFQUFFLE1BQU0s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LEVBQUUscUJBQXFCO3FCQUM3Qzt3REF1RG1DLGFBQWE7c0JBQWhELFdBQVc7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBIb3N0QmluZGluZywgaW5qZWN0LCBpbnB1dCwgT25EZXN0cm95LCBTaWduYWwsIHNpZ25hbCwgdW50cmFja2VkLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFBhcmFtTWFwLCBSb3V0ZXIsIFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBBcHBDYWNoZVNlcnZpY2UsXG4gIEJhc2VPYmplY3RUeXBlRmllbGQsXG4gIENsaXBib2FyZFNlcnZpY2UsXG4gIENvbmZpZ1R5cGVPcHRpb24sXG4gIERldmljZVNjcmVlbixcbiAgRGV2aWNlU2VydmljZSxcbiAgRG1zT2JqZWN0LFxuICBEbXNTZXJ2aWNlLFxuICBFdmVudFNlcnZpY2UsXG4gIE9iamVjdENvbmZpZ1NlcnZpY2UsXG4gIE9wZXJhdG9yLFxuICBSZXNvbHZlZE9iamVjdENvbmZpZyxcbiAgU2VhcmNoUXVlcnksXG4gIFN5c3RlbVR5cGUsXG4gIFRyYW5zbGF0ZU1vZHVsZSxcbiAgVHJhbnNsYXRlU2VydmljZSxcbiAgWXV2RXZlbnRUeXBlXG59IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgQWN0aW9uLCBBY3Rpb25zU2VydmljZSwgQkFTRV9BQ1RJT04gfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvYWN0aW9ucyc7XG5pbXBvcnQgeyBGaWxlRHJvcFpvbmVEaXJlY3RpdmUgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvY29tbW9uJztcbmltcG9ydCB7IFlVVl9JQ09OUyB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWZyYW1ld29yay9pY29ucyc7XG5pbXBvcnQgeyBNdWx0aU9iamVjdFN1bW1hcnlDb21wb25lbnQsIE9iamVjdFN1bW1hcnlDb21wb25lbnQgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvb2JqZWN0LXN1bW1hcnknO1xuaW1wb3J0IHsgU2ltcGxlU2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtZnJhbWV3b3JrL3NpbXBsZS1zZWFyY2gnO1xuaW1wb3J0IHsgVGlsZUNvbmZpZ1RyaWdnZXJDb21wb25lbnQsIFRpbGVEYXRhLCBUaWxlTGlzdENvbXBvbmVudCwgVGlsZUxpc3RDb25maWdPcHRpb25zLCBUaWxlTGlzdEhpZ2hsaWdodCB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWZyYW1ld29yay90aWxlLWxpc3QnO1xuaW1wb3J0IHsgT2JqZWN0Rmxhdm9yLCBTaGVsbFNlcnZpY2UgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlJztcbmltcG9ydCB7IElDT05TLCBZdmNJY29uTW9kdWxlIH0gZnJvbSAnQHl1dXZpcy9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICdAeXV1dmlzL2NvbXBvbmVudHMvb3ZlcmZsb3ctbWVudSc7XG5pbXBvcnQgeyBTcGxpdFZpZXdDb21wb25lbnQsIFNwbGl0Vmlld0xheW91dFNldHRpbmdzLCBZdmNTcGxpdFZpZXdNb2R1bGUgfSBmcm9tICdAeXV1dmlzL2NvbXBvbmVudHMvc3BsaXQtdmlldyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgbWFwLCBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYkNvbXBvbmVudCwgU29ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgQWRkQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hZGQtYnV0dG9uL2FkZC1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEZvbGRlclRyZWVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2ZvbGRlci10cmVlL2ZvbGRlci10cmVlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSaWJib25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3JpYmJvbi9yaWJib24uY29tcG9uZW50JztcbmltcG9ydCB7IEFQUF9EUklWRV9JQ09OUyB9IGZyb20gJy4uLy4uL2RyaXZlLmljb25zJztcbmltcG9ydCB7IEFDVElPTl9DT05URVhULCBBUFBfSUQsIEFQUF9TQ0hFTUEgfSBmcm9tICcuLi8uLi9kcml2ZS5zY2hlbWEnO1xuaW1wb3J0IHsgRFJJVkVfRVZFTlQsIERSSVZFX1FVRVJZX0ZPTERFUl9JRCwgRFJJVkVfUk9PVF9GT0xERVJfSUQsIERyaXZlRm9sZGVySWQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcml2ZS9kcml2ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHJpdmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJpdmUvZHJpdmUuc2VydmljZSc7XG5pbXBvcnQgeyBTVE9SRURfUVVFUllfSURfUFJFRklYIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmVkLXF1ZXJ5L3N0b3JlZC1xdWVyeS5kYXRhJztcbmltcG9ydCB7IFN0b3JlZFF1ZXJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmVkLXF1ZXJ5L3N0b3JlZC1xdWVyeS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU3RvcmVkUXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmVkLXF1ZXJ5L3N0b3JlZC1xdWVyeS5zZXJ2aWNlJztcbmltcG9ydCB7IFNlYXJjaEZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvc2VhcmNoLWZpbHRlci9zZWFyY2gtZmlsdGVyLmNvbXBvbmVudCc7XG5cbmNvbnN0IGNvbXBvbmVudHMgPSBbXG4gIFRpbGVMaXN0Q29tcG9uZW50LFxuICBCcmVhZGNydW1iQ29tcG9uZW50LFxuICBGb2xkZXJUcmVlQ29tcG9uZW50LFxuICBPYmplY3RTdW1tYXJ5Q29tcG9uZW50LFxuICBUaWxlQ29uZmlnVHJpZ2dlckNvbXBvbmVudCxcbiAgUmliYm9uQ29tcG9uZW50LFxuICBBZGRCdXR0b25Db21wb25lbnQsXG4gIFNpbXBsZVNlYXJjaENvbXBvbmVudCxcbiAgTXVsdGlPYmplY3RTdW1tYXJ5Q29tcG9uZW50LFxuICBTb3J0Q29tcG9uZW50LFxuICBTZWFyY2hGaWx0ZXJDb21wb25lbnRcbl07XG5cbmNvbnN0IG1vZHVsZSA9IFtZdmNJY29uTW9kdWxlLCBUcmFuc2xhdGVNb2R1bGUsIFJvdXRlck1vZHVsZSwgWXZjU3BsaXRWaWV3TW9kdWxlXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneW1kLWZpbGVzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nQ2xhc3MsIEFzeW5jUGlwZSwgLi4ubW9kdWxlLCAuLi5jb21wb25lbnRzLCBGaWxlRHJvcFpvbmVEaXJlY3RpdmVdLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZmlsZXMuY29tcG9uZW50LnNjc3MnLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5zbWFsbFNjcmVlbl0nOiAnc21hbGxTY3JlZW5MYXlvdXQoKSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlc1BhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICB0aWxlTGlzdCA9IHZpZXdDaGlsZDxUaWxlTGlzdENvbXBvbmVudD4oJ3RpbGVMaXN0Jyk7XG5cbiAgI0xBWU9VVF9TRVRUSU5HU19TVE9SQUdFX0tFWSA9ICd5dXYuYXBwLmRyaXZlLmZpbGVzLmxheW91dCc7XG5cbiAgcHJpdmF0ZSBzaGVsbFNlcnZpY2UgPSBpbmplY3QoU2hlbGxTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBkbXNTZXJ2aWNlID0gaW5qZWN0KERtc1NlcnZpY2UpO1xuICBwcml2YXRlIGRyaXZlID0gaW5qZWN0KERyaXZlU2VydmljZSk7XG4gIHByaXZhdGUgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICBwcml2YXRlIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBzdG9yZWRRdWVyeVNlcnZpY2UgPSBpbmplY3QoU3RvcmVkUXVlcnlTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBjbGlwYm9hcmQgPSBpbmplY3QoQ2xpcGJvYXJkU2VydmljZSk7XG4gIHByaXZhdGUgYWN0aW9uc1NlcnZpY2UgPSBpbmplY3QoQWN0aW9uc1NlcnZpY2UpO1xuICByZWFkb25seSAjb2JqZWN0Q29uZmlnU2VydmljZSA9IGluamVjdChPYmplY3RDb25maWdTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI2RldmljZSA9IGluamVjdChEZXZpY2VTZXJ2aWNlKTtcblxuICByZWFkb25seSAjZXZlbnRTZXJ2aWNlID0gaW5qZWN0KEV2ZW50U2VydmljZSk7XG5cbiAgcmVhZG9ubHkgRVJST1JfQ09ERSA9IHtcbiAgICBOT1RfRk9VTkQ6ICc0MDQnLFxuICAgIC8vIHBhdHRlcm46IHtIVFRQX1NUQVRVU19DT0RFfS17U0VSVklDRV9FUlJPUl9DT0RFfVxuICAgIElOVkFMSURfSUQ6ICc0MjItMjkxMidcbiAgfTtcblxuICAjYXBwQ2FjaGUgPSBpbmplY3QoQXBwQ2FjaGVTZXJ2aWNlKTtcblxuICBvYmplY3RDb25maWdCdWNrZXQ6IHN0cmluZyA9IEFQUF9TQ0hFTUEuaWQ7XG5cbiAgc3BsaXRWaWV3Q21wID0gdmlld0NoaWxkLnJlcXVpcmVkKFNwbGl0Vmlld0NvbXBvbmVudCk7XG4gIHNlbGVjdGVkID0gc2lnbmFsPERtc09iamVjdCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgZmlsZURyb3BTdW1tYXJ5RGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiAhdGhpcy5zZWxlY3RlZCgpPy5wZXJtaXNzaW9ucz8ud3JpdGVDb250ZW50KTtcbiAgZGlzYWJsZUNyZWF0ZSA9IGZhbHNlO1xuXG4gIGFjdGlvbnMgPSB0aGlzLmRyaXZlLnN0YXRlJC5hY3Rpb25zO1xuICBzZWxlY3Rpb24gPSB0aGlzLmRyaXZlLnN0YXRlJC5zZWxlY3Rpb247XG5cbiAgYnVzeSA9IHRoaXMuZHJpdmUuc3RhdGUkLmJ1c3k7XG4gIGZsYXZvckNoaXBzOiBPYmplY3RGbGF2b3JbXSA9IHRoaXMuc2hlbGxTZXJ2aWNlLmdldE9iamVjdEZsYXZvcnMoKTtcbiAgYXBwbGllZEZsYXZvcj86IE9iamVjdEZsYXZvcjtcblxuICBzZWxlY3Rpb25BY3Rpb25zID0gY29tcHV0ZWQoKCkgPT4gKHsgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbigpLCBhY3Rpb25zOiB0aGlzLmFjdGlvbnMoKSB9KSk7XG5cbiAgZW1wdHlNb2RlID0gc2lnbmFsPERyaXZlRm9sZGVySWQgfCBudWxsPihudWxsKTtcbiAgLy8gZXJyb3IgY29kZSB3aGVuIGxvYWRpbmcgdGhlIG9iamVjdCBmYWlsZWQuIFRoaXMgd2lsbCBiZSB1c2VkXG4gIC8vIHRvIGRldGVybWluZSBhIHByb3BlciBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXlcbiAgZXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIGNvbmZpZ1R5cGVPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb25maWdUeXBlT3B0aW9uPiA9IHtcbiAgICBmb2xkZXI6IHsgYnVja2V0OiBBUFBfSUQsIHR5cGU6IEFQUF9TQ0hFTUEudHlwZXNbJ2ZvbGRlciddIH0sXG4gICAgZmlsZTogeyBidWNrZXQ6IEFQUF9JRCwgdHlwZTogQVBQX1NDSEVNQS50eXBlc1snZmlsZSddIH1cbiAgfTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNlYXJjaEZvY3VzZWQnKSBzZWFyY2hGb2N1c2VkID0gZmFsc2U7XG5cbiAgY3VycmVudEZvbGRlcklEPzogc3RyaW5nO1xuICBjdXJyZW50Rm9sZGVyPzogRG1zT2JqZWN0O1xuICBlbmFibGVEZXRhaWxzID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuICBlbmFibGVUcmVlID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuICB0aWxlQ29uZmlnQnVja2V0TGFiZWwgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuYXBwLmRyaXZlLnRpbGUtY29uZmlnLmJ1Y2tldCcpO1xuXG4gIHNtYWxsU2NyZWVuTGF5b3V0ID0gc2lnbmFsKGZhbHNlKTtcbiAgc29ydE9wdGlvbnNBdmFpbGFibGUgPSBzaWduYWwodHJ1ZSk7XG5cbiAgaWQgPSBpbnB1dDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBoaWdobGlnaHRTdHlsZXMkOiBPYnNlcnZhYmxlPFRpbGVMaXN0SGlnaGxpZ2h0W10+ID0gdGhpcy5jbGlwYm9hcmQuY2xpcGJvYXJkJChBUFBfSUQpLnBpcGUoXG4gICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgbWFwKChjKSA9PiB7XG4gICAgICByZXR1cm4gYyAmJiBjLm1vZGUgJiYgYy5vYmplY3RzPy5sZW5ndGhcbiAgICAgICAgPyBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNzc1N0eWxlczogdGhpcy4jaGlnaGxpZ2h0U3R5bGVzW2M/Lm1vZGVdLFxuICAgICAgICAgICAgICBpZHM6IGMub2JqZWN0cy5tYXAoKG8pID0+IG8uaWQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICA6IFtdO1xuICAgIH0pXG4gICk7XG5cbiAgcmVhZG9ubHkgI2hpZ2hsaWdodFN0eWxlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge1xuICAgIGN1dDogeyBvcGFjaXR5OiAwLjUgfVxuICB9O1xuXG4gICNyb3V0ZUlkRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBwYXJhbSA9IHRoaXMuaWQoKSB8fCB1bmRlZmluZWQ7XG5cbiAgICB1bnRyYWNrZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHBhcmFtID09PSBEUklWRV9RVUVSWV9GT0xERVJfSUQpIHtcbiAgICAgICAgdGhpcy5lbXB0eU1vZGUuc2V0KERSSVZFX1FVRVJZX0ZPTERFUl9JRCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbXB0eU1vZGUuc2V0KHBhcmFtID09PSBEUklWRV9ST09UX0ZPTERFUl9JRCA/IERSSVZFX1JPT1RfRk9MREVSX0lEIDogbnVsbCk7XG4gICAgICB0aGlzLmVycm9yLnNldCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5kaXNhYmxlQ3JlYXRlID0gZmFsc2U7XG4gICAgICB0aGlzLmN1cnJlbnRGb2xkZXJJRCA9IHBhcmFtO1xuICAgICAgdGhpcy5kcml2ZS51cGRhdGVDdXJyZW50Rm9sZGVyKHRoaXMuY3VycmVudEZvbGRlcklEKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQuc2V0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLmN1cnJlbnRGb2xkZXIgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5jdXJyZW50Rm9sZGVySUQgPT09IERSSVZFX1JPT1RfRk9MREVSX0lEKSB0aGlzLmN1cnJlbnRGb2xkZXJJRCA9IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHRoaXMuY3VycmVudEZvbGRlcklEKSB7XG4gICAgICAgIHRoaXMuZG1zU2VydmljZS5nZXREbXNPYmplY3QodGhpcy5jdXJyZW50Rm9sZGVySUQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKG86IERtc09iamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9sZGVyID0gbztcbiAgICAgICAgICAgIHRoaXMuX3NldEZvbGRlclF1ZXJ5KHRoaXMuI2dldFRpdGxlKG8pKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0dGluZyBmb2xkZXInLCBlKTtcbiAgICAgICAgICAgIHRoaXMuI3Byb2Nlc3NMb2FkRXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB0aGlzLl9zZXRGb2xkZXJRdWVyeSh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuYXBwLmRyaXZlLmZvbGRlci10cmVlLm15ZHJpdmUnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRpbGVMaXN0T3B0aW9uczogVGlsZUxpc3RDb25maWdPcHRpb25zID0ge1xuICAgIGFjdGlvbkNvbnRleHQ6IEFDVElPTl9DT05URVhULFxuICAgIGNvbmZpZ1R5cGVzOiBPYmplY3QudmFsdWVzKEFQUF9TQ0hFTUEudHlwZXMpLFxuICAgIGNvbmZpZ0ZsYXZvcnM6IFsuLi50aGlzLnNoZWxsU2VydmljZS5nZXRPYmplY3RGbGF2b3JzKCksIC4uLkFQUF9TQ0hFTUEuZmxhdm9ycy5maWx0ZXIoKGYpID0+ICFmLmFwcGxpY2FibGVUbykubWFwKChmKSA9PiAoeyAuLi5mLCBhcHA6IEFQUF9JRCB9KSldXG4gIH07XG5cbiAgcXVlcnkgPSB0aGlzLmRyaXZlLnN0YXRlJC5xdWVyeTtcbiAgcXVlcnlUaXRsZSA9IHRoaXMuZHJpdmUuc3RhdGUkLnF1ZXJ5VGl0bGU7XG5cbiAgaWNvbnMgPSB7XG4gICAgLi4uQVBQX0RSSVZFX0lDT05TLFxuICAgIHNvcnQ6IEFQUF9EUklWRV9JQ09OUy5zb3J0LFxuICAgIGJhY2s6IFlVVl9JQ09OUy5iYWNrLFxuICAgIGF0dGVudGlvbjogWVVWX0lDT05TLmF0dGVudGlvbixcbiAgICByZWZyZXNoOiBZVVZfSUNPTlMucmVmcmVzaCxcbiAgICBjbGVhcjogSUNPTlMuY2xlYXJcbiAgfTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmRyaXZlLmV2ZW50cyQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChlKSA9PiB7XG4gICAgICAgIGlmIChlID09PSBEUklWRV9FVkVOVC5yZWZyZXNoKSB7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuI2RldmljZS5zY3JlZW5DaGFuZ2UkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoczogRGV2aWNlU2NyZWVuKSA9PiB7XG4gICAgICAgIHRoaXMuc21hbGxTY3JlZW5MYXlvdXQuc2V0KHMuc2l6ZSA9PT0gJ3MnICYmIHMub3JpZW50YXRpb24gPT09ICdwb3J0cmFpdCcpO1xuICAgICAgICB0aGlzLmVuYWJsZURldGFpbHMuc2V0KCF0aGlzLnNtYWxsU2NyZWVuTGF5b3V0KCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdG9PYnNlcnZhYmxlKHRoaXMuZHJpdmUuc3RhdGUkLnNlbGVjdGlvbilcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChzZWw6IERtc09iamVjdFtdKSA9PiB7XG4gICAgICAgICAgaWYgKHNlbD8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVMaXN0KCk/LmNsZWFyU2VsZWN0aW9uKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5zZXQodW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtTWFwLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocDogUGFyYW1NYXApID0+IHtcbiAgICAgICAgdGhpcy5zb3J0T3B0aW9uc0F2YWlsYWJsZS5zZXQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snaWQnXSA9PT0gRFJJVkVfUVVFUllfRk9MREVSX0lEKSB7XG4gICAgICAgICAgY29uc3QgcSA9IHAuZ2V0KCdxJyk7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlQ3JlYXRlID0gdHJ1ZTtcbiAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgcXVlcnkgaXMgYSBzdG9yZWQgcXVlcnlcbiAgICAgICAgICBpZiAocT8uc3RhcnRzV2l0aChTVE9SRURfUVVFUllfSURfUFJFRklYKSkge1xuICAgICAgICAgICAgY29uc3Qgc3E6IFN0b3JlZFF1ZXJ5IHwgdW5kZWZpbmVkID0gdGhpcy5zdG9yZWRRdWVyeVNlcnZpY2UuZ2V0U3RvcmVkUXVlcnkocSk7XG4gICAgICAgICAgICBpZiAoc3EpIHtcbiAgICAgICAgICAgICAgdGhpcy5kcml2ZS51cGRhdGVRdWVyeShzcS5xdWVyeSwgc3EubGFiZWwpO1xuICAgICAgICAgICAgICB0aGlzLnNvcnRPcHRpb25zQXZhaWxhYmxlLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHEpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydE9wdGlvbnNBdmFpbGFibGUuc2V0KHRydWUpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3E6IFNlYXJjaFF1ZXJ5ID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQocSkpO1xuICAgICAgICAgICAgICBzcS5maWx0ZXJzID0gKHNxLmZpbHRlcnMgfHwgW10pLmZpbHRlcigoZikgPT4gZi5mICE9PSBCYXNlT2JqZWN0VHlwZUZpZWxkLlBBUkVOVF9JRCk7XG4gICAgICAgICAgICAgIHRoaXMuZHJpdmUudXBkYXRlUXVlcnkoc3EsIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5hcHAuZHJpdmUuZmlsZXMuc2VhcmNoLnJlc3VsdC50aXRsZScpKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHF1ZXJ5JywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLiNldmVudFNlcnZpY2VcbiAgICAgIC5vbihZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9VUERBVEVEKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICB0YXAoKGUpID0+IHtcbiAgICAgICAgICB0aGlzLnRpbGVMaXN0KCk/LnVwZGF0ZVRpbGVMaXN0KFtlLmRhdGFdKTtcbiAgICAgICAgICBlLmRhdGEuaWQgPT09IHRoaXMuc2VsZWN0ZWQoKT8uaWQgJiYgdGhpcy5zZWxlY3RlZC5zZXQoZS5kYXRhKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG9uRmlsdGVyUXVlcnlDaGFuZ2UocTogU2VhcmNoUXVlcnkpIHtcbiAgICB0aGlzLmRyaXZlLnVwZGF0ZVF1ZXJ5KHEsIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5hcHAuZHJpdmUuZmlsZXMuc2VhcmNoLnJlc3VsdC50aXRsZScpKTtcbiAgICB0aGlzLmRyaXZlLnNldFNlbGVjdGlvbihbXSk7XG4gIH1cblxuICAjcHJvY2Vzc0xvYWRFcnJvcihlOiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgIGlmIChgJHtlLnN0YXR1c31gICE9PSB0aGlzLkVSUk9SX0NPREUuTk9UX0ZPVU5EKSB7XG4gICAgICB0aGlzLmVycm9yLnNldChgJHtlLnN0YXR1c30tJHtlLmVycm9yPy5zZXJ2aWNlRXJyb3JDb2RlIHx8ICcnfWApO1xuICAgIH0gZWxzZSB0aGlzLmVycm9yLnNldCh0aGlzLkVSUk9SX0NPREUuTk9UX0ZPVU5EKTtcbiAgfVxuXG4gICNnZXRUaXRsZShvOiBEbXNPYmplY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNmZ1R5cGU6IENvbmZpZ1R5cGVPcHRpb24gPSBvLmlzRm9sZGVyID8gdGhpcy5jb25maWdUeXBlT3B0aW9uc1snZm9sZGVyJ10gOiB0aGlzLmNvbmZpZ1R5cGVPcHRpb25zWydmaWxlJ107XG4gICAgY29uc3Qgb2M6IFJlc29sdmVkT2JqZWN0Q29uZmlnID0gdGhpcy4jb2JqZWN0Q29uZmlnU2VydmljZS5nZXRSZXNvbHZlZE9iamVjdENvbmZpZyhvLmRhdGEsIGNmZ1R5cGUudHlwZSwgY2ZnVHlwZS5idWNrZXQsIHRydWUpO1xuICAgIHJldHVybiBvYy50aXRsZS52YWx1ZTtcbiAgfVxuXG4gIG9uRGVsZXRlKCkge1xuICAgIGNvbnN0IGRlbGV0ZUFjdGlvbiA9IHRoaXMuYWN0aW9ucygpLmZpbmQoKGEpID0+IGEuaWQgPT09IEJBU0VfQUNUSU9OLmRlbGV0ZSk7XG4gICAgaWYgKGRlbGV0ZUFjdGlvbikgZGVsZXRlQWN0aW9uLnJ1bih0aGlzLmRyaXZlLnN0YXRlJC5zZWxlY3Rpb24oKSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRGb2xkZXJRdWVyeShxdWVyeVRpdGxlPzogc3RyaW5nKSB7XG4gICAgdGhpcy5kcml2ZS51cGRhdGVRdWVyeShcbiAgICAgIHtcbiAgICAgICAgZmlsdGVyczogW3sgZjogQmFzZU9iamVjdFR5cGVGaWVsZC5QQVJFTlRfSUQsIG86IE9wZXJhdG9yLkVRVUFMLCB2MTogdGhpcy5jdXJyZW50Rm9sZGVySUQgfHwgbnVsbCB9XVxuICAgICAgfSxcbiAgICAgIHF1ZXJ5VGl0bGVcbiAgICApO1xuICB9XG5cbiAgb25Db250ZXh0bWVudSh7IGV2ZW50IH06IHsgZXZlbnQ6IE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQgfSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5hY3Rpb25zU2VydmljZS5vcGVuQ29udGV4dE1lbnUodGhpcy5hY3Rpb25zLCAoYTogQWN0aW9uKSA9PiBhLnJ1bih0aGlzLnNlbGVjdGlvbigpKSwgeyB4OiBldmVudC54LCB5OiBldmVudC55IH0pO1xuICB9XG5cbiAgb25GaWxlRHJvcChmaWxlczogRmlsZVtdKSB7XG4gICAgdGhpcy5kcml2ZS5zZXRCdXN5KHRydWUpO1xuICAgIHRoaXMuZHJpdmUuY2hlY2tOYW1lc0FuZFVwbG9hZChmaWxlcykuc3Vic2NyaWJlKHsgY29tcGxldGU6ICgpID0+IHRoaXMuZHJpdmUuc2V0QnVzeShmYWxzZSkgfSk7XG4gIH1cblxuICBvbkZpbGVVcGRhdGVEcm9wKGZpbGU6IEZpbGVbXSkge1xuICAgIGNvbnN0IGRtc09iamVjdCA9IHRoaXMuc2VsZWN0ZWQoKTtcbiAgICBpZiAoZG1zT2JqZWN0KSB7XG4gICAgICB0aGlzLmRyaXZlLnNldEJ1c3kodHJ1ZSk7XG4gICAgICB0aGlzLmRyaXZlXG4gICAgICAgIC51cGxvYWRDb250ZW50KGRtc09iamVjdC5pZCwgZmlsZVswXSlcbiAgICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5kcml2ZS5zZXRCdXN5KGZhbHNlKSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBpdGVtRm9jdXNlZCh0aWxlOiBUaWxlRGF0YSkge1xuICAgIC8vIGNvbnNvbGUubG9nKHRpbGUpO1xuICB9XG5cbiAgaXRlbUNsaWNrZWQodGlsZTogVGlsZURhdGEpIHtcbiAgICBpZiAodGhpcy5zbWFsbFNjcmVlbkxheW91dCgpKSB0aGlzLml0ZW1Eb3VibGVDbGlja2VkKHRpbGUpO1xuICB9XG5cbiAgb25Db3B5KHRpbGVzOiBUaWxlRGF0YVtdKSB7XG4gICAgdGhpcy5jbGlwYm9hcmQuYWRkT2JqZWN0cyhcbiAgICAgIHRpbGVzLm1hcCgodCkgPT4gdC5kbXNPYmplY3QpLFxuICAgICAgJ2NvcHknLFxuICAgICAgQVBQX0lEXG4gICAgKTtcbiAgfVxuXG4gIG9uQ3V0KHRpbGVzOiBUaWxlRGF0YVtdKSB7XG4gICAgdGhpcy5jbGlwYm9hcmQuYWRkT2JqZWN0cyhcbiAgICAgIHRpbGVzLm1hcCgodCkgPT4gdC5kbXNPYmplY3QpLFxuICAgICAgJ2N1dCcsXG4gICAgICBBUFBfSURcbiAgICApO1xuICB9XG5cbiAgb25RdWVyeVN1Ym1pdChxOiBTZWFyY2hRdWVyeSkge1xuICAgIC8vIGluIG9yZGVyIHRvIGtlZXAgdGhlIHF1ZXJ5IGluIHRoZSB1cmwgYXMgc2hvcnQgYXNcbiAgICAvLyBwb3NzaWJsZSB3ZSdsbCBnZXQgcmlkIG9mIHRoZSBmaWVsZHMgYmVjYXVzZSB0aGV5IGNvdWxkIGJlXG4gICAgLy8gcmUtYXBwbGllZCBsYXRlciBvblxuICAgIHEuZmllbGRzID0gdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLicsICdxdWVyeSddLCB7XG4gICAgICBxdWVyeVBhcmFtczogeyBxOiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkocSkpIH0sXG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlXG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3Rpb25DaGFuZ2VkKHRpbGVzOiBUaWxlRGF0YVtdKSB7XG4gICAgaWYgKHRpbGVzLmxlbmd0aCA9PT0gMSkgdGhpcy5sb2FkRGV0YWlscyh0aWxlc1swXS5pZCk7XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkLnNldCh1bmRlZmluZWQpO1xuICAgICAgaWYgKHRpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmRyaXZlLnNldFNlbGVjdGlvbihbXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRyaXZlLnNldEJ1c3kodHJ1ZSk7XG4gICAgICAgIHRoaXMuZG1zU2VydmljZS5nZXREbXNPYmplY3RzKHRpbGVzLm1hcCgoaSkgPT4gaS5pZCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKG86IERtc09iamVjdFtdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRyaXZlLnNldEJ1c3koZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5kcml2ZS5zZXRTZWxlY3Rpb24obyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpdGVtRG91YmxlQ2xpY2tlZCh0aWxlOiBUaWxlRGF0YSkge1xuICAgIGlmICh0aWxlLmluc3RhbmNlRGF0YSkge1xuICAgICAgdGhpcy5kcml2ZS5zZXRCdXN5KHRydWUpO1xuICAgICAgY29uc3QgbmF2ID0gKHRpbGUuaW5zdGFuY2VEYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuQkFTRV9UWVBFX0lEXSBhcyBzdHJpbmcpID09PSBTeXN0ZW1UeXBlLkZPTERFUiA/IFsnLi4nXSA6IFsnLi4vLi4nLCAnb2JqZWN0J107XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbLi4ubmF2LCB0aWxlLmluc3RhbmNlRGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9JRF1dLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSkudGhlbigoKSA9PiB0aGlzLmRyaXZlLnNldEJ1c3koZmFsc2UpKTtcbiAgICB9XG4gIH1cblxuICBsb2FkRGV0YWlscyhpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zaGVsbFNlcnZpY2UuYWRkQnVzeSgpO1xuICAgIC8vIGxvYWQgdGhlIGRtcyBvYmplY3RcbiAgICB0aGlzLmRtc1NlcnZpY2UuZ2V0RG1zT2JqZWN0KGlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKG86IERtc09iamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnNldChvKTtcbiAgICAgICAgdGhpcy5zaGVsbFNlcnZpY2UucmVtb3ZlQnVzeSgpO1xuICAgICAgICB0aGlzLmRyaXZlLnNldFNlbGVjdGlvbihbb10pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5kcml2ZS5zZXRTZWxlY3Rpb24oW10pO1xuICB9XG5cbiAgb3BlblBhcmVudCgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50Rm9sZGVyKSB7XG4gICAgICB0aGlzLmRyaXZlLnNldEJ1c3kodHJ1ZSk7XG4gICAgICB0aGlzLnJvdXRlclxuICAgICAgICAubmF2aWdhdGUoWycuLicsIHRoaXMuY3VycmVudEZvbGRlci5kYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuUEFSRU5UX0lEXSB8fCBEUklWRV9ST09UX0ZPTERFUl9JRF0sIHtcbiAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgIHJlcGxhY2VVcmw6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5kcml2ZS5zZXRCdXN5KGZhbHNlKSk7XG4gICAgfVxuICB9XG5cbiAgc2V0QnVzeShidXN5OiBib29sZWFuKSB7XG4gICAgdGhpcy5kcml2ZS5zZXRCdXN5KGJ1c3kpO1xuICB9XG5cbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLnRpbGVMaXN0KCk/LnJlZnJlc2goKTtcbiAgICB0aGlzLmRyaXZlLnNldFNlbGVjdGlvbihbXSk7XG4gIH1cblxuICBvbkxheW91dFNldHRpbmdzQ2hhbmdlKGU6IGFueSkge1xuICAgIHRoaXMuI2FwcENhY2hlLnNldEl0ZW0odGhpcy4jTEFZT1VUX1NFVFRJTkdTX1NUT1JBR0VfS0VZLCBlKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gICNhcHBseUxheW91dFNldHRpbmdzKHNldHRpbmdzOiBTcGxpdFZpZXdMYXlvdXRTZXR0aW5ncykge1xuICAgIHRoaXMuc3BsaXRWaWV3Q21wKCkuYXBwbHlMYXlvdXRTZXR0aW5ncyhzZXR0aW5ncyk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy4jYXBwQ2FjaGUuZ2V0SXRlbSh0aGlzLiNMQVlPVVRfU0VUVElOR1NfU1RPUkFHRV9LRVkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAobHM6IFNwbGl0Vmlld0xheW91dFNldHRpbmdzKSA9PiB7XG4gICAgICAgIGlmIChscykge1xuICAgICAgICAgIHRoaXMuZW5hYmxlRGV0YWlscy5zZXQobHMuYXJlYXNbMl0/LnZpc2libGUpO1xuICAgICAgICAgIHRoaXMuZW5hYmxlVHJlZS5zZXQobHMuYXJlYXNbMF0/LnZpc2libGUpO1xuICAgICAgICAgIHRoaXMuI2FwcGx5TGF5b3V0U2V0dGluZ3MobHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsaXBib2FyZC5jbGVhcihBUFBfSUQpO1xuICB9XG59XG4iLCI8aGVhZGVyPlxuICA8IS0tIG5hdmlnYXRpb24gYmFyIC0tPlxuICA8bmF2IFthdHRyLmFyaWEtbGFiZWxdPVwiJ3l1di5hcHAuZHJpdmUuZmlsZXMubmF2aWFndGlvbi5hcmlhLmxhYmVsJyB8IHRyYW5zbGF0ZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJuYXZcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJiYWNrXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Rm9sZGVyXCIgdGl0bGU9XCJ7eyAneXV2LmFwcC5kcml2ZS5maWxlcy5uYXYuYmFjay50b29sdGlwJyB8IHRyYW5zbGF0ZSB9fVwiIChjbGljayk9XCJvcGVuUGFyZW50KClcIj5cbiAgICAgICAgPHl2Yy1pY29uIFtzdmddPVwiaWNvbnMuYmFja1wiPjwveXZjLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJyZWZyZXNoXCIgdGl0bGU9XCJ7eyAneXV2LmFwcC5kcml2ZS5maWxlcy5uYXYucmVmcmVzaC50b29sdGlwJyB8IHRyYW5zbGF0ZSB9fVwiIChjbGljayk9XCJyZWZyZXNoKClcIj5cbiAgICAgICAgPHl2Yy1pY29uIFtzdmddPVwiaWNvbnMucmVmcmVzaFwiPjwveXZjLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoIXF1ZXJ5KCk/LnRlcm0pIHtcbiAgICAgIDx5bWQtYnJlYWRjcnVtYj48L3ltZC1icmVhZGNydW1iPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cImJyZWFkY3J1bWJcIj48L2Rpdj5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cInNlYXJjaFwiPlxuICAgICAgPHl1di1zaW1wbGUtc2VhcmNoIFtxdWVyeV09XCJxdWVyeSgpXCIgKHF1ZXJ5U3VibWl0KT1cIm9uUXVlcnlTdWJtaXQoJGV2ZW50KVwiPjwveXV2LXNpbXBsZS1zZWFyY2g+XG4gICAgICA8IS0tIFRPRE86IGVuYWJsZSBhZ2FpbiBvbmNlIGRyaXZlIHNlYXJjaCBuZWVkcyB0byBiZSBhIGxpdHRsZSBiaXQgbW9yZSBzb3BoaXN0aWNhdGVkIC0tPlxuICAgICAgPCEtLSA8eW1kLWRyaXZlLXNlYXJjaCAoZm9jdXNlZCk9XCJzZWFyY2hGb2N1c2VkID0gJGV2ZW50XCI+PC95bWQtZHJpdmUtc2VhcmNoPiAtLT5cbiAgICA8L2Rpdj5cbiAgPC9uYXY+XG5cbiAgPCEtLSByaWJib24gd2l0aCBhY3Rpb25zIGFuZCBvcHRpb25zIC0tPlxuICA8eW1kLXJpYmJvbiBbb2JqZWN0c109XCJzZWxlY3Rpb24oKVwiIFtidXN5XT1cImJ1c3koKVwiIFtlbmFibGVDbGlwYm9hcmRdPVwidHJ1ZVwiPlxuICAgIDxuZy10ZW1wbGF0ZSAjcHJpbWFyeUFjdGlvbnM+XG4gICAgICA8eW1kLWFkZC1idXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVDcmVhdGVcIj48L3ltZC1hZGQtYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI3NlY29uZGFyeUFjdGlvbnM+XG4gICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uc1wiPlxuICAgICAgICBAaWYgKCFzbWFsbFNjcmVlbkxheW91dCgpKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtdHJlZSB0b2dnbGVcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBlbmFibGVkOiBlbmFibGVUcmVlKCkgfVwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICd5dXYuYXBwLmRyaXZlLmZpbGVzLnRvZ2dsZXRyZWUudG9vbHRpcCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImVuYWJsZVRyZWUuc2V0KCFlbmFibGVUcmVlKCkpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8eXZjLWljb24gW3N2Z109XCJpY29ucy50b2dnbGVMZWZ0XCI+PC95dmMtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1kZXRhaWxzIHRvZ2dsZVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7IGVuYWJsZWQ6IGVuYWJsZURldGFpbHMoKSB9XCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ3l1di5hcHAuZHJpdmUuZmlsZXMudG9nZ2xlZGV0YWlscy50b29sdGlwJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZW5hYmxlRGV0YWlscy5zZXQoIWVuYWJsZURldGFpbHMoKSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx5dmMtaWNvbiBbc3ZnXT1cImljb25zLnRvZ2dsZVJpZ2h0XCI+PC95dmMtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICA8eXV2LXRpbGUtY29uZmlnLXRyaWdnZXJcbiAgICAgICAgICBbaWNvbl09XCJpY29ucy5zZXR0aW5nc1wiXG4gICAgICAgICAgW2J1Y2tldF09XCJvYmplY3RDb25maWdCdWNrZXRcIlxuICAgICAgICAgIFtidWNrZXRMYWJlbF09XCJ0aWxlQ29uZmlnQnVja2V0TGFiZWxcIlxuICAgICAgICAgIFtvcHRpb25zXT1cInRpbGVMaXN0T3B0aW9uc1wiXG4gICAgICAgID48L3l1di10aWxlLWNvbmZpZy10cmlnZ2VyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC95bWQtcmliYm9uPlxuPC9oZWFkZXI+XG5cbjx5dmMtc3BsaXQtdmlldyBbZ3V0dGVyU2l6ZV09XCIxXCIgKGxheW91dFNldHRpbmdzQ2hhbmdlKT1cIm9uTGF5b3V0U2V0dGluZ3NDaGFuZ2UoJGV2ZW50KVwiPlxuICA8IS0tIGZvbGRlciB0cmVlIC0tPlxuICA8bmctdGVtcGxhdGUgeXZjU3BsaXRBcmVhIFtzaXplXT1cIjIwXCIgW3Zpc2libGVdPVwiZW5hYmxlVHJlZSgpICYmICFzbWFsbFNjcmVlbkxheW91dCgpXCI+XG4gICAgPHltZC1mb2xkZXItdHJlZSB5dXZGb2N1c2FibGU9XCJUcmVlXCI+PC95bWQtZm9sZGVyLXRyZWU+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPCEtLSBmaWxlcyAtLT5cbiAgPG5nLXRlbXBsYXRlIHl2Y1NwbGl0QXJlYSBbc2l6ZV09XCI2MFwiPlxuICAgIEBsZXQgZXJyID0gZXJyb3IoKTtcbiAgICBAaWYgKGVycikge1xuICAgICAgPGRpdiBjbGFzcz1cImVycm9yXCI+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDx5dmMtaWNvbiBbc3ZnXT1cImljb25zLmF0dGVudGlvblwiPjwveXZjLWljb24+XG4gICAgICAgICAgQHN3aXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBAY2FzZSAoRVJST1JfQ09ERS5OT1RfRk9VTkQpIHtcbiAgICAgICAgICAgICAge3sgJ3l1di5hcHAuZHJpdmUuZmlsZXMuZXJyb3IubG9hZC5ub3QtZm91bmQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoRVJST1JfQ09ERS5JTlZBTElEX0lEKSB7XG4gICAgICAgICAgICAgIHt7ICd5dXYuYXBwLmRyaXZlLmZpbGVzLmVycm9yLmxvYWQuaW52YWxpZC1pZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAge3sgJ3l1di5hcHAuZHJpdmUuZmlsZXMuZXJyb3IubG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cImZpbGVzXCIgW3l1dkZpbGVEcm9wWm9uZV09XCJ7IGxhYmVsOiAneXV2LmFwcC5kcml2ZS5maWxlcy5kcm9wem9uZS5sYWJlbCcgfCB0cmFuc2xhdGUgfVwiIChmaWxlRHJvcCk9XCJvbkZpbGVEcm9wKCRldmVudClcIj5cbiAgICAgICAgPGhlYWRlciBjbGFzcz1cImZpbGVzLWhlYWRlclwiPlxuICAgICAgICAgIDxoMT57eyBxdWVyeVRpdGxlKCkgfX08L2gxPlxuICAgICAgICAgIEBpZiAocXVlcnkoKT8udGVybSkge1xuICAgICAgICAgICAgPHltZC1zZWFyY2gtZmlsdGVyIFtxdWVyeV09XCJxdWVyeSgpXCIgKHF1ZXJ5Q2hhbmdlKT1cIm9uRmlsdGVyUXVlcnlDaGFuZ2UoJGV2ZW50KVwiPjwveW1kLXNlYXJjaC1maWx0ZXI+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoc29ydE9wdGlvbnNBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgPHltZC1zb3J0IC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGF2b3JzXCI+XG4gICAgICAgICAgICA8IS0tIFRPRE86IGVuYWJsZSBhZ2FpbiBvbmNlIGZsYXZvcnMvYXNwZWN0cyBhcmUgc3VwcG9ydGVkIC0tPlxuICAgICAgICAgICAgPCEtLSAgQGZvciAoZiBvZiBmbGF2b3JDaGlwczsgdHJhY2sgZi5pZCkge1xuICAgICAgICAgICAgPHl1di1mbGF2b3ItY2hpcCBbbmdDbGFzc109XCJ7IGFjdGl2ZTogZi5pZCA9PT0gYXBwbGllZEZsYXZvcj8uaWQgfVwiIFtmbGF2b3JdPVwiZlwiIChjbGljayk9XCJhcHBsaWVkRmxhdm9yID0gZlwiPjwveXV2LWZsYXZvci1jaGlwPlxuICAgICAgICAgIH0tLT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgPHl1di10aWxlLWxpc3RcbiAgICAgICAgICAjdGlsZUxpc3RcbiAgICAgICAgICBjbGFzcz1cInN0YWdnZXJlZFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIneXV2LmFwcC5kcml2ZS5maWxlcy5jb250ZW50LmFyaWEubGFiZWwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiYnVzeSgpXCJcbiAgICAgICAgICBbYXR0ci5yb2xlXT1cIidsaXN0Ym94J1wiXG4gICAgICAgICAgKGtleWRvd24uZGVsZXRlKT1cIm9uRGVsZXRlKClcIlxuICAgICAgICAgIFtidWNrZXRdPVwib2JqZWN0Q29uZmlnQnVja2V0XCJcbiAgICAgICAgICBbbXVsdGlzZWxlY3RdPVwidHJ1ZVwiXG4gICAgICAgICAgW3F1ZXJ5XT1cInF1ZXJ5KClcIlxuICAgICAgICAgIFtmbGF2b3JdPVwiYXBwbGllZEZsYXZvclwiXG4gICAgICAgICAgW29wdGlvbnNdPVwidGlsZUxpc3RPcHRpb25zXCJcbiAgICAgICAgICAoaXRlbURibENsaWNrKT1cIml0ZW1Eb3VibGVDbGlja2VkKCRldmVudClcIlxuICAgICAgICAgIChpdGVtU2VsZWN0KT1cIml0ZW1DbGlja2VkKCRldmVudClcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0aW9uQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAoY29weSk9XCJvbkNvcHkoJGV2ZW50KVwiXG4gICAgICAgICAgKGN1dCk9XCJvbkN1dCgkZXZlbnQpXCJcbiAgICAgICAgICAoYnVzeSk9XCJzZXRCdXN5KCRldmVudClcIlxuICAgICAgICAgIChjdHhNZW51KT1cIm9uQ29udGV4dG1lbnUoJGV2ZW50KVwiXG4gICAgICAgICAgW2hpZ2hsaWdodHNdPVwiaGlnaGxpZ2h0U3R5bGVzJCB8IGFzeW5jXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgI2VtcHR5PlxuICAgICAgICAgICAgQGlmIChlbXB0eU1vZGUoKSA9PT0gJ3Jvb3QnKSB7XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiZW1wdHlcIj57eyAneXV2LmFwcC5kcml2ZS5maWxlcy5jb250ZW50LmVtcHR5LnJvb3QubGlzdCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChlbXB0eU1vZGUoKSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgICAgICAgICA8cCBjbGFzcz1cImVtcHR5XCI+e3sgJ3l1di5hcHAuZHJpdmUuZmlsZXMuY29udGVudC5lbXB0eS5xdWVyeS5saXN0JyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8cCBjbGFzcz1cImVtcHR5XCI+e3sgJ3l1di5hcHAuZHJpdmUuZmlsZXMuY29udGVudC5lbXB0eS5saXN0JyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC95dXYtdGlsZS1saXN0PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDwhLS0gZGV0YWlscyAtLT5cbiAgPG5nLXRlbXBsYXRlIHl2Y1NwbGl0QXJlYSBbc2l6ZV09XCIyMFwiIFt2aXNpYmxlXT1cImVuYWJsZURldGFpbHMoKVwiPlxuICAgIEBsZXQgc2VsZWN0ZWRJdGVtID0gc2VsZWN0ZWQoKTtcbiAgICBAaWYgKGVuYWJsZURldGFpbHMoKSAmJiBzZWxlY3RlZEl0ZW0pIHtcbiAgICAgIEBpZiAoc2VsZWN0ZWRJdGVtPy5pc0ZvbGRlcikge1xuICAgICAgICA8eXV2LW9iamVjdC1zdW1tYXJ5IFtjb25maWdUeXBlXT1cImNvbmZpZ1R5cGVPcHRpb25zWydmb2xkZXInXVwiIFtkbXNPYmplY3RdPVwic2VsZWN0ZWRJdGVtXCI+PC95dXYtb2JqZWN0LXN1bW1hcnk+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHl1di1vYmplY3Qtc3VtbWFyeVxuICAgICAgICAgIFtjb25maWdUeXBlXT1cImNvbmZpZ1R5cGVPcHRpb25zWydmaWxlJ11cIlxuICAgICAgICAgIFtkbXNPYmplY3RdPVwic2VsZWN0ZWRJdGVtXCJcbiAgICAgICAgICBbeXV2RmlsZURyb3Bab25lXT1cInsgbGFiZWw6ICd5dXYuYXBwLmRyaXZlLmZpbGVzLmRyb3B6b25lLmNvbnRlbnQucmVwbGFjZS5sYWJlbCcgfCB0cmFuc2xhdGUgfVwiXG4gICAgICAgICAgW2ZpbGVEcm9wRGlzYWJsZWRdPVwiZmlsZURyb3BTdW1tYXJ5RGlzYWJsZWQoKVwiXG4gICAgICAgICAgKGZpbGVEcm9wKT1cIm9uRmlsZVVwZGF0ZURyb3AoJGV2ZW50KVwiXG4gICAgICAgID48L3l1di1vYmplY3Qtc3VtbWFyeT5cbiAgICAgIH1cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBsZXQgc2VsID0gc2VsZWN0aW9uKCk7XG4gICAgICBAaWYgKHNlbCAmJiBzZWwubGVuZ3RoID4gMCkge1xuICAgICAgICA8eXV2LW11bHRpLW9iamVjdC1zdW1tYXJ5IFtoZWFkbGluZV09XCIneXV2LmFwcC5kcml2ZS5tdWx0aXNlbGVjdGVkLmRldGFpbHMnIHwgdHJhbnNsYXRlOiB7IGNvdW50OiBzZWxlY3Rpb24oKS5sZW5ndGggfVwiPjwveXV2LW11bHRpLW9iamVjdC1zdW1tYXJ5PlxuICAgICAgfSBAZWxzZSBpZiAodGlsZUxpc3QoKT8uaXRlbXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICA8IS0tIFRPRE86IENIT1VMRCBIQVZFIEEgRElGRkVSRU5UIE1FU1NBR0UgRk9SIEVNUFRZIFJFU1VMVFMgRU1QVFkgRk9SIE5PVyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VcIj57eyAneXV2LmFwcC5kcml2ZS5lbXB0eS5yZXN1bHRzLmRldGFpbHMubWVzc2FnZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiPnt7ICd5dXYuYXBwLmRyaXZlLnVuc2VsZWN0ZWQuZGV0YWlscycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIDwvbmctdGVtcGxhdGU+XG48L3l2Yy1zcGxpdC12aWV3PlxuIl19