@tilde-nlp/ngx-common 4.0.28 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (497) hide show
  1. package/esm2022/lib/close-button/close-button.component.mjs +34 -34
  2. package/esm2022/lib/close-button/close-button.module.mjs +36 -36
  3. package/esm2022/lib/close-button/index.mjs +2 -2
  4. package/esm2022/lib/company-product/company-product.component.mjs +20 -20
  5. package/esm2022/lib/company-product/company-product.module.mjs +22 -22
  6. package/esm2022/lib/company-product/index.mjs +2 -2
  7. package/esm2022/lib/confirmation-modal/confirmation-modal.component.mjs +25 -25
  8. package/esm2022/lib/confirmation-modal/confirmation-modal.module.mjs +21 -21
  9. package/esm2022/lib/confirmation-modal/index.mjs +5 -5
  10. package/esm2022/lib/confirmation-modal/models/confirmation-body.model.mjs +1 -1
  11. package/esm2022/lib/confirmation-modal/models/confirmation.enum.mjs +5 -5
  12. package/esm2022/lib/confirmation-modal/services/confirmation.service.mjs +25 -25
  13. package/esm2022/lib/confirmation-modal/services/index.mjs +1 -1
  14. package/esm2022/lib/constants/index.mjs +1 -1
  15. package/esm2022/lib/constants/screen-size.const.mjs +10 -10
  16. package/esm2022/lib/directives/click-outside/click-outside.directive.mjs +29 -29
  17. package/esm2022/lib/directives/click-outside/click-outside.module.mjs +24 -24
  18. package/esm2022/lib/directives/click-outside/index.mjs +2 -2
  19. package/esm2022/lib/directives/drag-and-drop/drag-and-drop.directive.mjs +62 -62
  20. package/esm2022/lib/directives/drag-and-drop/drag-and-drop.module.mjs +24 -24
  21. package/esm2022/lib/directives/drag-and-drop/index.mjs +2 -2
  22. package/esm2022/lib/directives/index.mjs +3 -3
  23. package/esm2022/lib/directives/mat-button-loading/index.mjs +2 -2
  24. package/esm2022/lib/directives/mat-button-loading/mat-button-loading.directive.mjs +59 -59
  25. package/esm2022/lib/directives/mat-button-loading/mat-button-loading.module.mjs +20 -20
  26. package/esm2022/lib/extension-dialog/components/index.mjs +1 -1
  27. package/esm2022/lib/extension-dialog/components/open-extension-dialog/open-extension-dialog.component.mjs +22 -22
  28. package/esm2022/lib/extension-dialog/extension-dialog.component.mjs +142 -142
  29. package/esm2022/lib/extension-dialog/extension-dialog.module.mjs +51 -51
  30. package/esm2022/lib/extension-dialog/icons/file-types/excel.icon.mjs +1 -1
  31. package/esm2022/lib/extension-dialog/icons/file-types/index.mjs +9 -9
  32. package/esm2022/lib/extension-dialog/icons/file-types/interchange.icon.mjs +1 -1
  33. package/esm2022/lib/extension-dialog/icons/file-types/office-other.icon.mjs +1 -1
  34. package/esm2022/lib/extension-dialog/icons/file-types/other.icon.mjs +1 -1
  35. package/esm2022/lib/extension-dialog/icons/file-types/pdf.icon.mjs +1 -1
  36. package/esm2022/lib/extension-dialog/icons/file-types/powerpoint.icon.mjs +1 -1
  37. package/esm2022/lib/extension-dialog/icons/file-types/scanned.icon.mjs +1 -1
  38. package/esm2022/lib/extension-dialog/icons/file-types/web.icon.mjs +1 -1
  39. package/esm2022/lib/extension-dialog/icons/file-types/word.icon.mjs +1 -1
  40. package/esm2022/lib/extension-dialog/icons/index.mjs +1 -1
  41. package/esm2022/lib/extension-dialog/index.mjs +5 -5
  42. package/esm2022/lib/extension-dialog/models/enums/file-categories.enum.mjs +8 -8
  43. package/esm2022/lib/extension-dialog/models/enums/file-extensions.enum.mjs +34 -34
  44. package/esm2022/lib/extension-dialog/models/enums/file-type-icons.enum.mjs +12 -12
  45. package/esm2022/lib/extension-dialog/models/enums/file-types.enum.mjs +12 -12
  46. package/esm2022/lib/extension-dialog/models/enums/index.mjs +4 -4
  47. package/esm2022/lib/extension-dialog/models/index.mjs +2 -2
  48. package/esm2022/lib/extension-dialog/models/interfaces/config.mjs +1 -1
  49. package/esm2022/lib/extension-dialog/models/interfaces/dialog-data.model.mjs +1 -1
  50. package/esm2022/lib/extension-dialog/models/interfaces/index.mjs +2 -2
  51. package/esm2022/lib/extension-dialog/services/extension-dialog.service.mjs +22 -22
  52. package/esm2022/lib/extension-dialog/services/index.mjs +1 -1
  53. package/esm2022/lib/file-upload/file-upload.component.mjs +107 -107
  54. package/esm2022/lib/file-upload/file-upload.module.mjs +42 -42
  55. package/esm2022/lib/file-upload/index.mjs +3 -3
  56. package/esm2022/lib/file-upload/models/file-upload-error-type.enum.mjs +7 -7
  57. package/esm2022/lib/file-upload/models/file-upload-error.model.mjs +1 -1
  58. package/esm2022/lib/file-upload/models/index.mjs +2 -2
  59. package/esm2022/lib/filter-bar/filter-bar.component.mjs +146 -146
  60. package/esm2022/lib/filter-bar/filter-bar.module.mjs +71 -71
  61. package/esm2022/lib/filter-bar/index.mjs +3 -3
  62. package/esm2022/lib/filter-bar/models/filter-bar-change-event.model.mjs +1 -1
  63. package/esm2022/lib/filter-bar/models/filter-bar-filter-item.model.mjs +1 -1
  64. package/esm2022/lib/filter-bar/models/filter-bar-filter.model.mjs +1 -1
  65. package/esm2022/lib/filter-bar/models/filter-bar-settings.model.mjs +1 -1
  66. package/esm2022/lib/filter-bar/models/index.mjs +3 -3
  67. package/esm2022/lib/footer/footer.component.mjs +37 -37
  68. package/esm2022/lib/footer/footer.module.mjs +34 -34
  69. package/esm2022/lib/footer/index.mjs +2 -2
  70. package/esm2022/lib/helpers/auth-headers.helper.mjs +24 -21
  71. package/esm2022/lib/helpers/conversion.helper.mjs +10 -10
  72. package/esm2022/lib/helpers/file-extension.helper.mjs +5 -5
  73. package/esm2022/lib/helpers/html-element-parse.helper.mjs +15 -15
  74. package/esm2022/lib/helpers/html.helper.mjs +54 -54
  75. package/esm2022/lib/helpers/index.mjs +9 -9
  76. package/esm2022/lib/helpers/missing-translation.helper.mjs +6 -6
  77. package/esm2022/lib/helpers/resolution.helper.mjs +6 -6
  78. package/esm2022/lib/helpers/save-file.helper.mjs +10 -10
  79. package/esm2022/lib/helpers/sort.helper.mjs +11 -10
  80. package/esm2022/lib/inline-message/index.mjs +3 -3
  81. package/esm2022/lib/inline-message/inline-message.component.mjs +23 -23
  82. package/esm2022/lib/inline-message/inline-message.module.mjs +32 -32
  83. package/esm2022/lib/inline-message/models/index.mjs +3 -3
  84. package/esm2022/lib/inline-message/models/inline-message-icon-position.enum.mjs +5 -5
  85. package/esm2022/lib/inline-message/models/inline-message-type.enum.mjs +6 -6
  86. package/esm2022/lib/inline-message/models/inline-message.model.mjs +1 -1
  87. package/esm2022/lib/multi-functional-table/constants/disable-export-attribute-name.const.mjs +1 -1
  88. package/esm2022/lib/multi-functional-table/constants/index.mjs +1 -1
  89. package/esm2022/lib/multi-functional-table/index.mjs +4 -4
  90. package/esm2022/lib/multi-functional-table/models/batch-config.model.mjs +1 -1
  91. package/esm2022/lib/multi-functional-table/models/column-config.model.mjs +1 -1
  92. package/esm2022/lib/multi-functional-table/models/column-select-config.model.mjs +1 -1
  93. package/esm2022/lib/multi-functional-table/models/export-config.model.mjs +1 -1
  94. package/esm2022/lib/multi-functional-table/models/export-format.enum.mjs +4 -4
  95. package/esm2022/lib/multi-functional-table/models/filter-config.model.mjs +2 -2
  96. package/esm2022/lib/multi-functional-table/models/index.mjs +6 -6
  97. package/esm2022/lib/multi-functional-table/models/multi-functional-table-config.model.mjs +1 -1
  98. package/esm2022/lib/multi-functional-table/models/selected-column-local-storage-config.model.mjs +1 -1
  99. package/esm2022/lib/multi-functional-table/multi-functional-table.component.mjs +228 -229
  100. package/esm2022/lib/multi-functional-table/multi-functional-table.module.mjs +72 -72
  101. package/esm2022/lib/notification-message/enums/index.mjs +1 -1
  102. package/esm2022/lib/notification-message/enums/notification-message-type.enum.mjs +8 -8
  103. package/esm2022/lib/notification-message/index.mjs +4 -4
  104. package/esm2022/lib/notification-message/interfaces/index.mjs +1 -1
  105. package/esm2022/lib/notification-message/interfaces/notification-message.model.mjs +1 -1
  106. package/esm2022/lib/notification-message/notification-message.component.mjs +52 -52
  107. package/esm2022/lib/notification-message/notification-message.module.mjs +44 -44
  108. package/esm2022/lib/open-close-button/index.mjs +4 -4
  109. package/esm2022/lib/open-close-button/injection-tokens/index.mjs +1 -1
  110. package/esm2022/lib/open-close-button/injection-tokens/open-close-btn-icons.token.mjs +1 -1
  111. package/esm2022/lib/open-close-button/models/index.mjs +1 -1
  112. package/esm2022/lib/open-close-button/models/open-close-btn-icons.model.mjs +1 -1
  113. package/esm2022/lib/open-close-button/open-close-button.component.mjs +53 -53
  114. package/esm2022/lib/open-close-button/open-close-button.module.mjs +21 -21
  115. package/esm2022/lib/pipes/date-ago/date-ago.module.mjs +28 -28
  116. package/esm2022/lib/pipes/date-ago/date-ago.pipe.mjs +114 -114
  117. package/esm2022/lib/pipes/date-ago/index.mjs +2 -2
  118. package/esm2022/lib/pipes/date-ago/models/date-ago-interval.model.mjs +1 -1
  119. package/esm2022/lib/pipes/date-ago/models/date-ago-settings.model.mjs +1 -1
  120. package/esm2022/lib/pipes/date-ago/models/date-ago-settings.token.mjs +1 -1
  121. package/esm2022/lib/pipes/date-ago/models/date-ago.model.mjs +1 -1
  122. package/esm2022/lib/pipes/date-ago/models/index.mjs +4 -4
  123. package/esm2022/lib/pipes/filter-with-highlight/filter-with-highlight.module.mjs +24 -24
  124. package/esm2022/lib/pipes/filter-with-highlight/filter-with-highlight.pipe.mjs +43 -42
  125. package/esm2022/lib/pipes/filter-with-highlight/index.mjs +2 -2
  126. package/esm2022/lib/pipes/index.mjs +6 -7
  127. package/esm2022/lib/pipes/language-translate/index.mjs +2 -2
  128. package/esm2022/lib/pipes/language-translate/language-translate.module.mjs +18 -18
  129. package/esm2022/lib/pipes/language-translate/language-translate.pipe.mjs +100 -99
  130. package/esm2022/lib/pipes/sort-translations/index.mjs +2 -2
  131. package/esm2022/lib/pipes/sort-translations/sort-translations.module.mjs +22 -22
  132. package/esm2022/lib/pipes/sort-translations/sort-translations.pipe.mjs +60 -60
  133. package/esm2022/lib/pipes/sort-translations-by-property/index.mjs +2 -2
  134. package/esm2022/lib/pipes/sort-translations-by-property/sort-translations-by-property.module.mjs +18 -18
  135. package/esm2022/lib/pipes/sort-translations-by-property/sort-translations-by-property.pipe.mjs +40 -40
  136. package/esm2022/lib/plausible/index.mjs +4 -4
  137. package/esm2022/lib/plausible/models/index.mjs +1 -1
  138. package/esm2022/lib/plausible/models/plausible-event.model.mjs +1 -1
  139. package/esm2022/lib/plausible/plausible-event.directive.mjs +40 -40
  140. package/esm2022/lib/plausible/plausible.helper.mjs +37 -37
  141. package/esm2022/lib/plausible/plausible.module.mjs +24 -24
  142. package/esm2022/lib/services/alert/alert.service.mjs +167 -165
  143. package/esm2022/lib/services/alert/index.mjs +3 -3
  144. package/esm2022/lib/services/alert/injection-tokens/alert-configuration.token.mjs +1 -1
  145. package/esm2022/lib/services/alert/injection-tokens/index.mjs +1 -1
  146. package/esm2022/lib/services/alert/models/alert-configuration.model.mjs +2 -2
  147. package/esm2022/lib/services/alert/models/index.mjs +1 -1
  148. package/esm2022/lib/services/dom/dom.service.mjs +21 -21
  149. package/esm2022/lib/services/dom/index.mjs +1 -1
  150. package/esm2022/lib/services/icon/icon.service.mjs +35 -35
  151. package/esm2022/lib/services/icon/index.mjs +1 -1
  152. package/esm2022/lib/services/index.mjs +6 -6
  153. package/esm2022/lib/services/language-translate/index.mjs +1 -1
  154. package/esm2022/lib/services/language-translate/language-translate.service.mjs +25 -25
  155. package/esm2022/lib/services/notification/index.mjs +2 -2
  156. package/esm2022/lib/services/notification/models/index.mjs +2 -2
  157. package/esm2022/lib/services/notification/models/notification.model.mjs +1 -1
  158. package/esm2022/lib/services/notification/models/operations.enum.mjs +5 -5
  159. package/esm2022/lib/services/notification/notification.service.mjs +35 -35
  160. package/esm2022/lib/services/system/index.mjs +1 -1
  161. package/esm2022/lib/services/system/system.service.mjs +23 -23
  162. package/esm2022/lib/status-display/index.mjs +3 -3
  163. package/esm2022/lib/status-display/models/index.mjs +1 -1
  164. package/esm2022/lib/status-display/models/status-display-config.model.mjs +1 -1
  165. package/esm2022/lib/status-display/status-display.component.mjs +17 -17
  166. package/esm2022/lib/status-display/status-display.module.mjs +21 -21
  167. package/esm2022/lib/terminology/components/terminology-panel/terminology-collection-list/terminology-collection-card/terminology-collection-card.component.mjs +65 -65
  168. package/esm2022/lib/terminology/components/terminology-panel/terminology-collection-list/terminology-collection-list.component.mjs +70 -70
  169. package/esm2022/lib/terminology/components/terminology-panel/terminology-create-collection/terminology-create-collection-dialog/terminology-create-collection-dialog.component.mjs +60 -58
  170. package/esm2022/lib/terminology/components/terminology-panel/terminology-create-collection/terminology-create-collection.component.mjs +56 -56
  171. package/esm2022/lib/terminology/components/terminology-panel/terminology-panel.component.mjs +49 -49
  172. package/esm2022/lib/terminology/config/models/index.mjs +1 -1
  173. package/esm2022/lib/terminology/config/models/terminology-config.model.mjs +1 -1
  174. package/esm2022/lib/terminology/config/services/index.mjs +1 -1
  175. package/esm2022/lib/terminology/config/services/terminology-config/terminology-config.service.mjs +45 -48
  176. package/esm2022/lib/terminology/enums/combined-collection-tooltip-key.enum.mjs +5 -5
  177. package/esm2022/lib/terminology/enums/engine-term-collection-scope.enum.mjs +6 -6
  178. package/esm2022/lib/terminology/enums/engine-term-collection-source.enum.mjs +5 -5
  179. package/esm2022/lib/terminology/enums/engine-term-collection-status.enum.mjs +7 -7
  180. package/esm2022/lib/terminology/enums/engine-term-collection-sub-status.enum.mjs +13 -13
  181. package/esm2022/lib/terminology/enums/index.mjs +6 -6
  182. package/esm2022/lib/terminology/enums/mt-collection-status.enum.mjs +10 -10
  183. package/esm2022/lib/terminology/enums/mt-term-collection-v1-status.enum.mjs +6 -6
  184. package/esm2022/lib/terminology/enums/system-metadata-key.enum.mjs +6 -6
  185. package/esm2022/lib/terminology/enums/translation-api-version.model.mjs +5 -5
  186. package/esm2022/lib/terminology/factories/terminology-api.factory.mjs +12 -12
  187. package/esm2022/lib/terminology/factories/terminology-system.factory.mjs +13 -13
  188. package/esm2022/lib/terminology/icons/collections-menu.icon.mjs +1 -1
  189. package/esm2022/lib/terminology/icons/index.mjs +1 -1
  190. package/esm2022/lib/terminology/index.mjs +9 -9
  191. package/esm2022/lib/terminology/injection-tokens/terminology-api.token.mjs +1 -1
  192. package/esm2022/lib/terminology/injection-tokens/terminology-system.token.mjs +1 -1
  193. package/esm2022/lib/terminology/models/active-data.model.mjs +2 -2
  194. package/esm2022/lib/terminology/models/add-engine-terms-request-params.model.mjs +1 -1
  195. package/esm2022/lib/terminology/models/api-system.model.mjs +2 -2
  196. package/esm2022/lib/terminology/models/combined-collection.model.mjs +189 -189
  197. package/esm2022/lib/terminology/models/default-term-collection-order-update.model.mjs +1 -1
  198. package/esm2022/lib/terminology/models/domain.model.mjs +1 -1
  199. package/esm2022/lib/terminology/models/engine-term-collection-access-scope-update.model.mjs +1 -1
  200. package/esm2022/lib/terminology/models/engine-term-collection-access-scope.model.mjs +1 -1
  201. package/esm2022/lib/terminology/models/engine-term-collection-access-update.model.mjs +1 -1
  202. package/esm2022/lib/terminology/models/engine-term-collection-access.model.mjs +1 -1
  203. package/esm2022/lib/terminology/models/engine-term-collection-list.model.mjs +1 -1
  204. package/esm2022/lib/terminology/models/engine-term-collection.model.mjs +1 -1
  205. package/esm2022/lib/terminology/models/index.mjs +20 -20
  206. package/esm2022/lib/terminology/models/lang-list-item.model.mjs +1 -1
  207. package/esm2022/lib/terminology/models/mt-collection.model.mjs +1 -1
  208. package/esm2022/lib/terminology/models/mt-term-collection-v1.model.mjs +1 -1
  209. package/esm2022/lib/terminology/models/mt-term-service.model.mjs +1 -1
  210. package/esm2022/lib/terminology/models/system-api-service.model.mjs +1 -1
  211. package/esm2022/lib/terminology/models/system.model.mjs +2 -2
  212. package/esm2022/lib/terminology/models/terminology-engine.model.mjs +2 -2
  213. package/esm2022/lib/terminology/models/tld-term-collection-languages.model.mjs +1 -1
  214. package/esm2022/lib/terminology/models/tld-term-collection.model.mjs +2 -2
  215. package/esm2022/lib/terminology/models/update-engine-terms-request-params.model.mjs +1 -1
  216. package/esm2022/lib/terminology/models/vendor.model.mjs +1 -1
  217. package/esm2022/lib/terminology/services/engine-term-api/engine-term-api.service.mjs +51 -51
  218. package/esm2022/lib/terminology/services/engine-term-api/index.mjs +1 -1
  219. package/esm2022/lib/terminology/services/index.mjs +5 -5
  220. package/esm2022/lib/terminology/services/system-api-v1/system-api-v1.service.mjs +60 -59
  221. package/esm2022/lib/terminology/services/system-api-v2/models/engine-deployment.model.mjs +1 -1
  222. package/esm2022/lib/terminology/services/system-api-v2/models/engine-domain-list.model.mjs +1 -1
  223. package/esm2022/lib/terminology/services/system-api-v2/models/engine-domain.model.mjs +1 -1
  224. package/esm2022/lib/terminology/services/system-api-v2/models/engine-list.model.mjs +1 -1
  225. package/esm2022/lib/terminology/services/system-api-v2/models/engine-status.enum.mjs +10 -10
  226. package/esm2022/lib/terminology/services/system-api-v2/models/engine-sub-status.enum.mjs +17 -17
  227. package/esm2022/lib/terminology/services/system-api-v2/models/engine.model.mjs +1 -1
  228. package/esm2022/lib/terminology/services/system-api-v2/models/index.mjs +8 -8
  229. package/esm2022/lib/terminology/services/system-api-v2/models/revision.model.mjs +1 -1
  230. package/esm2022/lib/terminology/services/system-api-v2/models/worker-status.model.mjs +1 -1
  231. package/esm2022/lib/terminology/services/system-api-v2/system-api-v2.service.mjs +81 -81
  232. package/esm2022/lib/terminology/services/terminology/terminology.service.mjs +325 -324
  233. package/esm2022/lib/terminology/services/terminology-api-v1/terminology-api-v1.service.mjs +59 -58
  234. package/esm2022/lib/terminology/services/terminology-api-v2/terminology-api-v2.service.mjs +85 -84
  235. package/esm2022/lib/terminology/services/terminology-collection/index.mjs +1 -1
  236. package/esm2022/lib/terminology/services/terminology-collection/terminology-collection.service.mjs +54 -54
  237. package/esm2022/lib/terminology/terminology.component.mjs +137 -137
  238. package/esm2022/lib/terminology/terminology.module.mjs +132 -132
  239. package/esm2022/lib/tld-loader/index.mjs +2 -2
  240. package/esm2022/lib/tld-loader/tld-loader.component.mjs +11 -11
  241. package/esm2022/lib/tld-loader/tld-loader.module.mjs +20 -20
  242. package/esm2022/public-api.mjs +23 -23
  243. package/esm2022/tilde-nlp-ngx-common.mjs +4 -4
  244. package/fesm2022/tilde-nlp-ngx-common.mjs +3768 -3791
  245. package/fesm2022/tilde-nlp-ngx-common.mjs.map +1 -1
  246. package/index.d.ts +5 -5
  247. package/lib/close-button/close-button.component.d.ts +13 -13
  248. package/lib/close-button/close-button.module.d.ts +11 -11
  249. package/lib/close-button/index.d.ts +2 -2
  250. package/lib/company-product/company-product.component.d.ts +7 -7
  251. package/lib/company-product/company-product.module.d.ts +8 -8
  252. package/lib/company-product/index.d.ts +2 -2
  253. package/lib/confirmation-modal/confirmation-modal.component.d.ts +12 -12
  254. package/lib/confirmation-modal/confirmation-modal.module.d.ts +11 -11
  255. package/lib/confirmation-modal/index.d.ts +5 -5
  256. package/lib/confirmation-modal/models/confirmation-body.model.d.ts +8 -8
  257. package/lib/confirmation-modal/models/confirmation.enum.d.ts +4 -4
  258. package/lib/confirmation-modal/services/confirmation.service.d.ts +12 -12
  259. package/lib/confirmation-modal/services/index.d.ts +1 -1
  260. package/lib/constants/index.d.ts +1 -1
  261. package/lib/constants/screen-size.const.d.ts +10 -10
  262. package/lib/directives/click-outside/click-outside.directive.d.ts +10 -10
  263. package/lib/directives/click-outside/click-outside.module.d.ts +8 -8
  264. package/lib/directives/click-outside/index.d.ts +2 -2
  265. package/lib/directives/drag-and-drop/drag-and-drop.directive.d.ts +14 -14
  266. package/lib/directives/drag-and-drop/drag-and-drop.module.d.ts +8 -8
  267. package/lib/directives/drag-and-drop/index.d.ts +2 -2
  268. package/lib/directives/index.d.ts +3 -3
  269. package/lib/directives/mat-button-loading/index.d.ts +2 -2
  270. package/lib/directives/mat-button-loading/mat-button-loading.directive.d.ts +18 -18
  271. package/lib/directives/mat-button-loading/mat-button-loading.module.d.ts +8 -8
  272. package/lib/extension-dialog/components/index.d.ts +1 -1
  273. package/lib/extension-dialog/components/open-extension-dialog/open-extension-dialog.component.d.ts +10 -10
  274. package/lib/extension-dialog/extension-dialog.component.d.ts +21 -21
  275. package/lib/extension-dialog/extension-dialog.module.d.ts +15 -15
  276. package/lib/extension-dialog/icons/file-types/excel.icon.d.ts +1 -1
  277. package/lib/extension-dialog/icons/file-types/index.d.ts +9 -9
  278. package/lib/extension-dialog/icons/file-types/interchange.icon.d.ts +1 -1
  279. package/lib/extension-dialog/icons/file-types/office-other.icon.d.ts +1 -1
  280. package/lib/extension-dialog/icons/file-types/other.icon.d.ts +1 -1
  281. package/lib/extension-dialog/icons/file-types/pdf.icon.d.ts +1 -1
  282. package/lib/extension-dialog/icons/file-types/powerpoint.icon.d.ts +1 -1
  283. package/lib/extension-dialog/icons/file-types/scanned.icon.d.ts +1 -1
  284. package/lib/extension-dialog/icons/file-types/web.icon.d.ts +1 -1
  285. package/lib/extension-dialog/icons/file-types/word.icon.d.ts +1 -1
  286. package/lib/extension-dialog/icons/index.d.ts +1 -1
  287. package/lib/extension-dialog/index.d.ts +5 -5
  288. package/lib/extension-dialog/models/enums/file-categories.enum.d.ts +7 -7
  289. package/lib/extension-dialog/models/enums/file-extensions.enum.d.ts +33 -33
  290. package/lib/extension-dialog/models/enums/file-type-icons.enum.d.ts +11 -11
  291. package/lib/extension-dialog/models/enums/file-types.enum.d.ts +11 -11
  292. package/lib/extension-dialog/models/enums/index.d.ts +4 -4
  293. package/lib/extension-dialog/models/index.d.ts +2 -2
  294. package/lib/extension-dialog/models/interfaces/config.d.ts +18 -18
  295. package/lib/extension-dialog/models/interfaces/dialog-data.model.d.ts +3 -3
  296. package/lib/extension-dialog/models/interfaces/index.d.ts +2 -2
  297. package/lib/extension-dialog/services/extension-dialog.service.d.ts +9 -9
  298. package/lib/extension-dialog/services/index.d.ts +1 -1
  299. package/lib/file-upload/file-upload.component.d.ts +29 -29
  300. package/lib/file-upload/file-upload.module.d.ts +13 -13
  301. package/lib/file-upload/index.d.ts +3 -3
  302. package/lib/file-upload/models/file-upload-error-type.enum.d.ts +6 -6
  303. package/lib/file-upload/models/file-upload-error.model.d.ts +6 -6
  304. package/lib/file-upload/models/index.d.ts +2 -2
  305. package/lib/filter-bar/filter-bar.component.d.ts +54 -54
  306. package/lib/filter-bar/filter-bar.module.d.ts +19 -19
  307. package/lib/filter-bar/index.d.ts +3 -3
  308. package/lib/filter-bar/models/filter-bar-change-event.model.d.ts +6 -6
  309. package/lib/filter-bar/models/filter-bar-filter-item.model.d.ts +4 -4
  310. package/lib/filter-bar/models/filter-bar-filter.model.d.ts +6 -6
  311. package/lib/filter-bar/models/filter-bar-settings.model.d.ts +19 -19
  312. package/lib/filter-bar/models/index.d.ts +3 -3
  313. package/lib/footer/footer.component.d.ts +15 -15
  314. package/lib/footer/footer.module.d.ts +11 -11
  315. package/lib/footer/index.d.ts +2 -2
  316. package/lib/helpers/auth-headers.helper.d.ts +4 -4
  317. package/lib/helpers/conversion.helper.d.ts +4 -4
  318. package/lib/helpers/file-extension.helper.d.ts +3 -3
  319. package/lib/helpers/html-element-parse.helper.d.ts +3 -3
  320. package/lib/helpers/html.helper.d.ts +17 -17
  321. package/lib/helpers/index.d.ts +9 -9
  322. package/lib/helpers/missing-translation.helper.d.ts +4 -4
  323. package/lib/helpers/resolution.helper.d.ts +3 -3
  324. package/lib/helpers/save-file.helper.d.ts +3 -3
  325. package/lib/helpers/sort.helper.d.ts +3 -3
  326. package/lib/inline-message/index.d.ts +3 -3
  327. package/lib/inline-message/inline-message.component.d.ts +10 -10
  328. package/lib/inline-message/inline-message.module.d.ts +10 -10
  329. package/lib/inline-message/models/index.d.ts +3 -3
  330. package/lib/inline-message/models/inline-message-icon-position.enum.d.ts +4 -4
  331. package/lib/inline-message/models/inline-message-type.enum.d.ts +5 -5
  332. package/lib/inline-message/models/inline-message.model.d.ts +10 -10
  333. package/lib/multi-functional-table/constants/disable-export-attribute-name.const.d.ts +1 -1
  334. package/lib/multi-functional-table/constants/index.d.ts +1 -1
  335. package/lib/multi-functional-table/index.d.ts +4 -4
  336. package/lib/multi-functional-table/models/batch-config.model.d.ts +4 -4
  337. package/lib/multi-functional-table/models/column-config.model.d.ts +18 -18
  338. package/lib/multi-functional-table/models/column-select-config.model.d.ts +14 -14
  339. package/lib/multi-functional-table/models/export-config.model.d.ts +9 -9
  340. package/lib/multi-functional-table/models/export-format.enum.d.ts +3 -3
  341. package/lib/multi-functional-table/models/filter-config.model.d.ts +6 -7
  342. package/lib/multi-functional-table/models/index.d.ts +6 -6
  343. package/lib/multi-functional-table/models/multi-functional-table-config.model.d.ts +36 -36
  344. package/lib/multi-functional-table/models/selected-column-local-storage-config.model.d.ts +20 -20
  345. package/lib/multi-functional-table/multi-functional-table.component.d.ts +66 -67
  346. package/lib/multi-functional-table/multi-functional-table.module.d.ts +20 -20
  347. package/lib/notification-message/enums/index.d.ts +1 -1
  348. package/lib/notification-message/enums/notification-message-type.enum.d.ts +7 -7
  349. package/lib/notification-message/index.d.ts +4 -4
  350. package/lib/notification-message/interfaces/index.d.ts +1 -1
  351. package/lib/notification-message/interfaces/notification-message.model.d.ts +22 -22
  352. package/lib/notification-message/notification-message.component.d.ts +22 -22
  353. package/lib/notification-message/notification-message.module.d.ts +13 -13
  354. package/lib/open-close-button/index.d.ts +4 -4
  355. package/lib/open-close-button/injection-tokens/index.d.ts +1 -1
  356. package/lib/open-close-button/injection-tokens/open-close-btn-icons.token.d.ts +1 -1
  357. package/lib/open-close-button/models/index.d.ts +1 -1
  358. package/lib/open-close-button/models/open-close-btn-icons.model.d.ts +4 -4
  359. package/lib/open-close-button/open-close-button.component.d.ts +22 -22
  360. package/lib/open-close-button/open-close-button.module.d.ts +11 -11
  361. package/lib/pipes/date-ago/date-ago.module.d.ts +9 -9
  362. package/lib/pipes/date-ago/date-ago.pipe.d.ts +20 -20
  363. package/lib/pipes/date-ago/index.d.ts +2 -2
  364. package/lib/pipes/date-ago/models/date-ago-interval.model.d.ts +5 -5
  365. package/lib/pipes/date-ago/models/date-ago-settings.model.d.ts +26 -26
  366. package/lib/pipes/date-ago/models/date-ago-settings.token.d.ts +1 -1
  367. package/lib/pipes/date-ago/models/date-ago.model.d.ts +4 -4
  368. package/lib/pipes/date-ago/models/index.d.ts +4 -4
  369. package/lib/pipes/filter-with-highlight/filter-with-highlight.module.d.ts +8 -8
  370. package/lib/pipes/filter-with-highlight/filter-with-highlight.pipe.d.ts +7 -7
  371. package/lib/pipes/filter-with-highlight/index.d.ts +2 -2
  372. package/lib/pipes/index.d.ts +5 -6
  373. package/lib/pipes/language-translate/index.d.ts +2 -2
  374. package/lib/pipes/language-translate/language-translate.module.d.ts +8 -8
  375. package/lib/pipes/language-translate/language-translate.pipe.d.ts +19 -19
  376. package/lib/pipes/sort-translations/index.d.ts +2 -2
  377. package/lib/pipes/sort-translations/sort-translations.module.d.ts +8 -8
  378. package/lib/pipes/sort-translations/sort-translations.pipe.d.ts +20 -20
  379. package/lib/pipes/sort-translations-by-property/index.d.ts +2 -2
  380. package/lib/pipes/sort-translations-by-property/sort-translations-by-property.module.d.ts +8 -8
  381. package/lib/pipes/sort-translations-by-property/sort-translations-by-property.pipe.d.ts +15 -15
  382. package/lib/plausible/index.d.ts +4 -4
  383. package/lib/plausible/models/index.d.ts +1 -1
  384. package/lib/plausible/models/plausible-event.model.d.ts +7 -7
  385. package/lib/plausible/plausible-event.directive.d.ts +11 -11
  386. package/lib/plausible/plausible.helper.d.ts +15 -15
  387. package/lib/plausible/plausible.module.d.ts +8 -8
  388. package/lib/services/alert/alert.service.d.ts +37 -37
  389. package/lib/services/alert/index.d.ts +3 -3
  390. package/lib/services/alert/injection-tokens/alert-configuration.token.d.ts +1 -1
  391. package/lib/services/alert/injection-tokens/index.d.ts +1 -1
  392. package/lib/services/alert/models/alert-configuration.model.d.ts +7 -7
  393. package/lib/services/alert/models/index.d.ts +1 -1
  394. package/lib/services/dom/dom.service.d.ts +7 -7
  395. package/lib/services/dom/index.d.ts +1 -1
  396. package/lib/services/icon/icon.service.d.ts +14 -14
  397. package/lib/services/icon/index.d.ts +1 -1
  398. package/lib/services/index.d.ts +6 -6
  399. package/lib/services/language-translate/index.d.ts +1 -1
  400. package/lib/services/language-translate/language-translate.service.d.ts +10 -10
  401. package/lib/services/notification/index.d.ts +2 -2
  402. package/lib/services/notification/models/index.d.ts +2 -2
  403. package/lib/services/notification/models/notification.model.d.ts +6 -6
  404. package/lib/services/notification/models/operations.enum.d.ts +4 -4
  405. package/lib/services/notification/notification.service.d.ts +15 -15
  406. package/lib/services/system/index.d.ts +1 -1
  407. package/lib/services/system/system.service.d.ts +11 -11
  408. package/lib/status-display/index.d.ts +3 -3
  409. package/lib/status-display/models/index.d.ts +1 -1
  410. package/lib/status-display/models/status-display-config.model.d.ts +9 -9
  411. package/lib/status-display/status-display.component.d.ts +7 -7
  412. package/lib/status-display/status-display.module.d.ts +11 -11
  413. package/lib/terminology/components/terminology-panel/terminology-collection-list/terminology-collection-card/terminology-collection-card.component.d.ts +28 -28
  414. package/lib/terminology/components/terminology-panel/terminology-collection-list/terminology-collection-list.component.d.ts +30 -30
  415. package/lib/terminology/components/terminology-panel/terminology-create-collection/terminology-create-collection-dialog/terminology-create-collection-dialog.component.d.ts +32 -32
  416. package/lib/terminology/components/terminology-panel/terminology-create-collection/terminology-create-collection.component.d.ts +20 -20
  417. package/lib/terminology/components/terminology-panel/terminology-panel.component.d.ts +30 -30
  418. package/lib/terminology/config/models/index.d.ts +1 -1
  419. package/lib/terminology/config/models/terminology-config.model.d.ts +39 -39
  420. package/lib/terminology/config/services/index.d.ts +1 -1
  421. package/lib/terminology/config/services/terminology-config/terminology-config.service.d.ts +9 -10
  422. package/lib/terminology/enums/combined-collection-tooltip-key.enum.d.ts +4 -4
  423. package/lib/terminology/enums/engine-term-collection-scope.enum.d.ts +5 -5
  424. package/lib/terminology/enums/engine-term-collection-source.enum.d.ts +4 -4
  425. package/lib/terminology/enums/engine-term-collection-status.enum.d.ts +6 -6
  426. package/lib/terminology/enums/engine-term-collection-sub-status.enum.d.ts +12 -12
  427. package/lib/terminology/enums/index.d.ts +6 -6
  428. package/lib/terminology/enums/mt-collection-status.enum.d.ts +8 -8
  429. package/lib/terminology/enums/mt-term-collection-v1-status.enum.d.ts +5 -5
  430. package/lib/terminology/enums/system-metadata-key.enum.d.ts +5 -5
  431. package/lib/terminology/enums/translation-api-version.model.d.ts +4 -4
  432. package/lib/terminology/factories/terminology-api.factory.d.ts +5 -5
  433. package/lib/terminology/factories/terminology-system.factory.d.ts +5 -5
  434. package/lib/terminology/icons/collections-menu.icon.d.ts +1 -1
  435. package/lib/terminology/icons/index.d.ts +1 -1
  436. package/lib/terminology/index.d.ts +9 -9
  437. package/lib/terminology/injection-tokens/terminology-api.token.d.ts +1 -1
  438. package/lib/terminology/injection-tokens/terminology-system.token.d.ts +1 -1
  439. package/lib/terminology/models/active-data.model.d.ts +22 -23
  440. package/lib/terminology/models/add-engine-terms-request-params.model.d.ts +7 -7
  441. package/lib/terminology/models/api-system.model.d.ts +27 -27
  442. package/lib/terminology/models/combined-collection.model.d.ts +92 -92
  443. package/lib/terminology/models/default-term-collection-order-update.model.d.ts +5 -5
  444. package/lib/terminology/models/domain.model.d.ts +9 -9
  445. package/lib/terminology/models/engine-term-collection-access-scope-update.model.d.ts +3 -3
  446. package/lib/terminology/models/engine-term-collection-access-scope.model.d.ts +4 -4
  447. package/lib/terminology/models/engine-term-collection-access-update.model.d.ts +6 -6
  448. package/lib/terminology/models/engine-term-collection-access.model.d.ts +6 -6
  449. package/lib/terminology/models/engine-term-collection-list.model.d.ts +4 -4
  450. package/lib/terminology/models/engine-term-collection.model.d.ts +24 -24
  451. package/lib/terminology/models/index.d.ts +20 -20
  452. package/lib/terminology/models/lang-list-item.model.d.ts +6 -6
  453. package/lib/terminology/models/mt-collection.model.d.ts +17 -17
  454. package/lib/terminology/models/mt-term-collection-v1.model.d.ts +12 -12
  455. package/lib/terminology/models/mt-term-service.model.d.ts +8 -8
  456. package/lib/terminology/models/system-api-service.model.d.ts +5 -5
  457. package/lib/terminology/models/system.model.d.ts +19 -20
  458. package/lib/terminology/models/terminology-engine.model.d.ts +15 -15
  459. package/lib/terminology/models/tld-term-collection-languages.model.d.ts +11 -11
  460. package/lib/terminology/models/tld-term-collection.model.d.ts +46 -46
  461. package/lib/terminology/models/update-engine-terms-request-params.model.d.ts +4 -4
  462. package/lib/terminology/models/vendor.model.d.ts +5 -5
  463. package/lib/terminology/services/engine-term-api/engine-term-api.service.d.ts +19 -19
  464. package/lib/terminology/services/engine-term-api/index.d.ts +1 -1
  465. package/lib/terminology/services/index.d.ts +5 -5
  466. package/lib/terminology/services/system-api-v1/system-api-v1.service.d.ts +15 -15
  467. package/lib/terminology/services/system-api-v2/models/engine-deployment.model.d.ts +9 -9
  468. package/lib/terminology/services/system-api-v2/models/engine-domain-list.model.d.ts +4 -4
  469. package/lib/terminology/services/system-api-v2/models/engine-domain.model.d.ts +5 -5
  470. package/lib/terminology/services/system-api-v2/models/engine-list.model.d.ts +4 -4
  471. package/lib/terminology/services/system-api-v2/models/engine-status.enum.d.ts +9 -9
  472. package/lib/terminology/services/system-api-v2/models/engine-sub-status.enum.d.ts +16 -16
  473. package/lib/terminology/services/system-api-v2/models/engine.model.d.ts +24 -24
  474. package/lib/terminology/services/system-api-v2/models/index.d.ts +8 -8
  475. package/lib/terminology/services/system-api-v2/models/revision.model.d.ts +9 -9
  476. package/lib/terminology/services/system-api-v2/models/worker-status.model.d.ts +12 -12
  477. package/lib/terminology/services/system-api-v2/system-api-v2.service.d.ts +16 -16
  478. package/lib/terminology/services/terminology/terminology.service.d.ts +61 -61
  479. package/lib/terminology/services/terminology-api-v1/terminology-api-v1.service.d.ts +17 -17
  480. package/lib/terminology/services/terminology-api-v2/terminology-api-v2.service.d.ts +18 -18
  481. package/lib/terminology/services/terminology-collection/index.d.ts +1 -1
  482. package/lib/terminology/services/terminology-collection/terminology-collection.service.d.ts +17 -17
  483. package/lib/terminology/terminology.component.d.ts +37 -37
  484. package/lib/terminology/terminology.module.d.ts +29 -29
  485. package/lib/tld-loader/index.d.ts +2 -2
  486. package/lib/tld-loader/tld-loader.component.d.ts +5 -5
  487. package/lib/tld-loader/tld-loader.module.d.ts +7 -7
  488. package/package.json +5 -4
  489. package/public-api.d.ts +20 -20
  490. package/styles/custom/containers.scss +1 -1
  491. package/styles/typography.scss +1 -1
  492. package/esm2022/lib/pipes/object-length/index.mjs +0 -3
  493. package/esm2022/lib/pipes/object-length/object-length.module.mjs +0 -18
  494. package/esm2022/lib/pipes/object-length/object-length.pipe.mjs +0 -22
  495. package/lib/pipes/object-length/index.d.ts +0 -2
  496. package/lib/pipes/object-length/object-length.module.d.ts +0 -8
  497. package/lib/pipes/object-length/object-length.pipe.d.ts +0 -7
