ngx-edu-sharing-ui 0.7.0 → 9.0.1

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 (367) hide show
  1. package/assets/scss/mixins.scss +4 -1
  2. package/assets/scss/variables.scss +3 -0
  3. package/esm2022/lib/actionbar/actionbar.component.mjs +188 -0
  4. package/esm2022/lib/common/edu-sharing-ui-common.module.mjs +134 -0
  5. package/esm2022/lib/directives/border-box-observer.directive.mjs +71 -0
  6. package/esm2022/lib/directives/check-text-overflow.directive.mjs +65 -0
  7. package/esm2022/lib/directives/drag-nodes/drag-nodes.mjs +14 -0
  8. package/esm2022/lib/directives/drag-nodes/nodes-drag-source.directive.mjs +79 -0
  9. package/esm2022/lib/directives/drag-nodes/nodes-drag.directive.mjs +49 -0
  10. package/esm2022/lib/directives/drag-nodes/nodes-drop-target.directive.mjs +105 -0
  11. package/esm2022/lib/directives/focus-state.directive.mjs +44 -0
  12. package/esm2022/lib/directives/icon.directive.mjs +139 -0
  13. package/esm2022/lib/dropdown/dropdown.component.mjs +70 -0
  14. package/esm2022/lib/edu-sharing-ui-configuration.mjs +41 -0
  15. package/esm2022/lib/edu-sharing-ui.module.mjs +78 -0
  16. package/esm2022/lib/list-items/available-widgets.mjs +27 -0
  17. package/esm2022/lib/list-items/format-duration.pipe.mjs +20 -0
  18. package/esm2022/lib/list-items/list-base/list-base.component.mjs +46 -0
  19. package/esm2022/lib/list-items/list-collection-info/list-collection-info.component.mjs +29 -0
  20. package/esm2022/lib/list-items/list-counts/list-counts.component.mjs +54 -0
  21. package/esm2022/lib/list-items/list-items.module.mjs +50 -0
  22. package/esm2022/lib/list-items/list-node-license/list-node-license.component.mjs +41 -0
  23. package/esm2022/lib/list-items/list-node-replication-source/list-node-replication-source.component.mjs +47 -0
  24. package/esm2022/lib/list-items/list-node-workflow/list-node-workflow.component.mjs +24 -0
  25. package/esm2022/lib/list-items/list-text/list-text.component.mjs +106 -0
  26. package/esm2022/lib/list-items/list-widget.mjs +49 -0
  27. package/esm2022/lib/list-items/node-row/node-row.component.mjs +24 -0
  28. package/esm2022/lib/list-items/node-source.pipe.mjs +49 -0
  29. package/esm2022/lib/node-entries/combined-data-source.mjs +41 -0
  30. package/esm2022/lib/node-entries/custom-templates-data-source.mjs +7 -0
  31. package/esm2022/lib/node-entries/drag-preview/drag-preview.component.mjs +21 -0
  32. package/esm2022/lib/node-entries/entries-model.mjs +23 -0
  33. package/esm2022/lib/node-entries/items-cap.mjs +47 -0
  34. package/esm2022/lib/node-entries/list-item-label.pipe.mjs +34 -0
  35. package/esm2022/lib/node-entries/node-cache.mjs +65 -0
  36. package/esm2022/lib/node-entries/node-data-source-remote.mjs +4 -0
  37. package/esm2022/lib/node-entries/node-data-source.mjs +115 -0
  38. package/esm2022/lib/node-entries/node-entries-card/node-entries-card.component.mjs +131 -0
  39. package/esm2022/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.mjs +307 -0
  40. package/esm2022/lib/node-entries/node-entries-card-small/node-entries-card-small.component.mjs +45 -0
  41. package/esm2022/lib/node-entries/node-entries-global-options/node-entries-global-options.component.mjs +23 -0
  42. package/esm2022/lib/node-entries/node-entries-global.service.mjs +58 -0
  43. package/esm2022/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.mjs +42 -0
  44. package/esm2022/lib/node-entries/node-entries-table/node-entries-table.component.mjs +290 -0
  45. package/esm2022/lib/node-entries/node-entries-templates.service.mjs +11 -0
  46. package/esm2022/lib/node-entries/node-entries-wrapper.component.mjs +324 -0
  47. package/esm2022/lib/node-entries/node-entries.component.mjs +131 -0
  48. package/esm2022/lib/node-entries/node-entries.module.mjs +161 -0
  49. package/esm2022/lib/node-entries/node-rating/node-rating.component.mjs +102 -0
  50. package/esm2022/lib/node-entries/node-stats-badges/node-stats-badges.component.mjs +48 -0
  51. package/esm2022/lib/node-entries/node-type-badge/node-type-badge.component.mjs +36 -0
  52. package/esm2022/lib/node-entries/option-button/option-button.component.mjs +62 -0
  53. package/esm2022/lib/node-entries/preview-image/preview-image.component.mjs +53 -0
  54. package/esm2022/lib/node-entries/sort-select-panel/sort-select-panel.component.mjs +41 -0
  55. package/esm2022/lib/node-url/node-url.component.mjs +128 -0
  56. package/esm2022/lib/pipes/file-size.pipe.mjs +31 -0
  57. package/esm2022/lib/pipes/format-date.pipe.mjs +38 -0
  58. package/esm2022/lib/pipes/node-icon.pipe.mjs +18 -0
  59. package/esm2022/lib/pipes/node-image-size.pipe.mjs +24 -0
  60. package/esm2022/lib/pipes/node-image.pipe.mjs +55 -0
  61. package/esm2022/lib/pipes/node-person-name.pipe.mjs +50 -0
  62. package/esm2022/lib/pipes/node-title.pipe.mjs +19 -0
  63. package/esm2022/lib/pipes/option-tooltip.pipe.mjs +33 -0
  64. package/esm2022/lib/pipes/replace-chars.pipe.mjs +29 -0
  65. package/esm2022/lib/pipes/vcard-name.pipe.mjs +19 -0
  66. package/esm2022/lib/services/abstract/app.service.mjs +3 -0
  67. package/esm2022/lib/services/abstract/keyboard-shortcuts.service.mjs +10 -0
  68. package/esm2022/lib/services/abstract/options-helper.service.mjs +3 -0
  69. package/esm2022/lib/services/abstract/toast.service.mjs +3 -0
  70. package/esm2022/lib/services/accessibility.service.mjs +73 -0
  71. package/esm2022/lib/services/local-events.service.mjs +36 -0
  72. package/esm2022/lib/services/node-entries.service.mjs +137 -0
  73. package/esm2022/lib/services/node-helper.service.mjs +234 -0
  74. package/esm2022/lib/services/nodes-drag-drop.service.mjs +155 -0
  75. package/esm2022/lib/services/options-helper-data.service.mjs +134 -0
  76. package/esm2022/lib/services/repo-url.service.mjs +49 -0
  77. package/esm2022/lib/services/temporary-storage.service.mjs +48 -0
  78. package/esm2022/lib/services/ui.service.mjs +162 -0
  79. package/esm2022/lib/sort-dropdown/sort-dropdown.component.mjs +50 -0
  80. package/esm2022/lib/spinner/spinner.component.mjs +18 -0
  81. package/esm2022/lib/translations/fallback-translation-handler.mjs +6 -0
  82. package/esm2022/lib/translations/languages.mjs +5 -0
  83. package/esm2022/lib/translations/translation-loader.mjs +149 -0
  84. package/esm2022/lib/translations/translation-source.mjs +11 -0
  85. package/esm2022/lib/translations/translations.module.mjs +67 -0
  86. package/esm2022/lib/translations/translations.service.mjs +171 -0
  87. package/esm2022/lib/types/accessibillity.mjs +19 -0
  88. package/esm2022/lib/types/api-models.mjs +2 -0
  89. package/esm2022/lib/types/drag-drop.mjs +2 -0
  90. package/esm2022/lib/types/keyboard-shortcuts.mjs +11 -0
  91. package/esm2022/lib/types/list-item.mjs +41 -0
  92. package/esm2022/lib/types/option-item.mjs +174 -0
  93. package/esm2022/lib/types/workflow.mjs +25 -0
  94. package/esm2022/lib/util/DateHelper.mjs +200 -0
  95. package/esm2022/lib/util/VCard.mjs +278 -0
  96. package/esm2022/lib/util/color-helper.mjs +124 -0
  97. package/esm2022/lib/util/duration-helper.mjs +102 -0
  98. package/esm2022/lib/util/functions.mjs +13 -0
  99. package/esm2022/lib/util/helper.mjs +64 -0
  100. package/esm2022/lib/util/isNumeric.mjs +11 -0
  101. package/esm2022/lib/util/rest-helper.mjs +33 -0
  102. package/esm2022/lib/util/ui-animation.mjs +146 -0
  103. package/esm2022/lib/util/ui-constants.mjs +21 -0
  104. package/esm2022/module.mjs +76 -0
  105. package/esm2022/ngx-edu-sharing-ui.mjs +5 -0
  106. package/fesm2022/ngx-edu-sharing-ui.mjs +6509 -0
  107. package/fesm2022/ngx-edu-sharing-ui.mjs.map +1 -0
  108. package/index.d.ts +5 -0
  109. package/lib/actionbar/actionbar.component.d.ts +74 -0
  110. package/lib/common/edu-sharing-ui-common.module.d.ts +32 -0
  111. package/lib/directives/border-box-observer.directive.d.ts +31 -0
  112. package/lib/directives/check-text-overflow.directive.d.ts +20 -0
  113. package/lib/directives/drag-nodes/drag-nodes.d.ts +16 -0
  114. package/lib/directives/drag-nodes/nodes-drag-source.directive.d.ts +37 -0
  115. package/lib/directives/drag-nodes/nodes-drag.directive.d.ts +17 -0
  116. package/lib/directives/drag-nodes/nodes-drop-target.directive.d.ts +22 -0
  117. package/lib/directives/focus-state.directive.d.ts +14 -0
  118. package/lib/directives/icon.directive.d.ts +46 -0
  119. package/lib/dropdown/dropdown.component.d.ts +40 -0
  120. package/lib/edu-sharing-ui-configuration.d.ts +11 -0
  121. package/lib/edu-sharing-ui.module.d.ts +19 -0
  122. package/lib/list-items/available-widgets.d.ts +13 -0
  123. package/lib/list-items/format-duration.pipe.d.ts +10 -0
  124. package/lib/list-items/list-base/list-base.component.d.ts +18 -0
  125. package/lib/list-items/list-collection-info/list-collection-info.component.d.ts +14 -0
  126. package/lib/list-items/list-counts/list-counts.component.d.ts +13 -0
  127. package/lib/list-items/list-items.module.d.ts +20 -0
  128. package/lib/list-items/list-node-license/list-node-license.component.d.ts +20 -0
  129. package/lib/list-items/list-node-replication-source/list-node-replication-source.component.d.ts +22 -0
  130. package/lib/list-items/list-node-workflow/list-node-workflow.component.d.ts +12 -0
  131. package/lib/list-items/list-text/list-text.component.d.ts +28 -0
  132. package/lib/list-items/list-widget.d.ts +32 -0
  133. package/lib/list-items/node-row/node-row.component.d.ts +12 -0
  134. package/lib/list-items/node-source.pipe.d.ts +16 -0
  135. package/lib/node-entries/combined-data-source.d.ts +19 -0
  136. package/{src/lib/node-entries/custom-templates-data-source.ts → lib/node-entries/custom-templates-data-source.d.ts} +2 -2
  137. package/lib/node-entries/drag-preview/drag-preview.component.d.ts +11 -0
  138. package/{src/lib/node-entries/entries-model.ts → lib/node-entries/entries-model.d.ts} +19 -47
  139. package/lib/node-entries/items-cap.d.ts +17 -0
  140. package/lib/node-entries/list-item-label.pipe.d.ts +14 -0
  141. package/lib/node-entries/node-cache.d.ts +17 -0
  142. package/{src/lib/node-entries/node-data-source-remote.ts → lib/node-entries/node-data-source-remote.d.ts} +2 -12
  143. package/lib/node-entries/node-data-source.d.ts +42 -0
  144. package/lib/node-entries/node-entries-card/node-entries-card.component.d.ts +45 -0
  145. package/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.d.ts +92 -0
  146. package/lib/node-entries/node-entries-card-small/node-entries-card-small.component.d.ts +23 -0
  147. package/lib/node-entries/node-entries-global-options/node-entries-global-options.component.d.ts +12 -0
  148. package/lib/node-entries/node-entries-global.service.d.ts +50 -0
  149. package/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.d.ts +17 -0
  150. package/lib/node-entries/node-entries-table/node-entries-table.component.d.ts +76 -0
  151. package/{src/lib/node-entries/node-entries-templates.service.ts → lib/node-entries/node-entries-templates.service.d.ts} +6 -9
  152. package/lib/node-entries/node-entries-wrapper.component.d.ts +129 -0
  153. package/lib/node-entries/node-entries.component.d.ts +32 -0
  154. package/lib/node-entries/node-entries.module.d.ts +43 -0
  155. package/lib/node-entries/node-rating/node-rating.component.d.ts +26 -0
  156. package/lib/node-entries/node-stats-badges/node-stats-badges.component.d.ts +17 -0
  157. package/lib/node-entries/node-type-badge/node-type-badge.component.d.ts +21 -0
  158. package/lib/node-entries/option-button/option-button.component.d.ts +11 -0
  159. package/lib/node-entries/preview-image/preview-image.component.d.ts +22 -0
  160. package/lib/node-entries/sort-select-panel/sort-select-panel.component.d.ts +16 -0
  161. package/lib/node-url/node-url.component.d.ts +51 -0
  162. package/lib/pipes/file-size.pipe.d.ts +10 -0
  163. package/lib/pipes/format-date.pipe.d.ts +21 -0
  164. package/lib/pipes/node-icon.pipe.d.ts +11 -0
  165. package/lib/pipes/node-image-size.pipe.d.ts +8 -0
  166. package/lib/pipes/node-image.pipe.d.ts +28 -0
  167. package/lib/pipes/node-person-name.pipe.d.ts +10 -0
  168. package/lib/pipes/node-title.pipe.d.ts +11 -0
  169. package/lib/pipes/option-tooltip.pipe.d.ts +12 -0
  170. package/lib/pipes/replace-chars.pipe.d.ts +10 -0
  171. package/lib/pipes/vcard-name.pipe.d.ts +10 -0
  172. package/{src/lib/services/abstract/app.service.ts → lib/services/abstract/app.service.d.ts} +1 -1
  173. package/lib/services/abstract/keyboard-shortcuts.service.d.ts +11 -0
  174. package/lib/services/abstract/options-helper.service.d.ts +10 -0
  175. package/{src/lib/services/abstract/toast.service.ts → lib/services/abstract/toast.service.d.ts} +1 -2
  176. package/lib/services/accessibility.service.d.ts +18 -0
  177. package/{src/lib/services/local-events.service.ts → lib/services/local-events.service.d.ts} +7 -10
  178. package/lib/services/node-entries.service.d.ts +69 -0
  179. package/lib/services/node-helper.service.d.ts +56 -0
  180. package/lib/services/nodes-drag-drop.service.d.ts +41 -0
  181. package/lib/services/options-helper-data.service.d.ts +75 -0
  182. package/lib/services/repo-url.service.d.ts +25 -0
  183. package/lib/services/temporary-storage.service.d.ts +35 -0
  184. package/lib/services/ui.service.d.ts +41 -0
  185. package/lib/sort-dropdown/sort-dropdown.component.d.ts +15 -0
  186. package/lib/spinner/spinner.component.d.ts +7 -0
  187. package/lib/translations/fallback-translation-handler.d.ts +4 -0
  188. package/lib/translations/languages.d.ts +4 -0
  189. package/lib/translations/translation-loader.d.ts +51 -0
  190. package/{src/lib/translations/translation-source.ts → lib/translations/translation-source.d.ts} +4 -4
  191. package/lib/translations/translations.module.d.ts +15 -0
  192. package/lib/translations/translations.service.d.ts +30 -0
  193. package/lib/types/accessibillity.d.ts +15 -0
  194. package/{src/lib/types/drag-drop.ts → lib/types/drag-drop.d.ts} +0 -3
  195. package/lib/types/keyboard-shortcuts.d.ts +10 -0
  196. package/lib/types/list-item.d.ts +55 -0
  197. package/lib/types/option-item.d.ts +236 -0
  198. package/lib/types/workflow.d.ts +14 -0
  199. package/lib/util/DateHelper.d.ts +44 -0
  200. package/lib/util/VCard.d.ts +66 -0
  201. package/lib/util/color-helper.d.ts +25 -0
  202. package/lib/util/duration-helper.d.ts +14 -0
  203. package/lib/util/functions.d.ts +4 -0
  204. package/lib/util/helper.d.ts +20 -0
  205. package/lib/util/isNumeric.d.ts +5 -0
  206. package/lib/util/rest-helper.d.ts +10 -0
  207. package/lib/util/ui-animation.d.ts +39 -0
  208. package/lib/util/ui-constants.d.ts +18 -0
  209. package/{src/module.ts → module.d.ts} +0 -4
  210. package/package.json +23 -9
  211. package/.browserslistrc +0 -16
  212. package/.eslintrc.json +0 -44
  213. package/karma.conf.js +0 -42
  214. package/ng-package.json +0 -10
  215. package/src/lib/actionbar/actionbar.component.html +0 -59
  216. package/src/lib/actionbar/actionbar.component.scss +0 -123
  217. package/src/lib/actionbar/actionbar.component.ts +0 -174
  218. package/src/lib/common/edu-sharing-ui-common.module.ts +0 -80
  219. package/src/lib/directives/border-box-observer.directive.ts +0 -75
  220. package/src/lib/directives/check-text-overflow.directive.ts +0 -61
  221. package/src/lib/directives/drag-nodes/drag-nodes.ts +0 -32
  222. package/src/lib/directives/drag-nodes/nodes-drag-source.directive.ts +0 -79
  223. package/src/lib/directives/drag-nodes/nodes-drag.directive.ts +0 -43
  224. package/src/lib/directives/drag-nodes/nodes-drop-target.directive.ts +0 -116
  225. package/src/lib/directives/focus-state.directive.ts +0 -34
  226. package/src/lib/directives/icon.directive.ts +0 -142
  227. package/src/lib/directives/nodes-drop-target-legacy.directive.ts +0 -155
  228. package/src/lib/dropdown/dropdown.component.html +0 -32
  229. package/src/lib/dropdown/dropdown.component.scss +0 -67
  230. package/src/lib/dropdown/dropdown.component.ts +0 -71
  231. package/src/lib/edu-sharing-ui-configuration.ts +0 -47
  232. package/src/lib/edu-sharing-ui.module.ts +0 -49
  233. package/src/lib/list-items/available-widgets.ts +0 -30
  234. package/src/lib/list-items/format-duration.pipe.ts +0 -17
  235. package/src/lib/list-items/list-base/list-base.component.html +0 -52
  236. package/src/lib/list-items/list-base/list-base.component.ts +0 -44
  237. package/src/lib/list-items/list-collection-info/list-collection-info.component.html +0 -48
  238. package/src/lib/list-items/list-collection-info/list-collection-info.component.scss +0 -8
  239. package/src/lib/list-items/list-collection-info/list-collection-info.component.ts +0 -24
  240. package/src/lib/list-items/list-counts/list-counts.component.html +0 -1
  241. package/src/lib/list-items/list-counts/list-counts.component.scss +0 -3
  242. package/src/lib/list-items/list-counts/list-counts.component.ts +0 -59
  243. package/src/lib/list-items/list-items.module.ts +0 -33
  244. package/src/lib/list-items/list-node-license/list-node-license.component.html +0 -8
  245. package/src/lib/list-items/list-node-license/list-node-license.component.ts +0 -47
  246. package/src/lib/list-items/list-node-replication-source/list-node-replication-source.component.html +0 -11
  247. package/src/lib/list-items/list-node-replication-source/list-node-replication-source.component.ts +0 -60
  248. package/src/lib/list-items/list-node-workflow/list-node-workflow.component.html +0 -3
  249. package/src/lib/list-items/list-node-workflow/list-node-workflow.component.ts +0 -21
  250. package/src/lib/list-items/list-text/list-text.component.html +0 -176
  251. package/src/lib/list-items/list-text/list-text.component.scss +0 -3
  252. package/src/lib/list-items/list-text/list-text.component.ts +0 -107
  253. package/src/lib/list-items/list-widget.ts +0 -52
  254. package/src/lib/list-items/node-row/node-row.component.html +0 -31
  255. package/src/lib/list-items/node-row/node-row.component.scss +0 -50
  256. package/src/lib/list-items/node-row/node-row.component.ts +0 -16
  257. package/src/lib/list-items/node-source.pipe.ts +0 -48
  258. package/src/lib/node-entries/combined-data-source.ts +0 -51
  259. package/src/lib/node-entries/drag-preview/drag-preview.component.html +0 -6
  260. package/src/lib/node-entries/drag-preview/drag-preview.component.scss +0 -35
  261. package/src/lib/node-entries/drag-preview/drag-preview.component.ts +0 -15
  262. package/src/lib/node-entries/items-cap.ts +0 -54
  263. package/src/lib/node-entries/list-item-label.pipe.ts +0 -28
  264. package/src/lib/node-entries/mixins.scss +0 -23
  265. package/src/lib/node-entries/node-cache.spec.ts +0 -199
  266. package/src/lib/node-entries/node-cache.ts +0 -81
  267. package/src/lib/node-entries/node-data-source.ts +0 -148
  268. package/src/lib/node-entries/node-entries-card/node-entries-card.component.html +0 -167
  269. package/src/lib/node-entries/node-entries-card/node-entries-card.component.scss +0 -28
  270. package/src/lib/node-entries/node-entries-card/node-entries-card.component.ts +0 -132
  271. package/src/lib/node-entries/node-entries-card/node-entries-card.main.scss +0 -261
  272. package/src/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.html +0 -205
  273. package/src/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.scss +0 -181
  274. package/src/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.ts +0 -361
  275. package/src/lib/node-entries/node-entries-card-small/node-entries-card-small.component.html +0 -100
  276. package/src/lib/node-entries/node-entries-card-small/node-entries-card-small.component.scss +0 -46
  277. package/src/lib/node-entries/node-entries-card-small/node-entries-card-small.component.ts +0 -40
  278. package/src/lib/node-entries/node-entries-global-options/node-entries-global-options.component.html +0 -23
  279. package/src/lib/node-entries/node-entries-global-options/node-entries-global-options.component.scss +0 -58
  280. package/src/lib/node-entries/node-entries-global-options/node-entries-global-options.component.ts +0 -16
  281. package/src/lib/node-entries/node-entries-global.service.ts +0 -79
  282. package/src/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.html +0 -25
  283. package/src/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.scss +0 -32
  284. package/src/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.ts +0 -31
  285. package/src/lib/node-entries/node-entries-table/node-entries-table.component.html +0 -270
  286. package/src/lib/node-entries/node-entries-table/node-entries-table.component.scss +0 -169
  287. package/src/lib/node-entries/node-entries-table/node-entries-table.component.ts +0 -333
  288. package/src/lib/node-entries/node-entries-wrapper.component.ts +0 -363
  289. package/src/lib/node-entries/node-entries.component.html +0 -33
  290. package/src/lib/node-entries/node-entries.component.scss +0 -13
  291. package/src/lib/node-entries/node-entries.component.ts +0 -151
  292. package/src/lib/node-entries/node-entries.module.ts +0 -93
  293. package/src/lib/node-entries/node-rating/node-rating.component.html +0 -53
  294. package/src/lib/node-entries/node-rating/node-rating.component.scss +0 -31
  295. package/src/lib/node-entries/node-rating/node-rating.component.ts +0 -105
  296. package/src/lib/node-entries/node-stats-badges/node-stats-badges.component.html +0 -39
  297. package/src/lib/node-entries/node-stats-badges/node-stats-badges.component.scss +0 -44
  298. package/src/lib/node-entries/node-stats-badges/node-stats-badges.component.ts +0 -43
  299. package/src/lib/node-entries/node-type-badge/node-type-badge.component.html +0 -31
  300. package/src/lib/node-entries/node-type-badge/node-type-badge.component.scss +0 -5
  301. package/src/lib/node-entries/node-type-badge/node-type-badge.component.ts +0 -36
  302. package/src/lib/node-entries/option-button/option-button.component.ts +0 -42
  303. package/src/lib/node-entries/preview-image/preview-image.component.html +0 -19
  304. package/src/lib/node-entries/preview-image/preview-image.component.scss +0 -31
  305. package/src/lib/node-entries/preview-image/preview-image.component.ts +0 -47
  306. package/src/lib/node-entries/sort-select-panel/sort-select-panel.component.html +0 -27
  307. package/src/lib/node-entries/sort-select-panel/sort-select-panel.component.scss +0 -9
  308. package/src/lib/node-entries/sort-select-panel/sort-select-panel.component.ts +0 -26
  309. package/src/lib/node-url/node-url.component.html +0 -66
  310. package/src/lib/node-url/node-url.component.scss +0 -32
  311. package/src/lib/node-url/node-url.component.ts +0 -136
  312. package/src/lib/pipes/file-size.pipe.ts +0 -24
  313. package/src/lib/pipes/format-date.pipe.ts +0 -39
  314. package/src/lib/pipes/node-icon.pipe.ts +0 -11
  315. package/src/lib/pipes/node-image-size.pipe.ts +0 -18
  316. package/src/lib/pipes/node-image.pipe.ts +0 -71
  317. package/src/lib/pipes/node-person-name.pipe.ts +0 -41
  318. package/src/lib/pipes/node-title.pipe.ts +0 -12
  319. package/src/lib/pipes/option-tooltip.pipe.ts +0 -32
  320. package/src/lib/pipes/replace-chars.pipe.ts +0 -21
  321. package/src/lib/pipes/vcard-name.pipe.ts +0 -11
  322. package/src/lib/services/abstract/keyboard-shortcuts.service.ts +0 -10
  323. package/src/lib/services/abstract/options-helper.service.ts +0 -29
  324. package/src/lib/services/accessibility.service.ts +0 -101
  325. package/src/lib/services/node-entries.service.ts +0 -172
  326. package/src/lib/services/node-helper.service.ts +0 -239
  327. package/src/lib/services/nodes-drag-drop.service.ts +0 -165
  328. package/src/lib/services/options-helper-data.service.ts +0 -186
  329. package/src/lib/services/repo-url.service.ts +0 -46
  330. package/src/lib/services/temporary-storage.service.ts +0 -58
  331. package/src/lib/services/ui.service.ts +0 -182
  332. package/src/lib/sort-dropdown/sort-dropdown.component.html +0 -22
  333. package/src/lib/sort-dropdown/sort-dropdown.component.scss +0 -47
  334. package/src/lib/sort-dropdown/sort-dropdown.component.ts +0 -42
  335. package/src/lib/spinner/spinner.component.html +0 -14
  336. package/src/lib/spinner/spinner.component.scss +0 -141
  337. package/src/lib/spinner/spinner.component.ts +0 -12
  338. package/src/lib/translations/README.md +0 -44
  339. package/src/lib/translations/fallback-translation-handler.ts +0 -7
  340. package/src/lib/translations/languages.ts +0 -6
  341. package/src/lib/translations/translation-loader.spec.ts +0 -352
  342. package/src/lib/translations/translation-loader.ts +0 -189
  343. package/src/lib/translations/translations.module.ts +0 -49
  344. package/src/lib/translations/translations.service.spec.ts +0 -152
  345. package/src/lib/translations/translations.service.ts +0 -188
  346. package/src/lib/types/accessibillity.ts +0 -15
  347. package/src/lib/types/keyboard-shortcuts.ts +0 -29
  348. package/src/lib/types/list-item.ts +0 -67
  349. package/src/lib/types/option-item.ts +0 -247
  350. package/src/lib/types/workflow.ts +0 -35
  351. package/src/lib/util/DateHelper.spec.ts +0 -112
  352. package/src/lib/util/DateHelper.ts +0 -197
  353. package/src/lib/util/VCard.ts +0 -277
  354. package/src/lib/util/color-helper.ts +0 -125
  355. package/src/lib/util/duration-helper.spec.ts +0 -35
  356. package/src/lib/util/duration-helper.ts +0 -98
  357. package/src/lib/util/functions.ts +0 -15
  358. package/src/lib/util/helper.ts +0 -60
  359. package/src/lib/util/isNumeric.ts +0 -13
  360. package/src/lib/util/rest-helper.ts +0 -28
  361. package/src/lib/util/ui-animation.ts +0 -154
  362. package/src/lib/util/ui-constants.ts +0 -20
  363. package/src/test.ts +0 -28
  364. package/tsconfig.lib.json +0 -15
  365. package/tsconfig.lib.prod.json +0 -10
  366. package/tsconfig.spec.json +0 -17
  367. /package/{src/lib/types/api-models.ts → lib/types/api-models.d.ts} +0 -0
@@ -0,0 +1,65 @@
1
+ import { notNull } from '../util/functions';
2
+ export class NodeCache {
3
+ constructor() {
4
+ this._slices = [];
5
+ }
6
+ add(slice) {
7
+ if (slice.endIndex - slice.startIndex !== slice.data.length) {
8
+ throw new Error('Tried to add invalid slice to cache: ' + JSON.stringify(slice));
9
+ }
10
+ this._slices = this._normalizeSlices([...this._slices, slice]);
11
+ }
12
+ clear() {
13
+ this._slices = [];
14
+ }
15
+ get(range) {
16
+ for (const slice of this._slices) {
17
+ if (slice.startIndex <= range.startIndex && slice.endIndex >= range.endIndex) {
18
+ return slice.data.slice(range.startIndex - slice.startIndex, range.endIndex - slice.startIndex);
19
+ }
20
+ }
21
+ return null;
22
+ }
23
+ getMissingRange(requestedRange) {
24
+ let fromIndex = requestedRange.startIndex;
25
+ let toIndex = requestedRange.endIndex;
26
+ for (const slice of this._slices) {
27
+ if (slice.startIndex <= fromIndex && slice.endIndex > fromIndex) {
28
+ fromIndex = slice.endIndex;
29
+ }
30
+ else if (slice.startIndex < toIndex && slice.endIndex >= toIndex) {
31
+ toIndex = slice.startIndex;
32
+ }
33
+ if (fromIndex >= toIndex) {
34
+ return null;
35
+ }
36
+ }
37
+ return { startIndex: fromIndex, endIndex: toIndex };
38
+ }
39
+ _normalizeSlices(slices) {
40
+ slices.sort((lhs, rhs) => lhs.startIndex - rhs.startIndex);
41
+ for (let i = 0; i < slices.length - 1; i++) {
42
+ for (let j = i + 1; j < slices.length; j++) {
43
+ if (this._canMerge(slices[i], slices[j])) {
44
+ slices[i] = this._merge(slices[i], slices[j]);
45
+ slices[j] = null; // Mark for deletion
46
+ }
47
+ }
48
+ }
49
+ return slices.filter(notNull);
50
+ }
51
+ _canMerge(lhs, rhs) {
52
+ if (!lhs || !rhs) {
53
+ return false;
54
+ }
55
+ return lhs.endIndex >= rhs.startIndex;
56
+ }
57
+ _merge(lhs, rhs) {
58
+ return {
59
+ startIndex: lhs.startIndex,
60
+ endIndex: rhs.endIndex,
61
+ data: [...lhs.data, ...rhs.data.slice(lhs.endIndex - rhs.startIndex)],
62
+ };
63
+ }
64
+ }
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvbm9kZS1lbnRyaWVzL25vZGUtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBVzVDLE1BQU0sT0FBTyxTQUFTO0lBQXRCO1FBQ1ksWUFBTyxHQUFpQyxFQUFFLENBQUM7SUFvRXZELENBQUM7SUFsRUcsR0FBRyxDQUFDLEtBQXdCO1FBQ3hCLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3BGO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsS0FBSztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxHQUFHLENBQUMsS0FBcUI7UUFDckIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzlCLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDMUUsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FDbkIsS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUNuQyxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQ3BDLENBQUM7YUFDTDtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELGVBQWUsQ0FBQyxjQUE4QjtRQUMxQyxJQUFJLFNBQVMsR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDO1FBQzFDLElBQUksT0FBTyxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUM7UUFDdEMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzlCLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxTQUFTLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLEVBQUU7Z0JBQzdELFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO2FBQzlCO2lCQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxPQUFPLEVBQUU7Z0JBQ2hFLE9BQU8sR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxTQUFTLElBQUksT0FBTyxFQUFFO2dCQUN0QixPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE1BQTJCO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN4QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzlDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxvQkFBb0I7aUJBQ3pDO2FBQ0o7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sU0FBUyxDQUFDLEdBQXNCLEVBQUUsR0FBc0I7UUFDNUQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNkLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxHQUFHLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUM7SUFDMUMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxHQUFzQixFQUFFLEdBQXNCO1FBQ3pELE9BQU87WUFDSCxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVU7WUFDMUIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1lBQ3RCLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3hFLENBQUM7SUFDTixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBub3ROdWxsIH0gZnJvbSAnLi4vdXRpbC9mdW5jdGlvbnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVDYWNoZVJhbmdlIHtcbiAgICBzdGFydEluZGV4OiBudW1iZXI7XG4gICAgZW5kSW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlQ2FjaGVTbGljZTxUPiBleHRlbmRzIE5vZGVDYWNoZVJhbmdlIHtcbiAgICBkYXRhOiByZWFkb25seSBUW107XG59XG5cbmV4cG9ydCBjbGFzcyBOb2RlQ2FjaGU8VD4ge1xuICAgIHByaXZhdGUgX3NsaWNlczogcmVhZG9ubHkgTm9kZUNhY2hlU2xpY2U8VD5bXSA9IFtdO1xuXG4gICAgYWRkKHNsaWNlOiBOb2RlQ2FjaGVTbGljZTxUPik6IHZvaWQge1xuICAgICAgICBpZiAoc2xpY2UuZW5kSW5kZXggLSBzbGljZS5zdGFydEluZGV4ICE9PSBzbGljZS5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byBhZGQgaW52YWxpZCBzbGljZSB0byBjYWNoZTogJyArIEpTT04uc3RyaW5naWZ5KHNsaWNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2xpY2VzID0gdGhpcy5fbm9ybWFsaXplU2xpY2VzKFsuLi50aGlzLl9zbGljZXMsIHNsaWNlXSk7XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX3NsaWNlcyA9IFtdO1xuICAgIH1cblxuICAgIGdldChyYW5nZTogTm9kZUNhY2hlUmFuZ2UpOiBUW10gfCBudWxsIHtcbiAgICAgICAgZm9yIChjb25zdCBzbGljZSBvZiB0aGlzLl9zbGljZXMpIHtcbiAgICAgICAgICAgIGlmIChzbGljZS5zdGFydEluZGV4IDw9IHJhbmdlLnN0YXJ0SW5kZXggJiYgc2xpY2UuZW5kSW5kZXggPj0gcmFuZ2UuZW5kSW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2xpY2UuZGF0YS5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnRJbmRleCAtIHNsaWNlLnN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZEluZGV4IC0gc2xpY2Uuc3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldE1pc3NpbmdSYW5nZShyZXF1ZXN0ZWRSYW5nZTogTm9kZUNhY2hlUmFuZ2UpOiBOb2RlQ2FjaGVSYW5nZSB8IG51bGwge1xuICAgICAgICBsZXQgZnJvbUluZGV4ID0gcmVxdWVzdGVkUmFuZ2Uuc3RhcnRJbmRleDtcbiAgICAgICAgbGV0IHRvSW5kZXggPSByZXF1ZXN0ZWRSYW5nZS5lbmRJbmRleDtcbiAgICAgICAgZm9yIChjb25zdCBzbGljZSBvZiB0aGlzLl9zbGljZXMpIHtcbiAgICAgICAgICAgIGlmIChzbGljZS5zdGFydEluZGV4IDw9IGZyb21JbmRleCAmJiBzbGljZS5lbmRJbmRleCA+IGZyb21JbmRleCkge1xuICAgICAgICAgICAgICAgIGZyb21JbmRleCA9IHNsaWNlLmVuZEluZGV4O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzbGljZS5zdGFydEluZGV4IDwgdG9JbmRleCAmJiBzbGljZS5lbmRJbmRleCA+PSB0b0luZGV4KSB7XG4gICAgICAgICAgICAgICAgdG9JbmRleCA9IHNsaWNlLnN0YXJ0SW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZnJvbUluZGV4ID49IHRvSW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGFydEluZGV4OiBmcm9tSW5kZXgsIGVuZEluZGV4OiB0b0luZGV4IH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbm9ybWFsaXplU2xpY2VzKHNsaWNlczogTm9kZUNhY2hlU2xpY2U8VD5bXSk6IE5vZGVDYWNoZVNsaWNlPFQ+W10ge1xuICAgICAgICBzbGljZXMuc29ydCgobGhzLCByaHMpID0+IGxocy5zdGFydEluZGV4IC0gcmhzLnN0YXJ0SW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWNlcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHNsaWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jYW5NZXJnZShzbGljZXNbaV0sIHNsaWNlc1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2xpY2VzW2ldID0gdGhpcy5fbWVyZ2Uoc2xpY2VzW2ldLCBzbGljZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICBzbGljZXNbal0gPSBudWxsOyAvLyBNYXJrIGZvciBkZWxldGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2xpY2VzLmZpbHRlcihub3ROdWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jYW5NZXJnZShsaHM6IE5vZGVDYWNoZVNsaWNlPFQ+LCByaHM6IE5vZGVDYWNoZVNsaWNlPFQ+KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbGhzIHx8ICFyaHMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGhzLmVuZEluZGV4ID49IHJocy5zdGFydEluZGV4O1xuICAgIH1cblxuICAgIHByaXZhdGUgX21lcmdlKGxoczogTm9kZUNhY2hlU2xpY2U8VD4sIHJoczogTm9kZUNhY2hlU2xpY2U8VD4pOiBOb2RlQ2FjaGVTbGljZTxUPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydEluZGV4OiBsaHMuc3RhcnRJbmRleCxcbiAgICAgICAgICAgIGVuZEluZGV4OiByaHMuZW5kSW5kZXgsXG4gICAgICAgICAgICBkYXRhOiBbLi4ubGhzLmRhdGEsIC4uLnJocy5kYXRhLnNsaWNlKGxocy5lbmRJbmRleCAtIHJocy5zdGFydEluZGV4KV0sXG4gICAgICAgIH07XG4gICAgfVxufVxuIl19
@@ -0,0 +1,4 @@
1
+ import { NodeDataSource } from './node-data-source';
2
+ export class NodeDataSourceRemote extends NodeDataSource {
3
+ }
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1kYXRhLXNvdXJjZS1yZW1vdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lZHUtc2hhcmluZy11aS9zcmMvbGliL25vZGUtZW50cmllcy9ub2RlLWRhdGEtc291cmNlLXJlbW90ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFhcEQsTUFBTSxPQUFnQixvQkFHcEIsU0FBUSxjQUFpQjtDQWdCMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb2RlRGF0YVNvdXJjZSB9IGZyb20gJy4vbm9kZS1kYXRhLXNvdXJjZSc7XG5pbXBvcnQgeyBHZW5lcmljQXV0aG9yaXR5LCBOb2RlIH0gZnJvbSAnbmd4LWVkdS1zaGFyaW5nLWFwaSc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2VQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBQYWdpbmF0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL25vZGUtZW50cmllcy1nbG9iYWwuc2VydmljZSc7XG5pbXBvcnQgeyBTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBTb3J0UGFuZWwgfSBmcm9tICcuLi90eXBlcy9saXN0LWl0ZW0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRpb25Db25maWcge1xuICAgIGRlZmF1bHRQYWdlU2l6ZTogbnVtYmVyO1xuICAgIHN0cmF0ZWd5OiBQYWdpbmF0aW9uU3RyYXRlZ3k7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOb2RlRGF0YVNvdXJjZVJlbW90ZTxcbiAgICBUIGV4dGVuZHMgTm9kZSB8IEdlbmVyaWNBdXRob3JpdHkgPSBOb2RlLFxuICAgIFAgZXh0ZW5kcyBNYXRUYWJsZURhdGFTb3VyY2VQYWdpbmF0b3IgPSBNYXRUYWJsZURhdGFTb3VyY2VQYWdpbmF0b3IsXG4+IGV4dGVuZHMgTm9kZURhdGFTb3VyY2U8VD4ge1xuICAgIGFic3RyYWN0IGdldCBwYWdpbmF0b3IoKTogUCB8IG51bGw7XG4gICAgYWJzdHJhY3Qgc2V0IHBhZ2luYXRvcih2YWx1ZTogUCB8IG51bGwpO1xuICAgIGFic3RyYWN0IGdldCBzb3J0UGFuZWwoKTogU29ydFBhbmVsO1xuICAgIGFic3RyYWN0IHNldCBzb3J0UGFuZWwodmFsdWU6IFNvcnRQYW5lbCk7XG4gICAgYWJzdHJhY3QgbG9hZE1vcmUoKTogYm9vbGVhbjtcblxuICAgIGFic3RyYWN0IHJlZ2lzdGVyUXVlcnlQYXJhbWV0ZXJzKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBpbml0KHtcbiAgICAgICAgcGFnaW5hdGlvbkNvbmZpZyxcbiAgICAgICAgZGVmYXVsdFNvcnQsXG4gICAgfToge1xuICAgICAgICBwYWdpbmF0aW9uQ29uZmlnOiBQYWdpbmF0aW9uQ29uZmlnO1xuICAgICAgICBkZWZhdWx0U29ydDogU29ydDtcbiAgICB9KTogdm9pZDtcbn1cbiJdfQ==
@@ -0,0 +1,115 @@
1
+ import { DataSource } from '@angular/cdk/collections';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { Helper } from '../util/helper';
4
+ export class NodeDataSource extends DataSource {
5
+ get isLoading() {
6
+ return this.isLoadingSubject.value;
7
+ }
8
+ set isLoading(isLoading) {
9
+ this.isLoadingSubject.next(isLoading);
10
+ }
11
+ get itemsCap() {
12
+ return this._itemsCap;
13
+ }
14
+ set itemsCap(value) {
15
+ this._itemsCap = value;
16
+ this.connectRenderData();
17
+ }
18
+ constructor(initialData = []) {
19
+ super();
20
+ this.dataStream = new BehaviorSubject([]);
21
+ this.pagination$ = new BehaviorSubject(null);
22
+ // Include `LoadingState` to be type-compatible to `NodeDataSourceRemote` although not used
23
+ // here.
24
+ this.isLoadingSubject = new BehaviorSubject(false);
25
+ this.initialPageLoaded = false;
26
+ this.renderData = new BehaviorSubject([]);
27
+ this.setData(initialData);
28
+ }
29
+ connect() {
30
+ if (!this.renderDataSubscription) {
31
+ this.connectRenderData();
32
+ }
33
+ return this.renderData;
34
+ }
35
+ connectRenderData() {
36
+ this.renderDataSubscription?.unsubscribe();
37
+ if (this.itemsCap) {
38
+ this.renderDataSubscription = this.itemsCap
39
+ .connect(this.dataStream)
40
+ .subscribe((data) => this.renderData.next(data));
41
+ }
42
+ else {
43
+ this.renderDataSubscription = this.dataStream.subscribe((data) => this.renderData.next(data));
44
+ }
45
+ }
46
+ connectPagination() {
47
+ return this.pagination$;
48
+ }
49
+ disconnect() { }
50
+ setData(data, pagination = null) {
51
+ this.dataStream.next(data);
52
+ this.setPagination(pagination);
53
+ }
54
+ appendData(appendData, location = 'after') {
55
+ let data = this.getData();
56
+ if (location === 'after') {
57
+ data = data.concat(appendData);
58
+ }
59
+ else {
60
+ data = appendData.concat(data);
61
+ }
62
+ this.dataStream.next(data);
63
+ }
64
+ /**
65
+ * Removes elements from the visible data.
66
+ */
67
+ removeData(toRemove) {
68
+ const newData = this.getData().filter((value) => !toRemove.some((d) => Helper.objectEquals(d.ref, value.ref)));
69
+ const removedData = this.getData().filter((value) => !newData.includes(value));
70
+ this.dataStream.next(newData);
71
+ if (this.pagination$.value) {
72
+ const pagination = this.pagination$.value;
73
+ this.setPagination({
74
+ count: pagination.count - removedData.length,
75
+ from: pagination.from,
76
+ total: pagination.total - removedData.length,
77
+ });
78
+ }
79
+ }
80
+ setPagination(pagination) {
81
+ this.pagination$.next(pagination);
82
+ }
83
+ reset() {
84
+ this.setData([]);
85
+ }
86
+ hasMore() {
87
+ if (!this.pagination$.value) {
88
+ return undefined;
89
+ }
90
+ return this.pagination$.value.total > this.dataStream.value?.length;
91
+ }
92
+ // FIXME: This is somewhat dangerous because we rely on `connect` being called from outside, but
93
+ // this method provides a way to access data without ever calling `connect`.
94
+ getData() {
95
+ return this.renderData.value;
96
+ }
97
+ isEmpty() {
98
+ return this.dataStream.value?.length === 0;
99
+ }
100
+ getTotal() {
101
+ return this.pagination$.value?.total ?? this.dataStream.value?.length ?? 0;
102
+ }
103
+ isFullyLoaded() {
104
+ return this.getTotal() <= this.dataStream.value?.length;
105
+ }
106
+ /**
107
+ * force a refresh of all elements in the current data stream
108
+ * trigger this to enforce a rebuild of the nodes in all sub-components
109
+ * i.e. if data from some nodes has changed
110
+ */
111
+ refresh() {
112
+ this.dataStream.next(Helper.deepCopy(this.dataStream.value));
113
+ }
114
+ }
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1kYXRhLXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvbm9kZS1lbnRyaWVzL25vZGUtZGF0YS1zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBR2pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVl4QyxNQUFNLE9BQU8sY0FBa0QsU0FBUSxVQUFhO0lBTWhGLElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsU0FBaUM7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBR0QsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUF5QjtRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBSUQsWUFBWSxjQUFtQixFQUFFO1FBQzdCLEtBQUssRUFBRSxDQUFDO1FBeEJGLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBTSxFQUFFLENBQUMsQ0FBQztRQUM1QyxnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFhLElBQUksQ0FBQyxDQUFDO1FBQzVELDJGQUEyRjtRQUMzRixRQUFRO1FBQ0QscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQXlCLEtBQUssQ0FBQyxDQUFDO1FBTzdFLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQVNoQixlQUFV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ImltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEl0ZW1zQ2FwIH0gZnJvbSAnLi9pdGVtcy1jYXAnO1xuaW1wb3J0IHsgTm9kZSwgR2VuZXJpY0F1dGhvcml0eSwgUGFnaW5hdGlvbiB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0IHsgSGVscGVyIH0gZnJvbSAnLi4vdXRpbC9oZWxwZXInO1xuXG5leHBvcnQgdHlwZSBMb2FkaW5nU3RhdGUgPVxuICAgIC8vIFRoZSBkYXRhIHNvdXJjZSBpcyBsb2FkaW5nIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgIHwgJ2luaXRpYWwnXG4gICAgLy8gTG9hZGluZyBkYXRhIGFmdGVyIGNoYW5nZSBvZiBwYXJhbWV0ZXJzLCBpLmUuLCBpdCB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgZGF0YSB3aGVuIGRvbmUuXG4gICAgfCAncmVzZXQnXG4gICAgLy8gTG9hZGluZyBhbm90aGVyIHBhZ2Ugd2l0aCB1bmNoYW5nZWQgcGFyYW1ldGVycy5cbiAgICB8ICdwYWdlJ1xuICAgIC8vIExvYWRpbmcgZG9uZS5cbiAgICB8IGZhbHNlO1xuXG5leHBvcnQgY2xhc3MgTm9kZURhdGFTb3VyY2U8VCBleHRlbmRzIE5vZGUgfCBHZW5lcmljQXV0aG9yaXR5PiBleHRlbmRzIERhdGFTb3VyY2U8VD4ge1xuICAgIHByb3RlY3RlZCBkYXRhU3RyZWFtID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUW10+KFtdKTtcbiAgICBwcml2YXRlIHBhZ2luYXRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQYWdpbmF0aW9uPihudWxsKTtcbiAgICAvLyBJbmNsdWRlIGBMb2FkaW5nU3RhdGVgIHRvIGJlIHR5cGUtY29tcGF0aWJsZSB0byBgTm9kZURhdGFTb3VyY2VSZW1vdGVgIGFsdGhvdWdoIG5vdCB1c2VkXG4gICAgLy8gaGVyZS5cbiAgICBwdWJsaWMgaXNMb2FkaW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TG9hZGluZ1N0YXRlIHwgYm9vbGVhbj4oZmFsc2UpO1xuICAgIGdldCBpc0xvYWRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTG9hZGluZ1N1YmplY3QudmFsdWU7XG4gICAgfVxuICAgIHNldCBpc0xvYWRpbmcoaXNMb2FkaW5nOiBMb2FkaW5nU3RhdGUgfCBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nU3ViamVjdC5uZXh0KGlzTG9hZGluZyk7XG4gICAgfVxuICAgIGluaXRpYWxQYWdlTG9hZGVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9pdGVtc0NhcDogSXRlbXNDYXA8VD4gfCBudWxsO1xuICAgIGdldCBpdGVtc0NhcCgpOiBJdGVtc0NhcDxUPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNDYXA7XG4gICAgfVxuICAgIHNldCBpdGVtc0NhcCh2YWx1ZTogSXRlbXNDYXA8VD4gfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zQ2FwID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY29ubmVjdFJlbmRlckRhdGEoKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHJlbmRlckRhdGEgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pO1xuICAgIHByb3RlY3RlZCByZW5kZXJEYXRhU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoaW5pdGlhbERhdGE6IFRbXSA9IFtdKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2V0RGF0YShpbml0aWFsRGF0YSk7XG4gICAgfVxuXG4gICAgY29ubmVjdCgpOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgICAgICBpZiAoIXRoaXMucmVuZGVyRGF0YVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0UmVuZGVyRGF0YSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckRhdGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25uZWN0UmVuZGVyRGF0YSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW5kZXJEYXRhU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAodGhpcy5pdGVtc0NhcCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy5pdGVtc0NhcFxuICAgICAgICAgICAgICAgIC5jb25uZWN0KHRoaXMuZGF0YVN0cmVhbSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB0aGlzLnJlbmRlckRhdGEubmV4dChkYXRhKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckRhdGFTdWJzY3JpcHRpb24gPSB0aGlzLmRhdGFTdHJlYW0uc3Vic2NyaWJlKChkYXRhKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyRGF0YS5uZXh0KGRhdGEpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbm5lY3RQYWdpbmF0aW9uKCk6IE9ic2VydmFibGU8UGFnaW5hdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uJDtcbiAgICB9XG5cbiAgICBkaXNjb25uZWN0KCkge31cblxuICAgIHNldERhdGEoZGF0YTogVFtdLCBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uID0gbnVsbCkge1xuICAgICAgICB0aGlzLmRhdGFTdHJlYW0ubmV4dChkYXRhKTtcbiAgICAgICAgdGhpcy5zZXRQYWdpbmF0aW9uKHBhZ2luYXRpb24pO1xuICAgIH1cblxuICAgIGFwcGVuZERhdGEoYXBwZW5kRGF0YTogVFtdLCBsb2NhdGlvbjogJ2JlZm9yZScgfCAnYWZ0ZXInID0gJ2FmdGVyJykge1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0RGF0YSgpO1xuICAgICAgICBpZiAobG9jYXRpb24gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgIGRhdGEgPSBkYXRhLmNvbmNhdChhcHBlbmREYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSBhcHBlbmREYXRhLmNvbmNhdChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFTdHJlYW0ubmV4dChkYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnRzIGZyb20gdGhlIHZpc2libGUgZGF0YS5cbiAgICAgKi9cbiAgICByZW1vdmVEYXRhKHRvUmVtb3ZlOiBUW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IHRoaXMuZ2V0RGF0YSgpLmZpbHRlcihcbiAgICAgICAgICAgICh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAhdG9SZW1vdmUuc29tZSgoZCkgPT4gSGVscGVyLm9iamVjdEVxdWFscygoZCBhcyBOb2RlKS5yZWYsICh2YWx1ZSBhcyBOb2RlKS5yZWYpKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZERhdGEgPSB0aGlzLmdldERhdGEoKS5maWx0ZXIoKHZhbHVlKSA9PiAhbmV3RGF0YS5pbmNsdWRlcyh2YWx1ZSkpO1xuICAgICAgICB0aGlzLmRhdGFTdHJlYW0ubmV4dChuZXdEYXRhKTtcbiAgICAgICAgaWYgKHRoaXMucGFnaW5hdGlvbiQudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2luYXRpb24gPSB0aGlzLnBhZ2luYXRpb24kLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5zZXRQYWdpbmF0aW9uKHtcbiAgICAgICAgICAgICAgICBjb3VudDogcGFnaW5hdGlvbi5jb3VudCAtIHJlbW92ZWREYXRhLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBmcm9tOiBwYWdpbmF0aW9uLmZyb20sXG4gICAgICAgICAgICAgICAgdG90YWw6IHBhZ2luYXRpb24udG90YWwgLSByZW1vdmVkRGF0YS5sZW5ndGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFBhZ2luYXRpb24ocGFnaW5hdGlvbjogUGFnaW5hdGlvbikge1xuICAgICAgICB0aGlzLnBhZ2luYXRpb24kLm5leHQocGFnaW5hdGlvbik7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuc2V0RGF0YShbXSk7XG4gICAgfVxuXG4gICAgaGFzTW9yZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhZ2luYXRpb24kLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb24kLnZhbHVlLnRvdGFsID4gdGhpcy5kYXRhU3RyZWFtLnZhbHVlPy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gRklYTUU6IFRoaXMgaXMgc29tZXdoYXQgZGFuZ2Vyb3VzIGJlY2F1c2Ugd2UgcmVseSBvbiBgY29ubmVjdGAgYmVpbmcgY2FsbGVkIGZyb20gb3V0c2lkZSwgYnV0XG4gICAgLy8gdGhpcyBtZXRob2QgcHJvdmlkZXMgYSB3YXkgdG8gYWNjZXNzIGRhdGEgd2l0aG91dCBldmVyIGNhbGxpbmcgYGNvbm5lY3RgLlxuICAgIGdldERhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckRhdGEudmFsdWU7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVN0cmVhbS52YWx1ZT8ubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIGdldFRvdGFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uJC52YWx1ZT8udG90YWwgPz8gdGhpcy5kYXRhU3RyZWFtLnZhbHVlPy5sZW5ndGggPz8gMDtcbiAgICB9XG5cbiAgICBpc0Z1bGx5TG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb3RhbCgpIDw9IHRoaXMuZGF0YVN0cmVhbS52YWx1ZT8ubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGZvcmNlIGEgcmVmcmVzaCBvZiBhbGwgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgZGF0YSBzdHJlYW1cbiAgICAgKiB0cmlnZ2VyIHRoaXMgdG8gZW5mb3JjZSBhIHJlYnVpbGQgb2YgdGhlIG5vZGVzIGluIGFsbCBzdWItY29tcG9uZW50c1xuICAgICAqIGkuZS4gaWYgZGF0YSBmcm9tIHNvbWUgbm9kZXMgaGFzIGNoYW5nZWRcbiAgICAgKi9cbiAgICByZWZyZXNoKCkge1xuICAgICAgICB0aGlzLmRhdGFTdHJlYW0ubmV4dChIZWxwZXIuZGVlcENvcHkodGhpcy5kYXRhU3RyZWFtLnZhbHVlKSk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,131 @@
1
+ import { Component, Input, Optional, ViewChild, } from '@angular/core';
2
+ import { ClickSource, InteractionType } from '../entries-model';
3
+ import { CustomFieldSpecialType } from '../node-entries-global.service';
4
+ import { Target } from '../../types/option-item';
5
+ import { RestConstants } from 'ngx-edu-sharing-api';
6
+ import { ColorHelper, PreferredColor } from '../../util/color-helper';
7
+ import { take } from 'rxjs/operators';
8
+ import { BehaviorSubject } from 'rxjs';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "../../services/node-entries.service";
11
+ import * as i2 from "../../services/node-helper.service";
12
+ import * as i3 from "ngx-edu-sharing-api";
13
+ import * as i4 from "../node-entries-templates.service";
14
+ import * as i5 from "../node-entries-global.service";
15
+ import * as i6 from "../../services/abstract/toast.service";
16
+ import * as i7 from "@angular/common";
17
+ import * as i8 from "../../directives/icon.directive";
18
+ import * as i9 from "../../directives/focus-state.directive";
19
+ import * as i10 from "../../node-url/node-url.component";
20
+ import * as i11 from "../../list-items/list-base/list-base.component";
21
+ import * as i12 from "@angular/material/checkbox";
22
+ import * as i13 from "@angular/material/button";
23
+ import * as i14 from "@angular/material/menu";
24
+ import * as i15 from "@angular/material/core";
25
+ import * as i16 from "../node-rating/node-rating.component";
26
+ import * as i17 from "../preview-image/preview-image.component";
27
+ import * as i18 from "../node-type-badge/node-type-badge.component";
28
+ import * as i19 from "../option-button/option-button.component";
29
+ import * as i20 from "../node-stats-badges/node-stats-badges.component";
30
+ import * as i21 from "../../pipes/node-title.pipe";
31
+ import * as i22 from "@ngx-translate/core";
32
+ import * as i23 from "../list-item-label.pipe";
33
+ export class NodeEntriesCardComponent {
34
+ constructor(entriesService, nodeHelper, applicationRef, configService, authenticationService, templatesService, nodeEntriesGlobalService, toast) {
35
+ this.entriesService = entriesService;
36
+ this.nodeHelper = nodeHelper;
37
+ this.applicationRef = applicationRef;
38
+ this.configService = configService;
39
+ this.authenticationService = authenticationService;
40
+ this.templatesService = templatesService;
41
+ this.nodeEntriesGlobalService = nodeEntriesGlobalService;
42
+ this.toast = toast;
43
+ this.InteractionType = InteractionType;
44
+ this.Target = Target;
45
+ this.ClickSource = ClickSource;
46
+ this.CustomFieldSpecialType = CustomFieldSpecialType;
47
+ this.showRatings = new BehaviorSubject(false);
48
+ }
49
+ ngOnChanges(changes) {
50
+ this.isCollection = this.nodeHelper.isNodeCollection(changes.node?.currentValue);
51
+ }
52
+ getTextColor() {
53
+ return ColorHelper.getPreferredColor(this.node.collection.color) === PreferredColor.Black
54
+ ? '#000'
55
+ : '#fff';
56
+ }
57
+ optionsOnCard() {
58
+ const options = this.entriesService.options[Target.List];
59
+ const always = options.filter((o) => o.showAlways);
60
+ if (always.some((o) => o.showCallback(this.node))) {
61
+ return always;
62
+ }
63
+ // we do NOT show any additional actions
64
+ return [];
65
+ // return options.filter((o) => o.showAsAction && o.showCallback(this.node)).slice(0, 3);
66
+ }
67
+ openContextmenu(event) {
68
+ event.stopPropagation();
69
+ event.preventDefault();
70
+ if (!this.dropdown) {
71
+ // Call `preventDefault()` even when there is no menu, so we can use `cdkDrag` with a
72
+ // start delay without being interrupted by the standard long-tap action.
73
+ return;
74
+ }
75
+ if (event instanceof MouseEvent) {
76
+ ({ clientX: this.dropdownLeft, clientY: this.dropdownTop } = event);
77
+ }
78
+ else {
79
+ ({ x: this.dropdownLeft, y: this.dropdownTop } = event.target.getBoundingClientRect());
80
+ }
81
+ if (!this.entriesService.selection.selected.includes(this.node)) {
82
+ this.entriesService.selection.clear();
83
+ this.entriesService.selection.select(this.node);
84
+ }
85
+ // Wait for the menu to reflect changed options.
86
+ setTimeout(() => {
87
+ if (this.dropdown.canShowDropdown()) {
88
+ this.menuTrigger.openMenu();
89
+ }
90
+ else {
91
+ this.toast.toast('NO_AVAILABLE_OPTIONS');
92
+ }
93
+ });
94
+ }
95
+ getVisibleColumns() {
96
+ return this.entriesService.columns?.filter((c) => c.visible);
97
+ }
98
+ async openMenu(node) {
99
+ this.entriesService.selection.clear();
100
+ this.entriesService.selection.select(node);
101
+ await this.applicationRef.tick();
102
+ this.dropdown.menu.focusFirstItem();
103
+ }
104
+ async ngOnInit() {
105
+ await this.configService.observeConfig().pipe(take(1)).toPromise();
106
+ this.showRatings.next(this.configService.instant('rating.mode', 'none') !== 'none' &&
107
+ (await this.authenticationService.hasToolpermission(RestConstants.TOOLPERMISSION_RATE_READ)));
108
+ }
109
+ getTemplate(name) {
110
+ return this.nodeEntriesGlobalService.getCustomFieldTemplate({
111
+ type: 'NODE',
112
+ name,
113
+ }, this.node);
114
+ }
115
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: NodeEntriesCardComponent, deps: [{ token: i1.NodeEntriesService }, { token: i2.NodeHelperService }, { token: i0.ApplicationRef }, { token: i3.ConfigService }, { token: i3.AuthenticationService }, { token: i4.NodeEntriesTemplatesService }, { token: i5.NodeEntriesGlobalService }, { token: i6.Toast, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
116
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: NodeEntriesCardComponent, selector: "es-node-entries-card", inputs: { dropdown: "dropdown", node: "node" }, viewQueries: [{ propertyName: "menuTrigger", first: true, predicate: ["menuTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"grid-card\"\n [class.grid-card-collection]=\"isCollection\"\n [class.grid-card-virtual]=\"$any(node).virtual\"\n [style.background-color]=\"isCollection ? node.collection.color : null\"\n [class.dynamic-single-click]=\"entriesService.singleClickHint === 'dynamic'\"\n [class.selected]=\"entriesService.selection.isSelected(node)\"\n (contextmenu)=\"openContextmenu($event)\"\n (keydown.ContextMenu)=\"openContextmenu($event)\"\n>\n <div\n *ngIf=\"templatesService.overlay\"\n class=\"card-overlay\"\n (click)=\"\n entriesService.clickItem.emit({\n element: node,\n source: ClickSource.Overlay\n })\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templatesService.overlay; context: { element: node }\"\n ></ng-container>\n </div>\n <button\n *ngIf=\"dropdown\"\n #menuTrigger=\"matMenuTrigger\"\n mat-button\n class=\"dropdown-dummy cdk-visually-hidden\"\n [style.left.px]=\"dropdownLeft\"\n [style.top.px]=\"dropdownTop\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ></button>\n <div class=\"card-top-bar\" [style.background-color]=\"isCollection ? node.collection.color : null\">\n <div class=\"card-top-bar-collection-color\" *ngIf=\"nodeHelper.isNodeCollection(node)\"></div>\n <es-node-type-badge [node]=\"node\"></es-node-type-badge>\n <div *ngIf=\"isCollection && node.collection.pinned\" class=\"card-top-bar-flag\">\n <i esIcon=\"edu-pin\"></i>\n </div>\n <div class=\"card-top-bar-empty\"></div>\n <es-node-stats-badges [node]=\"node\"></es-node-stats-badges>\n <div class=\"card-top-bar-checkbox\" *ngIf=\"entriesService.checkbox\">\n <mat-checkbox\n [checked]=\"entriesService.selection.isSelected(node)\"\n (change)=\"entriesService.onCheckboxChanged(node, $event.checked)\"\n aria-label=\"{{ 'SELECT' | translate : { element: (node | nodeTitle) } }}\"\n ></mat-checkbox>\n </div>\n </div>\n <es-node-url\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n mode=\"wrapper\"\n [node]=\"node\"\n esFocusState\n #cardFocusState=\"esFocusState\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n image;\n context: { playAnimation: cardFocusState.hovering || cardFocusState.hasFocus }\n \"\n ></ng-container>\n <ng-container *ngTemplateOutlet=\"meta\"></ng-container>\n </es-node-url>\n <div\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n matRipple\n (click)=\"\n entriesService.onClicked({\n event: $event,\n element: node,\n source: ClickSource.Metadata\n })\n \"\n (dblclick)=\"\n entriesService.dblClickItem.emit({\n element: node,\n source: ClickSource.Metadata\n })\n \"\n esFocusState\n #cardFocusState=\"esFocusState\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n image;\n context: { playAnimation: cardFocusState.hovering || cardFocusState.hasFocus }\n \"\n ></ng-container>\n <ng-container *ngTemplateOutlet=\"meta\"></ng-container>\n </div>\n <div class=\"card-options\" *ngIf=\"showRatings | async\">\n <div class=\"card-rating-area\">\n <es-node-rating [node]=\"node\"></es-node-rating>\n </div>\n <div class=\"card-options-area\">\n <es-option-button\n *ngFor=\"let option of optionsOnCard()\"\n class=\"card-options-always\"\n [option]=\"option\"\n [node]=\"node\"\n ></es-option-button>\n <div class=\"card-options-spacer\"></div>\n <button\n *ngIf=\"dropdown\"\n mat-icon-button\n color=\"primary\"\n (click)=\"openMenu(node)\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n [attr.aria-label]=\"'OPTIONS_FOR' | translate : { element: (node | nodeTitle) }\"\n data-test=\"card-options-button\"\n >\n <i esIcon=\"more_vert\"></i>\n </button>\n </div>\n </div>\n <ng-template #image let-playAnimation=\"playAnimation\">\n <div\n class=\"card-image-area\"\n [style.background-color]=\"isCollection ? node.collection.color : null\"\n >\n <ng-container *ngIf=\"getTemplate(CustomFieldSpecialType.preview) as ref\">\n <ng-container *ngTemplateOutlet=\"ref; context: { node: this.node }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!getTemplate(CustomFieldSpecialType.preview)\">\n <es-preview-image\n *ngIf=\"!(isCollection && node.preview.isIcon)\"\n [node]=\"node\"\n [playAnimation]=\"playAnimation\"\n ></es-preview-image>\n <div *ngIf=\"isCollection && node.preview.isIcon\" class=\"card-collection-image\">\n <i esIcon=\"layers\"></i>\n </div>\n </ng-container>\n </div>\n </ng-template>\n <ng-template #meta let-link=\"link\">\n <div class=\"card-meta\">\n <div\n *ngFor=\"let displayPart of getVisibleColumns(); let first = first\"\n class=\"card-meta-row card-meta-row-{{ displayPart.name | lowercase }}\"\n [class.card-meta-row-primary]=\"first\"\n >\n <ng-container *ngIf=\"first\">\n <es-node-url\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n [node]=\"node\"\n #link\n >\n <es-list-base [item]=\"displayPart\" [node]=\"node\" [provideLabel]=\"false\"> </es-list-base>\n </es-node-url>\n <div *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\">\n <es-list-base [item]=\"displayPart\" [node]=\"node\" [provideLabel]=\"false\"> </es-list-base>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!first\">\n <label>\n {{ displayPart | esListItemLabel | async }}\n </label>\n <es-list-base [item]=\"displayPart\" [node]=\"node\" [provideLabel]=\"false\"> </es-list-base>\n </ng-container>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: [".grid-card{transition:all var(--transitionNormal);overflow:hidden;background-color:#fff;box-shadow:0 0 10px #0003;border-radius:var(--cardRoundness);display:grid;height:100%;grid-template-columns:auto}:host-context(body.es-contrast-mode) .grid-card{border:1px solid rgba(0,0,0,.42)}.grid-card.selected{background-color:rgb(var(--palette-primary-50))}.grid-card .dropdown-dummy{position:fixed}.grid-card .card-options{display:grid;grid-template-columns:1fr auto;grid-column-gap:10px}.grid-card .card-options .card-rating-area{display:flex;align-items:center;height:100%}.grid-card .card-options .card-options-area{display:flex}.grid-card .card-options .card-options-area es-option-button,.grid-card .card-options .card-options-area button{transition:all var(--transitionNormal);margin:0 2px;border-radius:50%}.grid-card .card-options .card-options-area es-option-button:hover,.grid-card .card-options .card-options-area es-option-button:focus,.grid-card .card-options .card-options-area button:hover,.grid-card .card-options .card-options-area button:focus{background-color:#fff}.grid-card:not(.grid-card-collection) .card-top-bar{background-color:var(--palette-primary-200)}.grid-card.grid-card-virtual{outline:2px dashed var(--nodeVirtualColor)}.grid-card .card-top-bar{height:40px;display:flex;gap:15px;align-items:center;padding:0 20px;position:relative}.grid-card .card-top-bar .card-top-bar-collection-color{position:absolute;background-color:#ffffff80;inset:0}.grid-card .card-top-bar .card-top-bar-flag{display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;border-radius:50%;background-color:#fff;padding:5px;position:relative;z-index:1;box-shadow:0 0 5px #0000004d}.grid-card .card-top-bar .card-top-bar-flag i{font-size:18px;color:#333}.grid-card .card-top-bar .card-top-bar-flag img{width:18px;height:18px}.grid-card .card-top-bar .card-top-bar-checkbox mat-checkbox{margin-right:-5px;position:relative;top:-1.3px}.grid-card .card-top-bar .card-top-bar-checkbox mat-checkbox.cdk-keyboard-focused ::ng-deep .mat-focus-indicator{outline:none}.grid-card .card-top-bar .card-top-bar-checkbox mat-checkbox.cdk-keyboard-focused ::ng-deep .mat-focus-indicator:after{content:\"\";position:absolute;inset:2px;outline:none;border:var(--focusWidth) solid var(--palette-primary-300);border-color:#fff}.grid-card .card-top-bar .card-top-bar-empty{width:0;flex-grow:1}.grid-card .card-image-area{height:150px;padding:0;display:flex}.grid-card .card-image-area es-preview-image{flex-grow:1}.grid-card .card-image-area .card-collection-image{display:flex;width:100%;height:100%;align-items:center;justify-content:center}.grid-card .card-image-area .card-collection-image i{display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;color:#000000bf;background-color:#ffffff80;padding:40px;font-size:40px;border-radius:50%}.grid-card .card-meta{padding:10px 20px 5px;display:grid;flex-direction:row}.grid-card .card-meta .card-meta-row{display:flex;flex-direction:row;align-items:center;min-height:2.5em;gap:5px}.grid-card .card-meta .card-meta-row:not(:first-child)>label{cursor:inherit;color:var(--textLight);font-size:85%}.grid-card .card-meta .card-meta-row:not(:first-child)>es-list-base{color:#000;flex-grow:1;margin:5px 0;display:flex;justify-content:flex-end;text-align:end;word-break:break-word}.grid-card .card-meta .card-meta-row:first-child>es-list-base,.grid-card .card-meta .card-meta-row:first-child>es-node-url{width:100%;color:var(--textMain);font-size:120%;height:2.5em;text-align:left;word-break:break-word}.grid-card.dynamic-single-click:hover{box-shadow:0 0 20px #0000004d;background-color:rgb(var(--palette-primary-50))}.grid-card.dynamic-single-click.grid-card-collection:hover .card-meta{background-color:#ffffffe6}.grid-card.grid-card-collection .card-meta{background-color:#fffc}.grid-card.grid-card-collection .card-options{background-color:#ffffffe6}.grid-card .card-options{border-top:1px solid #ddd}:host ::ng-deep .grid-card .card-meta-row:first-child es-list-base,:host ::ng-deep .grid-card .card-meta-row:first-child es-node-url a es-list-base{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;line-height:1.25em;max-height:2.5em;-webkit-line-clamp:2;-webkit-box-orient:vertical}:host ::ng-deep .grid-card .card-meta-row:first-child es-list-base>es-list-text,:host ::ng-deep .grid-card .card-meta-row:first-child es-node-url a es-list-base>es-list-text{word-break:break-word}:host ::ng-deep .grid-card .card-meta-row es-node-url a{color:var(--textMain)}:host ::ng-deep .grid-card .card-meta-row es-node-url a.cdk-keyboard-focused{display:inline-flex;outline:none;outline:var(--focusWidth) solid var(--palette-primary-300);outline-offset:2px}:host ::ng-deep .card-meta es-list-base img{max-width:100px;max-height:20px}:host ::ng-deep .card-meta es-list-base es-list-node-license img{height:20px}:host ::ng-deep .card-meta es-list-base es-list-collection-info{display:flex;align-items:center}:host ::ng-deep .card-meta es-list-base es-list-collection-info i{font-size:12pt;margin:0 6px}:host ::ng-deep .grid-card-collection es-node-url a.cdk-keyboard-focused .card-meta{background-color:#fff}.card-overlay{position:absolute;z-index:2;inset:0;pointer-events:none}.card-overlay ::ng-deep>*{pointer-events:auto}.grid-card{grid-template-rows:40px auto auto}.grid-card .card-meta .card-meta-row>es-list-base{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;line-height:1.25em;max-height:2.5em;-webkit-line-clamp:2;-webkit-box-orient:vertical}:host ::ng-deep .grid-card es-node-url .node-url-wrapper{height:100%}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "directive", type: i9.FocusStateDirective, selector: "[esFocusState]", exportAs: ["esFocusState"] }, { kind: "component", type: i10.NodeUrlComponent, selector: "es-node-url", inputs: ["node", "nodes", "target", "scope", "queryParams", "mode", "disabled", "alwaysRipple", "aria-describedby", "aria-label"], outputs: ["buttonClick"] }, { kind: "component", type: i11.ListBaseComponent, selector: "es-list-base", inputs: ["forceText"] }, { kind: "component", type: i12.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i13.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i14.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i15.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "component", type: i16.NodeRatingComponent, selector: "es-node-rating", inputs: ["node"] }, { kind: "component", type: i17.PreviewImageComponent, selector: "es-preview-image", inputs: ["node", "playAnimation"] }, { kind: "component", type: i18.NodeTypeBadgeComponent, selector: "es-node-type-badge", inputs: ["node"] }, { kind: "component", type: i19.OptionButtonComponent, selector: "es-option-button", inputs: ["option", "node"] }, { kind: "component", type: i20.NodeStatsBadgesComponent, selector: "es-node-stats-badges", inputs: ["node", "backgroundStyle"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.LowerCasePipe, name: "lowercase" }, { kind: "pipe", type: i21.NodeTitlePipe, name: "nodeTitle" }, { kind: "pipe", type: i22.TranslatePipe, name: "translate" }, { kind: "pipe", type: i23.ListItemLabelPipe, name: "esListItemLabel" }] }); }
117
+ }
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: NodeEntriesCardComponent, decorators: [{
119
+ type: Component,
120
+ args: [{ selector: 'es-node-entries-card', template: "<div\n class=\"grid-card\"\n [class.grid-card-collection]=\"isCollection\"\n [class.grid-card-virtual]=\"$any(node).virtual\"\n [style.background-color]=\"isCollection ? node.collection.color : null\"\n [class.dynamic-single-click]=\"entriesService.singleClickHint === 'dynamic'\"\n [class.selected]=\"entriesService.selection.isSelected(node)\"\n (contextmenu)=\"openContextmenu($event)\"\n (keydown.ContextMenu)=\"openContextmenu($event)\"\n>\n <div\n *ngIf=\"templatesService.overlay\"\n class=\"card-overlay\"\n (click)=\"\n entriesService.clickItem.emit({\n element: node,\n source: ClickSource.Overlay\n })\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templatesService.overlay; context: { element: node }\"\n ></ng-container>\n </div>\n <button\n *ngIf=\"dropdown\"\n #menuTrigger=\"matMenuTrigger\"\n mat-button\n class=\"dropdown-dummy cdk-visually-hidden\"\n [style.left.px]=\"dropdownLeft\"\n [style.top.px]=\"dropdownTop\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ></button>\n <div class=\"card-top-bar\" [style.background-color]=\"isCollection ? node.collection.color : null\">\n <div class=\"card-top-bar-collection-color\" *ngIf=\"nodeHelper.isNodeCollection(node)\"></div>\n <es-node-type-badge [node]=\"node\"></es-node-type-badge>\n <div *ngIf=\"isCollection && node.collection.pinned\" class=\"card-top-bar-flag\">\n <i esIcon=\"edu-pin\"></i>\n </div>\n <div class=\"card-top-bar-empty\"></div>\n <es-node-stats-badges [node]=\"node\"></es-node-stats-badges>\n <div class=\"card-top-bar-checkbox\" *ngIf=\"entriesService.checkbox\">\n <mat-checkbox\n [checked]=\"entriesService.selection.isSelected(node)\"\n (change)=\"entriesService.onCheckboxChanged(node, $event.checked)\"\n aria-label=\"{{ 'SELECT' | translate : { element: (node | nodeTitle) } }}\"\n ></mat-checkbox>\n </div>\n </div>\n <es-node-url\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n mode=\"wrapper\"\n [node]=\"node\"\n esFocusState\n #cardFocusState=\"esFocusState\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n image;\n context: { playAnimation: cardFocusState.hovering || cardFocusState.hasFocus }\n \"\n ></ng-container>\n <ng-container *ngTemplateOutlet=\"meta\"></ng-container>\n </es-node-url>\n <div\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n matRipple\n (click)=\"\n entriesService.onClicked({\n event: $event,\n element: node,\n source: ClickSource.Metadata\n })\n \"\n (dblclick)=\"\n entriesService.dblClickItem.emit({\n element: node,\n source: ClickSource.Metadata\n })\n \"\n esFocusState\n #cardFocusState=\"esFocusState\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n image;\n context: { playAnimation: cardFocusState.hovering || cardFocusState.hasFocus }\n \"\n ></ng-container>\n <ng-container *ngTemplateOutlet=\"meta\"></ng-container>\n </div>\n <div class=\"card-options\" *ngIf=\"showRatings | async\">\n <div class=\"card-rating-area\">\n <es-node-rating [node]=\"node\"></es-node-rating>\n </div>\n <div class=\"card-options-area\">\n <es-option-button\n *ngFor=\"let option of optionsOnCard()\"\n class=\"card-options-always\"\n [option]=\"option\"\n [node]=\"node\"\n ></es-option-button>\n <div class=\"card-options-spacer\"></div>\n <button\n *ngIf=\"dropdown\"\n mat-icon-button\n color=\"primary\"\n (click)=\"openMenu(node)\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n [attr.aria-label]=\"'OPTIONS_FOR' | translate : { element: (node | nodeTitle) }\"\n data-test=\"card-options-button\"\n >\n <i esIcon=\"more_vert\"></i>\n </button>\n </div>\n </div>\n <ng-template #image let-playAnimation=\"playAnimation\">\n <div\n class=\"card-image-area\"\n [style.background-color]=\"isCollection ? node.collection.color : null\"\n >\n <ng-container *ngIf=\"getTemplate(CustomFieldSpecialType.preview) as ref\">\n <ng-container *ngTemplateOutlet=\"ref; context: { node: this.node }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!getTemplate(CustomFieldSpecialType.preview)\">\n <es-preview-image\n *ngIf=\"!(isCollection && node.preview.isIcon)\"\n [node]=\"node\"\n [playAnimation]=\"playAnimation\"\n ></es-preview-image>\n <div *ngIf=\"isCollection && node.preview.isIcon\" class=\"card-collection-image\">\n <i esIcon=\"layers\"></i>\n </div>\n </ng-container>\n </div>\n </ng-template>\n <ng-template #meta let-link=\"link\">\n <div class=\"card-meta\">\n <div\n *ngFor=\"let displayPart of getVisibleColumns(); let first = first\"\n class=\"card-meta-row card-meta-row-{{ displayPart.name | lowercase }}\"\n [class.card-meta-row-primary]=\"first\"\n >\n <ng-container *ngIf=\"first\">\n <es-node-url\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n [node]=\"node\"\n #link\n >\n <es-list-base [item]=\"displayPart\" [node]=\"node\" [provideLabel]=\"false\"> </es-list-base>\n </es-node-url>\n <div *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\">\n <es-list-base [item]=\"displayPart\" [node]=\"node\" [provideLabel]=\"false\"> </es-list-base>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!first\">\n <label>\n {{ displayPart | esListItemLabel | async }}\n </label>\n <es-list-base [item]=\"displayPart\" [node]=\"node\" [provideLabel]=\"false\"> </es-list-base>\n </ng-container>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: [".grid-card{transition:all var(--transitionNormal);overflow:hidden;background-color:#fff;box-shadow:0 0 10px #0003;border-radius:var(--cardRoundness);display:grid;height:100%;grid-template-columns:auto}:host-context(body.es-contrast-mode) .grid-card{border:1px solid rgba(0,0,0,.42)}.grid-card.selected{background-color:rgb(var(--palette-primary-50))}.grid-card .dropdown-dummy{position:fixed}.grid-card .card-options{display:grid;grid-template-columns:1fr auto;grid-column-gap:10px}.grid-card .card-options .card-rating-area{display:flex;align-items:center;height:100%}.grid-card .card-options .card-options-area{display:flex}.grid-card .card-options .card-options-area es-option-button,.grid-card .card-options .card-options-area button{transition:all var(--transitionNormal);margin:0 2px;border-radius:50%}.grid-card .card-options .card-options-area es-option-button:hover,.grid-card .card-options .card-options-area es-option-button:focus,.grid-card .card-options .card-options-area button:hover,.grid-card .card-options .card-options-area button:focus{background-color:#fff}.grid-card:not(.grid-card-collection) .card-top-bar{background-color:var(--palette-primary-200)}.grid-card.grid-card-virtual{outline:2px dashed var(--nodeVirtualColor)}.grid-card .card-top-bar{height:40px;display:flex;gap:15px;align-items:center;padding:0 20px;position:relative}.grid-card .card-top-bar .card-top-bar-collection-color{position:absolute;background-color:#ffffff80;inset:0}.grid-card .card-top-bar .card-top-bar-flag{display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;border-radius:50%;background-color:#fff;padding:5px;position:relative;z-index:1;box-shadow:0 0 5px #0000004d}.grid-card .card-top-bar .card-top-bar-flag i{font-size:18px;color:#333}.grid-card .card-top-bar .card-top-bar-flag img{width:18px;height:18px}.grid-card .card-top-bar .card-top-bar-checkbox mat-checkbox{margin-right:-5px;position:relative;top:-1.3px}.grid-card .card-top-bar .card-top-bar-checkbox mat-checkbox.cdk-keyboard-focused ::ng-deep .mat-focus-indicator{outline:none}.grid-card .card-top-bar .card-top-bar-checkbox mat-checkbox.cdk-keyboard-focused ::ng-deep .mat-focus-indicator:after{content:\"\";position:absolute;inset:2px;outline:none;border:var(--focusWidth) solid var(--palette-primary-300);border-color:#fff}.grid-card .card-top-bar .card-top-bar-empty{width:0;flex-grow:1}.grid-card .card-image-area{height:150px;padding:0;display:flex}.grid-card .card-image-area es-preview-image{flex-grow:1}.grid-card .card-image-area .card-collection-image{display:flex;width:100%;height:100%;align-items:center;justify-content:center}.grid-card .card-image-area .card-collection-image i{display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;color:#000000bf;background-color:#ffffff80;padding:40px;font-size:40px;border-radius:50%}.grid-card .card-meta{padding:10px 20px 5px;display:grid;flex-direction:row}.grid-card .card-meta .card-meta-row{display:flex;flex-direction:row;align-items:center;min-height:2.5em;gap:5px}.grid-card .card-meta .card-meta-row:not(:first-child)>label{cursor:inherit;color:var(--textLight);font-size:85%}.grid-card .card-meta .card-meta-row:not(:first-child)>es-list-base{color:#000;flex-grow:1;margin:5px 0;display:flex;justify-content:flex-end;text-align:end;word-break:break-word}.grid-card .card-meta .card-meta-row:first-child>es-list-base,.grid-card .card-meta .card-meta-row:first-child>es-node-url{width:100%;color:var(--textMain);font-size:120%;height:2.5em;text-align:left;word-break:break-word}.grid-card.dynamic-single-click:hover{box-shadow:0 0 20px #0000004d;background-color:rgb(var(--palette-primary-50))}.grid-card.dynamic-single-click.grid-card-collection:hover .card-meta{background-color:#ffffffe6}.grid-card.grid-card-collection .card-meta{background-color:#fffc}.grid-card.grid-card-collection .card-options{background-color:#ffffffe6}.grid-card .card-options{border-top:1px solid #ddd}:host ::ng-deep .grid-card .card-meta-row:first-child es-list-base,:host ::ng-deep .grid-card .card-meta-row:first-child es-node-url a es-list-base{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;line-height:1.25em;max-height:2.5em;-webkit-line-clamp:2;-webkit-box-orient:vertical}:host ::ng-deep .grid-card .card-meta-row:first-child es-list-base>es-list-text,:host ::ng-deep .grid-card .card-meta-row:first-child es-node-url a es-list-base>es-list-text{word-break:break-word}:host ::ng-deep .grid-card .card-meta-row es-node-url a{color:var(--textMain)}:host ::ng-deep .grid-card .card-meta-row es-node-url a.cdk-keyboard-focused{display:inline-flex;outline:none;outline:var(--focusWidth) solid var(--palette-primary-300);outline-offset:2px}:host ::ng-deep .card-meta es-list-base img{max-width:100px;max-height:20px}:host ::ng-deep .card-meta es-list-base es-list-node-license img{height:20px}:host ::ng-deep .card-meta es-list-base es-list-collection-info{display:flex;align-items:center}:host ::ng-deep .card-meta es-list-base es-list-collection-info i{font-size:12pt;margin:0 6px}:host ::ng-deep .grid-card-collection es-node-url a.cdk-keyboard-focused .card-meta{background-color:#fff}.card-overlay{position:absolute;z-index:2;inset:0;pointer-events:none}.card-overlay ::ng-deep>*{pointer-events:auto}.grid-card{grid-template-rows:40px auto auto}.grid-card .card-meta .card-meta-row>es-list-base{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;line-height:1.25em;max-height:2.5em;-webkit-line-clamp:2;-webkit-box-orient:vertical}:host ::ng-deep .grid-card es-node-url .node-url-wrapper{height:100%}\n"] }]
121
+ }], ctorParameters: function () { return [{ type: i1.NodeEntriesService }, { type: i2.NodeHelperService }, { type: i0.ApplicationRef }, { type: i3.ConfigService }, { type: i3.AuthenticationService }, { type: i4.NodeEntriesTemplatesService }, { type: i5.NodeEntriesGlobalService }, { type: i6.Toast, decorators: [{
122
+ type: Optional
123
+ }] }]; }, propDecorators: { dropdown: [{
124
+ type: Input
125
+ }], menuTrigger: [{
126
+ type: ViewChild,
127
+ args: ['menuTrigger']
128
+ }], node: [{
129
+ type: Input
130
+ }] } });
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLWNhcmQvbm9kZS1lbnRyaWVzLWNhcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLWNhcmQvbm9kZS1lbnRyaWVzLWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxLQUFLLEVBR0wsUUFBUSxFQUVSLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxzQkFBc0IsRUFBNEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHakQsT0FBTyxFQUE4QyxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT3ZDLE1BQU0sT0FBTyx3QkFBd0I7SUFjakMsWUFDVyxjQUFxQyxFQUNyQyxVQUE2QixFQUM3QixjQUE4QixFQUM5QixhQUE0QixFQUM1QixxQkFBNEMsRUFDNUMsZ0JBQTZDLEVBQzVDLHdCQUFrRCxFQUN0QyxLQUFZO1FBUHpCLG1CQUFjLEdBQWQsY0FBYyxD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QUFDLElBQVksQ0FDcEIsQ0FBQztJQUNOLENBQUM7OEdBdkdRLHdCQUF3QjtrR0FBeEIsd0JBQXdCLDZPQzdCckMsbWdNQXVLQTs7MkZEMUlhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDSSxzQkFBc0I7OzBCQTBCM0IsUUFBUTs0Q0FqQkosUUFBUTtzQkFBaEIsS0FBSztnQkFFb0IsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUVmLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IENsaWNrU291cmNlLCBJbnRlcmFjdGlvblR5cGUgfSBmcm9tICcuLi9lbnRyaWVzLW1vZGVsJztcbmltcG9ydCB7IE5vZGVFbnRyaWVzVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL25vZGUtZW50cmllcy10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBDdXN0b21GaWVsZFNwZWNpYWxUeXBlLCBOb2RlRW50cmllc0dsb2JhbFNlcnZpY2UgfSBmcm9tICcuLi9ub2RlLWVudHJpZXMtZ2xvYmFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vLi4vdHlwZXMvb3B0aW9uLWl0ZW0nO1xuaW1wb3J0IHsgTm9kZUVudHJpZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm9kZS1lbnRyaWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSwgQ29uZmlnU2VydmljZSwgTm9kZSwgUmVzdENvbnN0YW50cyB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0IHsgQ29sb3JIZWxwZXIsIFByZWZlcnJlZENvbG9yIH0gZnJvbSAnLi4vLi4vdXRpbC9jb2xvci1oZWxwZXInO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50JztcbmltcG9ydCB7IFRvYXN0IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWJzdHJhY3QvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlcy1ub2RlLWVudHJpZXMtY2FyZCcsXG4gICAgdGVtcGxhdGVVcmw6ICdub2RlLWVudHJpZXMtY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ25vZGUtZW50cmllcy1jYXJkLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVFbnRyaWVzQ2FyZENvbXBvbmVudDxUIGV4dGVuZHMgTm9kZT4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG4gICAgcmVhZG9ubHkgSW50ZXJhY3Rpb25UeXBlID0gSW50ZXJhY3Rpb25UeXBlO1xuICAgIHJlYWRvbmx5IFRhcmdldCA9IFRhcmdldDtcbiAgICByZWFkb25seSBDbGlja1NvdXJjZSA9IENsaWNrU291cmNlO1xuICAgIHJlYWRvbmx5IEN1c3RvbUZpZWxkU3BlY2lhbFR5cGUgPSBDdXN0b21GaWVsZFNwZWNpYWxUeXBlO1xuICAgIEBJbnB1dCgpIGRyb3Bkb3duOiBEcm9wZG93bkNvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ21lbnVUcmlnZ2VyJykgbWVudVRyaWdnZXI6IE1hdE1lbnVUcmlnZ2VyO1xuXG4gICAgQElucHV0KCkgbm9kZTogVDtcbiAgICBkcm9wZG93bkxlZnQ6IG51bWJlcjtcbiAgICBkcm9wZG93blRvcDogbnVtYmVyO1xuICAgIHNob3dSYXRpbmdzID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gICAgaXNDb2xsZWN0aW9uOiBib29sZWFuO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZW50cmllc1NlcnZpY2U6IE5vZGVFbnRyaWVzU2VydmljZTxUPixcbiAgICAgICAgcHVibGljIG5vZGVIZWxwZXI6IE5vZGVIZWxwZXJTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgYXBwbGljYXRpb25SZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgICAgICBwdWJsaWMgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICAgICAgcHVibGljIGF1dGhlbnRpY2F0aW9uU2VydmljZTogQXV0aGVudGljYXRpb25TZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgdGVtcGxhdGVzU2VydmljZTogTm9kZUVudHJpZXNUZW1wbGF0ZXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG5vZGVFbnRyaWVzR2xvYmFsU2VydmljZTogTm9kZUVudHJpZXNHbG9iYWxTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHRvYXN0OiBUb2FzdCxcbiAgICApIHt9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNDb2xsZWN0aW9uID0gdGhpcy5ub2RlSGVscGVyLmlzTm9kZUNvbGxlY3Rpb24oY2hhbmdlcy5ub2RlPy5jdXJyZW50VmFsdWUpO1xuICAgIH1cblxuICAgIGdldFRleHRDb2xvcigpIHtcbiAgICAgICAgcmV0dXJuIENvbG9ySGVscGVyLmdldFByZWZlcnJlZENvbG9yKHRoaXMubm9kZS5jb2xsZWN0aW9uLmNvbG9yKSA9PT0gUHJlZmVycmVkQ29sb3IuQmxhY2tcbiAgICAgICAgICAgID8gJyMwMDAnXG4gICAgICAgICAgICA6ICcjZmZmJztcbiAgICB9XG4gICAgb3B0aW9uc09uQ2FyZCgpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZW50cmllc1NlcnZpY2Uub3B0aW9uc1tUYXJnZXQuTGlzdF07XG4gICAgICAgIGNvbnN0IGFsd2F5cyA9IG9wdGlvbnMuZmlsdGVyKChvKSA9PiBvLnNob3dBbHdheXMpO1xuICAgICAgICBpZiAoYWx3YXlzLnNvbWUoKG8pID0+IG8uc2hvd0NhbGxiYWNrKHRoaXMubm9kZSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gYWx3YXlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlIGRvIE5PVCBzaG93IGFueSBhZGRpdGlvbmFsIGFjdGlvbnNcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAvLyByZXR1cm4gb3B0aW9ucy5maWx0ZXIoKG8pID0+IG8uc2hvd0FzQWN0aW9uICYmIG8uc2hvd0NhbGxiYWNrKHRoaXMubm9kZSkpLnNsaWNlKDAsIDMpO1xuICAgIH1cblxuICAgIG9wZW5Db250ZXh0bWVudShldmVudDogTW91c2VFdmVudCB8IEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoIXRoaXMuZHJvcGRvd24pIHtcbiAgICAgICAgICAgIC8vIENhbGwgYHByZXZlbnREZWZhdWx0KClgIGV2ZW4gd2hlbiB0aGVyZSBpcyBubyBtZW51LCBzbyB3ZSBjYW4gdXNlIGBjZGtEcmFnYCB3aXRoIGFcbiAgICAgICAgICAgIC8vIHN0YXJ0IGRlbGF5IHdpdGhvdXQgYmVpbmcgaW50ZXJydXB0ZWQgYnkgdGhlIHN0YW5kYXJkIGxvbmctdGFwIGFjdGlvbi5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XG4gICAgICAgICAgICAoeyBjbGllbnRYOiB0aGlzLmRyb3Bkb3duTGVmdCwgY2xpZW50WTogdGhpcy5kcm9wZG93blRvcCB9ID0gZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKHsgeDogdGhpcy5kcm9wZG93bkxlZnQsIHk6IHRoaXMuZHJvcGRvd25Ub3AgfSA9IChcbiAgICAgICAgICAgICAgICBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgICAgICkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0ZWQuaW5jbHVkZXModGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdCh0aGlzLm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBtZW51IHRvIHJlZmxlY3QgY2hhbmdlZCBvcHRpb25zLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duLmNhblNob3dEcm9wZG93bigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZW51VHJpZ2dlci5vcGVuTWVudSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnRvYXN0KCdOT19BVkFJTEFCTEVfT1BUSU9OUycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRWaXNpYmxlQ29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllc1NlcnZpY2UuY29sdW1ucz8uZmlsdGVyKChjKSA9PiBjLnZpc2libGUpO1xuICAgIH1cblxuICAgIGFzeW5jIG9wZW5NZW51KG5vZGU6IFQpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0KG5vZGUpO1xuICAgICAgICBhd2FpdCB0aGlzLmFwcGxpY2F0aW9uUmVmLnRpY2soKTtcbiAgICAgICAgdGhpcy5kcm9wZG93bi5tZW51LmZvY3VzRmlyc3RJdGVtKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlnU2VydmljZS5vYnNlcnZlQ29uZmlnKCkucGlwZSh0YWtlKDEpKS50b1Byb21pc2UoKTtcbiAgICAgICAgdGhpcy5zaG93UmF0aW5ncy5uZXh0KFxuICAgICAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmluc3RhbnQoJ3JhdGluZy5tb2RlJywgJ25vbmUnKSAhPT0gJ25vbmUnICYmXG4gICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLmhhc1Rvb2xwZXJtaXNzaW9uKFxuICAgICAgICAgICAgICAgICAgICBSZXN0Q29uc3RhbnRzLlRPT0xQRVJNSVNTSU9OX1JBVEVfUkVBRCxcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRUZW1wbGF0ZShuYW1lOiBDdXN0b21GaWVsZFNwZWNpYWxUeXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVFbnRyaWVzR2xvYmFsU2VydmljZS5nZXRDdXN0b21GaWVsZFRlbXBsYXRlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdOT0RFJyxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMubm9kZSBhcyBOb2RlLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJncmlkLWNhcmRcIlxuICBbY2xhc3MuZ3JpZC1jYXJkLWNvbGxlY3Rpb25dPVwiaXNDb2xsZWN0aW9uXCJcbiAgW2NsYXNzLmdyaWQtY2FyZC12aXJ0dWFsXT1cIiRhbnkobm9kZSkudmlydHVhbFwiXG4gIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImlzQ29sbGVjdGlvbiA/IG5vZGUuY29sbGVjdGlvbi5jb2xvciA6IG51bGxcIlxuICBbY2xhc3MuZHluYW1pYy1zaW5nbGUtY2xpY2tdPVwiZW50cmllc1NlcnZpY2Uuc2luZ2xlQ2xpY2tIaW50ID09PSAnZHluYW1pYydcIlxuICBbY2xhc3Muc2VsZWN0ZWRdPVwiZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSlcIlxuICAoY29udGV4dG1lbnUpPVwib3BlbkNvbnRleHRtZW51KCRldmVudClcIlxuICAoa2V5ZG93bi5Db250ZXh0TWVudSk9XCJvcGVuQ29udGV4dG1lbnUoJGV2ZW50KVwiXG4+XG4gIDxkaXZcbiAgICAqbmdJZj1cInRlbXBsYXRlc1NlcnZpY2Uub3ZlcmxheVwiXG4gICAgY2xhc3M9XCJjYXJkLW92ZXJsYXlcIlxuICAgIChjbGljayk9XCJcbiAgICAgIGVudHJpZXNTZXJ2aWNlLmNsaWNrSXRlbS5lbWl0KHtcbiAgICAgICAgZWxlbWVudDogbm9kZSxcbiAgICAgICAgc291cmNlOiBDbGlja1NvdXJjZS5PdmVybGF5XG4gICAgICB9KVxuICAgIFwiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1NlcnZpY2Uub3ZlcmxheTsgY29udGV4dDogeyBlbGVtZW50OiBub2RlIH1cIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxidXR0b25cbiAgICAqbmdJZj1cImRyb3Bkb3duXCJcbiAgICAjbWVudVRyaWdnZXI9XCJtYXRNZW51VHJpZ2dlclwiXG4gICAgbWF0LWJ1dHRvblxuICAgIGNsYXNzPVwiZHJvcGRvd24tZHVtbXkgY2RrLXZpc3VhbGx5LWhpZGRlblwiXG4gICAgW3N0eWxlLmxlZnQucHhdPVwiZHJvcGRvd25MZWZ0XCJcbiAgICBbc3R5bGUudG9wLnB4XT1cImRyb3Bkb3duVG9wXCJcbiAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZHJvcGRvd24ubWVudVwiXG4gICAgdGFiaW5kZXg9XCItMVwiXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgPjwvYnV0dG9uPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC10b3AtYmFyXCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiaXNDb2xsZWN0aW9uID8gbm9kZS5jb2xsZWN0aW9uLmNvbG9yIDogbnVsbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvcC1iYXItY29sbGVjdGlvbi1jb2xvclwiICpuZ0lmPVwibm9kZUhlbHBlci5pc05vZGVDb2xsZWN0aW9uKG5vZGUpXCI+PC9kaXY+XG4gICAgPGVzLW5vZGUtdHlwZS1iYWRnZSBbbm9kZV09XCJub2RlXCI+PC9lcy1ub2RlLXR5cGUtYmFkZ2U+XG4gICAgPGRpdiAqbmdJZj1cImlzQ29sbGVjdGlvbiAmJiBub2RlLmNvbGxlY3Rpb24ucGlubmVkXCIgY2xhc3M9XCJjYXJkLXRvcC1iYXItZmxhZ1wiPlxuICAgICAgPGkgZXNJY29uPVwiZWR1LXBpblwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC10b3AtYmFyLWVtcHR5XCI+PC9kaXY+XG4gICAgPGVzLW5vZGUtc3RhdHMtYmFkZ2VzIFtub2RlXT1cIm5vZGVcIj48L2VzLW5vZGUtc3RhdHMtYmFkZ2VzPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvcC1iYXItY2hlY2tib3hcIiAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLmNoZWNrYm94XCI+XG4gICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgIFtjaGVja2VkXT1cImVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpXCJcbiAgICAgICAgKGNoYW5nZSk9XCJlbnRyaWVzU2VydmljZS5vbkNoZWNrYm94Q2hhbmdlZChub2RlLCAkZXZlbnQuY2hlY2tlZClcIlxuICAgICAgICBhcmlhLWxhYmVsPVwie3sgJ1NFTEVDVCcgfCB0cmFuc2xhdGUgOiB7IGVsZW1lbnQ6IChub2RlIHwgbm9kZVRpdGxlKSB9IH19XCJcbiAgICAgID48L21hdC1jaGVja2JveD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxlcy1ub2RlLXVybFxuICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZWxlbWVudEludGVyYWN0aW9uVHlwZSA9PT0gSW50ZXJhY3Rpb25UeXBlLkRlZmF1bHRBY3Rpb25MaW5rXCJcbiAgICBtb2RlPVwid3JhcHBlclwiXG4gICAgW25vZGVdPVwibm9kZVwiXG4gICAgZXNGb2N1c1N0YXRlXG4gICAgI2NhcmRGb2N1c1N0YXRlPVwiZXNGb2N1c1N0YXRlXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIGltYWdlO1xuICAgICAgICBjb250ZXh0OiB7IHBsYXlBbmltYXRpb246IGNhcmRGb2N1c1N0YXRlLmhvdmVyaW5nIHx8IGNhcmRGb2N1c1N0YXRlLmhhc0ZvY3VzIH1cbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtZXRhXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZXMtbm9kZS11cmw+XG4gIDxkaXZcbiAgICAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLmVsZW1lbnRJbnRlcmFjdGlvblR5cGUgIT09IEludGVyYWN0aW9uVHlwZS5EZWZhdWx0QWN0aW9uTGlua1wiXG4gICAgbWF0UmlwcGxlXG4gICAgKGNsaWNrKT1cIlxuICAgICAgZW50cmllc1NlcnZpY2Uub25DbGlja2VkKHtcbiAgICAgICAgZXZlbnQ6ICRldmVudCxcbiAgICAgICAgZWxlbWVudDogbm9kZSxcbiAgICAgICAgc291cmNlOiBDbGlja1NvdXJjZS5NZXRhZGF0YVxuICAgICAgfSlcbiAgICBcIlxuICAgIChkYmxjbGljayk9XCJcbiAgICAgIGVudHJpZXNTZXJ2aWNlLmRibENsaWNrSXRlbS5lbWl0KHtcbiAgICAgICAgZWxlbWVudDogbm9kZSxcbiAgICAgICAgc291cmNlOiBDbGlja1NvdXJjZS5NZXRhZGF0YVxuICAgICAgfSlcbiAgICBcIlxuICAgIGVzRm9jdXNTdGF0ZVxuICAgICNjYXJkRm9jdXNTdGF0ZT1cImVzRm9jdXNTdGF0ZVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICBpbWFnZTtcbiAgICAgICAgY29udGV4dDogeyBwbGF5QW5pbWF0aW9uOiBjYXJkRm9jdXNTdGF0ZS5ob3ZlcmluZyB8fCBjYXJkRm9jdXNTdGF0ZS5oYXNGb2N1cyB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWV0YVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtb3B0aW9uc1wiICpuZ0lmPVwic2hvd1JhdGluZ3MgfCBhc3luY1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLXJhdGluZy1hcmVhXCI+XG4gICAgICA8ZXMtbm9kZS1yYXRpbmcgW25vZGVdPVwibm9kZVwiPjwvZXMtbm9kZS1yYXRpbmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtb3B0aW9ucy1hcmVhXCI+XG4gICAgICA8ZXMtb3B0aW9uLWJ1dHRvblxuICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNPbkNhcmQoKVwiXG4gICAgICAgIGNsYXNzPVwiY2FyZC1vcHRpb25zLWFsd2F5c1wiXG4gICAgICAgIFtvcHRpb25dPVwib3B0aW9uXCJcbiAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICA+PC9lcy1vcHRpb24tYnV0dG9uPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtb3B0aW9ucy1zcGFjZXJcIj48L2Rpdj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJkcm9wZG93blwiXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAoY2xpY2spPVwib3Blbk1lbnUobm9kZSlcIlxuICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZHJvcGRvd24ubWVudVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09QVElPTlNfRk9SJyB8IHRyYW5zbGF0ZSA6IHsgZWxlbWVudDogKG5vZGUgfCBub2RlVGl0bGUpIH1cIlxuICAgICAgICBkYXRhLXRlc3Q9XCJjYXJkLW9wdGlvbnMtYnV0dG9uXCJcbiAgICAgID5cbiAgICAgICAgPGkgZXNJY29uPVwibW9yZV92ZXJ0XCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8bmctdGVtcGxhdGUgI2ltYWdlIGxldC1wbGF5QW5pbWF0aW9uPVwicGxheUFuaW1hdGlvblwiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY2FyZC1pbWFnZS1hcmVhXCJcbiAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImlzQ29sbGVjdGlvbiA/IG5vZGUuY29sbGVjdGlvbi5jb2xvciA6IG51bGxcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRUZW1wbGF0ZShDdXN0b21GaWVsZFNwZWNpYWxUeXBlLnByZXZpZXcpIGFzIHJlZlwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVmOyBjb250ZXh0OiB7IG5vZGU6IHRoaXMubm9kZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZ2V0VGVtcGxhdGUoQ3VzdG9tRmllbGRTcGVjaWFsVHlwZS5wcmV2aWV3KVwiPlxuICAgICAgICA8ZXMtcHJldmlldy1pbWFnZVxuICAgICAgICAgICpuZ0lmPVwiIShpc0NvbGxlY3Rpb24gJiYgbm9kZS5wcmV2aWV3LmlzSWNvbilcIlxuICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgIFtwbGF5QW5pbWF0aW9uXT1cInBsYXlBbmltYXRpb25cIlxuICAgICAgICA+PC9lcy1wcmV2aWV3LWltYWdlPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb2xsZWN0aW9uICYmIG5vZGUucHJldmlldy5pc0ljb25cIiBjbGFzcz1cImNhcmQtY29sbGVjdGlvbi1pbWFnZVwiPlxuICAgICAgICAgIDxpIGVzSWNvbj1cImxheWVyc1wiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlICNtZXRhIGxldC1saW5rPVwibGlua1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLW1ldGFcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nRm9yPVwibGV0IGRpc3BsYXlQYXJ0IG9mIGdldFZpc2libGVDb2x1bW5zKCk7IGxldCBmaXJzdCA9IGZpcnN0XCJcbiAgICAgICAgY2xhc3M9XCJjYXJkLW1ldGEtcm93IGNhcmQtbWV0YS1yb3cte3sgZGlzcGxheVBhcnQubmFtZSB8IGxvd2VyY2FzZSB9fVwiXG4gICAgICAgIFtjbGFzcy5jYXJkLW1ldGEtcm93LXByaW1hcnldPVwiZmlyc3RcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlyc3RcIj5cbiAgICAgICAgICA8ZXMtbm9kZS11cmxcbiAgICAgICAgICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZWxlbWVudEludGVyYWN0aW9uVHlwZSA9PT0gSW50ZXJhY3Rpb25UeXBlLkRlZmF1bHRBY3Rpb25MaW5rXCJcbiAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgI2xpbmtcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZXMtbGlzdC1iYXNlIFtpdGVtXT1cImRpc3BsYXlQYXJ0XCIgW25vZGVdPVwibm9kZVwiIFtwcm92aWRlTGFiZWxdPVwiZmFsc2VcIj4gPC9lcy1saXN0LWJhc2U+XG4gICAgICAgICAgPC9lcy1ub2RlLXVybD5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZWxlbWVudEludGVyYWN0aW9uVHlwZSAhPT0gSW50ZXJhY3Rpb25UeXBlLkRlZmF1bHRBY3Rpb25MaW5rXCI+XG4gICAgICAgICAgICA8ZXMtbGlzdC1iYXNlIFtpdGVtXT1cImRpc3BsYXlQYXJ0XCIgW25vZGVdPVwibm9kZVwiIFtwcm92aWRlTGFiZWxdPVwiZmFsc2VcIj4gPC9lcy1saXN0LWJhc2U+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpcnN0XCI+XG4gICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAge3sgZGlzcGxheVBhcnQgfCBlc0xpc3RJdGVtTGFiZWwgfCBhc3luYyB9fVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGVzLWxpc3QtYmFzZSBbaXRlbV09XCJkaXNwbGF5UGFydFwiIFtub2RlXT1cIm5vZGVcIiBbcHJvdmlkZUxhYmVsXT1cImZhbHNlXCI+IDwvZXMtbGlzdC1iYXNlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG4iXX0=