@@ -1,229 +1,228 @@
1
- import { SelectionModel } from '@angular/cdk/collections';
2
- import { Component, ContentChild, ContentChildren, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
3
- import { MatSort } from '@angular/material/sort';
4
- import { MatColumnDef, MatHeaderRowDef, MatNoDataRow, MatRowDef, MatTable } from '@angular/material/table';
5
- import { map, take } from 'rxjs';
6
- import { HtmlElementParseHelper } from '../helpers';
7
- import { SaveFileHelper } from '../helpers/save-file.helper';
8
- import { DISABLE_EXPORT_ATTRIBUTE_NAME } from './constants/disable-export-attribute-name.const';
9
- import { ExportFormat } from './models';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "../services";
12
- import * as i2 from "@ngx-translate/core";
13
- import * as i3 from "@angular/common";
14
- import * as i4 from "@angular/material/table";
15
- import * as i5 from "@angular/material/button";
16
- import * as i6 from "@angular/material/menu";
17
- import * as i7 from "@angular/material/checkbox";
18
- import * as i8 from "@angular/forms";
19
- import * as i9 from "../filter-bar/filter-bar.component";
20
- import * as i10 from "@angular/flex-layout/flex";
21
- import * as i11 from "@angular/material/tooltip";
22
- import * as i12 from "../status-display/status-display.component";
23
- export class MultiFunctionalTableComponent {
24
- set selection(value) {
25
- this.matSelection.setSelection(...(value ?? []));
26
- }
27
- get ignoreAttributeName() { return DISABLE_EXPORT_ATTRIBUTE_NAME; }
28
- get filterActive() { return this.config.filter?.enabled; }
29
- get showFilterToggle() { return !this.config.filter?.hideFilterToggle; }
30
- constructor(domService, translateService) {
31
- this.domService = domService;
32
- this.translateService = translateService;
33
- this.matSelection = new SelectionModel(true, []);
34
- // Set this to false if you want to display checkboxes only on row hover.
35
- this.isRowCheckboxAlwaysVisible = true;
36
- //#region Output properties
37
- this.filterBarChange = new EventEmitter();
38
- this.exported = new EventEmitter();
39
- this.selectionChange = this.matSelection.changed.asObservable().pipe(map(() => { return this.matSelection.selected; }));
40
- this.noDataRowIcon = "manage_search";
41
- this.batchColumnName = "batch";
42
- }
43
- //#region Angular lifecycle hooks
44
- ngOnInit() {
45
- this.readFromLocalStorage();
46
- this.setFilterVisibility();
47
- this.setColumnSelectProperties();
48
- this.setExportProperties();
49
- this.setNoDataRowProperties();
50
- }
51
- ngAfterContentInit() {
52
- this.columnDefs.forEach(columnDef => this.table.addColumnDef(columnDef));
53
- this.rowDefs.forEach(rowDef => this.table.addRowDef(rowDef));
54
- this.headerRowDefs.forEach(headerRowDef => this.table.addHeaderRowDef(headerRowDef));
55
- this.headerRowDefs.forEach(headerRowDef => this.table.addHeaderRowDef(headerRowDef));
56
- this.table.setNoDataRow(this.noDataRow);
57
- }
58
- ngAfterViewInit() {
59
- this.config.dataSource.sort = this.sort;
60
- }
61
- //#endregion
62
- updateDisplayColumns(initial = false) {
63
- this.batchSelectedEnabled = this.config.batchConfig?.enabled ? true : false;
64
- const allColumns = this.config.columnSelect?.columns ?? [];
65
- this.displayColumns = [];
66
- this.configurableColumns = allColumns.filter(column => !column.notConfigurable);
67
- if (this.batchSelectedEnabled) {
68
- this.displayColumns.push(this.batchColumnName);
69
- }
70
- if (!allColumns.length) {
71
- return;
72
- }
73
- const localStorageValue = this.localStorageValue ?? {};
74
- if (!localStorageValue.columns) {
75
- localStorageValue.columns = {};
76
- }
77
- allColumns.forEach((column) => {
78
- if (initial) {
79
- column.selected = localStorageValue.columns?.[column.name] ?? column.selected;
80
- }
81
- else {
82
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
83
- localStorageValue.columns[column.name] = column.selected;
84
- }
85
- if (column.selected) {
86
- this.displayColumns.push(column.name);
87
- }
88
- });
89
- if (!initial) {
90
- this.updateLocalStorage(localStorageValue);
91
- }
92
- }
93
- toggleFilterBar() {
94
- const localstorageObject = this.localStorageValue ?? {};
95
- if (!localstorageObject.filter) {
96
- localstorageObject.filter = {};
97
- }
98
- this.filterBarVisible = !this.filterBarVisible;
99
- localstorageObject.filter.visible = this.filterBarVisible;
100
- this.updateLocalStorage(localstorageObject);
101
- }
102
- filtersChanged(filters) {
103
- this.filterBarChange.emit(filters);
104
- }
105
- export() {
106
- this.config.dataSource.connect().pipe(take(1)).subscribe((data) => {
107
- this.exported.emit(data);
108
- });
109
- if (this.config.export?.fileOptions) {
110
- this.exportToFile();
111
- }
112
- }
113
- highlightElement(element) {
114
- return this.highlightedElements?.includes(element);
115
- }
116
- //#region Methods for batch selection
117
- isAllSelected() {
118
- const numSelected = this.matSelection.selected.length;
119
- const numRows = this.config.dataSource.data.length;
120
- return numSelected === numRows;
121
- }
122
- toggleAllRowSelection() {
123
- if (this.isAllSelected()) {
124
- this.matSelection.clear();
125
- return;
126
- }
127
- this.matSelection.select(...this.config.dataSource.data);
128
- }
129
- toggleElementSelection(element) {
130
- this.matSelection.toggle(element);
131
- }
132
- //#endregion
133
- exportToFile() {
134
- if (!this.config.export?.fileOptions?.saveToFile) {
135
- return;
136
- }
137
- let fileString = "";
138
- let extension;
139
- switch (this.config.export.fileOptions.format) {
140
- case ExportFormat.CSV:
141
- default:
142
- extension = ExportFormat.CSV;
143
- fileString = HtmlElementParseHelper.tableAsCsv(this.tableElementRef.nativeElement, this.ignoreAttributeName);
144
- break;
145
- }
146
- const translatedFileName = this.translateService.instant(this.config.export.fileOptions.fileName);
147
- SaveFileHelper.saveFile(fileString, `${translatedFileName}.${extension}`);
148
- }
149
- updateLocalStorage(newValue) {
150
- this.localStorageValue = newValue;
151
- if (this.config.localStorageKey && newValue) {
152
- this.domService.localStorage?.setItem(this.config.localStorageKey, JSON.stringify(newValue));
153
- }
154
- }
155
- readFromLocalStorage() {
156
- if (this.config.localStorageKey) {
157
- try {
158
- const localStorageString = this.domService.localStorage?.getItem(this.config.localStorageKey);
159
- if (localStorageString) {
160
- this.localStorageValue = JSON.parse(localStorageString);
161
- }
162
- }
163
- // eslint-disable-next-line no-empty
164
- catch {
165
- }
166
- }
167
- }
168
- setColumnSelectProperties() {
169
- this.columnSelectActive = this.config.columnSelect?.enabled ? true : false;
170
- this.updateDisplayColumns(true);
171
- }
172
- setFilterVisibility() {
173
- this.filterBarVisible = this.localStorageValue?.filter?.visible ?? this.config?.filter?.visible ?? false;
174
- }
175
- setNoDataRowProperties() {
176
- if (this.config.noDataRow) {
177
- this.noDataRowActive = true;
178
- this.noDataRowConfig = this.config.noDataRow;
179
- this.noDataRowConfig.icon = this.config.noDataRow?.icon ?? this.noDataRowIcon;
180
- }
181
- }
182
- setExportProperties() {
183
- if (this.config.export?.enabled) {
184
- this.exportActive = true;
185
- }
186
- }
187
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiFunctionalTableComponent, deps: [{ token: i1.DOMService }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
188
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MultiFunctionalTableComponent, selector: "tld-multi-functional-table", inputs: { config: "config", highlightedElements: "highlightedElements", selection: "selection", isRowCheckboxAlwaysVisible: "isRowCheckboxAlwaysVisible" }, outputs: { filterBarChange: "filterBarChange", exported: "exported", selectionChange: "selectionChange" }, queries: [{ propertyName: "noDataRow", first: true, predicate: MatNoDataRow, descendants: true }, { propertyName: "headerRowDefs", predicate: MatHeaderRowDef }, { propertyName: "rowDefs", predicate: MatRowDef, descendants: true }, { propertyName: "columnDefs", predicate: MatColumnDef }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true, static: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableElementRef", first: true, predicate: MatTable, descendants: true, read: ElementRef }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n\r\n <div fxLayout=\"row\">\r\n <div fxFlex fxLayoutGap=\"1rem\">\r\n <button mat-button [matMenuTriggerFor]=\"columnMenu\" *ngIf=\"columnSelectActive\">\r\n <span class=\"material-icons column-select-icon\">menu</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.COLUMN_SELECT' | translate}}</span>\r\n </button>\r\n\r\n <button mat-button *ngIf=\"filterActive && showFilterToggle\" (click)=\"toggleFilterBar()\">\r\n <span class=\"material-icons\">filter_list</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.FILTER_TOGGLE' | translate}}</span>\r\n </button>\r\n\r\n <button class=\"export-data\" mat-stroked-button *ngIf=\"exportActive\" (click)=\"export()\">\r\n <span class=\"material-icons-outlined\">cloud_download</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.EXPORT' | translate}}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[additionalActions]\"></ng-content>\r\n </div>\r\n\r\n <mat-menu #columnMenu=\"matMenu\">\r\n <div class=\"column-select-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let column of configurableColumns\">\r\n <mat-checkbox [(ngModel)]=\"column.selected\" (change)=\"updateDisplayColumns()\">\r\n {{column.displayName | translate}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n\r\n <tld-filter-bar *ngIf=\"config.filter && config.filter.enabled\" [filterRowVisible]=\"!filterBarVisible\" [settings]=\"config.filter.settings\" \r\n (filterBarChange)=\"filtersChanged($event)\">\r\n </tld-filter-bar>\r\n\r\n <div class=\"table-overflow\">\r\n <table #table mat-table [dataSource]=\"config.dataSource\">\r\n <ng-content></ng-content>\r\n <ng-container [matColumnDef]=\"batchColumnName\">\r\n <th class=\"row-select\" mat-header-cell *matHeaderCellDef disable-export>\r\n <mat-checkbox [matTooltip]=\"'MULTI_FUNCTIONAL_TABLE.SELECT_ALL' | translate\" [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (change)=\"toggleAllRowSelection()\"\r\n [checked]=\"matSelection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"matSelection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td class=\"row-select\" mat-cell *matCellDef=\"let element\" disable-export>\r\n <mat-checkbox [matTooltip]=\"'MULTI_FUNCTIONAL_TABLE.SELECT' | translate\" *ngIf=\"isRowCheckboxAlwaysVisible || hoveredRow === element || matSelection.isSelected(element)\" [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"toggleElementSelection(element)\" [checked]=\"matSelection.isSelected(element)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"displayColumns\" sticky></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayColumns\" (mouseover)=\"hoveredRow = row\" (mouseleave)=\"hoveredRow = null\" [class.highlight]=\"highlightElement(row)\"></tr>\r\n\r\n <ng-container *ngIf=\"noDataRowActive\">\r\n <tr *matNoDataRow>\r\n <!-- add random number to make sure it takes full width -->\r\n <td colspan=\"99\">\r\n <lib-status-display [config]=\"noDataRowConfig\"></lib-status-display>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep th,:host ::ng-deep tr{white-space:nowrap}:host ::ng-deep td:not(:first-of-type){padding-right:10px!important}:host ::ng-deep tr.mat-mdc-row:hover,:host ::ng-deep tr.mat-mdc-row.highlight{background-color:var(--base-95)}:host ::ng-deep .export-data .mdc-button__label{display:flex;align-items:center}:host ::ng-deep .mat-mdc-cell,:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep .mdc-data-table__row:last-child{border-bottom-color:var(--base-70)}:host ::ng-deep .mdc-data-table__row:last-child{border-bottom-width:1px;border-bottom-style:solid}:host ::ng-deep .mdc-data-table__cell:nth-child(2),:host ::ng-deep .mdc-data-table__header-cell:nth-child(2){padding:0 16px 0 10px}table{width:100%}.column-select-icon{rotate:90deg}.column-select-wrapper{padding:1rem}.material-icons,.material-icons-outlined{margin-right:.5rem}.table-action-button{margin-bottom:1rem}th.mat-mdc-header-cell:first-of-type,td.mat-mdc-cell:first-of-type,td.mat-mdc-footer-cell:first-of-type{padding:0 0 0 10px}.row-select{width:0}.table-overflow{overflow-x:auto}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i4.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "component", type: i5.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: i6.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.FilterBarComponent, selector: "tld-filter-bar", inputs: ["settings", "filterRowVisible"], outputs: ["filterBarChange"] }, { kind: "directive", type: i10.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i10.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i10.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.StatusDisplayComponent, selector: "lib-status-display", inputs: ["config"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] }); }
189
- }
190
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiFunctionalTableComponent, decorators: [{
191
- type: Component,
192
- args: [{ selector: 'tld-multi-functional-table', template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n\r\n <div fxLayout=\"row\">\r\n <div fxFlex fxLayoutGap=\"1rem\">\r\n <button mat-button [matMenuTriggerFor]=\"columnMenu\" *ngIf=\"columnSelectActive\">\r\n <span class=\"material-icons column-select-icon\">menu</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.COLUMN_SELECT' | translate}}</span>\r\n </button>\r\n\r\n <button mat-button *ngIf=\"filterActive && showFilterToggle\" (click)=\"toggleFilterBar()\">\r\n <span class=\"material-icons\">filter_list</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.FILTER_TOGGLE' | translate}}</span>\r\n </button>\r\n\r\n <button class=\"export-data\" mat-stroked-button *ngIf=\"exportActive\" (click)=\"export()\">\r\n <span class=\"material-icons-outlined\">cloud_download</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.EXPORT' | translate}}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[additionalActions]\"></ng-content>\r\n </div>\r\n\r\n <mat-menu #columnMenu=\"matMenu\">\r\n <div class=\"column-select-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let column of configurableColumns\">\r\n <mat-checkbox [(ngModel)]=\"column.selected\" (change)=\"updateDisplayColumns()\">\r\n {{column.displayName | translate}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n\r\n <tld-filter-bar *ngIf=\"config.filter && config.filter.enabled\" [filterRowVisible]=\"!filterBarVisible\" [settings]=\"config.filter.settings\" \r\n (filterBarChange)=\"filtersChanged($event)\">\r\n </tld-filter-bar>\r\n\r\n <div class=\"table-overflow\">\r\n <table #table mat-table [dataSource]=\"config.dataSource\">\r\n <ng-content></ng-content>\r\n <ng-container [matColumnDef]=\"batchColumnName\">\r\n <th class=\"row-select\" mat-header-cell *matHeaderCellDef disable-export>\r\n <mat-checkbox [matTooltip]=\"'MULTI_FUNCTIONAL_TABLE.SELECT_ALL' | translate\" [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (change)=\"toggleAllRowSelection()\"\r\n [checked]=\"matSelection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"matSelection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td class=\"row-select\" mat-cell *matCellDef=\"let element\" disable-export>\r\n <mat-checkbox [matTooltip]=\"'MULTI_FUNCTIONAL_TABLE.SELECT' | translate\" *ngIf=\"isRowCheckboxAlwaysVisible || hoveredRow === element || matSelection.isSelected(element)\" [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"toggleElementSelection(element)\" [checked]=\"matSelection.isSelected(element)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"displayColumns\" sticky></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayColumns\" (mouseover)=\"hoveredRow = row\" (mouseleave)=\"hoveredRow = null\" [class.highlight]=\"highlightElement(row)\"></tr>\r\n\r\n <ng-container *ngIf=\"noDataRowActive\">\r\n <tr *matNoDataRow>\r\n <!-- add random number to make sure it takes full width -->\r\n <td colspan=\"99\">\r\n <lib-status-display [config]=\"noDataRowConfig\"></lib-status-display>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep th,:host ::ng-deep tr{white-space:nowrap}:host ::ng-deep td:not(:first-of-type){padding-right:10px!important}:host ::ng-deep tr.mat-mdc-row:hover,:host ::ng-deep tr.mat-mdc-row.highlight{background-color:var(--base-95)}:host ::ng-deep .export-data .mdc-button__label{display:flex;align-items:center}:host ::ng-deep .mat-mdc-cell,:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep .mdc-data-table__row:last-child{border-bottom-color:var(--base-70)}:host ::ng-deep .mdc-data-table__row:last-child{border-bottom-width:1px;border-bottom-style:solid}:host ::ng-deep .mdc-data-table__cell:nth-child(2),:host ::ng-deep .mdc-data-table__header-cell:nth-child(2){padding:0 16px 0 10px}table{width:100%}.column-select-icon{rotate:90deg}.column-select-wrapper{padding:1rem}.material-icons,.material-icons-outlined{margin-right:.5rem}.table-action-button{margin-bottom:1rem}th.mat-mdc-header-cell:first-of-type,td.mat-mdc-cell:first-of-type,td.mat-mdc-footer-cell:first-of-type{padding:0 0 0 10px}.row-select{width:0}.table-overflow{overflow-x:auto}\n"] }]
193
- }], ctorParameters: function () { return [{ type: i1.DOMService }, { type: i2.TranslateService }]; }, propDecorators: { config: [{
194
- type: Input
195
- }], highlightedElements: [{
196
- type: Input
197
- }], selection: [{
198
- type: Input
199
- }], isRowCheckboxAlwaysVisible: [{
200
- type: Input
201
- }], filterBarChange: [{
202
- type: Output
203
- }], exported: [{
204
- type: Output
205
- }], selectionChange: [{
206
- type: Output
207
- }], headerRowDefs: [{
208
- type: ContentChildren,
209
- args: [MatHeaderRowDef]
210
- }], rowDefs: [{
211
- type: ContentChildren,
212
- args: [MatRowDef, { descendants: true }]
213
- }], columnDefs: [{
214
- type: ContentChildren,
215
- args: [MatColumnDef]
216
- }], noDataRow: [{
217
- type: ContentChild,
218
- args: [MatNoDataRow]
219
- }], table: [{
220
- type: ViewChild,
221
- args: [MatTable, { static: true }]
222
- }], sort: [{
223
- type: ViewChild,
224
- args: [MatSort]
225
- }], tableElementRef: [{
226
- type: ViewChild,
227
- args: [MatTable, { read: ElementRef }]
228
- }] } });
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktZnVuY3Rpb25hbC10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvbXVsdGktZnVuY3Rpb25hbC10YWJsZS9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlL211bHRpLWZ1bmN0aW9uYWwtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBbUMsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqTCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRyxPQUFPLEVBQUUsR0FBRyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTdELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBWXhDLE1BQU0sT0FBTyw2QkFBNkI7SUFLeEMsSUFBYSxTQUFTLENBQUMsS0FBVTtRQUMvQixJQUFJLENBQUMs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QUFZO2dCQUVhLEtBQUs7c0JBQTNDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDakIsSUFBSTtzQkFBdkIsU0FBUzt1QkFBQyxPQUFPO2dCQUd5QixlQUFlO3NCQUF6RCxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBDb250ZW50Q2hpbGRyZW4sIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IE1hdENvbHVtbkRlZiwgTWF0SGVhZGVyUm93RGVmLCBNYXROb0RhdGFSb3csIE1hdFJvd0RlZiwgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlLCB0YWtlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZpbHRlckJhckNoYW5nZUV2ZW50IH0gZnJvbSAnLi4vZmlsdGVyLWJhci9tb2RlbHMvZmlsdGVyLWJhci1jaGFuZ2UtZXZlbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBIdG1sRWxlbWVudFBhcnNlSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycyc7XHJcbmltcG9ydCB7IFNhdmVGaWxlSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9zYXZlLWZpbGUuaGVscGVyJztcclxuaW1wb3J0IHsgRE9NU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgRElTQUJMRV9FWFBPUlRfQVRUUklCVVRFX05BTUUgfSBmcm9tICcuL2NvbnN0YW50cy9kaXNhYmxlLWV4cG9ydC1hdHRyaWJ1dGUtbmFtZS5jb25zdCc7XHJcbmltcG9ydCB7IEV4cG9ydEZvcm1hdCB9IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvY29sdW1uLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IE11bHRpRnVuY3Rpb25hbFRhYmxlQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvbXVsdGktZnVuY3Rpb25hbC10YWJsZS1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBTZWxlY3RlZENvbHVtbkxvY2FsU3RvcmFnZUNvbmZpZyB9IGZyb20gJy4vbW9kZWxzL3NlbGVjdGVkLWNvbHVtbi1sb2NhbC1zdG9yYWdlLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFN0YXR1c0Rpc3BsYXlDb25maWcgfSBmcm9tICcuLi9zdGF0dXMtZGlzcGxheS9tb2RlbHMvc3RhdHVzLWRpc3BsYXktY29uZmlnLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICd0bGQtbXVsdGktZnVuY3Rpb25hbC10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWZ1bmN0aW9uYWwtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL211bHRpLWZ1bmN0aW9uYWwtdGFibGUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTXVsdGlGdW5jdGlvbmFsVGFibGVDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIHJlYWRvbmx5IG1hdFNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxUPih0cnVlLCBbXSk7XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZyE6IE11bHRpRnVuY3Rpb25hbFRhYmxlQ29uZmlnPFQ+O1xyXG4gIEBJbnB1dCgpIGhpZ2hsaWdodGVkRWxlbWVudHMhOiBUW107XHJcbiAgQElucHV0KCkgc2V0IHNlbGVjdGlvbih2YWx1ZTogVFtdKSB7XHJcbiAgICB0aGlzLm1hdFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oLi4uKHZhbHVlID8/IFtdKSk7XHJcbiAgfVxyXG5cclxuICAvLyBTZXQgdGhpcyB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBkaXNwbGF5IGNoZWNrYm94ZXMgb25seSBvbiByb3cgaG92ZXIuXHJcbiAgQElucHV0KCkgaXNSb3dDaGVja2JveEFsd2F5c1Zpc2libGUgPSB0cnVlO1xyXG5cclxuICAvLyNyZWdpb24gT3V0cHV0IHByb3BlcnRpZXNcclxuICBAT3V0cHV0KCkgZmlsdGVyQmFyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RmlsdGVyQmFyQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJCYXJDaGFuZ2VFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgZXhwb3J0ZWQ6IEV2ZW50RW1pdHRlcjxUW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZTogT2JzZXJ2YWJsZTxUW10+ID0gdGhpcy5tYXRTZWxlY3Rpb24uY2hhbmdlZC5hc09ic2VydmFibGUoKS5waXBlKG1hcCgoKSA9PiB7IHJldHVybiB0aGlzLm1hdFNlbGVjdGlvbi5zZWxlY3RlZDsgfSkpO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIFByb3BlcnRpZXMgZm9yIG1hdCB0YWJsZSB3cmFwcGVyXHJcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRIZWFkZXJSb3dEZWYpIGhlYWRlclJvd0RlZnMhOiBRdWVyeUxpc3Q8TWF0SGVhZGVyUm93RGVmPjtcclxuICBAQ29udGVudENoaWxkcmVuKE1hdFJvd0RlZiwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSByb3dEZWZzITogUXVlcnlMaXN0PE1hdFJvd0RlZjxUPj47XHJcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRDb2x1bW5EZWYpIGNvbHVtbkRlZnMhOiBRdWVyeUxpc3Q8TWF0Q29sdW1uRGVmPjtcclxuICBAQ29udGVudENoaWxkKE1hdE5vRGF0YVJvdykgbm9EYXRhUm93ITogTWF0Tm9EYXRhUm93O1xyXG5cclxuICBAVmlld0NoaWxkKE1hdFRhYmxlLCB7IHN0YXRpYzogdHJ1ZSB9KSB0YWJsZSE6IE1hdFRhYmxlPFQ+O1xyXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydCE6IE1hdFNvcnQ7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUsIHsgcmVhZDogRWxlbWVudFJlZiB9KSB0YWJsZUVsZW1lbnRSZWYhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcblxyXG4gIGdldCBpZ25vcmVBdHRyaWJ1dGVOYW1lKCkgeyByZXR1cm4gRElTQUJMRV9FWFBPUlRfQVRUUklCVVRFX05BTUUgfVxyXG4gIGRpc3BsYXlDb2x1bW5zITogc3RyaW5nW107XHJcblxyXG4gIGNvbHVtblNlbGVjdEFjdGl2ZSE6IGJvb2xlYW47XHJcbiAgZXhwb3J0QWN0aXZlITogYm9vbGVhbjtcclxuICBub0RhdGFSb3dBY3RpdmUhOiBib29sZWFuO1xyXG5cclxuICBmaWx0ZXJCYXJWaXNpYmxlITogYm9vbGVhbjtcclxuXHJcbiAgbm9EYXRhUm93Q29uZmlnITogU3RhdHVzRGlzcGxheUNvbmZpZztcclxuICBub0RhdGFSb3dJY29uID0gXCJtYW5hZ2Vfc2VhcmNoXCI7XHJcblxyXG4gIGNvbmZpZ3VyYWJsZUNvbHVtbnMhOiBDb2x1bW5Db25maWdbXTtcclxuICBiYXRjaFNlbGVjdGVkRW5hYmxlZCE6IGJvb2xlYW47XHJcblxyXG4gIC8vIGlzIHVzZWQgaW4gaHRtbCB0byBkaXNwbGF5IGJhdGNoIGNoZWNrYm94IG9uIGhvdmVyZWQgcm93XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBob3ZlcmVkUm93OiBhbnk7XHJcblxyXG4gIGdldCBmaWx0ZXJBY3RpdmUoKSB7IHJldHVybiB0aGlzLmNvbmZpZy5maWx0ZXI/LmVuYWJsZWQ7IH1cclxuICBnZXQgc2hvd0ZpbHRlclRvZ2dsZSgpIHsgcmV0dXJuICF0aGlzLmNvbmZpZy5maWx0ZXI/LmhpZGVGaWx0ZXJUb2dnbGU7IH1cclxuXHJcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VWYWx1ZSE6IFNlbGVjdGVkQ29sdW1uTG9jYWxTdG9yYWdlQ29uZmlnO1xyXG4gIHJlYWRvbmx5IGJhdGNoQ29sdW1uTmFtZSA9IFwiYmF0Y2hcIjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkb21TZXJ2aWNlOiBET01TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7IH1cclxuXHJcbiAgLy8jcmVnaW9uIEFuZ3VsYXIgbGlmZWN5Y2xlIGhvb2tzXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlYWRGcm9tTG9jYWxTdG9yYWdlKCk7XHJcbiAgICB0aGlzLnNldEZpbHRlclZpc2liaWxpdHkoKTtcclxuICAgIHRoaXMuc2V0Q29sdW1uU2VsZWN0UHJvcGVydGllcygpO1xyXG4gICAgdGhpcy5zZXRFeHBvcnRQcm9wZXJ0aWVzKCk7XHJcbiAgICB0aGlzLnNldE5vRGF0YVJvd1Byb3BlcnRpZXMoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgIHRoaXMuY29sdW1uRGVmcy5mb3JFYWNoKGNvbHVtbkRlZiA9PiB0aGlzLnRhYmxlLmFkZENvbHVtbkRlZihjb2x1bW5EZWYpKTtcclxuICAgIHRoaXMucm93RGVmcy5mb3JFYWNoKHJvd0RlZiA9PiB0aGlzLnRhYmxlLmFkZFJvd0RlZihyb3dEZWYpKTtcclxuICAgIHRoaXMuaGVhZGVyUm93RGVmcy5mb3JFYWNoKGhlYWRlclJvd0RlZiA9PiB0aGlzLnRhYmxlLmFkZEhlYWRlclJvd0RlZihoZWFkZXJSb3dEZWYpKTtcclxuICAgIHRoaXMuaGVhZGVyUm93RGVmcy5mb3JFYWNoKGhlYWRlclJvd0RlZiA9PiB0aGlzLnRhYmxlLmFkZEhlYWRlclJvd0RlZihoZWFkZXJSb3dEZWYpKTtcclxuICAgIHRoaXMudGFibGUuc2V0Tm9EYXRhUm93KHRoaXMubm9EYXRhUm93KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmlnLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHVwZGF0ZURpc3BsYXlDb2x1bW5zKGluaXRpYWwgPSBmYWxzZSkge1xyXG4gICAgdGhpcy5iYXRjaFNlbGVjdGVkRW5hYmxlZCA9IHRoaXMuY29uZmlnLmJhdGNoQ29uZmlnPy5lbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IHRoaXMuY29uZmlnLmNvbHVtblNlbGVjdD8uY29sdW1ucyA/PyBbXTtcclxuICAgIHRoaXMuZGlzcGxheUNvbHVtbnMgPSBbXTtcclxuICAgIHRoaXMuY29uZmlndXJhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiAhY29sdW1uLm5vdENvbmZpZ3VyYWJsZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYmF0Y2hTZWxlY3RlZEVuYWJsZWQpIHtcclxuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1ucy5wdXNoKHRoaXMuYmF0Y2hDb2x1bW5OYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWFsbENvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsb2NhbFN0b3JhZ2VWYWx1ZSA9IHRoaXMubG9jYWxTdG9yYWdlVmFsdWUgPz8ge307XHJcbiAgICBpZiAoIWxvY2FsU3RvcmFnZVZhbHVlLmNvbHVtbnMpIHtcclxuICAgICAgbG9jYWxTdG9yYWdlVmFsdWUuY29sdW1ucyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGFsbENvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChpbml0aWFsKSB7XHJcbiAgICAgICAgY29sdW1uLnNlbGVjdGVkID0gbG9jYWxTdG9yYWdlVmFsdWUuY29sdW1ucz8uW2NvbHVtbi5uYW1lXSA/PyBjb2x1bW4uc2VsZWN0ZWQ7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICBsb2NhbFN0b3JhZ2VWYWx1ZS5jb2x1bW5zIVtjb2x1bW4ubmFtZV0gPSBjb2x1bW4uc2VsZWN0ZWQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbHVtbi5zZWxlY3RlZCkge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUNvbHVtbnMucHVzaChjb2x1bW4ubmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBpZiAoIWluaXRpYWwpIHtcclxuICAgICAgdGhpcy51cGRhdGVMb2NhbFN0b3JhZ2UobG9jYWxTdG9yYWdlVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRmlsdGVyQmFyKCkge1xyXG4gICAgY29uc3QgbG9jYWxzdG9yYWdlT2JqZWN0ID0gdGhpcy5sb2NhbFN0b3JhZ2VWYWx1ZSA/PyB7fTtcclxuICAgIGlmICghbG9jYWxzdG9yYWdlT2JqZWN0LmZpbHRlcikge1xyXG4gICAgICBsb2NhbHN0b3JhZ2VPYmplY3QuZmlsdGVyID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWx0ZXJCYXJWaXNpYmxlID0gIXRoaXMuZmlsdGVyQmFyVmlzaWJsZTtcclxuICAgIGxvY2Fsc3RvcmFnZU9iamVjdC5maWx0ZXIudmlzaWJsZSA9IHRoaXMuZmlsdGVyQmFyVmlzaWJsZTtcclxuICAgIHRoaXMudXBkYXRlTG9jYWxTdG9yYWdlKGxvY2Fsc3RvcmFnZU9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJzQ2hhbmdlZChmaWx0ZXJzOiBGaWx0ZXJCYXJDaGFuZ2VFdmVudCkge1xyXG4gICAgdGhpcy5maWx0ZXJCYXJDaGFuZ2UuZW1pdChmaWx0ZXJzKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCgpIHtcclxuICAgIHRoaXMuY29uZmlnLmRhdGFTb3VyY2UuY29ubmVjdCgpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZXhwb3J0ZWQuZW1pdChkYXRhKTtcclxuICAgIH0pXHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLmV4cG9ydD8uZmlsZU9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5leHBvcnRUb0ZpbGUoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlnaGxpZ2h0RWxlbWVudChlbGVtZW50OiBUKSB7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRlZEVsZW1lbnRzPy5pbmNsdWRlcyhlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBNZXRob2RzIGZvciBiYXRjaCBzZWxlY3Rpb25cclxuICBpc0FsbFNlbGVjdGVkKCkge1xyXG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLm1hdFNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XHJcbiAgICBjb25zdCBudW1Sb3dzID0gdGhpcy5jb25maWcuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aDtcclxuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcclxuICB9XHJcblxyXG4gIHRvZ2dsZUFsbFJvd1NlbGVjdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmlzQWxsU2VsZWN0ZWQoKSkge1xyXG4gICAgICB0aGlzLm1hdFNlbGVjdGlvbi5jbGVhcigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tYXRTZWxlY3Rpb24uc2VsZWN0KC4uLnRoaXMuY29uZmlnLmRhdGFTb3VyY2UuZGF0YSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVFbGVtZW50U2VsZWN0aW9uKGVsZW1lbnQ6IFQpIHtcclxuICAgIHRoaXMubWF0U2VsZWN0aW9uLnRvZ2dsZShlbGVtZW50KTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHByaXZhdGUgZXhwb3J0VG9GaWxlKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5leHBvcnQ/LmZpbGVPcHRpb25zPy5zYXZlVG9GaWxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZmlsZVN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgZXh0ZW5zaW9uITogRXhwb3J0Rm9ybWF0O1xyXG4gICAgc3dpdGNoICh0aGlzLmNvbmZpZy5leHBvcnQuZmlsZU9wdGlvbnMuZm9ybWF0KSB7XHJcbiAgICAgIGNhc2UgRXhwb3J0Rm9ybWF0LkNTVjpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBleHRlbnNpb24gPSBFeHBvcnRGb3JtYXQuQ1NWO1xyXG4gICAgICAgIGZpbGVTdHJpbmcgPSBIdG1sRWxlbWVudFBhcnNlSGVscGVyLnRhYmxlQXNDc3YodGhpcy50YWJsZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5pZ25vcmVBdHRyaWJ1dGVOYW1lKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGNvbnN0IHRyYW5zbGF0ZWRGaWxlTmFtZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY29uZmlnLmV4cG9ydC5maWxlT3B0aW9ucy5maWxlTmFtZSk7XHJcbiAgICBTYXZlRmlsZUhlbHBlci5zYXZlRmlsZShmaWxlU3RyaW5nLCBgJHt0cmFuc2xhdGVkRmlsZU5hbWV9LiR7ZXh0ZW5zaW9ufWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVMb2NhbFN0b3JhZ2UobmV3VmFsdWU6IFNlbGVjdGVkQ29sdW1uTG9jYWxTdG9yYWdlQ29uZmlnKSB7XHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICBpZiAodGhpcy5jb25maWcubG9jYWxTdG9yYWdlS2V5ICYmIG5ld1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZG9tU2VydmljZS5sb2NhbFN0b3JhZ2U/LnNldEl0ZW0odGhpcy5jb25maWcubG9jYWxTdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShuZXdWYWx1ZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIHJlYWRGcm9tTG9jYWxTdG9yYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmxvY2FsU3RvcmFnZUtleSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGxvY2FsU3RvcmFnZVN0cmluZyA9IHRoaXMuZG9tU2VydmljZS5sb2NhbFN0b3JhZ2U/LmdldEl0ZW0odGhpcy5jb25maWcubG9jYWxTdG9yYWdlS2V5KTtcclxuICAgICAgICBpZiAobG9jYWxTdG9yYWdlU3RyaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2VTdHJpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcclxuICAgICAgY2F0Y2gge1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldENvbHVtblNlbGVjdFByb3BlcnRpZXMoKSB7XHJcbiAgICB0aGlzLmNvbHVtblNlbGVjdEFjdGl2ZSA9IHRoaXMuY29uZmlnLmNvbHVtblNlbGVjdD8uZW5hYmxlZCA/IHRydWUgOiBmYWxzZTtcclxuICAgIHRoaXMudXBkYXRlRGlzcGxheUNvbHVtbnModHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZpbHRlclZpc2liaWxpdHkoKSB7XHJcbiAgICB0aGlzLmZpbHRlckJhclZpc2libGUgPSB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlPy5maWx0ZXI/LnZpc2libGUgPz8gdGhpcy5jb25maWc/LmZpbHRlcj8udmlzaWJsZSA/PyBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Tm9EYXRhUm93UHJvcGVydGllcygpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5ub0RhdGFSb3cpIHtcclxuICAgICAgdGhpcy5ub0RhdGFSb3dBY3RpdmUgPSB0cnVlO1xyXG4gICAgICB0aGlzLm5vRGF0YVJvd0NvbmZpZyA9IHRoaXMuY29uZmlnLm5vRGF0YVJvdztcclxuICAgICAgdGhpcy5ub0RhdGFSb3dDb25maWcuaWNvbiA9IHRoaXMuY29uZmlnLm5vRGF0YVJvdz8uaWNvbiA/PyB0aGlzLm5vRGF0YVJvd0ljb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEV4cG9ydFByb3BlcnRpZXMoKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWcuZXhwb3J0Py5lbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuZXhwb3J0QWN0aXZlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0R2FwPVwiMXJlbVwiPlxyXG5cclxuICA8ZGl2IGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICA8ZGl2IGZ4RmxleCBmeExheW91dEdhcD1cIjFyZW1cIj5cclxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJjb2x1bW5NZW51XCIgKm5nSWY9XCJjb2x1bW5TZWxlY3RBY3RpdmVcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGNvbHVtbi1zZWxlY3QtaWNvblwiPm1lbnU8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4+e3snTVVMVElfRlVOQ1RJT05BTF9UQUJMRS5DT0xVTU5fU0VMRUNUJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKm5nSWY9XCJmaWx0ZXJBY3RpdmUgJiYgc2hvd0ZpbHRlclRvZ2dsZVwiIChjbGljayk9XCJ0b2dnbGVGaWx0ZXJCYXIoKVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5maWx0ZXJfbGlzdDwvc3Bhbj5cclxuICAgICAgICA8c3Bhbj57eydNVUxUSV9GVU5DVElPTkFMX1RBQkxFLkZJTFRFUl9UT0dHTEUnIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImV4cG9ydC1kYXRhXCIgbWF0LXN0cm9rZWQtYnV0dG9uICpuZ0lmPVwiZXhwb3J0QWN0aXZlXCIgKGNsaWNrKT1cImV4cG9ydCgpXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPmNsb3VkX2Rvd25sb2FkPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuPnt7J01VTFRJX0ZVTkNUSU9OQUxfVEFCTEUuRVhQT1JUJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthZGRpdGlvbmFsQWN0aW9uc11cIj48L25nLWNvbnRlbnQ+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxtYXQtbWVudSAjY29sdW1uTWVudT1cIm1hdE1lbnVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tc2VsZWN0LXdyYXBwZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb25maWd1cmFibGVDb2x1bW5zXCI+XHJcbiAgICAgICAgPG1hdC1jaGVja2JveCBbKG5nTW9kZWwpXT1cImNvbHVtbi5zZWxlY3RlZFwiIChjaGFuZ2UpPVwidXBkYXRlRGlzcGxheUNvbHVtbnMoKVwiPlxyXG4gICAgICAgICAge3tjb2x1bW4uZGlzcGxheU5hbWUgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbWF0LW1lbnU+XHJcblxyXG4gIDx0bGQtZmlsdGVyLWJhciAqbmdJZj1cImNvbmZpZy5maWx0ZXIgJiYgY29uZmlnLmZpbHRlci5lbmFibGVkXCIgW2ZpbHRlclJvd1Zpc2libGVdPVwiIWZpbHRlckJhclZpc2libGVcIiBbc2V0dGluZ3NdPVwiY29uZmlnLmZpbHRlci5zZXR0aW5nc1wiIFxyXG4gICAgKGZpbHRlckJhckNoYW5nZSk9XCJmaWx0ZXJzQ2hhbmdlZCgkZXZlbnQpXCI+XHJcbiAgPC90bGQtZmlsdGVyLWJhcj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInRhYmxlLW92ZXJmbG93XCI+XHJcbiAgICA8dGFibGUgI3RhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJjb25maWcuZGF0YVNvdXJjZVwiPlxyXG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJiYXRjaENvbHVtbk5hbWVcIj5cclxuICAgICAgICA8dGggY2xhc3M9XCJyb3ctc2VsZWN0XCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGRpc2FibGUtZXhwb3J0PlxyXG4gICAgICAgICAgPG1hdC1jaGVja2JveCBbbWF0VG9vbHRpcF09XCInTVVMVElfRlVOQ1RJT05BTF9UQUJMRS5TRUxFQ1RfQUxMJyB8IHRyYW5zbGF0ZVwiIFtkaXNhYmxlZF09XCJjb25maWcuYmF0Y2hDb25maWchLmNoZWNrQm94ZXNEaXNhYmxlZFwiIChjaGFuZ2UpPVwidG9nZ2xlQWxsUm93U2VsZWN0aW9uKClcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJtYXRTZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiBpc0FsbFNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJtYXRTZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCI+XHJcbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cInJvdy1zZWxlY3RcIiBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgZGlzYWJsZS1leHBvcnQ+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94IFttYXRUb29sdGlwXT1cIidNVUxUSV9GVU5DVElPTkFMX1RBQkxFLlNFTEVDVCcgfCB0cmFuc2xhdGVcIiAqbmdJZj1cImlzUm93Q2hlY2tib3hBbHdheXNWaXNpYmxlIHx8IGhvdmVyZWRSb3cgPT09IGVsZW1lbnQgfHwgbWF0U2VsZWN0aW9uLmlzU2VsZWN0ZWQoZWxlbWVudClcIiBbZGlzYWJsZWRdPVwiY29uZmlnLmJhdGNoQ29uZmlnIS5jaGVja0JveGVzRGlzYWJsZWRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVFbGVtZW50U2VsZWN0aW9uKGVsZW1lbnQpXCIgW2NoZWNrZWRdPVwibWF0U2VsZWN0aW9uLmlzU2VsZWN0ZWQoZWxlbWVudClcIj5cclxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXlDb2x1bW5zXCIgc3RpY2t5PjwvdHI+XHJcbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5Q29sdW1uc1wiIChtb3VzZW92ZXIpPVwiaG92ZXJlZFJvdyA9IHJvd1wiIChtb3VzZWxlYXZlKT1cImhvdmVyZWRSb3cgPSBudWxsXCIgW2NsYXNzLmhpZ2hsaWdodF09XCJoaWdobGlnaHRFbGVtZW50KHJvdylcIj48L3RyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vRGF0YVJvd0FjdGl2ZVwiPlxyXG4gICAgICAgIDx0ciAqbWF0Tm9EYXRhUm93PlxyXG4gICAgICAgICAgPCEtLSBhZGQgcmFuZG9tIG51bWJlciB0byBtYWtlIHN1cmUgaXQgdGFrZXMgZnVsbCB3aWR0aCAtLT5cclxuICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiOTlcIj5cclxuICAgICAgICAgICAgPGxpYi1zdGF0dXMtZGlzcGxheSBbY29uZmlnXT1cIm5vRGF0YVJvd0NvbmZpZ1wiPjwvbGliLXN0YXR1cy1kaXNwbGF5PlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvdGFibGU+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
1
+ import { SelectionModel } from '@angular/cdk/collections';
2
+ import { Component, ContentChild, ContentChildren, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
3
+ import { MatSort } from '@angular/material/sort';
4
+ import { MatColumnDef, MatHeaderRowDef, MatNoDataRow, MatRowDef, MatTable } from '@angular/material/table';
5
+ import { map, take } from 'rxjs';
6
+ import { HtmlElementParseHelper } from '../helpers';
7
+ import { SaveFileHelper } from '../helpers/save-file.helper';
8
+ import { DISABLE_EXPORT_ATTRIBUTE_NAME } from './constants/disable-export-attribute-name.const';
9
+ import { ExportFormat } from './models';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../services";
12
+ import * as i2 from "@ngx-translate/core";
13
+ import * as i3 from "@angular/common";
14
+ import * as i4 from "@angular/material/table";
15
+ import * as i5 from "@angular/material/button";
16
+ import * as i6 from "@angular/material/menu";
17
+ import * as i7 from "@angular/material/checkbox";
18
+ import * as i8 from "@angular/forms";
19
+ import * as i9 from "../filter-bar/filter-bar.component";
20
+ import * as i10 from "@ngbracket/ngx-layout/flex";
21
+ import * as i11 from "@angular/material/tooltip";
22
+ import * as i12 from "../status-display/status-display.component";
23
+ export class MultiFunctionalTableComponent {
24
+ set selection(value) {
25
+ this.matSelection.setSelection(...(value ?? []));
26
+ }
27
+ get ignoreAttributeName() { return DISABLE_EXPORT_ATTRIBUTE_NAME; }
28
+ get filterActive() { return this.config.filter?.enabled; }
29
+ constructor(domService, translateService) {
30
+ this.domService = domService;
31
+ this.translateService = translateService;
32
+ this.matSelection = new SelectionModel(true, []);
33
+ // Set this to false if you want to display checkboxes only on row hover.
34
+ this.isRowCheckboxAlwaysVisible = true;
35
+ //#region Output properties
36
+ this.filterBarChange = new EventEmitter();
37
+ this.exported = new EventEmitter();
38
+ this.selectionChange = this.matSelection.changed.asObservable().pipe(map(() => { return this.matSelection.selected; }));
39
+ this.noDataRowIcon = "manage_search";
40
+ this.batchColumnName = "batch";
41
+ }
42
+ //#region Angular lifecycle hooks
43
+ ngOnInit() {
44
+ this.readFromLocalStorage();
45
+ this.setFilterVisibility();
46
+ this.setColumnSelectProperties();
47
+ this.setExportProperties();
48
+ this.setNoDataRowProperties();
49
+ }
50
+ ngAfterContentInit() {
51
+ this.columnDefs.forEach(columnDef => this.table.addColumnDef(columnDef));
52
+ this.rowDefs.forEach(rowDef => this.table.addRowDef(rowDef));
53
+ this.headerRowDefs.forEach(headerRowDef => this.table.addHeaderRowDef(headerRowDef));
54
+ this.headerRowDefs.forEach(headerRowDef => this.table.addHeaderRowDef(headerRowDef));
55
+ this.table.setNoDataRow(this.noDataRow);
56
+ }
57
+ ngAfterViewInit() {
58
+ this.config.dataSource.sort = this.sort;
59
+ }
60
+ //#endregion
61
+ updateDisplayColumns(initial = false) {
62
+ this.batchSelectedEnabled = this.config.batchConfig?.enabled ? true : false;
63
+ const allColumns = this.config.columnSelect?.columns ?? [];
64
+ this.displayColumns = [];
65
+ this.configurableColumns = allColumns.filter(column => !column.notConfigurable);
66
+ if (this.batchSelectedEnabled) {
67
+ this.displayColumns.push(this.batchColumnName);
68
+ }
69
+ if (!allColumns.length) {
70
+ return;
71
+ }
72
+ const localStorageValue = this.localStorageValue ?? {};
73
+ if (!localStorageValue.columns) {
74
+ localStorageValue.columns = {};
75
+ }
76
+ allColumns.forEach((column) => {
77
+ if (initial) {
78
+ column.selected = localStorageValue.columns?.[column.name] ?? column.selected;
79
+ }
80
+ else {
81
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
82
+ localStorageValue.columns[column.name] = column.selected;
83
+ }
84
+ if (column.selected) {
85
+ this.displayColumns.push(column.name);
86
+ }
87
+ });
88
+ if (!initial) {
89
+ this.updateLocalStorage(localStorageValue);
90
+ }
91
+ }
92
+ toggleFilterBar() {
93
+ const localstorageObject = this.localStorageValue ?? {};
94
+ if (!localstorageObject.filter) {
95
+ localstorageObject.filter = {};
96
+ }
97
+ this.filterBarVisible = !this.filterBarVisible;
98
+ localstorageObject.filter.visible = this.filterBarVisible;
99
+ this.updateLocalStorage(localstorageObject);
100
+ }
101
+ filtersChanged(filters) {
102
+ this.filterBarChange.emit(filters);
103
+ }
104
+ export() {
105
+ this.config.dataSource.connect().pipe(take(1)).subscribe((data) => {
106
+ this.exported.emit(data);
107
+ });
108
+ if (this.config.export?.fileOptions) {
109
+ this.exportToFile();
110
+ }
111
+ }
112
+ highlightElement(element) {
113
+ return this.highlightedElements?.includes(element);
114
+ }
115
+ //#region Methods for batch selection
116
+ isAllSelected() {
117
+ const numSelected = this.matSelection.selected.length;
118
+ const numRows = this.config.dataSource.data.length;
119
+ return numSelected === numRows;
120
+ }
121
+ toggleAllRowSelection() {
122
+ if (this.isAllSelected()) {
123
+ this.matSelection.clear();
124
+ return;
125
+ }
126
+ this.matSelection.select(...this.config.dataSource.data);
127
+ }
128
+ toggleElementSelection(element) {
129
+ this.matSelection.toggle(element);
130
+ }
131
+ //#endregion
132
+ exportToFile() {
133
+ if (!this.config.export?.fileOptions?.saveToFile) {
134
+ return;
135
+ }
136
+ let fileString = "";
137
+ let extension;
138
+ switch (this.config.export.fileOptions.format) {
139
+ case ExportFormat.CSV:
140
+ default:
141
+ extension = ExportFormat.CSV;
142
+ fileString = HtmlElementParseHelper.tableAsCsv(this.tableElementRef.nativeElement, this.ignoreAttributeName);
143
+ break;
144
+ }
145
+ const translatedFileName = this.translateService.instant(this.config.export.fileOptions.fileName);
146
+ SaveFileHelper.saveFile(fileString, `${translatedFileName}.${extension}`);
147
+ }
148
+ updateLocalStorage(newValue) {
149
+ this.localStorageValue = newValue;
150
+ if (this.config.localStorageKey && newValue) {
151
+ this.domService.localStorage?.setItem(this.config.localStorageKey, JSON.stringify(newValue));
152
+ }
153
+ }
154
+ readFromLocalStorage() {
155
+ if (this.config.localStorageKey) {
156
+ try {
157
+ const localStorageString = this.domService.localStorage?.getItem(this.config.localStorageKey);
158
+ if (localStorageString) {
159
+ this.localStorageValue = JSON.parse(localStorageString);
160
+ }
161
+ }
162
+ // eslint-disable-next-line no-empty
163
+ catch {
164
+ }
165
+ }
166
+ }
167
+ setColumnSelectProperties() {
168
+ this.columnSelectActive = this.config.columnSelect?.enabled ? true : false;
169
+ this.updateDisplayColumns(true);
170
+ }
171
+ setFilterVisibility() {
172
+ this.filterBarVisible = this.localStorageValue?.filter?.visible ?? this.config?.filter?.visible ?? false;
173
+ }
174
+ setNoDataRowProperties() {
175
+ if (this.config.noDataRow) {
176
+ this.noDataRowActive = true;
177
+ this.noDataRowConfig = this.config.noDataRow;
178
+ this.noDataRowConfig.icon = this.config.noDataRow?.icon ?? this.noDataRowIcon;
179
+ }
180
+ }
181
+ setExportProperties() {
182
+ if (this.config.export?.enabled) {
183
+ this.exportActive = true;
184
+ }
185
+ }
186
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MultiFunctionalTableComponent, deps: [{ token: i1.DOMService }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
187
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: MultiFunctionalTableComponent, selector: "tld-multi-functional-table", inputs: { config: "config", highlightedElements: "highlightedElements", selection: "selection", isRowCheckboxAlwaysVisible: "isRowCheckboxAlwaysVisible" }, outputs: { filterBarChange: "filterBarChange", exported: "exported", selectionChange: "selectionChange" }, queries: [{ propertyName: "noDataRow", first: true, predicate: MatNoDataRow, descendants: true }, { propertyName: "headerRowDefs", predicate: MatHeaderRowDef }, { propertyName: "rowDefs", predicate: MatRowDef, descendants: true }, { propertyName: "columnDefs", predicate: MatColumnDef }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true, static: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableElementRef", first: true, predicate: MatTable, descendants: true, read: ElementRef }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n\r\n <div fxLayout=\"row\">\r\n <div fxFlex fxLayoutGap=\"1rem\">\r\n <button mat-button [matMenuTriggerFor]=\"columnMenu\" *ngIf=\"columnSelectActive\">\r\n <span class=\"material-icons column-select-icon\">menu</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.COLUMN_SELECT' | translate}}</span>\r\n </button>\r\n\r\n <button mat-button *ngIf=\"filterActive\" (click)=\"toggleFilterBar()\">\r\n <span class=\"material-icons\">filter_list</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.FILTER_TOGGLE' | translate}}</span>\r\n </button>\r\n\r\n <button class=\"export-data\" mat-stroked-button *ngIf=\"exportActive\" (click)=\"export()\">\r\n <span class=\"material-icons-outlined\">cloud_download</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.EXPORT' | translate}}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[additionalActions]\"></ng-content>\r\n </div>\r\n\r\n <mat-menu #columnMenu=\"matMenu\">\r\n <div class=\"column-select-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let column of configurableColumns\">\r\n <mat-checkbox [(ngModel)]=\"column.selected\" (change)=\"updateDisplayColumns()\">\r\n {{column.displayName | translate}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n\r\n <tld-filter-bar *ngIf=\"config.filter && config.filter.enabled\" [filterRowVisible]=\"!filterBarVisible\" [settings]=\"config.filter.settings\" \r\n (filterBarChange)=\"filtersChanged($event)\">\r\n </tld-filter-bar>\r\n\r\n <div class=\"table-overflow\">\r\n <table #table mat-table [dataSource]=\"config.dataSource\">\r\n <ng-content></ng-content>\r\n <ng-container [matColumnDef]=\"batchColumnName\">\r\n <th class=\"row-select\" mat-header-cell *matHeaderCellDef disable-export>\r\n <mat-checkbox [matTooltip]=\"'MULTI_FUNCTIONAL_TABLE.SELECT_ALL' | translate\" [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (change)=\"toggleAllRowSelection()\"\r\n [checked]=\"matSelection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"matSelection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td class=\"row-select\" mat-cell *matCellDef=\"let element\" disable-export>\r\n <mat-checkbox [matTooltip]=\"'MULTI_FUNCTIONAL_TABLE.SELECT' | translate\" *ngIf=\"isRowCheckboxAlwaysVisible || hoveredRow === element || matSelection.isSelected(element)\" [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"toggleElementSelection(element)\" [checked]=\"matSelection.isSelected(element)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"displayColumns\" sticky></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayColumns\" (mouseover)=\"hoveredRow = row\" (mouseleave)=\"hoveredRow = null\" [class.highlight]=\"highlightElement(row)\"></tr>\r\n\r\n <ng-container *ngIf=\"noDataRowActive\">\r\n <tr *matNoDataRow>\r\n <!-- add random number to make sure it takes full width -->\r\n <td colspan=\"99\">\r\n <lib-status-display [config]=\"noDataRowConfig\"></lib-status-display>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep th,:host ::ng-deep tr{white-space:nowrap}:host ::ng-deep td:not(:first-of-type){padding-right:10px!important}:host ::ng-deep tr.mat-mdc-row:hover,:host ::ng-deep tr.mat-mdc-row.highlight{background-color:var(--base-95)}:host ::ng-deep .export-data .mdc-button__label{display:flex;align-items:center}:host ::ng-deep .mat-mdc-cell,:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep .mdc-data-table__row:last-child{border-bottom-color:var(--base-70)}:host ::ng-deep .mdc-data-table__row:last-child{border-bottom-width:1px;border-bottom-style:solid}:host ::ng-deep .mdc-data-table__cell:nth-child(2),:host ::ng-deep .mdc-data-table__header-cell:nth-child(2){padding:0 16px 0 10px}table{width:100%}.column-select-icon{rotate:90deg}.column-select-wrapper{padding:1rem}.material-icons,.material-icons-outlined{margin-right:.5rem}.table-action-button{margin-bottom:1rem}th.mat-mdc-header-cell:first-of-type,td.mat-mdc-cell:first-of-type,td.mat-mdc-footer-cell:first-of-type{padding:0 0 0 10px}.row-select{width:0}.table-overflow{overflow-x:auto}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i4.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.FilterBarComponent, selector: "tld-filter-bar", inputs: ["settings", "filterRowVisible"], outputs: ["filterBarChange"] }, { kind: "directive", type: i10.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i10.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i10.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i12.StatusDisplayComponent, selector: "lib-status-display", inputs: ["config"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] }); }
188
+ }
189
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MultiFunctionalTableComponent, decorators: [{
190
+ type: Component,
191
+ args: [{ selector: 'tld-multi-functional-table', template: "<div fxLayout=\"column\" fxLayoutGap=\"1rem\">\r\n\r\n <div fxLayout=\"row\">\r\n <div fxFlex fxLayoutGap=\"1rem\">\r\n <button mat-button [matMenuTriggerFor]=\"columnMenu\" *ngIf=\"columnSelectActive\">\r\n <span class=\"material-icons column-select-icon\">menu</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.COLUMN_SELECT' | translate}}</span>\r\n </button>\r\n\r\n <button mat-button *ngIf=\"filterActive\" (click)=\"toggleFilterBar()\">\r\n <span class=\"material-icons\">filter_list</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.FILTER_TOGGLE' | translate}}</span>\r\n </button>\r\n\r\n <button class=\"export-data\" mat-stroked-button *ngIf=\"exportActive\" (click)=\"export()\">\r\n <span class=\"material-icons-outlined\">cloud_download</span>\r\n <span>{{'MULTI_FUNCTIONAL_TABLE.EXPORT' | translate}}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[additionalActions]\"></ng-content>\r\n </div>\r\n\r\n <mat-menu #columnMenu=\"matMenu\">\r\n <div class=\"column-select-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let column of configurableColumns\">\r\n <mat-checkbox [(ngModel)]=\"column.selected\" (change)=\"updateDisplayColumns()\">\r\n {{column.displayName | translate}}\r\n </mat-checkbox>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n\r\n <tld-filter-bar *ngIf=\"config.filter && config.filter.enabled\" [filterRowVisible]=\"!filterBarVisible\" [settings]=\"config.filter.settings\" \r\n (filterBarChange)=\"filtersChanged($event)\">\r\n </tld-filter-bar>\r\n\r\n <div class=\"table-overflow\">\r\n <table #table mat-table [dataSource]=\"config.dataSource\">\r\n <ng-content></ng-content>\r\n <ng-container [matColumnDef]=\"batchColumnName\">\r\n <th class=\"row-select\" mat-header-cell *matHeaderCellDef disable-export>\r\n <mat-checkbox [matTooltip]=\"'MULTI_FUNCTIONAL_TABLE.SELECT_ALL' | translate\" [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (change)=\"toggleAllRowSelection()\"\r\n [checked]=\"matSelection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"matSelection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td class=\"row-select\" mat-cell *matCellDef=\"let element\" disable-export>\r\n <mat-checkbox [matTooltip]=\"'MULTI_FUNCTIONAL_TABLE.SELECT' | translate\" *ngIf=\"isRowCheckboxAlwaysVisible || hoveredRow === element || matSelection.isSelected(element)\" [disabled]=\"config.batchConfig!.checkBoxesDisabled\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"toggleElementSelection(element)\" [checked]=\"matSelection.isSelected(element)\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"displayColumns\" sticky></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayColumns\" (mouseover)=\"hoveredRow = row\" (mouseleave)=\"hoveredRow = null\" [class.highlight]=\"highlightElement(row)\"></tr>\r\n\r\n <ng-container *ngIf=\"noDataRowActive\">\r\n <tr *matNoDataRow>\r\n <!-- add random number to make sure it takes full width -->\r\n <td colspan=\"99\">\r\n <lib-status-display [config]=\"noDataRowConfig\"></lib-status-display>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep th,:host ::ng-deep tr{white-space:nowrap}:host ::ng-deep td:not(:first-of-type){padding-right:10px!important}:host ::ng-deep tr.mat-mdc-row:hover,:host ::ng-deep tr.mat-mdc-row.highlight{background-color:var(--base-95)}:host ::ng-deep .export-data .mdc-button__label{display:flex;align-items:center}:host ::ng-deep .mat-mdc-cell,:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep .mdc-data-table__row:last-child{border-bottom-color:var(--base-70)}:host ::ng-deep .mdc-data-table__row:last-child{border-bottom-width:1px;border-bottom-style:solid}:host ::ng-deep .mdc-data-table__cell:nth-child(2),:host ::ng-deep .mdc-data-table__header-cell:nth-child(2){padding:0 16px 0 10px}table{width:100%}.column-select-icon{rotate:90deg}.column-select-wrapper{padding:1rem}.material-icons,.material-icons-outlined{margin-right:.5rem}.table-action-button{margin-bottom:1rem}th.mat-mdc-header-cell:first-of-type,td.mat-mdc-cell:first-of-type,td.mat-mdc-footer-cell:first-of-type{padding:0 0 0 10px}.row-select{width:0}.table-overflow{overflow-x:auto}\n"] }]
192
+ }], ctorParameters: () => [{ type: i1.DOMService }, { type: i2.TranslateService }], propDecorators: { config: [{
193
+ type: Input
194
+ }], highlightedElements: [{
195
+ type: Input
196
+ }], selection: [{
197
+ type: Input
198
+ }], isRowCheckboxAlwaysVisible: [{
199
+ type: Input
200
+ }], filterBarChange: [{
201
+ type: Output
202
+ }], exported: [{
203
+ type: Output
204
+ }], selectionChange: [{
205
+ type: Output
206
+ }], headerRowDefs: [{
207
+ type: ContentChildren,
208
+ args: [MatHeaderRowDef]
209
+ }], rowDefs: [{
210
+ type: ContentChildren,
211
+ args: [MatRowDef, { descendants: true }]
212
+ }], columnDefs: [{
213
+ type: ContentChildren,
214
+ args: [MatColumnDef]
215
+ }], noDataRow: [{
216
+ type: ContentChild,
217
+ args: [MatNoDataRow]
218
+ }], table: [{
219
+ type: ViewChild,
220
+ args: [MatTable, { static: true }]
221
+ }], sort: [{
222
+ type: ViewChild,
223
+ args: [MatSort]
224
+ }], tableElementRef: [{
225
+ type: ViewChild,
226
+ args: [MatTable, { read: ElementRef }]
227
+ }] } });
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktZnVuY3Rpb25hbC10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvbXVsdGktZnVuY3Rpb25hbC10YWJsZS9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlL211bHRpLWZ1bmN0aW9uYWwtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBbUMsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqTCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRyxPQUFPLEVBQUUsR0FBRyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTdELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBWXhDLE1BQU0sT0FBTyw2QkFBNkI7SUFLeEMsSUFBYSxTQUFTLENBQUMsS0FBVTtRQUMvQixJQUFJLENBQUMs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QkFBQyxTQUFTLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUNsQixVQUFVO3NCQUF4QyxlQUFlO3VCQUFDLFlBQVk7Z0JBQ0QsU0FBUztzQkFBcEMsWUFBWTt1QkFBQyxZQUFZO2dCQUVhLEtBQUs7c0JBQTNDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDakIsSUFBSTtzQkFBdkIsU0FBUzt1QkFBQyxPQUFPO2dCQUd5QixlQUFlO3NCQUF6RCxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBDb250ZW50Q2hpbGRyZW4sIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IE1hdENvbHVtbkRlZiwgTWF0SGVhZGVyUm93RGVmLCBNYXROb0RhdGFSb3csIE1hdFJvd0RlZiwgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlLCB0YWtlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZpbHRlckJhckNoYW5nZUV2ZW50IH0gZnJvbSAnLi4vZmlsdGVyLWJhci9tb2RlbHMvZmlsdGVyLWJhci1jaGFuZ2UtZXZlbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBIdG1sRWxlbWVudFBhcnNlSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycyc7XHJcbmltcG9ydCB7IFNhdmVGaWxlSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9zYXZlLWZpbGUuaGVscGVyJztcclxuaW1wb3J0IHsgRE9NU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgRElTQUJMRV9FWFBPUlRfQVRUUklCVVRFX05BTUUgfSBmcm9tICcuL2NvbnN0YW50cy9kaXNhYmxlLWV4cG9ydC1hdHRyaWJ1dGUtbmFtZS5jb25zdCc7XHJcbmltcG9ydCB7IEV4cG9ydEZvcm1hdCB9IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvY29sdW1uLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IE11bHRpRnVuY3Rpb25hbFRhYmxlQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvbXVsdGktZnVuY3Rpb25hbC10YWJsZS1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBTZWxlY3RlZENvbHVtbkxvY2FsU3RvcmFnZUNvbmZpZyB9IGZyb20gJy4vbW9kZWxzL3NlbGVjdGVkLWNvbHVtbi1sb2NhbC1zdG9yYWdlLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFN0YXR1c0Rpc3BsYXlDb25maWcgfSBmcm9tICcuLi9zdGF0dXMtZGlzcGxheS9tb2RlbHMvc3RhdHVzLWRpc3BsYXktY29uZmlnLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICd0bGQtbXVsdGktZnVuY3Rpb25hbC10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWZ1bmN0aW9uYWwtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL211bHRpLWZ1bmN0aW9uYWwtdGFibGUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTXVsdGlGdW5jdGlvbmFsVGFibGVDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIHJlYWRvbmx5IG1hdFNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxUPih0cnVlLCBbXSk7XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZyE6IE11bHRpRnVuY3Rpb25hbFRhYmxlQ29uZmlnPFQ+O1xyXG4gIEBJbnB1dCgpIGhpZ2hsaWdodGVkRWxlbWVudHMhOiBUW107XHJcbiAgQElucHV0KCkgc2V0IHNlbGVjdGlvbih2YWx1ZTogVFtdKSB7XHJcbiAgICB0aGlzLm1hdFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oLi4uKHZhbHVlID8/IFtdKSk7XHJcbiAgfVxyXG5cclxuICAvLyBTZXQgdGhpcyB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBkaXNwbGF5IGNoZWNrYm94ZXMgb25seSBvbiByb3cgaG92ZXIuXHJcbiAgQElucHV0KCkgaXNSb3dDaGVja2JveEFsd2F5c1Zpc2libGUgPSB0cnVlO1xyXG5cclxuICAvLyNyZWdpb24gT3V0cHV0IHByb3BlcnRpZXNcclxuICBAT3V0cHV0KCkgZmlsdGVyQmFyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RmlsdGVyQmFyQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJCYXJDaGFuZ2VFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgZXhwb3J0ZWQ6IEV2ZW50RW1pdHRlcjxUW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZTogT2JzZXJ2YWJsZTxUW10+ID0gdGhpcy5tYXRTZWxlY3Rpb24uY2hhbmdlZC5hc09ic2VydmFibGUoKS5waXBlKG1hcCgoKSA9PiB7IHJldHVybiB0aGlzLm1hdFNlbGVjdGlvbi5zZWxlY3RlZDsgfSkpO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIFByb3BlcnRpZXMgZm9yIG1hdCB0YWJsZSB3cmFwcGVyXHJcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRIZWFkZXJSb3dEZWYpIGhlYWRlclJvd0RlZnMhOiBRdWVyeUxpc3Q8TWF0SGVhZGVyUm93RGVmPjtcclxuICBAQ29udGVudENoaWxkcmVuKE1hdFJvd0RlZiwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSByb3dEZWZzITogUXVlcnlMaXN0PE1hdFJvd0RlZjxUPj47XHJcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRDb2x1bW5EZWYpIGNvbHVtbkRlZnMhOiBRdWVyeUxpc3Q8TWF0Q29sdW1uRGVmPjtcclxuICBAQ29udGVudENoaWxkKE1hdE5vRGF0YVJvdykgbm9EYXRhUm93ITogTWF0Tm9EYXRhUm93O1xyXG5cclxuICBAVmlld0NoaWxkKE1hdFRhYmxlLCB7IHN0YXRpYzogdHJ1ZSB9KSB0YWJsZSE6IE1hdFRhYmxlPFQ+O1xyXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydCE6IE1hdFNvcnQ7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUsIHsgcmVhZDogRWxlbWVudFJlZiB9KSB0YWJsZUVsZW1lbnRSZWYhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcblxyXG4gIGdldCBpZ25vcmVBdHRyaWJ1dGVOYW1lKCkgeyByZXR1cm4gRElTQUJMRV9FWFBPUlRfQVRUUklCVVRFX05BTUUgfVxyXG4gIGRpc3BsYXlDb2x1bW5zITogc3RyaW5nW107XHJcblxyXG4gIGNvbHVtblNlbGVjdEFjdGl2ZSE6IGJvb2xlYW47XHJcbiAgZXhwb3J0QWN0aXZlITogYm9vbGVhbjtcclxuICBub0RhdGFSb3dBY3RpdmUhOiBib29sZWFuO1xyXG5cclxuICBmaWx0ZXJCYXJWaXNpYmxlITogYm9vbGVhbjtcclxuXHJcbiAgbm9EYXRhUm93Q29uZmlnITogU3RhdHVzRGlzcGxheUNvbmZpZztcclxuICBub0RhdGFSb3dJY29uID0gXCJtYW5hZ2Vfc2VhcmNoXCI7XHJcblxyXG4gIGNvbmZpZ3VyYWJsZUNvbHVtbnMhOiBDb2x1bW5Db25maWdbXTtcclxuICBiYXRjaFNlbGVjdGVkRW5hYmxlZCE6IGJvb2xlYW47XHJcblxyXG4gIC8vIGlzIHVzZWQgaW4gaHRtbCB0byBkaXNwbGF5IGJhdGNoIGNoZWNrYm94IG9uIGhvdmVyZWQgcm93XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBob3ZlcmVkUm93OiBhbnk7XHJcblxyXG4gIGdldCBmaWx0ZXJBY3RpdmUoKSB7IHJldHVybiB0aGlzLmNvbmZpZy5maWx0ZXI/LmVuYWJsZWQ7IH1cclxuXHJcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VWYWx1ZSE6IFNlbGVjdGVkQ29sdW1uTG9jYWxTdG9yYWdlQ29uZmlnO1xyXG4gIHJlYWRvbmx5IGJhdGNoQ29sdW1uTmFtZSA9IFwiYmF0Y2hcIjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkb21TZXJ2aWNlOiBET01TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7IH1cclxuXHJcbiAgLy8jcmVnaW9uIEFuZ3VsYXIgbGlmZWN5Y2xlIGhvb2tzXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlYWRGcm9tTG9jYWxTdG9yYWdlKCk7XHJcbiAgICB0aGlzLnNldEZpbHRlclZpc2liaWxpdHkoKTtcclxuICAgIHRoaXMuc2V0Q29sdW1uU2VsZWN0UHJvcGVydGllcygpO1xyXG4gICAgdGhpcy5zZXRFeHBvcnRQcm9wZXJ0aWVzKCk7XHJcbiAgICB0aGlzLnNldE5vRGF0YVJvd1Byb3BlcnRpZXMoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgIHRoaXMuY29sdW1uRGVmcy5mb3JFYWNoKGNvbHVtbkRlZiA9PiB0aGlzLnRhYmxlLmFkZENvbHVtbkRlZihjb2x1bW5EZWYpKTtcclxuICAgIHRoaXMucm93RGVmcy5mb3JFYWNoKHJvd0RlZiA9PiB0aGlzLnRhYmxlLmFkZFJvd0RlZihyb3dEZWYpKTtcclxuICAgIHRoaXMuaGVhZGVyUm93RGVmcy5mb3JFYWNoKGhlYWRlclJvd0RlZiA9PiB0aGlzLnRhYmxlLmFkZEhlYWRlclJvd0RlZihoZWFkZXJSb3dEZWYpKTtcclxuICAgIHRoaXMuaGVhZGVyUm93RGVmcy5mb3JFYWNoKGhlYWRlclJvd0RlZiA9PiB0aGlzLnRhYmxlLmFkZEhlYWRlclJvd0RlZihoZWFkZXJSb3dEZWYpKTtcclxuICAgIHRoaXMudGFibGUuc2V0Tm9EYXRhUm93KHRoaXMubm9EYXRhUm93KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmlnLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHVwZGF0ZURpc3BsYXlDb2x1bW5zKGluaXRpYWwgPSBmYWxzZSkge1xyXG4gICAgdGhpcy5iYXRjaFNlbGVjdGVkRW5hYmxlZCA9IHRoaXMuY29uZmlnLmJhdGNoQ29uZmlnPy5lbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IHRoaXMuY29uZmlnLmNvbHVtblNlbGVjdD8uY29sdW1ucyA/PyBbXTtcclxuICAgIHRoaXMuZGlzcGxheUNvbHVtbnMgPSBbXTtcclxuICAgIHRoaXMuY29uZmlndXJhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiAhY29sdW1uLm5vdENvbmZpZ3VyYWJsZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYmF0Y2hTZWxlY3RlZEVuYWJsZWQpIHtcclxuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1ucy5wdXNoKHRoaXMuYmF0Y2hDb2x1bW5OYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWFsbENvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsb2NhbFN0b3JhZ2VWYWx1ZSA9IHRoaXMubG9jYWxTdG9yYWdlVmFsdWUgPz8ge307XHJcbiAgICBpZiAoIWxvY2FsU3RvcmFnZVZhbHVlLmNvbHVtbnMpIHtcclxuICAgICAgbG9jYWxTdG9yYWdlVmFsdWUuY29sdW1ucyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGFsbENvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChpbml0aWFsKSB7XHJcbiAgICAgICAgY29sdW1uLnNlbGVjdGVkID0gbG9jYWxTdG9yYWdlVmFsdWUuY29sdW1ucz8uW2NvbHVtbi5uYW1lXSA/PyBjb2x1bW4uc2VsZWN0ZWQ7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICBsb2NhbFN0b3JhZ2VWYWx1ZS5jb2x1bW5zIVtjb2x1bW4ubmFtZV0gPSBjb2x1bW4uc2VsZWN0ZWQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbHVtbi5zZWxlY3RlZCkge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUNvbHVtbnMucHVzaChjb2x1bW4ubmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBpZiAoIWluaXRpYWwpIHtcclxuICAgICAgdGhpcy51cGRhdGVMb2NhbFN0b3JhZ2UobG9jYWxTdG9yYWdlVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRmlsdGVyQmFyKCkge1xyXG4gICAgY29uc3QgbG9jYWxzdG9yYWdlT2JqZWN0ID0gdGhpcy5sb2NhbFN0b3JhZ2VWYWx1ZSA/PyB7fTtcclxuICAgIGlmICghbG9jYWxzdG9yYWdlT2JqZWN0LmZpbHRlcikge1xyXG4gICAgICBsb2NhbHN0b3JhZ2VPYmplY3QuZmlsdGVyID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWx0ZXJCYXJWaXNpYmxlID0gIXRoaXMuZmlsdGVyQmFyVmlzaWJsZTtcclxuICAgIGxvY2Fsc3RvcmFnZU9iamVjdC5maWx0ZXIudmlzaWJsZSA9IHRoaXMuZmlsdGVyQmFyVmlzaWJsZTtcclxuICAgIHRoaXMudXBkYXRlTG9jYWxTdG9yYWdlKGxvY2Fsc3RvcmFnZU9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJzQ2hhbmdlZChmaWx0ZXJzOiBGaWx0ZXJCYXJDaGFuZ2VFdmVudCkge1xyXG4gICAgdGhpcy5maWx0ZXJCYXJDaGFuZ2UuZW1pdChmaWx0ZXJzKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCgpIHtcclxuICAgIHRoaXMuY29uZmlnLmRhdGFTb3VyY2UuY29ubmVjdCgpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZXhwb3J0ZWQuZW1pdChkYXRhKTtcclxuICAgIH0pXHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLmV4cG9ydD8uZmlsZU9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5leHBvcnRUb0ZpbGUoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlnaGxpZ2h0RWxlbWVudChlbGVtZW50OiBUKSB7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRlZEVsZW1lbnRzPy5pbmNsdWRlcyhlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBNZXRob2RzIGZvciBiYXRjaCBzZWxlY3Rpb25cclxuICBpc0FsbFNlbGVjdGVkKCkge1xyXG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLm1hdFNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XHJcbiAgICBjb25zdCBudW1Sb3dzID0gdGhpcy5jb25maWcuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aDtcclxuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcclxuICB9XHJcblxyXG4gIHRvZ2dsZUFsbFJvd1NlbGVjdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmlzQWxsU2VsZWN0ZWQoKSkge1xyXG4gICAgICB0aGlzLm1hdFNlbGVjdGlvbi5jbGVhcigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tYXRTZWxlY3Rpb24uc2VsZWN0KC4uLnRoaXMuY29uZmlnLmRhdGFTb3VyY2UuZGF0YSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVFbGVtZW50U2VsZWN0aW9uKGVsZW1lbnQ6IFQpIHtcclxuICAgIHRoaXMubWF0U2VsZWN0aW9uLnRvZ2dsZShlbGVtZW50KTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHByaXZhdGUgZXhwb3J0VG9GaWxlKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5leHBvcnQ/LmZpbGVPcHRpb25zPy5zYXZlVG9GaWxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZmlsZVN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgZXh0ZW5zaW9uITogRXhwb3J0Rm9ybWF0O1xyXG4gICAgc3dpdGNoICh0aGlzLmNvbmZpZy5leHBvcnQuZmlsZU9wdGlvbnMuZm9ybWF0KSB7XHJcbiAgICAgIGNhc2UgRXhwb3J0Rm9ybWF0LkNTVjpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBleHRlbnNpb24gPSBFeHBvcnRGb3JtYXQuQ1NWO1xyXG4gICAgICAgIGZpbGVTdHJpbmcgPSBIdG1sRWxlbWVudFBhcnNlSGVscGVyLnRhYmxlQXNDc3YodGhpcy50YWJsZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5pZ25vcmVBdHRyaWJ1dGVOYW1lKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGNvbnN0IHRyYW5zbGF0ZWRGaWxlTmFtZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY29uZmlnLmV4cG9ydC5maWxlT3B0aW9ucy5maWxlTmFtZSk7XHJcbiAgICBTYXZlRmlsZUhlbHBlci5zYXZlRmlsZShmaWxlU3RyaW5nLCBgJHt0cmFuc2xhdGVkRmlsZU5hbWV9LiR7ZXh0ZW5zaW9ufWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVMb2NhbFN0b3JhZ2UobmV3VmFsdWU6IFNlbGVjdGVkQ29sdW1uTG9jYWxTdG9yYWdlQ29uZmlnKSB7XHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICBpZiAodGhpcy5jb25maWcubG9jYWxTdG9yYWdlS2V5ICYmIG5ld1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZG9tU2VydmljZS5sb2NhbFN0b3JhZ2U/LnNldEl0ZW0odGhpcy5jb25maWcubG9jYWxTdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShuZXdWYWx1ZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIHJlYWRGcm9tTG9jYWxTdG9yYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmxvY2FsU3RvcmFnZUtleSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGxvY2FsU3RvcmFnZVN0cmluZyA9IHRoaXMuZG9tU2VydmljZS5sb2NhbFN0b3JhZ2U/LmdldEl0ZW0odGhpcy5jb25maWcubG9jYWxTdG9yYWdlS2V5KTtcclxuICAgICAgICBpZiAobG9jYWxTdG9yYWdlU3RyaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2VTdHJpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcclxuICAgICAgY2F0Y2gge1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldENvbHVtblNlbGVjdFByb3BlcnRpZXMoKSB7XHJcbiAgICB0aGlzLmNvbHVtblNlbGVjdEFjdGl2ZSA9IHRoaXMuY29uZmlnLmNvbHVtblNlbGVjdD8uZW5hYmxlZCA/IHRydWUgOiBmYWxzZTtcclxuICAgIHRoaXMudXBkYXRlRGlzcGxheUNvbHVtbnModHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZpbHRlclZpc2liaWxpdHkoKSB7XHJcbiAgICB0aGlzLmZpbHRlckJhclZpc2libGUgPSB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlPy5maWx0ZXI/LnZpc2libGUgPz8gdGhpcy5jb25maWc/LmZpbHRlcj8udmlzaWJsZSA/PyBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Tm9EYXRhUm93UHJvcGVydGllcygpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5ub0RhdGFSb3cpIHtcclxuICAgICAgdGhpcy5ub0RhdGFSb3dBY3RpdmUgPSB0cnVlO1xyXG4gICAgICB0aGlzLm5vRGF0YVJvd0NvbmZpZyA9IHRoaXMuY29uZmlnLm5vRGF0YVJvdztcclxuICAgICAgdGhpcy5ub0RhdGFSb3dDb25maWcuaWNvbiA9IHRoaXMuY29uZmlnLm5vRGF0YVJvdz8uaWNvbiA/PyB0aGlzLm5vRGF0YVJvd0ljb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEV4cG9ydFByb3BlcnRpZXMoKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWcuZXhwb3J0Py5lbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuZXhwb3J0QWN0aXZlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0R2FwPVwiMXJlbVwiPlxyXG5cclxuICA8ZGl2IGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICA8ZGl2IGZ4RmxleCBmeExheW91dEdhcD1cIjFyZW1cIj5cclxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJjb2x1bW5NZW51XCIgKm5nSWY9XCJjb2x1bW5TZWxlY3RBY3RpdmVcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGNvbHVtbi1zZWxlY3QtaWNvblwiPm1lbnU8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4+e3snTVVMVElfRlVOQ1RJT05BTF9UQUJMRS5DT0xVTU5fU0VMRUNUJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKm5nSWY9XCJmaWx0ZXJBY3RpdmVcIiAoY2xpY2spPVwidG9nZ2xlRmlsdGVyQmFyKClcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+ZmlsdGVyX2xpc3Q8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4+e3snTVVMVElfRlVOQ1RJT05BTF9UQUJMRS5GSUxURVJfVE9HR0xFJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJleHBvcnQtZGF0YVwiIG1hdC1zdHJva2VkLWJ1dHRvbiAqbmdJZj1cImV4cG9ydEFjdGl2ZVwiIChjbGljayk9XCJleHBvcnQoKVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj5jbG91ZF9kb3dubG9hZDwvc3Bhbj5cclxuICAgICAgICA8c3Bhbj57eydNVUxUSV9GVU5DVElPTkFMX1RBQkxFLkVYUE9SVCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYWRkaXRpb25hbEFjdGlvbnNdXCI+PC9uZy1jb250ZW50PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bWF0LW1lbnUgI2NvbHVtbk1lbnU9XCJtYXRNZW51XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLXNlbGVjdC13cmFwcGVyXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29uZmlndXJhYmxlQ29sdW1uc1wiPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJjb2x1bW4uc2VsZWN0ZWRcIiAoY2hhbmdlKT1cInVwZGF0ZURpc3BsYXlDb2x1bW5zKClcIj5cclxuICAgICAgICAgIHt7Y29sdW1uLmRpc3BsYXlOYW1lIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L21hdC1tZW51PlxyXG5cclxuICA8dGxkLWZpbHRlci1iYXIgKm5nSWY9XCJjb25maWcuZmlsdGVyICYmIGNvbmZpZy5maWx0ZXIuZW5hYmxlZFwiIFtmaWx0ZXJSb3dWaXNpYmxlXT1cIiFmaWx0ZXJCYXJWaXNpYmxlXCIgW3NldHRpbmdzXT1cImNvbmZpZy5maWx0ZXIuc2V0dGluZ3NcIiBcclxuICAgIChmaWx0ZXJCYXJDaGFuZ2UpPVwiZmlsdGVyc0NoYW5nZWQoJGV2ZW50KVwiPlxyXG4gIDwvdGxkLWZpbHRlci1iYXI+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1vdmVyZmxvd1wiPlxyXG4gICAgPHRhYmxlICN0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiY29uZmlnLmRhdGFTb3VyY2VcIj5cclxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwiYmF0Y2hDb2x1bW5OYW1lXCI+XHJcbiAgICAgICAgPHRoIGNsYXNzPVwicm93LXNlbGVjdFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBkaXNhYmxlLWV4cG9ydD5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggW21hdFRvb2x0aXBdPVwiJ01VTFRJX0ZVTkNUSU9OQUxfVEFCTEUuU0VMRUNUX0FMTCcgfCB0cmFuc2xhdGVcIiBbZGlzYWJsZWRdPVwiY29uZmlnLmJhdGNoQ29uZmlnIS5jaGVja0JveGVzRGlzYWJsZWRcIiAoY2hhbmdlKT1cInRvZ2dsZUFsbFJvd1NlbGVjdGlvbigpXCJcclxuICAgICAgICAgICAgW2NoZWNrZWRdPVwibWF0U2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwibWF0U2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiPlxyXG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJyb3ctc2VsZWN0XCIgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGRpc2FibGUtZXhwb3J0PlxyXG4gICAgICAgICAgPG1hdC1jaGVja2JveCBbbWF0VG9vbHRpcF09XCInTVVMVElfRlVOQ1RJT05BTF9UQUJMRS5TRUxFQ1QnIHwgdHJhbnNsYXRlXCIgKm5nSWY9XCJpc1Jvd0NoZWNrYm94QWx3YXlzVmlzaWJsZSB8fCBob3ZlcmVkUm93ID09PSBlbGVtZW50IHx8IG1hdFNlbGVjdGlvbi5pc1NlbGVjdGVkKGVsZW1lbnQpXCIgW2Rpc2FibGVkXT1cImNvbmZpZy5iYXRjaENvbmZpZyEuY2hlY2tCb3hlc0Rpc2FibGVkXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlRWxlbWVudFNlbGVjdGlvbihlbGVtZW50KVwiIFtjaGVja2VkXT1cIm1hdFNlbGVjdGlvbi5pc1NlbGVjdGVkKGVsZW1lbnQpXCI+XHJcbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5Q29sdW1uc1wiIHN0aWNreT48L3RyPlxyXG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheUNvbHVtbnNcIiAobW91c2VvdmVyKT1cImhvdmVyZWRSb3cgPSByb3dcIiAobW91c2VsZWF2ZSk9XCJob3ZlcmVkUm93ID0gbnVsbFwiIFtjbGFzcy5oaWdobGlnaHRdPVwiaGlnaGxpZ2h0RWxlbWVudChyb3cpXCI+PC90cj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub0RhdGFSb3dBY3RpdmVcIj5cclxuICAgICAgICA8dHIgKm1hdE5vRGF0YVJvdz5cclxuICAgICAgICAgIDwhLS0gYWRkIHJhbmRvbSBudW1iZXIgdG8gbWFrZSBzdXJlIGl0IHRha2VzIGZ1bGwgd2lkdGggLS0+XHJcbiAgICAgICAgICA8dGQgY29sc3Bhbj1cIjk5XCI+XHJcbiAgICAgICAgICAgIDxsaWItc3RhdHVzLWRpc3BsYXkgW2NvbmZpZ109XCJub0RhdGFSb3dDb25maWdcIj48L2xpYi1zdGF0dXMtZGlzcGxheT5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3RhYmxlPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19