@alfresco/aca-content 5.1.1 → 5.2.0

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 (396) hide show
  1. package/assets/app.extensions.json +9 -0
  2. package/assets/i18n/ar.json +600 -599
  3. package/assets/i18n/cs.json +600 -599
  4. package/assets/i18n/da.json +600 -599
  5. package/assets/i18n/de.json +600 -599
  6. package/assets/i18n/en.json +40 -1
  7. package/assets/i18n/es.json +600 -599
  8. package/assets/i18n/fi.json +600 -599
  9. package/assets/i18n/fr.json +600 -599
  10. package/assets/i18n/it.json +600 -599
  11. package/assets/i18n/ja.json +600 -599
  12. package/assets/i18n/nb.json +600 -599
  13. package/assets/i18n/nl.json +600 -599
  14. package/assets/i18n/pl.json +600 -599
  15. package/assets/i18n/pt-BR.json +600 -599
  16. package/assets/i18n/ru.json +600 -599
  17. package/assets/i18n/sv.json +600 -599
  18. package/assets/i18n/zh-CN.json +600 -599
  19. package/esm2022/about/about.component.mjs +70 -0
  20. package/esm2022/about/aca-about.module.mjs +47 -0
  21. package/esm2022/folder-rules/folder-rules.module.mjs +116 -0
  22. package/esm2022/folder-rules/manage-rules/manage-rules.smart-component.mjs +280 -0
  23. package/esm2022/folder-rules/rule-details/actions/rule-action-list.ui-component.mjs +117 -0
  24. package/esm2022/folder-rules/rule-details/actions/rule-action.ui-component.mjs +359 -0
  25. package/esm2022/folder-rules/rule-details/conditions/rule-composite-condition.ui-component.mjs +171 -0
  26. package/esm2022/folder-rules/rule-details/conditions/rule-simple-condition.ui-component.mjs +237 -0
  27. package/esm2022/folder-rules/rule-details/edit-rule-dialog.ui-component.mjs +80 -0
  28. package/esm2022/folder-rules/rule-details/options/rule-options.ui-component.mjs +129 -0
  29. package/esm2022/folder-rules/rule-details/rule-details.ui-component.mjs +192 -0
  30. package/esm2022/folder-rules/rule-details/triggers/rule-triggers.ui-component.mjs +87 -0
  31. package/esm2022/folder-rules/rule-details/validators/rule-actions.validator.mjs +36 -0
  32. package/esm2022/folder-rules/rule-list/rule-list/rule-list.ui-component.mjs +166 -0
  33. package/esm2022/folder-rules/rule-list/rule-list-grouping/rule-list-grouping.ui-component.mjs +80 -0
  34. package/esm2022/folder-rules/rule-list/rule-list-item/rule-list-item.ui-component.mjs +59 -0
  35. package/esm2022/folder-rules/rule-set-picker/rule-set-picker.smart-component.mjs +125 -0
  36. package/esm2022/folder-rules/services/actions.service.mjs +117 -0
  37. package/esm2022/folder-rules/services/folder-rule-sets.service.mjs +230 -0
  38. package/esm2022/folder-rules/services/folder-rules.service.mjs +195 -0
  39. package/esm2022/lib/aca-content.module.mjs +303 -0
  40. package/esm2022/lib/aca-content.routes.mjs +369 -0
  41. package/esm2022/lib/components/bulk-actions-dropdown/bulk-actions-dropdown.component.mjs +82 -0
  42. package/{esm2020 → esm2022}/lib/components/common/language-picker/language-picker.component.mjs +9 -8
  43. package/esm2022/lib/components/common/location-link/location-link.component.mjs +182 -0
  44. package/{esm2020 → esm2022}/lib/components/common/logout/logout.component.mjs +8 -6
  45. package/esm2022/lib/components/common/toggle-shared/toggle-shared.component.mjs +81 -0
  46. package/esm2022/lib/components/common/user-info/user-info.component.mjs +46 -0
  47. package/esm2022/lib/components/context-menu/base-context-menu.directive.mjs +77 -0
  48. package/esm2022/lib/components/context-menu/context-menu-item.component.mjs +65 -0
  49. package/esm2022/lib/components/context-menu/context-menu-outside-event.directive.mjs +62 -0
  50. package/esm2022/lib/components/context-menu/context-menu-overlay.mjs +33 -0
  51. package/esm2022/lib/components/context-menu/context-menu.component.mjs +84 -0
  52. package/esm2022/lib/components/context-menu/context-menu.service.mjs +127 -0
  53. package/esm2022/lib/components/context-menu/custom-context-menu-actions.token.mjs +26 -0
  54. package/esm2022/lib/components/context-menu/custom-context-menu.component.mjs +79 -0
  55. package/esm2022/lib/components/details/details.component.mjs +154 -0
  56. package/esm2022/lib/components/dl-custom-components/datatable-cell-badges/datatable-cell-badges.component.mjs +75 -0
  57. package/esm2022/lib/components/dl-custom-components/name-column/name-column.component.mjs +106 -0
  58. package/esm2022/lib/components/dl-custom-components/tags-column/tags-column.component.mjs +52 -0
  59. package/esm2022/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.mjs +77 -0
  60. package/esm2022/lib/components/favorite-libraries/favorite-libraries.component.mjs +126 -0
  61. package/esm2022/lib/components/favorites/favorites.component.mjs +105 -0
  62. package/esm2022/lib/components/files/files.component.mjs +336 -0
  63. package/esm2022/lib/components/home/home.component.mjs +46 -0
  64. package/esm2022/lib/components/info-drawer/comments-tab/comments-tab.component.mjs +62 -0
  65. package/esm2022/lib/components/info-drawer/info.drawer.module.mjs +74 -0
  66. package/esm2022/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.mjs +213 -0
  67. package/esm2022/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.mjs +47 -0
  68. package/esm2022/lib/components/info-drawer/metadata-tab/metadata-tab.component.mjs +145 -0
  69. package/esm2022/lib/components/info-drawer/versions-tab/versions-tab.component.mjs +107 -0
  70. package/esm2022/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.mjs +135 -0
  71. package/esm2022/lib/components/knowledge-retrieval/search-ai/search-ai-input/search-ai-input.component.mjs +181 -0
  72. package/esm2022/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.mjs +77 -0
  73. package/esm2022/lib/components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component.mjs +210 -0
  74. package/esm2022/lib/components/libraries/libraries.component.mjs +81 -0
  75. package/esm2022/lib/components/recent-files/recent-files.component.mjs +80 -0
  76. package/esm2022/lib/components/search/search-action-menu/search-action-menu.component.mjs +66 -0
  77. package/esm2022/lib/components/search/search-input/search-input.component.mjs +297 -0
  78. package/esm2022/lib/components/search/search-input-control/search-input-control.component.mjs +94 -0
  79. package/esm2022/lib/components/search/search-libraries-results/search-libraries-query-builder.service.mjs +93 -0
  80. package/esm2022/lib/components/search/search-libraries-results/search-libraries-results.component.mjs +155 -0
  81. package/esm2022/lib/components/search/search-navigation.service.mjs +62 -0
  82. package/esm2022/lib/components/search/search-results/search-results.component.mjs +279 -0
  83. package/esm2022/lib/components/search/search-results-row/search-results-row.component.mjs +149 -0
  84. package/esm2022/lib/components/search/search-save/dialog/delete/saved-search-delete-dialog.component.mjs +82 -0
  85. package/esm2022/lib/components/search/search-save/dialog/edit/saved-search-edit-dialog.component.mjs +116 -0
  86. package/esm2022/lib/components/search/search-save/dialog/save-search-dialog.component.mjs +125 -0
  87. package/esm2022/lib/components/search/search-save/dialog/saved-search-form.interface.mjs +25 -0
  88. package/esm2022/lib/components/search/search-save/dialog/unique-search-name-validator.mjs +45 -0
  89. package/esm2022/lib/components/search/search-save/directive/save-search.directive.mjs +64 -0
  90. package/esm2022/lib/components/search/search-save/list/saved-searches-list-ui.service.mjs +51 -0
  91. package/esm2022/lib/components/search/search-save/list/smart-list/saved-searches-list-schema.mjs +44 -0
  92. package/esm2022/lib/components/search/search-save/list/smart-list/saved-searches-smart-list.component.mjs +50 -0
  93. package/esm2022/lib/components/search/search-save/list/ui-list/saved-searches-list.ui-component.mjs +153 -0
  94. package/esm2022/lib/components/search/search-save/sidenav/save-search-sidenav.component.mjs +94 -0
  95. package/esm2022/lib/components/shared-files/shared-files.component.mjs +85 -0
  96. package/esm2022/lib/components/shared-link-view/shared-link-view.component.mjs +89 -0
  97. package/esm2022/lib/components/sidenav/components/button-menu.component.mjs +66 -0
  98. package/esm2022/lib/components/sidenav/components/expand-menu.component.mjs +73 -0
  99. package/esm2022/lib/components/sidenav/components/sidenav-header.component.mjs +65 -0
  100. package/esm2022/lib/components/sidenav/directives/action.directive.mjs +86 -0
  101. package/esm2022/lib/components/sidenav/directives/active-link.directive.mjs +100 -0
  102. package/esm2022/lib/components/sidenav/directives/expansion-panel.directive.mjs +107 -0
  103. package/esm2022/lib/components/sidenav/directives/menu-panel.directive.mjs +103 -0
  104. package/esm2022/lib/components/sidenav/sidenav.component.mjs +101 -0
  105. package/esm2022/lib/components/sidenav/user-menu/user-menu.component.mjs +57 -0
  106. package/esm2022/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.mjs +143 -0
  107. package/esm2022/lib/components/toolbar/toggle-favorite/toggle-favorite.component.mjs +91 -0
  108. package/esm2022/lib/components/toolbar/toggle-favorite-library/toggle-favorite-library.component.mjs +112 -0
  109. package/esm2022/lib/components/toolbar/toggle-info-drawer/toggle-info-drawer.component.mjs +77 -0
  110. package/esm2022/lib/components/toolbar/toggle-join-library/toggle-join-library-button.component.mjs +107 -0
  111. package/{esm2020 → esm2022}/lib/components/toolbar/toggle-join-library/toggle-join-library-menu.component.mjs +7 -6
  112. package/esm2022/lib/components/toolbar/view-node/view-node.component.mjs +128 -0
  113. package/esm2022/lib/components/trashcan/trashcan.component.mjs +66 -0
  114. package/esm2022/lib/components/upload-files-dialog/upload-files-dialog.component.mjs +55 -0
  115. package/esm2022/lib/components/view-profile/view-profile.component.mjs +200 -0
  116. package/esm2022/lib/dialogs/node-template/create-from-template.dialog.mjs +127 -0
  117. package/esm2022/lib/directives/document-list.directive.mjs +207 -0
  118. package/esm2022/lib/extensions/core.extensions.module.mjs +56 -0
  119. package/esm2022/lib/services/content-management.service.mjs +892 -0
  120. package/esm2022/lib/services/content-url.service.mjs +74 -0
  121. package/esm2022/lib/services/modal-ai.service.mjs +65 -0
  122. package/esm2022/lib/services/node-actions.service.mjs +609 -0
  123. package/esm2022/lib/services/node-template.service.mjs +145 -0
  124. package/esm2022/lib/services/search-ai-navigation.service.mjs +63 -0
  125. package/esm2022/lib/store/app-store.module.mjs +101 -0
  126. package/esm2022/lib/store/effects/app.effects.mjs +46 -0
  127. package/esm2022/lib/store/effects/contextmenu.effects.mjs +65 -0
  128. package/esm2022/lib/store/effects/download.effects.mjs +153 -0
  129. package/esm2022/lib/store/effects/favorite.effects.mjs +72 -0
  130. package/esm2022/lib/store/effects/library.effects.mjs +108 -0
  131. package/esm2022/lib/store/effects/node.effects.mjs +318 -0
  132. package/esm2022/lib/store/effects/search-ai.effects.mjs +54 -0
  133. package/esm2022/lib/store/effects/search.effects.mjs +52 -0
  134. package/esm2022/lib/store/effects/template.effects.mjs +116 -0
  135. package/esm2022/lib/store/effects/upload.effects.mjs +166 -0
  136. package/esm2022/lib/store/effects/viewer.effects.mjs +169 -0
  137. package/esm2022/lib/utils/aca-search-utils.mjs +129 -0
  138. package/esm2022/ms-office/actions/aos.actions.mjs +32 -0
  139. package/esm2022/ms-office/aos-extension.module.mjs +53 -0
  140. package/esm2022/ms-office/aos-extension.service.mjs +136 -0
  141. package/esm2022/ms-office/effects/aos.effects.mjs +45 -0
  142. package/esm2022/public-api.mjs +33 -0
  143. package/esm2022/viewer/lib/components/preview/preview.component.mjs +246 -0
  144. package/esm2022/viewer/lib/components/viewer/viewer.component.mjs +261 -0
  145. package/esm2022/viewer/lib/services/viewer.service.mjs +229 -0
  146. package/esm2022/viewer/lib/viewer.module.mjs +53 -0
  147. package/{fesm2015 → fesm2022}/alfresco-aca-content-about.mjs +17 -19
  148. package/fesm2022/alfresco-aca-content-about.mjs.map +1 -0
  149. package/{fesm2020 → fesm2022}/alfresco-aca-content-folder-rules.mjs +357 -316
  150. package/fesm2022/alfresco-aca-content-folder-rules.mjs.map +1 -0
  151. package/{fesm2020 → fesm2022}/alfresco-aca-content-ms-office.mjs +28 -26
  152. package/fesm2022/alfresco-aca-content-ms-office.mjs.map +1 -0
  153. package/{fesm2020 → fesm2022}/alfresco-aca-content-viewer.mjs +95 -64
  154. package/fesm2022/alfresco-aca-content-viewer.mjs.map +1 -0
  155. package/fesm2022/alfresco-aca-content.mjs +11091 -0
  156. package/fesm2022/alfresco-aca-content.mjs.map +1 -0
  157. package/folder-rules/rule-details/actions/rule-action-list.ui-component.d.ts +1 -1
  158. package/folder-rules/rule-details/actions/rule-action.ui-component.d.ts +1 -1
  159. package/folder-rules/rule-details/conditions/rule-composite-condition.ui-component.d.ts +1 -1
  160. package/folder-rules/rule-details/conditions/rule-simple-condition.ui-component.d.ts +1 -1
  161. package/folder-rules/rule-details/options/rule-options.ui-component.d.ts +1 -1
  162. package/folder-rules/rule-details/rule-details.ui-component.d.ts +1 -1
  163. package/folder-rules/rule-list/rule-list/rule-list.ui-component.d.ts +1 -1
  164. package/folder-rules/rule-list/rule-list-grouping/rule-list-grouping.ui-component.d.ts +1 -1
  165. package/folder-rules/rule-list/rule-list-item/rule-list-item.ui-component.d.ts +1 -1
  166. package/folder-rules/services/folder-rule-sets.service.d.ts +4 -4
  167. package/folder-rules/services/folder-rules.service.d.ts +1 -1
  168. package/lib/components/bulk-actions-dropdown/bulk-actions-dropdown.component.d.ts +5 -10
  169. package/lib/components/common/location-link/location-link.component.d.ts +1 -1
  170. package/lib/components/common/toggle-shared/toggle-shared.component.d.ts +1 -1
  171. package/lib/components/context-menu/base-context-menu.directive.d.ts +20 -0
  172. package/lib/components/context-menu/context-menu-item.component.d.ts +1 -1
  173. package/lib/components/context-menu/context-menu-outside-event.directive.d.ts +1 -1
  174. package/lib/components/context-menu/context-menu.component.d.ts +4 -15
  175. package/lib/components/context-menu/context-menu.service.d.ts +4 -1
  176. package/lib/components/{knowledge-retrieval/search-ai/search-ai-utils.d.ts → context-menu/custom-context-menu-actions.token.d.ts} +2 -2
  177. package/lib/components/context-menu/custom-context-menu.component.d.ts +36 -0
  178. package/lib/components/details/details.component.d.ts +1 -1
  179. package/lib/components/dl-custom-components/datatable-cell-badges/datatable-cell-badges.component.d.ts +1 -1
  180. package/lib/components/dl-custom-components/tags-column/tags-column.component.d.ts +1 -1
  181. package/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.d.ts +1 -1
  182. package/lib/components/info-drawer/comments-tab/comments-tab.component.d.ts +1 -1
  183. package/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.d.ts +1 -1
  184. package/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.d.ts +1 -1
  185. package/lib/components/info-drawer/metadata-tab/metadata-tab.component.d.ts +1 -1
  186. package/lib/components/info-drawer/versions-tab/versions-tab.component.d.ts +1 -1
  187. package/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.d.ts +1 -2
  188. package/lib/components/knowledge-retrieval/search-ai/search-ai-input/search-ai-input.component.d.ts +4 -5
  189. package/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.d.ts +8 -8
  190. package/lib/components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component.d.ts +2 -3
  191. package/lib/components/search/search-input/search-input.component.d.ts +12 -14
  192. package/lib/components/search/search-input-control/search-input-control.component.d.ts +1 -1
  193. package/lib/components/search/search-libraries-results/search-libraries-results.component.d.ts +0 -1
  194. package/lib/components/search/search-results/search-results.component.d.ts +15 -9
  195. package/lib/components/search/search-results-row/search-results-row.component.d.ts +1 -1
  196. package/lib/components/search/search-save/dialog/delete/saved-search-delete-dialog.component.d.ts +16 -0
  197. package/lib/components/search/search-save/dialog/edit/saved-search-edit-dialog.component.d.ts +22 -0
  198. package/lib/components/search/search-save/dialog/save-search-dialog.component.d.ts +23 -0
  199. package/lib/components/search/search-save/dialog/saved-search-form.interface.d.ts +28 -0
  200. package/lib/components/search/search-save/dialog/unique-search-name-validator.d.ts +34 -0
  201. package/lib/components/search/search-save/directive/save-search.directive.d.ts +13 -0
  202. package/lib/components/search/search-save/list/saved-searches-list-ui.service.d.ts +9 -0
  203. package/lib/components/search/search-save/list/smart-list/saved-searches-list-schema.d.ts +33 -0
  204. package/lib/components/search/search-save/list/smart-list/saved-searches-smart-list.component.d.ts +13 -0
  205. package/lib/components/search/search-save/list/ui-list/saved-searches-list.ui-component.d.ts +66 -0
  206. package/lib/components/search/search-save/sidenav/save-search-sidenav.component.d.ts +44 -0
  207. package/lib/components/sidenav/components/button-menu.component.d.ts +1 -1
  208. package/lib/components/sidenav/components/expand-menu.component.d.ts +3 -2
  209. package/lib/components/sidenav/directives/action.directive.d.ts +28 -1
  210. package/lib/components/sidenav/directives/active-link.directive.d.ts +2 -2
  211. package/lib/components/sidenav/directives/expansion-panel.directive.d.ts +1 -1
  212. package/lib/components/sidenav/directives/menu-panel.directive.d.ts +1 -1
  213. package/lib/components/sidenav/sidenav.component.d.ts +4 -3
  214. package/lib/components/sidenav/user-menu/user-menu.component.d.ts +1 -1
  215. package/lib/components/toolbar/toggle-favorite/toggle-favorite.component.d.ts +1 -1
  216. package/lib/components/toolbar/view-node/view-node.component.d.ts +1 -1
  217. package/lib/services/search-ai-navigation.service.d.ts +4 -2
  218. package/lib/store/effects/app.effects.d.ts +2 -3
  219. package/lib/store/effects/contextmenu.effects.d.ts +3 -3
  220. package/lib/store/effects/download.effects.d.ts +0 -30
  221. package/lib/store/effects/favorite.effects.d.ts +0 -28
  222. package/lib/store/effects/library.effects.d.ts +2 -7
  223. package/lib/store/effects/node.effects.d.ts +7 -38
  224. package/lib/store/effects/search-ai.effects.d.ts +0 -4
  225. package/lib/store/effects/search.effects.d.ts +3 -30
  226. package/lib/store/effects/template.effects.d.ts +5 -7
  227. package/lib/store/effects/upload.effects.d.ts +8 -32
  228. package/lib/store/effects/viewer.effects.d.ts +0 -29
  229. package/lib/utils/aca-search-utils.d.ts +67 -0
  230. package/ms-office/effects/aos.effects.d.ts +0 -3
  231. package/package.json +21 -35
  232. package/public-api.d.ts +1 -0
  233. package/ui/overrides/adf-pagination.theme.scss +0 -4
  234. package/ui/theme.scss +9 -4
  235. package/assets/images/agent-avatar-blue.png +0 -0
  236. package/assets/images/agent-avatar-gold.png +0 -0
  237. package/assets/images/agent-avatar-pink.png +0 -0
  238. package/esm2020/about/about.component.mjs +0 -71
  239. package/esm2020/about/aca-about.module.mjs +0 -46
  240. package/esm2020/folder-rules/folder-rules.module.mjs +0 -115
  241. package/esm2020/folder-rules/manage-rules/manage-rules.smart-component.mjs +0 -261
  242. package/esm2020/folder-rules/rule-details/actions/rule-action-list.ui-component.mjs +0 -117
  243. package/esm2020/folder-rules/rule-details/actions/rule-action.ui-component.mjs +0 -351
  244. package/esm2020/folder-rules/rule-details/conditions/rule-composite-condition.ui-component.mjs +0 -172
  245. package/esm2020/folder-rules/rule-details/conditions/rule-simple-condition.ui-component.mjs +0 -234
  246. package/esm2020/folder-rules/rule-details/edit-rule-dialog.ui-component.mjs +0 -74
  247. package/esm2020/folder-rules/rule-details/options/rule-options.ui-component.mjs +0 -129
  248. package/esm2020/folder-rules/rule-details/rule-details.ui-component.mjs +0 -185
  249. package/esm2020/folder-rules/rule-details/triggers/rule-triggers.ui-component.mjs +0 -88
  250. package/esm2020/folder-rules/rule-details/validators/rule-actions.validator.mjs +0 -37
  251. package/esm2020/folder-rules/rule-list/rule-list/rule-list.ui-component.mjs +0 -164
  252. package/esm2020/folder-rules/rule-list/rule-list-grouping/rule-list-grouping.ui-component.mjs +0 -81
  253. package/esm2020/folder-rules/rule-list/rule-list-item/rule-list-item.ui-component.mjs +0 -58
  254. package/esm2020/folder-rules/rule-set-picker/rule-set-picker.smart-component.mjs +0 -120
  255. package/esm2020/folder-rules/services/actions.service.mjs +0 -114
  256. package/esm2020/folder-rules/services/folder-rule-sets.service.mjs +0 -225
  257. package/esm2020/folder-rules/services/folder-rules.service.mjs +0 -193
  258. package/esm2020/lib/aca-content.module.mjs +0 -299
  259. package/esm2020/lib/aca-content.routes.mjs +0 -359
  260. package/esm2020/lib/components/bulk-actions-dropdown/bulk-actions-dropdown.component.mjs +0 -83
  261. package/esm2020/lib/components/common/location-link/location-link.component.mjs +0 -180
  262. package/esm2020/lib/components/common/toggle-shared/toggle-shared.component.mjs +0 -76
  263. package/esm2020/lib/components/common/user-info/user-info.component.mjs +0 -47
  264. package/esm2020/lib/components/context-menu/context-menu-item.component.mjs +0 -62
  265. package/esm2020/lib/components/context-menu/context-menu-outside-event.directive.mjs +0 -63
  266. package/esm2020/lib/components/context-menu/context-menu-overlay.mjs +0 -32
  267. package/esm2020/lib/components/context-menu/context-menu.component.mjs +0 -114
  268. package/esm2020/lib/components/context-menu/context-menu.service.mjs +0 -99
  269. package/esm2020/lib/components/details/details.component.mjs +0 -147
  270. package/esm2020/lib/components/dl-custom-components/datatable-cell-badges/datatable-cell-badges.component.mjs +0 -71
  271. package/esm2020/lib/components/dl-custom-components/name-column/name-column.component.mjs +0 -101
  272. package/esm2020/lib/components/dl-custom-components/tags-column/tags-column.component.mjs +0 -48
  273. package/esm2020/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.mjs +0 -75
  274. package/esm2020/lib/components/favorite-libraries/favorite-libraries.component.mjs +0 -120
  275. package/esm2020/lib/components/favorites/favorites.component.mjs +0 -103
  276. package/esm2020/lib/components/files/files.component.mjs +0 -330
  277. package/esm2020/lib/components/home/home.component.mjs +0 -47
  278. package/esm2020/lib/components/info-drawer/comments-tab/comments-tab.component.mjs +0 -59
  279. package/esm2020/lib/components/info-drawer/info.drawer.module.mjs +0 -73
  280. package/esm2020/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.mjs +0 -206
  281. package/esm2020/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.mjs +0 -45
  282. package/esm2020/lib/components/info-drawer/metadata-tab/metadata-tab.component.mjs +0 -134
  283. package/esm2020/lib/components/info-drawer/versions-tab/versions-tab.component.mjs +0 -95
  284. package/esm2020/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.mjs +0 -129
  285. package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-input/search-ai-input.component.mjs +0 -171
  286. package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.mjs +0 -82
  287. package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component.mjs +0 -199
  288. package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-utils.mjs +0 -33
  289. package/esm2020/lib/components/libraries/libraries.component.mjs +0 -79
  290. package/esm2020/lib/components/recent-files/recent-files.component.mjs +0 -82
  291. package/esm2020/lib/components/search/search-action-menu/search-action-menu.component.mjs +0 -64
  292. package/esm2020/lib/components/search/search-input/search-input.component.mjs +0 -301
  293. package/esm2020/lib/components/search/search-input-control/search-input-control.component.mjs +0 -94
  294. package/esm2020/lib/components/search/search-libraries-results/search-libraries-query-builder.service.mjs +0 -90
  295. package/esm2020/lib/components/search/search-libraries-results/search-libraries-results.component.mjs +0 -153
  296. package/esm2020/lib/components/search/search-navigation.service.mjs +0 -60
  297. package/esm2020/lib/components/search/search-results/search-results.component.mjs +0 -255
  298. package/esm2020/lib/components/search/search-results-row/search-results-row.component.mjs +0 -142
  299. package/esm2020/lib/components/shared-files/shared-files.component.mjs +0 -83
  300. package/esm2020/lib/components/shared-link-view/shared-link-view.component.mjs +0 -82
  301. package/esm2020/lib/components/sidenav/components/button-menu.component.mjs +0 -62
  302. package/esm2020/lib/components/sidenav/components/expand-menu.component.mjs +0 -67
  303. package/esm2020/lib/components/sidenav/components/sidenav-header.component.mjs +0 -66
  304. package/esm2020/lib/components/sidenav/directives/action.directive.mjs +0 -75
  305. package/esm2020/lib/components/sidenav/directives/active-link.directive.mjs +0 -93
  306. package/esm2020/lib/components/sidenav/directives/expansion-panel.directive.mjs +0 -102
  307. package/esm2020/lib/components/sidenav/directives/menu-panel.directive.mjs +0 -99
  308. package/esm2020/lib/components/sidenav/sidenav.component.mjs +0 -89
  309. package/esm2020/lib/components/sidenav/user-menu/user-menu.component.mjs +0 -56
  310. package/esm2020/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.mjs +0 -137
  311. package/esm2020/lib/components/toolbar/toggle-favorite/toggle-favorite.component.mjs +0 -86
  312. package/esm2020/lib/components/toolbar/toggle-favorite-library/toggle-favorite-library.component.mjs +0 -107
  313. package/esm2020/lib/components/toolbar/toggle-info-drawer/toggle-info-drawer.component.mjs +0 -74
  314. package/esm2020/lib/components/toolbar/toggle-join-library/toggle-join-library-button.component.mjs +0 -105
  315. package/esm2020/lib/components/toolbar/view-node/view-node.component.mjs +0 -122
  316. package/esm2020/lib/components/trashcan/trashcan.component.mjs +0 -68
  317. package/esm2020/lib/components/upload-files-dialog/upload-files-dialog.component.mjs +0 -52
  318. package/esm2020/lib/components/view-profile/view-profile.component.mjs +0 -193
  319. package/esm2020/lib/dialogs/node-template/create-from-template.dialog.mjs +0 -120
  320. package/esm2020/lib/directives/document-list.directive.mjs +0 -199
  321. package/esm2020/lib/extensions/core.extensions.module.mjs +0 -55
  322. package/esm2020/lib/services/content-management.service.mjs +0 -873
  323. package/esm2020/lib/services/content-url.service.mjs +0 -71
  324. package/esm2020/lib/services/modal-ai.service.mjs +0 -66
  325. package/esm2020/lib/services/node-actions.service.mjs +0 -600
  326. package/esm2020/lib/services/node-template.service.mjs +0 -144
  327. package/esm2020/lib/services/search-ai-navigation.service.mjs +0 -52
  328. package/esm2020/lib/store/app-store.module.mjs +0 -102
  329. package/esm2020/lib/store/effects/app.effects.mjs +0 -49
  330. package/esm2020/lib/store/effects/contextmenu.effects.mjs +0 -55
  331. package/esm2020/lib/store/effects/download.effects.mjs +0 -159
  332. package/esm2020/lib/store/effects/favorite.effects.mjs +0 -76
  333. package/esm2020/lib/store/effects/library.effects.mjs +0 -113
  334. package/esm2020/lib/store/effects/node.effects.mjs +0 -325
  335. package/esm2020/lib/store/effects/search-ai.effects.mjs +0 -57
  336. package/esm2020/lib/store/effects/search.effects.mjs +0 -60
  337. package/esm2020/lib/store/effects/template.effects.mjs +0 -121
  338. package/esm2020/lib/store/effects/upload.effects.mjs +0 -166
  339. package/esm2020/lib/store/effects/viewer.effects.mjs +0 -175
  340. package/esm2020/ms-office/actions/aos.actions.mjs +0 -31
  341. package/esm2020/ms-office/aos-extension.module.mjs +0 -52
  342. package/esm2020/ms-office/aos-extension.service.mjs +0 -132
  343. package/esm2020/ms-office/effects/aos.effects.mjs +0 -48
  344. package/esm2020/public-api.mjs +0 -32
  345. package/esm2020/viewer/lib/components/preview/preview.component.mjs +0 -236
  346. package/esm2020/viewer/lib/components/viewer/viewer.component.mjs +0 -240
  347. package/esm2020/viewer/lib/services/viewer.service.mjs +0 -226
  348. package/esm2020/viewer/lib/viewer.module.mjs +0 -52
  349. package/fesm2015/alfresco-aca-content-about.mjs.map +0 -1
  350. package/fesm2015/alfresco-aca-content-folder-rules.mjs +0 -2662
  351. package/fesm2015/alfresco-aca-content-folder-rules.mjs.map +0 -1
  352. package/fesm2015/alfresco-aca-content-ms-office.mjs +0 -256
  353. package/fesm2015/alfresco-aca-content-ms-office.mjs.map +0 -1
  354. package/fesm2015/alfresco-aca-content-viewer.mjs +0 -700
  355. package/fesm2015/alfresco-aca-content-viewer.mjs.map +0 -1
  356. package/fesm2015/alfresco-aca-content.mjs +0 -9835
  357. package/fesm2015/alfresco-aca-content.mjs.map +0 -1
  358. package/fesm2020/alfresco-aca-content-about.mjs +0 -193
  359. package/fesm2020/alfresco-aca-content-about.mjs.map +0 -1
  360. package/fesm2020/alfresco-aca-content-folder-rules.mjs.map +0 -1
  361. package/fesm2020/alfresco-aca-content-ms-office.mjs.map +0 -1
  362. package/fesm2020/alfresco-aca-content-viewer.mjs.map +0 -1
  363. package/fesm2020/alfresco-aca-content.mjs +0 -9934
  364. package/fesm2020/alfresco-aca-content.mjs.map +0 -1
  365. /package/{esm2020 → esm2022}/about/alfresco-aca-content-about.mjs +0 -0
  366. /package/{esm2020 → esm2022}/about/dev-mode.tokens.mjs +0 -0
  367. /package/{esm2020 → esm2022}/about/package-json.token.mjs +0 -0
  368. /package/{esm2020 → esm2022}/about/public-api.mjs +0 -0
  369. /package/{esm2020 → esm2022}/alfresco-aca-content.mjs +0 -0
  370. /package/{esm2020 → esm2022}/folder-rules/alfresco-aca-content-folder-rules.mjs +0 -0
  371. /package/{esm2020 → esm2022}/folder-rules/folder-rules.rules.mjs +0 -0
  372. /package/{esm2020 → esm2022}/folder-rules/model/action-parameter-constraint.model.mjs +0 -0
  373. /package/{esm2020 → esm2022}/folder-rules/model/rule-action.model.mjs +0 -0
  374. /package/{esm2020 → esm2022}/folder-rules/model/rule-composite-condition.model.mjs +0 -0
  375. /package/{esm2020 → esm2022}/folder-rules/model/rule-grouping-item.model.mjs +0 -0
  376. /package/{esm2020 → esm2022}/folder-rules/model/rule-set.model.mjs +0 -0
  377. /package/{esm2020 → esm2022}/folder-rules/model/rule-simple-condition.model.mjs +0 -0
  378. /package/{esm2020 → esm2022}/folder-rules/model/rule.model.mjs +0 -0
  379. /package/{esm2020 → esm2022}/folder-rules/public-api.mjs +0 -0
  380. /package/{esm2020 → esm2022}/folder-rules/rule-details/conditions/rule-condition-comparators.mjs +0 -0
  381. /package/{esm2020 → esm2022}/folder-rules/rule-details/conditions/rule-condition-fields.mjs +0 -0
  382. /package/{esm2020 → esm2022}/folder-rules/rule-details/validators/rule-composite-condition.validator.mjs +0 -0
  383. /package/{esm2020 → esm2022}/lib/components/common/index.mjs +0 -0
  384. /package/{esm2020 → esm2022}/lib/components/context-menu/direction.token.mjs +0 -0
  385. /package/{esm2020 → esm2022}/lib/components/context-menu/interfaces.mjs +0 -0
  386. /package/{esm2020 → esm2022}/lib/components/search/index.mjs +0 -0
  387. /package/{esm2020 → esm2022}/lib/components/sidenav/index.mjs +0 -0
  388. /package/{esm2020 → esm2022}/lib/components/toolbar/index.mjs +0 -0
  389. /package/{esm2020 → esm2022}/lib/components/view-profile/view-profile.guard.mjs +0 -0
  390. /package/{esm2020 → esm2022}/lib/store/effects.mjs +0 -0
  391. /package/{esm2020 → esm2022}/lib/store/initial-state.mjs +0 -0
  392. /package/{esm2020 → esm2022}/lib/store/reducers/app.reducer.mjs +0 -0
  393. /package/{esm2020 → esm2022}/ms-office/alfresco-aca-content-ms-office.mjs +0 -0
  394. /package/{esm2020 → esm2022}/ms-office/public-api.mjs +0 -0
  395. /package/{esm2020 → esm2022}/viewer/alfresco-aca-content-viewer.mjs +0 -0
  396. /package/{esm2020 → esm2022}/viewer/public-api.mjs +0 -0
@@ -1,873 +0,0 @@
1
- /*!
2
- * Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
3
- *
4
- * Alfresco Example Content Application
5
- *
6
- * This file is part of the Alfresco Example Content Application.
7
- * If the software was purchased under a paid Alfresco license, the terms of
8
- * the paid license agreement will prevail. Otherwise, the software is
9
- * provided under the following open source license terms:
10
- *
11
- * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
12
- * it under the terms of the GNU Lesser General Public License as published by
13
- * the Free Software Foundation, either version 3 of the License, or
14
- * (at your option) any later version.
15
- *
16
- * The Alfresco Example Content Application is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU Lesser General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU Lesser General Public License
22
- * from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
23
- */
24
- import { AppHookService, AppSettingsService, ContentApiService, NodePermissionService } from '@alfresco/aca-shared';
25
- import { getAppSelection, NavigateRouteAction, NavigateToParentFolder, RefreshPreviewAction, SetSelectedNodesAction, ShowLoaderAction, SnackbarErrorAction, SnackbarInfoAction, SnackbarUserAction, SnackbarWarningAction, UndoDeleteNodesAction, UnlockWriteAction, ViewNodeVersionAction } from '@alfresco/aca-shared/store';
26
- import { DocumentListService, FolderDialogComponent, LibraryDialogComponent, NewVersionUploaderDataAction, NewVersionUploaderService, NodeAspectService, NodesApiService, ShareDialogComponent } from '@alfresco/adf-content-services';
27
- import { NotificationService, TranslationService, ConfirmDialogComponent } from '@alfresco/adf-core';
28
- import { inject, Injectable } from '@angular/core';
29
- import { MatDialog } from '@angular/material/dialog';
30
- import { Store } from '@ngrx/store';
31
- import { forkJoin, of, zip } from 'rxjs';
32
- import { catchError, map, mergeMap, take, tap } from 'rxjs/operators';
33
- import { NodeActionsService } from './node-actions.service';
34
- import { Router } from '@angular/router';
35
- import * as i0 from "@angular/core";
36
- import * as i1 from "@alfresco/adf-content-services";
37
- import * as i2 from "@ngrx/store";
38
- import * as i3 from "@alfresco/aca-shared";
39
- import * as i4 from "@angular/material/dialog";
40
- import * as i5 from "./node-actions.service";
41
- import * as i6 from "@alfresco/adf-core";
42
- import * as i7 from "@angular/router";
43
- export class ContentManagementService {
44
- constructor(nodesApiService, store, contentApi, permission, dialogRef, nodeActionsService, translation, nodeAspectService, appHookService, newVersionUploaderService, router, appSettingsService, documentListService) {
45
- this.nodesApiService = nodesApiService;
46
- this.store = store;
47
- this.contentApi = contentApi;
48
- this.permission = permission;
49
- this.dialogRef = dialogRef;
50
- this.nodeActionsService = nodeActionsService;
51
- this.translation = translation;
52
- this.nodeAspectService = nodeAspectService;
53
- this.appHookService = appHookService;
54
- this.newVersionUploaderService = newVersionUploaderService;
55
- this.router = router;
56
- this.appSettingsService = appSettingsService;
57
- this.documentListService = documentListService;
58
- this.notificationService = inject(NotificationService);
59
- this.createMenuButtonSelector = 'app-toolbar-menu button[id="app.toolbar.create"]';
60
- }
61
- addFavorite(nodes) {
62
- if (nodes && nodes.length > 0) {
63
- this.contentApi.addFavorite(nodes).subscribe(() => {
64
- const favoriteNodes = nodes.map((node) => {
65
- const newNode = JSON.parse(JSON.stringify(node));
66
- newNode.entry.isFavorite = true;
67
- return newNode;
68
- });
69
- this.store.dispatch(new SetSelectedNodesAction(favoriteNodes));
70
- });
71
- }
72
- }
73
- removeFavorite(nodes) {
74
- if (nodes && nodes.length > 0) {
75
- this.contentApi.removeFavorite(nodes).subscribe(() => {
76
- const favoriteNodes = nodes.map((node) => {
77
- const newNode = JSON.parse(JSON.stringify(node));
78
- newNode.entry.isFavorite = false;
79
- return newNode;
80
- });
81
- this.store.dispatch(new SetSelectedNodesAction(favoriteNodes));
82
- });
83
- }
84
- }
85
- manageVersions(node, focusedElementOnCloseSelector) {
86
- if (node?.entry) {
87
- // shared and favorite
88
- const id = node.entry.nodeId || node.entry.guid;
89
- if (id) {
90
- this.contentApi.getNodeInfo(id).subscribe((entry) => {
91
- this.openVersionManagerDialog(entry, focusedElementOnCloseSelector);
92
- });
93
- }
94
- else {
95
- this.openVersionManagerDialog(node.entry, focusedElementOnCloseSelector);
96
- }
97
- }
98
- }
99
- manageAspects(node, focusedElementOnCloseSelector) {
100
- if (node?.entry) {
101
- // shared and favorite
102
- const id = node.entry.nodeId || node.entry.guid;
103
- if (id) {
104
- this.contentApi.getNodeInfo(id).subscribe((entry) => {
105
- this.openAspectListDialog(entry, focusedElementOnCloseSelector);
106
- });
107
- }
108
- else {
109
- this.openAspectListDialog(node.entry, focusedElementOnCloseSelector);
110
- }
111
- }
112
- }
113
- versionUpdateDialog(node, file) {
114
- this.contentApi.getNodeVersions(node.id).subscribe(({ list }) => {
115
- const newVersionUploaderDialogData = {
116
- node,
117
- file,
118
- currentVersion: list.entries[0].entry,
119
- title: 'VERSION.DIALOG.TITLE',
120
- showComments: this.appSettingsService.uploadAllowComments,
121
- allowDownload: this.appSettingsService.uploadAllowDownload
122
- };
123
- const dialogConfig = { width: '600px' };
124
- this.newVersionUploaderService.openUploadNewVersionDialog(newVersionUploaderDialogData, dialogConfig).subscribe((data) => {
125
- if (data.action === NewVersionUploaderDataAction.upload) {
126
- if (data.newVersion.value.entry.properties['cm:lockType'] === 'WRITE_LOCK') {
127
- this.store.dispatch(new UnlockWriteAction(data.newVersion.value));
128
- }
129
- }
130
- }, (error) => this.notificationService.showError(error));
131
- });
132
- }
133
- shareNode(node, focusedElementOnCloseSelector) {
134
- if (node?.entry) {
135
- // shared and favorite
136
- const id = node.entry.nodeId || node.entry.guid;
137
- if (id) {
138
- this.contentApi.getNodeInfo(id).subscribe((entry) => {
139
- this.openShareLinkDialog({ entry }, focusedElementOnCloseSelector);
140
- });
141
- }
142
- else {
143
- this.openShareLinkDialog(node, focusedElementOnCloseSelector);
144
- }
145
- }
146
- }
147
- openShareLinkDialog(node, focusedElementOnCloseSelector) {
148
- const baseShareUrl = this.appSettingsService.baseShareUrl;
149
- this.dialogRef
150
- .open(ShareDialogComponent, {
151
- restoreFocus: true,
152
- width: '600px',
153
- panelClass: 'adf-share-link-dialog',
154
- data: {
155
- node,
156
- baseShareUrl
157
- }
158
- })
159
- .afterClosed()
160
- .subscribe(() => {
161
- this.store.dispatch(new SetSelectedNodesAction([node]));
162
- this.appHookService.linksUnshared.next();
163
- this.focusAfterClose(focusedElementOnCloseSelector);
164
- });
165
- }
166
- createFolder(parentNodeId) {
167
- const dialogInstance = this.dialogRef.open(FolderDialogComponent, {
168
- data: {
169
- parentNodeId,
170
- createTitle: undefined,
171
- nodeType: 'cm:folder'
172
- },
173
- width: '400px',
174
- role: 'dialog'
175
- });
176
- dialogInstance.componentInstance.error.subscribe((message) => {
177
- this.notificationService.showError(message);
178
- });
179
- dialogInstance.afterClosed().subscribe((node) => {
180
- if (node) {
181
- this.documentListService.reload();
182
- }
183
- this.focusAfterClose(this.createMenuButtonSelector);
184
- });
185
- }
186
- editFolder(folder, focusedElementOnCloseSelector) {
187
- if (!folder) {
188
- return;
189
- }
190
- const dialog = this.dialogRef.open(FolderDialogComponent, {
191
- data: {
192
- folder: folder.entry
193
- },
194
- width: '400px'
195
- });
196
- dialog.componentInstance.error.subscribe((message) => {
197
- this.notificationService.showError(message);
198
- });
199
- dialog.afterClosed().subscribe((node) => {
200
- if (node) {
201
- this.store.dispatch(new SetSelectedNodesAction([{ entry: node }]));
202
- this.nodesApiService.nodeUpdated.next(node);
203
- }
204
- this.focusAfterClose(focusedElementOnCloseSelector);
205
- });
206
- }
207
- createLibrary() {
208
- const dialogInstance = this.dialogRef.open(LibraryDialogComponent, {
209
- width: '400px'
210
- });
211
- dialogInstance.componentInstance.error.subscribe((message) => {
212
- this.notificationService.showError(message);
213
- });
214
- return dialogInstance.afterClosed().pipe(tap((node) => {
215
- if (node) {
216
- this.appHookService.libraryCreated.next(node);
217
- }
218
- this.focusAfterClose(this.createMenuButtonSelector);
219
- }), map((node) => {
220
- if (node?.entry?.guid) {
221
- return node.entry.guid;
222
- }
223
- return null;
224
- }));
225
- }
226
- deleteLibrary(id) {
227
- this.contentApi.deleteSite(id).subscribe(() => {
228
- this.appHookService.libraryDeleted.next(id);
229
- this.notificationService.showInfo('APP.MESSAGES.INFO.LIBRARY_DELETED');
230
- this.store.dispatch(new NavigateRouteAction(['/libraries']));
231
- }, () => {
232
- this.notificationService.showError('APP.MESSAGES.ERRORS.DELETE_LIBRARY_FAILED');
233
- });
234
- }
235
- leaveLibrary(siteId, focusedElementOnCloseSelector) {
236
- const dialogRef = this.dialogRef.open(ConfirmDialogComponent, {
237
- data: {
238
- title: 'APP.DIALOGS.CONFIRM_LEAVE.TITLE',
239
- message: 'APP.DIALOGS.CONFIRM_LEAVE.MESSAGE',
240
- yesLabel: 'APP.DIALOGS.CONFIRM_LEAVE.YES_LABEL',
241
- noLabel: 'APP.DIALOGS.CONFIRM_LEAVE.NO_LABEL'
242
- },
243
- minWidth: '250px'
244
- });
245
- dialogRef.afterClosed().subscribe((result) => {
246
- if (result === true) {
247
- this.contentApi.leaveSite(siteId).subscribe(() => {
248
- this.appHookService.libraryLeft.next(siteId);
249
- this.notificationService.showInfo('APP.MESSAGES.INFO.LEFT_LIBRARY');
250
- }, () => {
251
- this.notificationService.showError('APP.MESSAGES.ERRORS.LEAVE_LIBRARY_FAILED');
252
- });
253
- }
254
- this.focusAfterClose(focusedElementOnCloseSelector);
255
- });
256
- }
257
- updateLibrary(siteId, siteBody) {
258
- this.contentApi.updateLibrary(siteId, siteBody).subscribe((siteEntry) => {
259
- this.appHookService.libraryUpdated.next(siteEntry);
260
- this.notificationService.showInfo('LIBRARY.SUCCESS.LIBRARY_UPDATED');
261
- }, () => {
262
- this.notificationService.showError('LIBRARY.ERRORS.LIBRARY_UPDATE_ERROR');
263
- });
264
- }
265
- async unshareNodes(links) {
266
- const promises = links.map((link) => this.contentApi.deleteSharedLink(link.entry.id).toPromise());
267
- await Promise.all(promises);
268
- this.appHookService.linksUnshared.next();
269
- }
270
- canUpdateNode(node) {
271
- return this.permission.check(node, ['update']);
272
- }
273
- canUploadContent(folderNode) {
274
- return this.permission.check(folderNode, ['create']);
275
- }
276
- purgeDeletedNodes(nodes) {
277
- if (!nodes || nodes.length === 0) {
278
- return;
279
- }
280
- const dialogRef = this.dialogRef.open(ConfirmDialogComponent, {
281
- data: {
282
- title: 'APP.DIALOGS.CONFIRM_PURGE.TITLE',
283
- message: 'APP.DIALOGS.CONFIRM_PURGE.MESSAGE',
284
- yesLabel: 'APP.DIALOGS.CONFIRM_PURGE.YES_LABEL',
285
- noLabel: 'APP.DIALOGS.CONFIRM_PURGE.NO_LABEL'
286
- },
287
- minWidth: '250px'
288
- });
289
- dialogRef.afterClosed().subscribe((result) => {
290
- if (result === true) {
291
- const nodesToDelete = nodes.map((node) => {
292
- const { name } = node.entry;
293
- const id = node.entry.nodeId || node.entry.id;
294
- return {
295
- id,
296
- name
297
- };
298
- });
299
- this.purgeNodes(nodesToDelete);
300
- }
301
- });
302
- }
303
- restoreDeletedNodes(selection = []) {
304
- if (!selection.length) {
305
- return;
306
- }
307
- const nodesWithPath = selection.filter((node) => node.entry.path);
308
- if (selection.length && !nodesWithPath.length) {
309
- const failedStatus = this.processStatus([]);
310
- failedStatus.fail.push(...selection);
311
- this.showRestoreNotification(failedStatus);
312
- this.documentListService.reload();
313
- return;
314
- }
315
- let status;
316
- forkJoin(nodesWithPath.map((node) => this.restoreNode(node)))
317
- .pipe(tap((restoredNodes) => {
318
- status = this.processStatus(restoredNodes);
319
- }), mergeMap(() => this.contentApi.getDeletedNodes()))
320
- .subscribe((nodes) => {
321
- const selectedNodes = this.diff(status.fail, selection, false);
322
- const remainingNodes = this.diff(selectedNodes, nodes.list.entries);
323
- if (!remainingNodes.length) {
324
- this.showRestoreNotification(status);
325
- this.documentListService.reload();
326
- }
327
- else {
328
- this.restoreDeletedNodes(remainingNodes);
329
- }
330
- });
331
- }
332
- copyNodes(nodes, focusedElementOnCloseSelector) {
333
- zip(this.nodeActionsService.copyNodes(nodes, undefined, focusedElementOnCloseSelector), this.nodeActionsService.contentCopied).subscribe((result) => {
334
- const [operationResult, newItems] = result;
335
- this.showCopyMessage(operationResult, nodes, newItems);
336
- }, (error) => {
337
- this.showCopyMessage(error, nodes);
338
- });
339
- }
340
- moveNodes(nodes, focusedElementOnCloseSelector) {
341
- const permissionForMove = '!';
342
- zip(this.nodeActionsService.moveNodes(nodes, permissionForMove, focusedElementOnCloseSelector), this.nodeActionsService.contentMoved).subscribe((result) => {
343
- const [operationResult, moveResponse] = result;
344
- this.showMoveMessage(nodes, operationResult, moveResponse);
345
- this.documentListService.reload();
346
- }, (error) => {
347
- this.showMoveMessage(nodes, error);
348
- });
349
- }
350
- getErrorMessage(errorObject) {
351
- let i18nMessageString = 'APP.MESSAGES.ERRORS.GENERIC';
352
- try {
353
- const { error: { statusCode } } = JSON.parse(errorObject.message);
354
- if (statusCode === 409) {
355
- i18nMessageString = 'APP.MESSAGES.ERRORS.NODE_MOVE';
356
- }
357
- else if (statusCode === 403) {
358
- i18nMessageString = 'APP.MESSAGES.ERRORS.PERMISSION';
359
- }
360
- }
361
- catch (err) {
362
- /* Do nothing, keep the original message */
363
- }
364
- return i18nMessageString;
365
- }
366
- getNodeInfo() {
367
- return this.store.select(getAppSelection).pipe(take(1), mergeMap(({ file }) => {
368
- const id = file.entry.nodeId || file.entry.guid;
369
- if (!id) {
370
- return of(file.entry);
371
- }
372
- else {
373
- return this.contentApi.getNodeInfo(id);
374
- }
375
- }));
376
- }
377
- unlockNode(node) {
378
- return this.contentApi.unlockNode(node.entry.id).catch(() => {
379
- this.notificationService.showError('APP.MESSAGES.ERRORS.UNLOCK_NODE', null, { fileName: node.entry.name });
380
- });
381
- }
382
- showCopyMessage(info, nodes, newItems) {
383
- const numberOfCopiedItems = newItems ? newItems.length : 0;
384
- const failedItems = nodes.length - numberOfCopiedItems;
385
- let i18nMessageString = 'APP.MESSAGES.ERRORS.GENERIC';
386
- if (typeof info === 'string') {
387
- if (info.toLowerCase().indexOf('succes') !== -1) {
388
- let i18MessageSuffix;
389
- if (failedItems) {
390
- if (numberOfCopiedItems) {
391
- i18MessageSuffix = numberOfCopiedItems === 1 ? 'PARTIAL_SINGULAR' : 'PARTIAL_PLURAL';
392
- }
393
- else {
394
- i18MessageSuffix = failedItems === 1 ? 'FAIL_SINGULAR' : 'FAIL_PLURAL';
395
- }
396
- }
397
- else {
398
- i18MessageSuffix = numberOfCopiedItems === 1 ? 'SINGULAR' : 'PLURAL';
399
- }
400
- i18nMessageString = `APP.MESSAGES.INFO.NODE_COPY.${i18MessageSuffix}`;
401
- }
402
- }
403
- else {
404
- try {
405
- const { error: { statusCode } } = JSON.parse(info.message);
406
- if (statusCode === 403) {
407
- i18nMessageString = 'APP.MESSAGES.ERRORS.PERMISSION';
408
- }
409
- }
410
- catch { }
411
- }
412
- const undo = numberOfCopiedItems > 0 ? this.translation.instant('APP.ACTIONS.UNDO') : '';
413
- const message = this.translation.instant(i18nMessageString, {
414
- success: numberOfCopiedItems,
415
- failed: failedItems
416
- });
417
- this.notificationService
418
- .openSnackMessageAction(message, undo, {
419
- panelClass: 'info-snackbar'
420
- })
421
- .onAction()
422
- .subscribe(() => this.undoCopyNodes(newItems));
423
- }
424
- undoCopyNodes(nodes) {
425
- const batch = this.nodeActionsService
426
- .flatten(nodes)
427
- .filter((item) => item.entry)
428
- .map((item) => this.contentApi.deleteNode(item.entry.id, { permanent: true }));
429
- forkJoin(...batch).subscribe(() => {
430
- this.appHookService.nodesDeleted.next(null);
431
- this.documentListService.reload();
432
- }, (error) => {
433
- let i18nMessageString = 'APP.MESSAGES.ERRORS.GENERIC';
434
- let errorJson = null;
435
- try {
436
- errorJson = JSON.parse(error.message);
437
- }
438
- catch { }
439
- if (errorJson?.error?.statusCode === 403) {
440
- i18nMessageString = 'APP.MESSAGES.ERRORS.PERMISSION';
441
- }
442
- this.notificationService.showError(i18nMessageString);
443
- });
444
- }
445
- openVersionManagerDialog(node, focusedElementOnCloseSelector) {
446
- // workaround Shared
447
- if (node.isFile || node.nodeId) {
448
- const newVersionUploaderDialogData = {
449
- node,
450
- showVersionsOnly: true,
451
- title: 'VERSION.DIALOG.TITLE'
452
- };
453
- this.newVersionUploaderService
454
- .openUploadNewVersionDialog(newVersionUploaderDialogData, { width: '630px', role: 'dialog' }, focusedElementOnCloseSelector)
455
- .subscribe({
456
- next: (newVersionUploaderData) => {
457
- switch (newVersionUploaderData.action) {
458
- case NewVersionUploaderDataAction.refresh:
459
- this.documentListService.reload();
460
- this.store.dispatch(new RefreshPreviewAction(newVersionUploaderData.node));
461
- break;
462
- case NewVersionUploaderDataAction.view:
463
- this.store.dispatch(new ViewNodeVersionAction(node.id, newVersionUploaderData.versionId, {
464
- location: this.router.url
465
- }));
466
- break;
467
- default:
468
- break;
469
- }
470
- }
471
- });
472
- }
473
- else {
474
- this.notificationService.showError('APP.MESSAGES.ERRORS.PERMISSION');
475
- }
476
- }
477
- openAspectListDialog(node, focusedElementOnCloseSelector) {
478
- // workaround Shared
479
- if (node.isFile || node.id) {
480
- this.nodeAspectService.updateNodeAspects(node.id, focusedElementOnCloseSelector);
481
- }
482
- else {
483
- this.notificationService.showError('APP.MESSAGES.ERRORS.PERMISSION');
484
- }
485
- }
486
- undoMoveNodes(moveResponse, selectionParentId) {
487
- const movedNodes = moveResponse?.['succeeded'] ?? [];
488
- const partiallyMovedNodes = moveResponse?.['partiallySucceeded'] ?? [];
489
- const restoreDeletedNodesBatch = this.nodeActionsService.moveDeletedEntries.map((folderEntry) => this.contentApi.restoreNode(folderEntry.nodeId || folderEntry.id).pipe(map((node) => node.entry)));
490
- zip(...restoreDeletedNodesBatch, of(null))
491
- .pipe(mergeMap(() => {
492
- const nodesToBeMovedBack = [...partiallyMovedNodes, ...movedNodes];
493
- const revertMoveBatch = this.nodeActionsService
494
- .flatten(nodesToBeMovedBack)
495
- .filter((node) => node.entry || node.itemMoved?.entry)
496
- .map((node) => {
497
- if (node.itemMoved) {
498
- return this.nodeActionsService.moveNodeAction(node.itemMoved.entry, node.initialParentId);
499
- }
500
- else {
501
- return this.nodeActionsService.moveNodeAction(node.entry, selectionParentId);
502
- }
503
- });
504
- return zip(...revertMoveBatch, of(null));
505
- }))
506
- .subscribe(() => {
507
- this.documentListService.reload();
508
- }, (error) => {
509
- let message = 'APP.MESSAGES.ERRORS.GENERIC';
510
- let errorJson = null;
511
- try {
512
- errorJson = JSON.parse(error.message);
513
- }
514
- catch { }
515
- if (errorJson?.error?.statusCode === 403) {
516
- message = 'APP.MESSAGES.ERRORS.PERMISSION';
517
- }
518
- this.notificationService.showError(message);
519
- });
520
- }
521
- deleteNodes(items) {
522
- const batch = [];
523
- items.forEach((node) => {
524
- batch.push(this.deleteNode(node));
525
- });
526
- forkJoin(...batch).subscribe((data) => {
527
- const status = this.processStatus(data);
528
- const message = this.getDeleteMessage(status);
529
- if (message && status.someSucceeded) {
530
- message.userAction = new SnackbarUserAction('APP.ACTIONS.UNDO', new UndoDeleteNodesAction([...status.success]));
531
- }
532
- this.store.dispatch(message);
533
- if (status.someSucceeded) {
534
- this.appHookService.nodesDeleted.next();
535
- this.documentListService.reload();
536
- }
537
- this.store.dispatch(new ShowLoaderAction(false));
538
- });
539
- }
540
- undoDeleteNodes(items) {
541
- const batch = [];
542
- items.forEach((item) => {
543
- batch.push(this.undoDeleteNode(item));
544
- });
545
- forkJoin(...batch).subscribe((data) => {
546
- const processedData = this.processStatus(data);
547
- if (processedData.fail.length) {
548
- const message = this.getUndoDeleteMessage(processedData);
549
- this.store.dispatch(message);
550
- }
551
- if (processedData.someSucceeded) {
552
- this.documentListService.reload();
553
- }
554
- });
555
- }
556
- undoDeleteNode(item) {
557
- const { id, name } = item;
558
- return this.contentApi.restoreNode(id).pipe(map(() => ({
559
- id,
560
- name,
561
- status: 1
562
- })), catchError(() => of({
563
- id,
564
- name,
565
- status: 0
566
- })));
567
- }
568
- getUndoDeleteMessage(status) {
569
- if (status.someFailed && !status.oneFailed) {
570
- return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_RESTORE_PLURAL', { number: status.fail.length });
571
- }
572
- if (status.oneFailed) {
573
- return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_RESTORE', {
574
- name: status.fail[0].name
575
- });
576
- }
577
- return null;
578
- }
579
- restoreNode(node) {
580
- const { entry } = node;
581
- return this.contentApi.restoreNode(entry.id).pipe(map(() => ({
582
- status: 1,
583
- entry
584
- })), catchError((error) => {
585
- const { statusCode } = JSON.parse(error.message).error;
586
- return of({
587
- status: 0,
588
- statusCode,
589
- entry
590
- });
591
- }));
592
- }
593
- purgeNodes(selection = []) {
594
- if (!selection.length) {
595
- return;
596
- }
597
- const batch = selection.map((node) => this.purgeDeletedNode(node));
598
- forkJoin(batch).subscribe((purgedNodes) => {
599
- const status = this.processStatus(purgedNodes);
600
- if (status.success.length) {
601
- this.documentListService.reload();
602
- }
603
- this.sendPurgeMessage(status);
604
- });
605
- }
606
- purgeDeletedNode(node) {
607
- const { id, name } = node;
608
- return this.contentApi.purgeDeletedNode(id).pipe(map(() => ({
609
- status: 1,
610
- id,
611
- name
612
- })), catchError(() => of({
613
- status: 0,
614
- id,
615
- name
616
- })));
617
- }
618
- processStatus(data = []) {
619
- const status = {
620
- fail: [],
621
- success: [],
622
- get someFailed() {
623
- return !!this.fail.length;
624
- },
625
- get someSucceeded() {
626
- return !!this.success.length;
627
- },
628
- get oneFailed() {
629
- return this.fail.length === 1;
630
- },
631
- get oneSucceeded() {
632
- return this.success.length === 1;
633
- },
634
- get allSucceeded() {
635
- return this.someSucceeded && !this.someFailed;
636
- },
637
- get allFailed() {
638
- return this.someFailed && !this.someSucceeded;
639
- },
640
- reset() {
641
- this.fail = [];
642
- this.success = [];
643
- }
644
- };
645
- return data.reduce((acc, node) => {
646
- if (node.status) {
647
- acc.success.push(node);
648
- }
649
- else {
650
- acc.fail.push(node);
651
- }
652
- return acc;
653
- }, status);
654
- }
655
- sendPurgeMessage(status) {
656
- if (status.oneSucceeded && status.someFailed && !status.oneFailed) {
657
- this.notificationService.showWarning('APP.MESSAGES.INFO.TRASH.NODES_PURGE.PARTIAL_SINGULAR', null, {
658
- name: status.success[0].name,
659
- failed: status.fail.length
660
- });
661
- return;
662
- }
663
- if (status.someSucceeded && !status.oneSucceeded && status.someFailed) {
664
- this.notificationService.showWarning('APP.MESSAGES.INFO.TRASH.NODES_PURGE.PARTIAL_PLURAL', null, {
665
- number: status.success.length,
666
- failed: status.fail.length
667
- });
668
- return;
669
- }
670
- if (status.oneSucceeded) {
671
- this.notificationService.showInfo('APP.MESSAGES.INFO.TRASH.NODES_PURGE.SINGULAR', null, { name: status.success[0].name });
672
- return;
673
- }
674
- if (status.oneFailed) {
675
- this.notificationService.showError('APP.MESSAGES.ERRORS.TRASH.NODES_PURGE.SINGULAR', null, { name: status.fail[0].name });
676
- return;
677
- }
678
- if (status.allSucceeded) {
679
- this.notificationService.showInfo('APP.MESSAGES.INFO.TRASH.NODES_PURGE.PLURAL', null, { number: status.success.length });
680
- return;
681
- }
682
- if (status.allFailed) {
683
- this.notificationService.showError('APP.MESSAGES.ERRORS.TRASH.NODES_PURGE.PLURAL', null, { number: status.fail.length });
684
- return;
685
- }
686
- }
687
- showRestoreNotification(status) {
688
- const message = this.getRestoreMessage(status);
689
- if (message) {
690
- if (status.oneSucceeded && !status.someFailed) {
691
- const isSite = this.isSite(status.success[0].entry);
692
- const path = status.success[0].entry.path;
693
- const parent = path.elements[path.elements.length - 1];
694
- const route = isSite ? ['/libraries', parent.id] : ['/personal-files', parent.id];
695
- let navigate;
696
- if (this.isLibraryContent(path)) {
697
- navigate = new NavigateToParentFolder(status.success[0]);
698
- }
699
- else {
700
- navigate = new NavigateRouteAction(route);
701
- }
702
- message.userAction = new SnackbarUserAction('APP.ACTIONS.VIEW', navigate);
703
- }
704
- this.store.dispatch(message);
705
- }
706
- }
707
- isSite(entry) {
708
- return entry.nodeType === 'st:site';
709
- }
710
- isLibraryContent(path) {
711
- return path && path.elements.length >= 2 && path.elements[1].name === 'Sites';
712
- }
713
- getRestoreMessage(status) {
714
- if (status.someFailed && !status.oneFailed) {
715
- return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.PARTIAL_PLURAL', {
716
- number: status.fail.length
717
- });
718
- }
719
- if (status.oneFailed && status.fail[0].statusCode) {
720
- if (status.fail[0].statusCode === 409) {
721
- return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.NODE_EXISTS', {
722
- name: status.fail[0].entry.name
723
- });
724
- }
725
- else {
726
- return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.GENERIC', {
727
- name: status.fail[0].entry.name
728
- });
729
- }
730
- }
731
- if (status.oneFailed && !status.fail[0].statusCode) {
732
- return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.LOCATION_MISSING', {
733
- name: status.fail[0].entry.name
734
- });
735
- }
736
- if (status.allSucceeded && !status.oneSucceeded) {
737
- return new SnackbarInfoAction('APP.MESSAGES.INFO.TRASH.NODES_RESTORE.PLURAL');
738
- }
739
- if (status.allSucceeded && status.oneSucceeded) {
740
- return new SnackbarInfoAction('APP.MESSAGES.INFO.TRASH.NODES_RESTORE.SINGULAR', {
741
- name: status.success[0].entry.name
742
- });
743
- }
744
- return null;
745
- }
746
- diff(selection, list, fromList = true) {
747
- const ids = selection.map((item) => item.entry.id);
748
- return list.filter((item) => {
749
- if (fromList) {
750
- return ids.includes(item.entry.id) ? item : null;
751
- }
752
- else {
753
- return !ids.includes(item.entry.id) ? item : null;
754
- }
755
- });
756
- }
757
- deleteNode(node) {
758
- const { name } = node.entry;
759
- const id = node.entry.nodeId || node.entry.id;
760
- return this.contentApi.deleteNode(id).pipe(map(() => ({
761
- id,
762
- name,
763
- status: 1
764
- })), catchError(() => of({
765
- id,
766
- name,
767
- status: 0
768
- })));
769
- }
770
- getDeleteMessage(status) {
771
- if (status.allFailed && !status.oneFailed) {
772
- return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_DELETION_PLURAL', { number: status.fail.length });
773
- }
774
- if (status.allSucceeded && !status.oneSucceeded) {
775
- return new SnackbarInfoAction('APP.MESSAGES.INFO.NODE_DELETION.PLURAL', {
776
- number: status.success.length
777
- });
778
- }
779
- if (status.someFailed && status.someSucceeded && !status.oneSucceeded) {
780
- return new SnackbarWarningAction('APP.MESSAGES.INFO.NODE_DELETION.PARTIAL_PLURAL', {
781
- success: status.success.length,
782
- failed: status.fail.length
783
- });
784
- }
785
- if (status.someFailed && status.oneSucceeded) {
786
- return new SnackbarWarningAction('APP.MESSAGES.INFO.NODE_DELETION.PARTIAL_SINGULAR', {
787
- success: status.success.length,
788
- failed: status.fail.length
789
- });
790
- }
791
- if (status.oneFailed && !status.someSucceeded) {
792
- return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_DELETION', {
793
- name: status.fail[0].name
794
- });
795
- }
796
- if (status.oneSucceeded && !status.someFailed) {
797
- return new SnackbarInfoAction('APP.MESSAGES.INFO.NODE_DELETION.SINGULAR', { name: status.success[0].name });
798
- }
799
- return null;
800
- }
801
- showMoveMessage(nodes, info, moveResponse) {
802
- const succeeded = moveResponse?.['succeeded'].length ?? 0;
803
- const partiallySucceeded = moveResponse?.['partiallySucceeded'].length ?? 0;
804
- const failures = moveResponse?.['failed'].length ?? 0;
805
- let successMessage = '';
806
- let partialSuccessMessage = '';
807
- let failedMessage = '';
808
- let errorMessage = '';
809
- if (typeof info === 'string') {
810
- // in case of success
811
- if (info.toLowerCase().indexOf('succes') !== -1) {
812
- const i18nMessageString = 'APP.MESSAGES.INFO.NODE_MOVE.';
813
- let i18MessageSuffix = '';
814
- if (succeeded) {
815
- i18MessageSuffix = succeeded === 1 ? 'SINGULAR' : 'PLURAL';
816
- successMessage = `${i18nMessageString}${i18MessageSuffix}`;
817
- }
818
- if (partiallySucceeded) {
819
- i18MessageSuffix = partiallySucceeded === 1 ? 'PARTIAL.SINGULAR' : 'PARTIAL.PLURAL';
820
- partialSuccessMessage = `${i18nMessageString}${i18MessageSuffix}`;
821
- }
822
- if (failures) {
823
- // if moving failed for ALL nodes, emit error
824
- if (failures === nodes.length) {
825
- const errors = this.nodeActionsService.flatten(moveResponse['failed']);
826
- errorMessage = this.getErrorMessage(errors[0]);
827
- }
828
- else {
829
- i18MessageSuffix = 'PARTIAL.FAIL';
830
- failedMessage = `${i18nMessageString}${i18MessageSuffix}`;
831
- }
832
- }
833
- }
834
- else {
835
- errorMessage = 'APP.MESSAGES.ERRORS.GENERIC';
836
- }
837
- }
838
- else {
839
- errorMessage = this.getErrorMessage(info);
840
- }
841
- const undo = succeeded + partiallySucceeded > 0 ? this.translation.instant('APP.ACTIONS.UNDO') : '';
842
- failedMessage = errorMessage ? errorMessage : failedMessage;
843
- const beforePartialSuccessMessage = successMessage && partialSuccessMessage ? ' ' : '';
844
- const beforeFailedMessage = (successMessage || partialSuccessMessage) && failedMessage ? ' ' : '';
845
- const initialParentId = this.nodeActionsService.getEntryParentId(nodes[0].entry);
846
- const messages = this.translation.instant([successMessage, partialSuccessMessage, failedMessage], {
847
- success: succeeded,
848
- failed: failures,
849
- partially: partiallySucceeded
850
- });
851
- // TODO: review in terms of i18n
852
- this.notificationService
853
- .openSnackMessageAction(messages[successMessage] + beforePartialSuccessMessage + messages[partialSuccessMessage] + beforeFailedMessage + messages[failedMessage], undo, {
854
- panelClass: 'info-snackbar'
855
- })
856
- .onAction()
857
- .subscribe(() => this.undoMoveNodes(moveResponse, initialParentId));
858
- }
859
- focusAfterClose(focusedElementSelector) {
860
- if (focusedElementSelector) {
861
- document.querySelector(focusedElementSelector)?.focus();
862
- }
863
- }
864
- }
865
- ContentManagementService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ContentManagementService, deps: [{ token: i1.NodesApiService }, { token: i2.Store }, { token: i3.ContentApiService }, { token: i3.NodePermissionService }, { token: i4.MatDialog }, { token: i5.NodeActionsService }, { token: i6.TranslationService }, { token: i1.NodeAspectService }, { token: i3.AppHookService }, { token: i1.NewVersionUploaderService }, { token: i7.Router }, { token: i3.AppSettingsService }, { token: i1.DocumentListService }], target: i0.ɵɵFactoryTarget.Injectable });
866
- ContentManagementService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ContentManagementService, providedIn: 'root' });
867
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ContentManagementService, decorators: [{
868
- type: Injectable,
869
- args: [{
870
- providedIn: 'root'
871
- }]
872
- }], ctorParameters: function () { return [{ type: i1.NodesApiService }, { type: i2.Store }, { type: i3.ContentApiService }, { type: i3.NodePermissionService }, { type: i4.MatDialog }, { type: i5.NodeActionsService }, { type: i6.TranslationService }, { type: i1.NodeAspectService }, { type: i3.AppHookService }, { type: i1.NewVersionUploaderService }, { type: i7.Router }, { type: i3.AppSettingsService }, { type: i1.DocumentListService }]; } });
873
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1tYW5hZ2VtZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY2EtY29udGVudC9zcmMvbGliL3NlcnZpY2VzL2NvbnRlbnQtbWFuYWdlbWVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BILE9BQU8sRUFJTCxlQUFlLEVBQ2YsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUV0QixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUVoQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDdEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsNEJBQTRCLEVBRTVCLHlCQUF5QixFQUN6QixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNyQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJHLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQW1CLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7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QUFFLFNBQVM7WUFDbEIsTUFBTSxFQUFFLFFBQVE7WUFDaEIsU0FBUyxFQUFFLGtCQUFrQjtTQUM5QixDQUFDLENBQUM7UUFFSCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLG1CQUFtQjthQUNyQixzQkFBc0IsQ0FDckIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLDJCQUEyQixHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFDeEksSUFBSSxFQUNKO1lBQ0UsVUFBVSxFQUFFLGVBQWU7U0FDNUIsQ0FDRjthQUNBLFFBQVEsRUFBRTthQUNWLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTyxlQUFlLENBQUMsc0JBQThCO1FBQ3BELElBQUksc0JBQXNCLEVBQUU7WUFDMUIsUUFBUSxDQUFDLGFBQWEsQ0FBYyxzQkFBc0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ3RFO0lBQ0gsQ0FBQzs7c0hBbC9CVSx3QkFBd0I7MEhBQXhCLHdCQUF3QixjQUZ2QixNQUFNOzRGQUVQLHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjQgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBBbGZyZXNjbyBFeGFtcGxlIENvbnRlbnQgQXBwbGljYXRpb25cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uLlxuICogSWYgdGhlIHNvZnR3YXJlIHdhcyBwdXJjaGFzZWQgdW5kZXIgYSBwYWlkIEFsZnJlc2NvIGxpY2Vuc2UsIHRoZSB0ZXJtcyBvZlxuICogdGhlIHBhaWQgbGljZW5zZSBhZ3JlZW1lbnQgd2lsbCBwcmV2YWlsLiBPdGhlcndpc2UsIHRoZSBzb2Z0d2FyZSBpc1xuICogcHJvdmlkZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBvcGVuIHNvdXJjZSBsaWNlbnNlIHRlcm1zOlxuICpcbiAqIFRoZSBBbGZyZXNjbyBFeGFtcGxlIENvbnRlbnQgQXBwbGljYXRpb24gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGZyb20gSHlsYW5kIFNvZnR3YXJlLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cblxuaW1wb3J0IHsgQXBwSG9va1NlcnZpY2UsIEFwcFNldHRpbmdzU2VydmljZSwgQ29udGVudEFwaVNlcnZpY2UsIE5vZGVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJ0BhbGZyZXNjby9hY2Etc2hhcmVkJztcbmltcG9ydCB7XG4gIEFwcFN0b3JlLFxuICBEZWxldGVkTm9kZUluZm8sXG4gIERlbGV0ZVN0YXR1cyxcbiAgZ2V0QXBwU2VsZWN0aW9uLFxuICBOYXZpZ2F0ZVJvdXRlQWN0aW9uLFxuICBOYXZpZ2F0ZVRvUGFyZW50Rm9sZGVyLFxuICBOb2RlSW5mbyxcbiAgUmVmcmVzaFByZXZpZXdBY3Rpb24sXG4gIFNldFNlbGVjdGVkTm9kZXNBY3Rpb24sXG4gIFNob3dMb2FkZXJBY3Rpb24sXG4gIFNuYWNrYmFyQWN0aW9uLFxuICBTbmFja2JhckVycm9yQWN0aW9uLFxuICBTbmFja2JhckluZm9BY3Rpb24sXG4gIFNuYWNrYmFyVXNlckFjdGlvbixcbiAgU25hY2tiYXJXYXJuaW5nQWN0aW9uLFxuICBVbmRvRGVsZXRlTm9kZXNBY3Rpb24sXG4gIFVubG9ja1dyaXRlQWN0aW9uLFxuICBWaWV3Tm9kZVZlcnNpb25BY3Rpb25cbn0gZnJvbSAnQGFsZnJlc2NvL2FjYS1zaGFyZWQvc3RvcmUnO1xuaW1wb3J0IHtcbiAgRG9jdW1lbnRMaXN0U2VydmljZSxcbiAgRm9sZGVyRGlhbG9nQ29tcG9uZW50LFxuICBMaWJyYXJ5RGlhbG9nQ29tcG9uZW50LFxuICBOZXdWZXJzaW9uVXBsb2FkZXJEYXRhQWN0aW9uLFxuICBOZXdWZXJzaW9uVXBsb2FkZXJEaWFsb2dEYXRhLFxuICBOZXdWZXJzaW9uVXBsb2FkZXJTZXJ2aWNlLFxuICBOb2RlQXNwZWN0U2VydmljZSxcbiAgTm9kZXNBcGlTZXJ2aWNlLFxuICBTaGFyZURpYWxvZ0NvbXBvbmVudFxufSBmcm9tICdAYWxmcmVzY28vYWRmLWNvbnRlbnQtc2VydmljZXMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSwgVHJhbnNsYXRpb25TZXJ2aWNlLCBDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb3JlJztcbmltcG9ydCB7IERlbGV0ZWROb2Rlc1BhZ2luZywgTm9kZSwgTm9kZUVudHJ5LCBQYXRoSW5mbywgU2l0ZUJvZHlDcmVhdGUsIFNpdGVFbnRyeSB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ0NvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgemlwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIG1lcmdlTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOb2RlQWN0aW9uc1NlcnZpY2UgfSBmcm9tICcuL25vZGUtYWN0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmludGVyZmFjZSBSZXN0b3JlZE5vZGUge1xuICBzdGF0dXM6IG51bWJlcjtcbiAgZW50cnk6IE5vZGU7XG4gIHN0YXR1c0NvZGU/OiBudW1iZXI7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENvbnRlbnRNYW5hZ2VtZW50U2VydmljZSB7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVNZW51QnV0dG9uU2VsZWN0b3IgPSAnYXBwLXRvb2xiYXItbWVudSBidXR0b25baWQ9XCJhcHAudG9vbGJhci5jcmVhdGVcIl0nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbm9kZXNBcGlTZXJ2aWNlOiBOb2Rlc0FwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmU8QXBwU3RvcmU+LFxuICAgIHByaXZhdGUgY29udGVudEFwaTogQ29udGVudEFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZXJtaXNzaW9uOiBOb2RlUGVybWlzc2lvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2dSZWY6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIG5vZGVBY3Rpb25zU2VydmljZTogTm9kZUFjdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb246IFRyYW5zbGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG5vZGVBc3BlY3RTZXJ2aWNlOiBOb2RlQXNwZWN0U2VydmljZSxcbiAgICBwcml2YXRlIGFwcEhvb2tTZXJ2aWNlOiBBcHBIb29rU2VydmljZSxcbiAgICBwcml2YXRlIG5ld1ZlcnNpb25VcGxvYWRlclNlcnZpY2U6IE5ld1ZlcnNpb25VcGxvYWRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGFwcFNldHRpbmdzU2VydmljZTogQXBwU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgZG9jdW1lbnRMaXN0U2VydmljZTogRG9jdW1lbnRMaXN0U2VydmljZVxuICApIHt9XG5cbiAgYWRkRmF2b3JpdGUobm9kZXM6IEFycmF5PE5vZGVFbnRyeT4pIHtcbiAgICBpZiAobm9kZXMgJiYgbm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb250ZW50QXBpLmFkZEZhdm9yaXRlKG5vZGVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBmYXZvcml0ZU5vZGVzID0gbm9kZXMubWFwKChub2RlKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3Tm9kZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobm9kZSkpO1xuICAgICAgICAgIG5ld05vZGUuZW50cnkuaXNGYXZvcml0ZSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIG5ld05vZGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNldFNlbGVjdGVkTm9kZXNBY3Rpb24oZmF2b3JpdGVOb2RlcykpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRmF2b3JpdGUobm9kZXM6IEFycmF5PE5vZGVFbnRyeT4pIHtcbiAgICBpZiAobm9kZXMgJiYgbm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb250ZW50QXBpLnJlbW92ZUZhdm9yaXRlKG5vZGVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBmYXZvcml0ZU5vZGVzID0gbm9kZXMubWFwKChub2RlKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3Tm9kZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobm9kZSkpO1xuICAgICAgICAgIG5ld05vZGUuZW50cnkuaXNGYXZvcml0ZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXdOb2RlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBTZXRTZWxlY3RlZE5vZGVzQWN0aW9uKGZhdm9yaXRlTm9kZXMpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG1hbmFnZVZlcnNpb25zKG5vZGU6IGFueSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpIHtcbiAgICBpZiAobm9kZT8uZW50cnkpIHtcbiAgICAgIC8vIHNoYXJlZCBhbmQgZmF2b3JpdGVcbiAgICAgIGNvbnN0IGlkID0gbm9kZS5lbnRyeS5ub2RlSWQgfHwgKG5vZGUgYXMgYW55KS5lbnRyeS5ndWlkO1xuXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXBpLmdldE5vZGVJbmZvKGlkKS5zdWJzY3JpYmUoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgdGhpcy5vcGVuVmVyc2lvbk1hbmFnZXJEaWFsb2coZW50cnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZW5WZXJzaW9uTWFuYWdlckRpYWxvZyhub2RlLmVudHJ5LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbWFuYWdlQXNwZWN0cyhub2RlOiBhbnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgaWYgKG5vZGU/LmVudHJ5KSB7XG4gICAgICAvLyBzaGFyZWQgYW5kIGZhdm9yaXRlXG4gICAgICBjb25zdCBpZCA9IG5vZGUuZW50cnkubm9kZUlkIHx8IChub2RlIGFzIGFueSkuZW50cnkuZ3VpZDtcblxuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIHRoaXMuY29udGVudEFwaS5nZXROb2RlSW5mbyhpZCkuc3Vic2NyaWJlKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHRoaXMub3BlbkFzcGVjdExpc3REaWFsb2coZW50cnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZW5Bc3BlY3RMaXN0RGlhbG9nKG5vZGUuZW50cnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2ZXJzaW9uVXBkYXRlRGlhbG9nKG5vZGU6IE5vZGUsIGZpbGU6IEZpbGUpIHtcbiAgICB0aGlzLmNvbnRlbnRBcGkuZ2V0Tm9kZVZlcnNpb25zKG5vZGUuaWQpLnN1YnNjcmliZSgoeyBsaXN0IH0pID0+IHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb25VcGxvYWRlckRpYWxvZ0RhdGEgPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBsaXN0LmVudHJpZXNbMF0uZW50cnksXG4gICAgICAgIHRpdGxlOiAnVkVSU0lPTi5ESUFMT0cuVElUTEUnLFxuICAgICAgICBzaG93Q29tbWVudHM6IHRoaXMuYXBwU2V0dGluZ3NTZXJ2aWNlLnVwbG9hZEFsbG93Q29tbWVudHMsXG4gICAgICAgIGFsbG93RG93bmxvYWQ6IHRoaXMuYXBwU2V0dGluZ3NTZXJ2aWNlLnVwbG9hZEFsbG93RG93bmxvYWRcbiAgICAgIH0gYXMgTmV3VmVyc2lvblVwbG9hZGVyRGlhbG9nRGF0YTtcbiAgICAgIGNvbnN0IGRpYWxvZ0NvbmZpZzogTWF0RGlhbG9nQ29uZmlnID0geyB3aWR0aDogJzYwMHB4JyB9O1xuXG4gICAgICB0aGlzLm5ld1ZlcnNpb25VcGxvYWRlclNlcnZpY2Uub3BlblVwbG9hZE5ld1ZlcnNpb25EaWFsb2cobmV3VmVyc2lvblVwbG9hZGVyRGlhbG9nRGF0YSwgZGlhbG9nQ29uZmlnKS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEuYWN0aW9uID09PSBOZXdWZXJzaW9uVXBsb2FkZXJEYXRhQWN0aW9uLnVwbG9hZCkge1xuICAgICAgICAgICAgaWYgKGRhdGEubmV3VmVyc2lvbi52YWx1ZS5lbnRyeS5wcm9wZXJ0aWVzWydjbTpsb2NrVHlwZSddID09PSAnV1JJVEVfTE9DSycpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgVW5sb2NrV3JpdGVBY3Rpb24oZGF0YS5uZXdWZXJzaW9uLnZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZXJyb3IpID0+IHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoZXJyb3IpXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgc2hhcmVOb2RlKG5vZGU6IGFueSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobm9kZT8uZW50cnkpIHtcbiAgICAgIC8vIHNoYXJlZCBhbmQgZmF2b3JpdGVcbiAgICAgIGNvbnN0IGlkID0gbm9kZS5lbnRyeS5ub2RlSWQgfHwgKG5vZGUgYXMgYW55KS5lbnRyeS5ndWlkO1xuXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXBpLmdldE5vZGVJbmZvKGlkKS5zdWJzY3JpYmUoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgdGhpcy5vcGVuU2hhcmVMaW5rRGlhbG9nKHsgZW50cnkgfSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3BlblNoYXJlTGlua0RpYWxvZyhub2RlLCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3BlblNoYXJlTGlua0RpYWxvZyhub2RlOiBhbnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZVNoYXJlVXJsID0gdGhpcy5hcHBTZXR0aW5nc1NlcnZpY2UuYmFzZVNoYXJlVXJsO1xuXG4gICAgdGhpcy5kaWFsb2dSZWZcbiAgICAgIC5vcGVuKFNoYXJlRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgIHJlc3RvcmVGb2N1czogdHJ1ZSxcbiAgICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICAgIHBhbmVsQ2xhc3M6ICdhZGYtc2hhcmUtbGluay1kaWFsb2cnLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBiYXNlU2hhcmVVcmxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgU2V0U2VsZWN0ZWROb2Rlc0FjdGlvbihbbm9kZV0pKTtcbiAgICAgICAgdGhpcy5hcHBIb29rU2VydmljZS5saW5rc1Vuc2hhcmVkLm5leHQoKTtcbiAgICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgICAgfSk7XG4gIH1cblxuICBjcmVhdGVGb2xkZXIocGFyZW50Tm9kZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaWFsb2dJbnN0YW5jZSA9IHRoaXMuZGlhbG9nUmVmLm9wZW4oRm9sZGVyRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHBhcmVudE5vZGVJZCxcbiAgICAgICAgY3JlYXRlVGl0bGU6IHVuZGVmaW5lZCxcbiAgICAgICAgbm9kZVR5cGU6ICdjbTpmb2xkZXInXG4gICAgICB9LFxuICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICByb2xlOiAnZGlhbG9nJ1xuICAgIH0pO1xuXG4gICAgZGlhbG9nSW5zdGFuY2UuY29tcG9uZW50SW5zdGFuY2UuZXJyb3Iuc3Vic2NyaWJlKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgfSk7XG5cbiAgICBkaWFsb2dJbnN0YW5jZS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgobm9kZSkgPT4ge1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UodGhpcy5jcmVhdGVNZW51QnV0dG9uU2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgZWRpdEZvbGRlcihmb2xkZXI6IE5vZGVFbnRyeSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMuZGlhbG9nUmVmLm9wZW4oRm9sZGVyRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZvbGRlcjogZm9sZGVyLmVudHJ5XG4gICAgICB9LFxuICAgICAgd2lkdGg6ICc0MDBweCdcbiAgICB9KTtcblxuICAgIGRpYWxvZy5jb21wb25lbnRJbnN0YW5jZS5lcnJvci5zdWJzY3JpYmUoKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcihtZXNzYWdlKTtcbiAgICB9KTtcblxuICAgIGRpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgobm9kZSkgPT4ge1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgU2V0U2VsZWN0ZWROb2Rlc0FjdGlvbihbeyBlbnRyeTogbm9kZSB9XSkpO1xuICAgICAgICB0aGlzLm5vZGVzQXBpU2VydmljZS5ub2RlVXBkYXRlZC5uZXh0KG5vZGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlTGlicmFyeSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IGRpYWxvZ0luc3RhbmNlID0gdGhpcy5kaWFsb2dSZWYub3BlbihMaWJyYXJ5RGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzQwMHB4J1xuICAgIH0pO1xuXG4gICAgZGlhbG9nSW5zdGFuY2UuY29tcG9uZW50SW5zdGFuY2UuZXJyb3Iuc3Vic2NyaWJlKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGlhbG9nSW5zdGFuY2UuYWZ0ZXJDbG9zZWQoKS5waXBlKFxuICAgICAgdGFwKChub2RlKSA9PiB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgdGhpcy5hcHBIb29rU2VydmljZS5saWJyYXJ5Q3JlYXRlZC5uZXh0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9jdXNBZnRlckNsb3NlKHRoaXMuY3JlYXRlTWVudUJ1dHRvblNlbGVjdG9yKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKChub2RlOiBTaXRlRW50cnkpID0+IHtcbiAgICAgICAgaWYgKG5vZGU/LmVudHJ5Py5ndWlkKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUuZW50cnkuZ3VpZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUxpYnJhcnkoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29udGVudEFwaS5kZWxldGVTaXRlKGlkKS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwSG9va1NlcnZpY2UubGlicmFyeURlbGV0ZWQubmV4dChpZCk7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93SW5mbygnQVBQLk1FU1NBR0VTLklORk8uTElCUkFSWV9ERUxFVEVEJyk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5hdmlnYXRlUm91dGVBY3Rpb24oWycvbGlicmFyaWVzJ10pKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ0FQUC5NRVNTQUdFUy5FUlJPUlMuREVMRVRFX0xJQlJBUllfRkFJTEVEJyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGxlYXZlTGlicmFyeShzaXRlSWQ6IHN0cmluZywgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1JlZi5vcGVuKENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6ICdBUFAuRElBTE9HUy5DT05GSVJNX0xFQVZFLlRJVExFJyxcbiAgICAgICAgbWVzc2FnZTogJ0FQUC5ESUFMT0dTLkNPTkZJUk1fTEVBVkUuTUVTU0FHRScsXG4gICAgICAgIHllc0xhYmVsOiAnQVBQLkRJQUxPR1MuQ09ORklSTV9MRUFWRS5ZRVNfTEFCRUwnLFxuICAgICAgICBub0xhYmVsOiAnQVBQLkRJQUxPR1MuQ09ORklSTV9MRUFWRS5OT19MQUJFTCdcbiAgICAgIH0sXG4gICAgICBtaW5XaWR0aDogJzI1MHB4J1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXBpLmxlYXZlU2l0ZShzaXRlSWQpLnN1YnNjcmliZShcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFwcEhvb2tTZXJ2aWNlLmxpYnJhcnlMZWZ0Lm5leHQoc2l0ZUlkKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93SW5mbygnQVBQLk1FU1NBR0VTLklORk8uTEVGVF9MSUJSQVJZJyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0Vycm9yKCdBUFAuTUVTU0FHRVMuRVJST1JTLkxFQVZFX0xJQlJBUllfRkFJTEVEJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlTGlicmFyeShzaXRlSWQ6IHN0cmluZywgc2l0ZUJvZHk6IFNpdGVCb2R5Q3JlYXRlKSB7XG4gICAgdGhpcy5jb250ZW50QXBpLnVwZGF0ZUxpYnJhcnkoc2l0ZUlkLCBzaXRlQm9keSkuc3Vic2NyaWJlKFxuICAgICAgKHNpdGVFbnRyeTogU2l0ZUVudHJ5KSA9PiB7XG4gICAgICAgIHRoaXMuYXBwSG9va1NlcnZpY2UubGlicmFyeVVwZGF0ZWQubmV4dChzaXRlRW50cnkpO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0luZm8oJ0xJQlJBUlkuU1VDQ0VTUy5MSUJSQVJZX1VQREFURUQnKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ0xJQlJBUlkuRVJST1JTLkxJQlJBUllfVVBEQVRFX0VSUk9SJyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVuc2hhcmVOb2RlcyhsaW5rczogQXJyYXk8Tm9kZUVudHJ5Pikge1xuICAgIGNvbnN0IHByb21pc2VzID0gbGlua3MubWFwKChsaW5rKSA9PiB0aGlzLmNvbnRlbnRBcGkuZGVsZXRlU2hhcmVkTGluayhsaW5rLmVudHJ5LmlkKS50b1Byb21pc2UoKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIHRoaXMuYXBwSG9va1NlcnZpY2UubGlua3NVbnNoYXJlZC5uZXh0KCk7XG4gIH1cblxuICBjYW5VcGRhdGVOb2RlKG5vZGU6IE5vZGVFbnRyeSB8IE5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uLmNoZWNrKG5vZGUsIFsndXBkYXRlJ10pO1xuICB9XG5cbiAgY2FuVXBsb2FkQ29udGVudChmb2xkZXJOb2RlOiBOb2RlRW50cnkgfCBOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbi5jaGVjayhmb2xkZXJOb2RlLCBbJ2NyZWF0ZSddKTtcbiAgfVxuXG4gIHB1cmdlRGVsZXRlZE5vZGVzKG5vZGVzOiBOb2RlRW50cnlbXSkge1xuICAgIGlmICghbm9kZXMgfHwgbm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dSZWYub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRpdGxlOiAnQVBQLkRJQUxPR1MuQ09ORklSTV9QVVJHRS5USVRMRScsXG4gICAgICAgIG1lc3NhZ2U6ICdBUFAuRElBTE9HUy5DT05GSVJNX1BVUkdFLk1FU1NBR0UnLFxuICAgICAgICB5ZXNMYWJlbDogJ0FQUC5ESUFMT0dTLkNPTkZJUk1fUFVSR0UuWUVTX0xBQkVMJyxcbiAgICAgICAgbm9MYWJlbDogJ0FQUC5ESUFMT0dTLkNPTkZJUk1fUFVSR0UuTk9fTEFCRUwnXG4gICAgICB9LFxuICAgICAgbWluV2lkdGg6ICcyNTBweCdcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG5vZGVzVG9EZWxldGU6IE5vZGVJbmZvW10gPSBub2Rlcy5tYXAoKG5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IG5vZGUuZW50cnk7XG4gICAgICAgICAgY29uc3QgaWQgPSAobm9kZSBhcyBhbnkpLmVudHJ5Lm5vZGVJZCB8fCBub2RlLmVudHJ5LmlkO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnB1cmdlTm9kZXMobm9kZXNUb0RlbGV0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXN0b3JlRGVsZXRlZE5vZGVzKHNlbGVjdGlvbjogTm9kZUVudHJ5W10gPSBbXSkge1xuICAgIGlmICghc2VsZWN0aW9uLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzV2l0aFBhdGggPSBzZWxlY3Rpb24uZmlsdGVyKChub2RlKSA9PiBub2RlLmVudHJ5LnBhdGgpO1xuXG4gICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggJiYgIW5vZGVzV2l0aFBhdGgubGVuZ3RoKSB7XG4gICAgICBjb25zdCBmYWlsZWRTdGF0dXMgPSB0aGlzLnByb2Nlc3NTdGF0dXMoW10pO1xuICAgICAgZmFpbGVkU3RhdHVzLmZhaWwucHVzaCguLi5zZWxlY3Rpb24pO1xuICAgICAgdGhpcy5zaG93UmVzdG9yZU5vdGlmaWNhdGlvbihmYWlsZWRTdGF0dXMpO1xuICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzdGF0dXM6IERlbGV0ZVN0YXR1cztcblxuICAgIGZvcmtKb2luKG5vZGVzV2l0aFBhdGgubWFwKChub2RlKSA9PiB0aGlzLnJlc3RvcmVOb2RlKG5vZGUpKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlc3RvcmVkTm9kZXMpID0+IHtcbiAgICAgICAgICBzdGF0dXMgPSB0aGlzLnByb2Nlc3NTdGF0dXMocmVzdG9yZWROb2Rlcyk7XG4gICAgICAgIH0pLFxuICAgICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLmNvbnRlbnRBcGkuZ2V0RGVsZXRlZE5vZGVzKCkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChub2RlczogRGVsZXRlZE5vZGVzUGFnaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTm9kZXMgPSB0aGlzLmRpZmYoc3RhdHVzLmZhaWwsIHNlbGVjdGlvbiwgZmFsc2UpO1xuICAgICAgICBjb25zdCByZW1haW5pbmdOb2RlcyA9IHRoaXMuZGlmZihzZWxlY3RlZE5vZGVzLCBub2Rlcy5saXN0LmVudHJpZXMpO1xuXG4gICAgICAgIGlmICghcmVtYWluaW5nTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5zaG93UmVzdG9yZU5vdGlmaWNhdGlvbihzdGF0dXMpO1xuICAgICAgICAgIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5yZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlc3RvcmVEZWxldGVkTm9kZXMocmVtYWluaW5nTm9kZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGNvcHlOb2Rlcyhub2RlczogQXJyYXk8Tm9kZUVudHJ5PiwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpIHtcbiAgICB6aXAodGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuY29weU5vZGVzKG5vZGVzLCB1bmRlZmluZWQsIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKSwgdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuY29udGVudENvcGllZCkuc3Vic2NyaWJlKFxuICAgICAgKHJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zdCBbb3BlcmF0aW9uUmVzdWx0LCBuZXdJdGVtc10gPSByZXN1bHQ7XG4gICAgICAgIHRoaXMuc2hvd0NvcHlNZXNzYWdlKG9wZXJhdGlvblJlc3VsdCwgbm9kZXMsIG5ld0l0ZW1zKTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zaG93Q29weU1lc3NhZ2UoZXJyb3IsIG5vZGVzKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgbW92ZU5vZGVzKG5vZGVzOiBBcnJheTxOb2RlRW50cnk+LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcj86IHN0cmluZykge1xuICAgIGNvbnN0IHBlcm1pc3Npb25Gb3JNb3ZlID0gJyEnO1xuXG4gICAgemlwKHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLm1vdmVOb2Rlcyhub2RlcywgcGVybWlzc2lvbkZvck1vdmUsIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKSwgdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuY29udGVudE1vdmVkKS5zdWJzY3JpYmUoXG4gICAgICAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNvbnN0IFtvcGVyYXRpb25SZXN1bHQsIG1vdmVSZXNwb25zZV0gPSByZXN1bHQ7XG4gICAgICAgIHRoaXMuc2hvd01vdmVNZXNzYWdlKG5vZGVzLCBvcGVyYXRpb25SZXN1bHQsIG1vdmVSZXNwb25zZSk7XG5cbiAgICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgfSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnNob3dNb3ZlTWVzc2FnZShub2RlcywgZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2UoZXJyb3JPYmplY3Q6IHsgbWVzc2FnZTogYW55IH0pOiBzdHJpbmcge1xuICAgIGxldCBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLkdFTkVSSUMnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZXJyb3I6IHsgc3RhdHVzQ29kZSB9XG4gICAgICB9ID0gSlNPTi5wYXJzZShlcnJvck9iamVjdC5tZXNzYWdlKTtcblxuICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwOSkge1xuICAgICAgICBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLk5PREVfTU9WRSc7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLlBFUk1JU1NJT04nO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyogRG8gbm90aGluZywga2VlcCB0aGUgb3JpZ2luYWwgbWVzc2FnZSAqL1xuICAgIH1cblxuICAgIHJldHVybiBpMThuTWVzc2FnZVN0cmluZztcbiAgfVxuXG4gIGdldE5vZGVJbmZvKCk6IE9ic2VydmFibGU8Tm9kZT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnNlbGVjdChnZXRBcHBTZWxlY3Rpb24pLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgbWVyZ2VNYXAoKHsgZmlsZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gKGZpbGUgYXMgYW55KS5lbnRyeS5ub2RlSWQgfHwgKGZpbGUgYXMgYW55KS5lbnRyeS5ndWlkO1xuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKGZpbGUuZW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkuZ2V0Tm9kZUluZm8oaWQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICB1bmxvY2tOb2RlKG5vZGU6IE5vZGVFbnRyeSk6IFByb21pc2U8dm9pZCB8IE5vZGVFbnRyeT4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkudW5sb2NrTm9kZShub2RlLmVudHJ5LmlkKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0Vycm9yKCdBUFAuTUVTU0FHRVMuRVJST1JTLlVOTE9DS19OT0RFJywgbnVsbCwgeyBmaWxlTmFtZTogbm9kZS5lbnRyeS5uYW1lIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93Q29weU1lc3NhZ2UoaW5mbzogYW55LCBub2RlczogQXJyYXk8Tm9kZUVudHJ5PiwgbmV3SXRlbXM/OiBBcnJheTxOb2RlRW50cnk+KSB7XG4gICAgY29uc3QgbnVtYmVyT2ZDb3BpZWRJdGVtcyA9IG5ld0l0ZW1zID8gbmV3SXRlbXMubGVuZ3RoIDogMDtcbiAgICBjb25zdCBmYWlsZWRJdGVtcyA9IG5vZGVzLmxlbmd0aCAtIG51bWJlck9mQ29waWVkSXRlbXM7XG5cbiAgICBsZXQgaTE4bk1lc3NhZ2VTdHJpbmcgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5HRU5FUklDJztcblxuICAgIGlmICh0eXBlb2YgaW5mbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChpbmZvLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignc3VjY2VzJykgIT09IC0xKSB7XG4gICAgICAgIGxldCBpMThNZXNzYWdlU3VmZml4O1xuXG4gICAgICAgIGlmIChmYWlsZWRJdGVtcykge1xuICAgICAgICAgIGlmIChudW1iZXJPZkNvcGllZEl0ZW1zKSB7XG4gICAgICAgICAgICBpMThNZXNzYWdlU3VmZml4ID0gbnVtYmVyT2ZDb3BpZWRJdGVtcyA9PT0gMSA/ICdQQVJUSUFMX1NJTkdVTEFSJyA6ICdQQVJUSUFMX1BMVVJBTCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkxOE1lc3NhZ2VTdWZmaXggPSBmYWlsZWRJdGVtcyA9PT0gMSA/ICdGQUlMX1NJTkdVTEFSJyA6ICdGQUlMX1BMVVJBTCc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkxOE1lc3NhZ2VTdWZmaXggPSBudW1iZXJPZkNvcGllZEl0ZW1zID09PSAxID8gJ1NJTkdVTEFSJyA6ICdQTFVSQUwnO1xuICAgICAgICB9XG5cbiAgICAgICAgaTE4bk1lc3NhZ2VTdHJpbmcgPSBgQVBQLk1FU1NBR0VTLklORk8uTk9ERV9DT1BZLiR7aTE4TWVzc2FnZVN1ZmZpeH1gO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZXJyb3I6IHsgc3RhdHVzQ29kZSB9XG4gICAgICAgIH0gPSBKU09OLnBhcnNlKGluZm8ubWVzc2FnZSk7XG5cbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgIGkxOG5NZXNzYWdlU3RyaW5nID0gJ0FQUC5NRVNTQUdFUy5FUlJPUlMuUEVSTUlTU0lPTic7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG5cbiAgICBjb25zdCB1bmRvID0gbnVtYmVyT2ZDb3BpZWRJdGVtcyA+IDAgPyB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoJ0FQUC5BQ1RJT05TLlVORE8nKSA6ICcnO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudChpMThuTWVzc2FnZVN0cmluZywge1xuICAgICAgc3VjY2VzczogbnVtYmVyT2ZDb3BpZWRJdGVtcyxcbiAgICAgIGZhaWxlZDogZmFpbGVkSXRlbXNcbiAgICB9KTtcblxuICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZVxuICAgICAgLm9wZW5TbmFja01lc3NhZ2VBY3Rpb24obWVzc2FnZSwgdW5kbywge1xuICAgICAgICBwYW5lbENsYXNzOiAnaW5mby1zbmFja2JhcidcbiAgICAgIH0pXG4gICAgICAub25BY3Rpb24oKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVuZG9Db3B5Tm9kZXMobmV3SXRlbXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5kb0NvcHlOb2Rlcyhub2RlczogTm9kZUVudHJ5W10pIHtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlXG4gICAgICAuZmxhdHRlbihub2RlcylcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZW50cnkpXG4gICAgICAubWFwKChpdGVtKSA9PiB0aGlzLmNvbnRlbnRBcGkuZGVsZXRlTm9kZShpdGVtLmVudHJ5LmlkLCB7IHBlcm1hbmVudDogdHJ1ZSB9KSk7XG5cbiAgICBmb3JrSm9pbiguLi5iYXRjaCkuc3Vic2NyaWJlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcEhvb2tTZXJ2aWNlLm5vZGVzRGVsZXRlZC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UucmVsb2FkKCk7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGxldCBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLkdFTkVSSUMnO1xuXG4gICAgICAgIGxldCBlcnJvckpzb24gPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGVycm9ySnNvbiA9IEpTT04ucGFyc2UoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICBpZiAoZXJyb3JKc29uPy5lcnJvcj8uc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgICAgICAgaTE4bk1lc3NhZ2VTdHJpbmcgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5QRVJNSVNTSU9OJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoaTE4bk1lc3NhZ2VTdHJpbmcpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5WZXJzaW9uTWFuYWdlckRpYWxvZyhub2RlOiBhbnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgLy8gd29ya2Fyb3VuZCBTaGFyZWRcbiAgICBpZiAobm9kZS5pc0ZpbGUgfHwgbm9kZS5ub2RlSWQpIHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb25VcGxvYWRlckRpYWxvZ0RhdGE6IE5ld1ZlcnNpb25VcGxvYWRlckRpYWxvZ0RhdGEgPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIHNob3dWZXJzaW9uc09ubHk6IHRydWUsXG4gICAgICAgIHRpdGxlOiAnVkVSU0lPTi5ESUFMT0cuVElUTEUnXG4gICAgICB9O1xuICAgICAgdGhpcy5uZXdWZXJzaW9uVXBsb2FkZXJTZXJ2aWNlXG4gICAgICAgIC5vcGVuVXBsb2FkTmV3VmVyc2lvbkRpYWxvZyhuZXdWZXJzaW9uVXBsb2FkZXJEaWFsb2dEYXRhLCB7IHdpZHRoOiAnNjMwcHgnLCByb2xlOiAnZGlhbG9nJyB9LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3RvcilcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKG5ld1ZlcnNpb25VcGxvYWRlckRhdGEpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAobmV3VmVyc2lvblVwbG9hZGVyRGF0YS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgY2FzZSBOZXdWZXJzaW9uVXBsb2FkZXJEYXRhQWN0aW9uLnJlZnJlc2g6XG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJlZnJlc2hQcmV2aWV3QWN0aW9uKG5ld1ZlcnNpb25VcGxvYWRlckRhdGEubm9kZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIE5ld1ZlcnNpb25VcGxvYWRlckRhdGFBY3Rpb24udmlldzpcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgICAgICAgICAgbmV3IFZpZXdOb2RlVmVyc2lvbkFjdGlvbihub2RlLmlkLCBuZXdWZXJzaW9uVXBsb2FkZXJEYXRhLnZlcnNpb25JZCwge1xuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogdGhpcy5yb3V0ZXIudXJsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcignQVBQLk1FU1NBR0VTLkVSUk9SUy5QRVJNSVNTSU9OJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQXNwZWN0TGlzdERpYWxvZyhub2RlOiBhbnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgLy8gd29ya2Fyb3VuZCBTaGFyZWRcbiAgICBpZiAobm9kZS5pc0ZpbGUgfHwgbm9kZS5pZCkge1xuICAgICAgdGhpcy5ub2RlQXNwZWN0U2VydmljZS51cGRhdGVOb2RlQXNwZWN0cyhub2RlLmlkLCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ0FQUC5NRVNTQUdFUy5FUlJPUlMuUEVSTUlTU0lPTicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5kb01vdmVOb2Rlcyhtb3ZlUmVzcG9uc2UsIHNlbGVjdGlvblBhcmVudElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtb3ZlZE5vZGVzID0gbW92ZVJlc3BvbnNlPy5bJ3N1Y2NlZWRlZCddID8/IFtdO1xuICAgIGNvbnN0IHBhcnRpYWxseU1vdmVkTm9kZXMgPSBtb3ZlUmVzcG9uc2U/LlsncGFydGlhbGx5U3VjY2VlZGVkJ10gPz8gW107XG5cbiAgICBjb25zdCByZXN0b3JlRGVsZXRlZE5vZGVzQmF0Y2ggPSB0aGlzLm5vZGVBY3Rpb25zU2VydmljZS5tb3ZlRGVsZXRlZEVudHJpZXMubWFwKChmb2xkZXJFbnRyeSkgPT5cbiAgICAgIHRoaXMuY29udGVudEFwaS5yZXN0b3JlTm9kZShmb2xkZXJFbnRyeS5ub2RlSWQgfHwgZm9sZGVyRW50cnkuaWQpLnBpcGUobWFwKChub2RlKSA9PiBub2RlLmVudHJ5KSlcbiAgICApO1xuXG4gICAgemlwKC4uLnJlc3RvcmVEZWxldGVkTm9kZXNCYXRjaCwgb2YobnVsbCkpXG4gICAgICAucGlwZShcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vZGVzVG9CZU1vdmVkQmFjayA9IFsuLi5wYXJ0aWFsbHlNb3ZlZE5vZGVzLCAuLi5tb3ZlZE5vZGVzXTtcblxuICAgICAgICAgIGNvbnN0IHJldmVydE1vdmVCYXRjaCA9IHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlXG4gICAgICAgICAgICAuZmxhdHRlbihub2Rlc1RvQmVNb3ZlZEJhY2spXG4gICAgICAgICAgICAuZmlsdGVyKChub2RlKSA9PiBub2RlLmVudHJ5IHx8IG5vZGUuaXRlbU1vdmVkPy5lbnRyeSlcbiAgICAgICAgICAgIC5tYXAoKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG5vZGUuaXRlbU1vdmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLm1vdmVOb2RlQWN0aW9uKG5vZGUuaXRlbU1vdmVkLmVudHJ5LCBub2RlLmluaXRpYWxQYXJlbnRJZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLm1vdmVOb2RlQWN0aW9uKG5vZGUuZW50cnksIHNlbGVjdGlvblBhcmVudElkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gemlwKC4uLnJldmVydE1vdmVCYXRjaCwgb2YobnVsbCkpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5yZWxvYWQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgbGV0IG1lc3NhZ2UgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5HRU5FUklDJztcblxuICAgICAgICAgIGxldCBlcnJvckpzb24gPSBudWxsO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlcnJvckpzb24gPSBKU09OLnBhcnNlKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgIGlmIChlcnJvckpzb24/LmVycm9yPy5zdGF0dXNDb2RlID09PSA0MDMpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5QRVJNSVNTSU9OJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0Vycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgZGVsZXRlTm9kZXMoaXRlbXM6IE5vZGVFbnRyeVtdKTogdm9pZCB7XG4gICAgY29uc3QgYmF0Y2g6IE9ic2VydmFibGU8RGVsZXRlZE5vZGVJbmZvPltdID0gW107XG5cbiAgICBpdGVtcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBiYXRjaC5wdXNoKHRoaXMuZGVsZXRlTm9kZShub2RlKSk7XG4gICAgfSk7XG5cbiAgICBmb3JrSm9pbiguLi5iYXRjaCkuc3Vic2NyaWJlKChkYXRhOiBEZWxldGVkTm9kZUluZm9bXSkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5wcm9jZXNzU3RhdHVzKGRhdGEpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuZ2V0RGVsZXRlTWVzc2FnZShzdGF0dXMpO1xuXG4gICAgICBpZiAobWVzc2FnZSAmJiBzdGF0dXMuc29tZVN1Y2NlZWRlZCkge1xuICAgICAgICBtZXNzYWdlLnVzZXJBY3Rpb24gPSBuZXcgU25hY2tiYXJVc2VyQWN0aW9uKCdBUFAuQUNUSU9OUy5VTkRPJywgbmV3IFVuZG9EZWxldGVOb2Rlc0FjdGlvbihbLi4uc3RhdHVzLnN1Y2Nlc3NdKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobWVzc2FnZSk7XG5cbiAgICAgIGlmIChzdGF0dXMuc29tZVN1Y2NlZWRlZCkge1xuICAgICAgICB0aGlzLmFwcEhvb2tTZXJ2aWNlLm5vZGVzRGVsZXRlZC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5yZWxvYWQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNob3dMb2FkZXJBY3Rpb24oZmFsc2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuZG9EZWxldGVOb2RlcyhpdGVtczogRGVsZXRlZE5vZGVJbmZvW10pOiB2b2lkIHtcbiAgICBjb25zdCBiYXRjaDogT2JzZXJ2YWJsZTxEZWxldGVkTm9kZUluZm8+W10gPSBbXTtcblxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGJhdGNoLnB1c2godGhpcy51bmRvRGVsZXRlTm9kZShpdGVtKSk7XG4gICAgfSk7XG5cbiAgICBmb3JrSm9pbiguLi5iYXRjaCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBwcm9jZXNzZWREYXRhID0gdGhpcy5wcm9jZXNzU3RhdHVzKGRhdGEpO1xuXG4gICAgICBpZiAocHJvY2Vzc2VkRGF0YS5mYWlsLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5nZXRVbmRvRGVsZXRlTWVzc2FnZShwcm9jZXNzZWREYXRhKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChtZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2Nlc3NlZERhdGEuc29tZVN1Y2NlZWRlZCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVuZG9EZWxldGVOb2RlKGl0ZW06IERlbGV0ZWROb2RlSW5mbyk6IE9ic2VydmFibGU8RGVsZXRlZE5vZGVJbmZvPiB7XG4gICAgY29uc3QgeyBpZCwgbmFtZSB9ID0gaXRlbTtcblxuICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkucmVzdG9yZU5vZGUoaWQpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4gKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHN0YXR1czogMVxuICAgICAgfSkpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PlxuICAgICAgICBvZih7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBzdGF0dXM6IDBcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVbmRvRGVsZXRlTWVzc2FnZShzdGF0dXM6IERlbGV0ZVN0YXR1cyk6IFNuYWNrYmFyQWN0aW9uIHtcbiAgICBpZiAoc3RhdHVzLnNvbWVGYWlsZWQgJiYgIXN0YXR1cy5vbmVGYWlsZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5OT0RFX1JFU1RPUkVfUExVUkFMJywgeyBudW1iZXI6IHN0YXR1cy5mYWlsLmxlbmd0aCB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLm9uZUZhaWxlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckVycm9yQWN0aW9uKCdBUFAuTUVTU0FHRVMuRVJST1JTLk5PREVfUkVTVE9SRScsIHtcbiAgICAgICAgbmFtZTogc3RhdHVzLmZhaWxbMF0ubmFtZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVOb2RlKG5vZGU6IE5vZGVFbnRyeSk6IE9ic2VydmFibGU8UmVzdG9yZWROb2RlPiB7XG4gICAgY29uc3QgeyBlbnRyeSB9ID0gbm9kZTtcblxuICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkucmVzdG9yZU5vZGUoZW50cnkuaWQpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4gKHtcbiAgICAgICAgc3RhdHVzOiAxLFxuICAgICAgICBlbnRyeVxuICAgICAgfSkpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXNDb2RlIH0gPSBKU09OLnBhcnNlKGVycm9yLm1lc3NhZ2UpLmVycm9yO1xuXG4gICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgc3RhdHVzOiAwLFxuICAgICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgICAgZW50cnlcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHB1cmdlTm9kZXMoc2VsZWN0aW9uOiBOb2RlSW5mb1tdID0gW10pIHtcbiAgICBpZiAoIXNlbGVjdGlvbi5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBiYXRjaCA9IHNlbGVjdGlvbi5tYXAoKG5vZGUpID0+IHRoaXMucHVyZ2VEZWxldGVkTm9kZShub2RlKSk7XG5cbiAgICBmb3JrSm9pbihiYXRjaCkuc3Vic2NyaWJlKChwdXJnZWROb2RlcykgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5wcm9jZXNzU3RhdHVzKHB1cmdlZE5vZGVzKTtcblxuICAgICAgaWYgKHN0YXR1cy5zdWNjZXNzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UucmVsb2FkKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VuZFB1cmdlTWVzc2FnZShzdGF0dXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwdXJnZURlbGV0ZWROb2RlKG5vZGU6IE5vZGVJbmZvKTogT2JzZXJ2YWJsZTxEZWxldGVkTm9kZUluZm8+IHtcbiAgICBjb25zdCB7IGlkLCBuYW1lIH0gPSBub2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuY29udGVudEFwaS5wdXJnZURlbGV0ZWROb2RlKGlkKS5waXBlKFxuICAgICAgbWFwKCgpID0+ICh7XG4gICAgICAgIHN0YXR1czogMSxcbiAgICAgICAgaWQsXG4gICAgICAgIG5hbWVcbiAgICAgIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT5cbiAgICAgICAgb2Yoe1xuICAgICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBuYW1lXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1N0YXR1cyhkYXRhOiBBcnJheTx7IHN0YXR1czogbnVtYmVyIH0+ID0gW10pOiBEZWxldGVTdGF0dXMge1xuICAgIGNvbnN0IHN0YXR1cyA9IHtcbiAgICAgIGZhaWw6IFtdLFxuICAgICAgc3VjY2VzczogW10sXG4gICAgICBnZXQgc29tZUZhaWxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5mYWlsLmxlbmd0aDtcbiAgICAgIH0sXG4gICAgICBnZXQgc29tZVN1Y2NlZWRlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zdWNjZXNzLmxlbmd0aDtcbiAgICAgIH0sXG4gICAgICBnZXQgb25lRmFpbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mYWlsLmxlbmd0aCA9PT0gMTtcbiAgICAgIH0sXG4gICAgICBnZXQgb25lU3VjY2VlZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWNjZXNzLmxlbmd0aCA9PT0gMTtcbiAgICAgIH0sXG4gICAgICBnZXQgYWxsU3VjY2VlZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb21lU3VjY2VlZGVkICYmICF0aGlzLnNvbWVGYWlsZWQ7XG4gICAgICB9LFxuICAgICAgZ2V0IGFsbEZhaWxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29tZUZhaWxlZCAmJiAhdGhpcy5zb21lU3VjY2VlZGVkO1xuICAgICAgfSxcbiAgICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmZhaWwgPSBbXTtcbiAgICAgICAgdGhpcy5zdWNjZXNzID0gW107XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBkYXRhLnJlZHVjZSgoYWNjLCBub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZS5zdGF0dXMpIHtcbiAgICAgICAgYWNjLnN1Y2Nlc3MucHVzaChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjYy5mYWlsLnB1c2gobm9kZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgc3RhdHVzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VuZFB1cmdlTWVzc2FnZShzdGF0dXM6IERlbGV0ZVN0YXR1cyk6IHZvaWQge1xuICAgIGlmIChzdGF0dXMub25lU3VjY2VlZGVkICYmIHN0YXR1cy5zb21lRmFpbGVkICYmICFzdGF0dXMub25lRmFpbGVkKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0FQUC5NRVNTQUdFUy5JTkZPLlRSQVNILk5PREVTX1BVUkdFLlBBUlRJQUxfU0lOR1VMQVInLCBudWxsLCB7XG4gICAgICAgIG5hbWU6IHN0YXR1cy5zdWNjZXNzWzBdLm5hbWUsXG4gICAgICAgIGZhaWxlZDogc3RhdHVzLmZhaWwubGVuZ3RoXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLnNvbWVTdWNjZWVkZWQgJiYgIXN0YXR1cy5vbmVTdWNjZWVkZWQgJiYgc3RhdHVzLnNvbWVGYWlsZWQpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93V2FybmluZygnQVBQLk1FU1NBR0VTLklORk8uVFJBU0guTk9ERVNfUFVSR0UuUEFSVElBTF9QTFVSQUwnLCBudWxsLCB7XG4gICAgICAgIG51bWJlcjogc3RhdHVzLnN1Y2Nlc3MubGVuZ3RoLFxuICAgICAgICBmYWlsZWQ6IHN0YXR1cy5mYWlsLmxlbmd0aFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVTdWNjZWVkZWQpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93SW5mbygnQVBQLk1FU1NBR0VTLklORk8uVFJBU0guTk9ERVNfUFVSR0UuU0lOR1VMQVInLCBudWxsLCB7IG5hbWU6IHN0YXR1cy5zdWNjZXNzWzBdLm5hbWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVGYWlsZWQpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ0FQUC5NRVNTQUdFUy5FUlJPUlMuVFJBU0guTk9ERVNfUFVSR0UuU0lOR1VMQVInLCBudWxsLCB7IG5hbWU6IHN0YXR1cy5mYWlsWzBdLm5hbWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5hbGxTdWNjZWVkZWQpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93SW5mbygnQVBQLk1FU1NBR0VTLklORk8uVFJBU0guTk9ERVNfUFVSR0UuUExVUkFMJywgbnVsbCwgeyBudW1iZXI6IHN0YXR1cy5zdWNjZXNzLmxlbmd0aCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLmFsbEZhaWxlZCkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcignQVBQLk1FU1NBR0VTLkVSUk9SUy5UUkFTSC5OT0RFU19QVVJHRS5QTFVSQUwnLCBudWxsLCB7IG51bWJlcjogc3RhdHVzLmZhaWwubGVuZ3RoIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvd1Jlc3RvcmVOb3RpZmljYXRpb24oc3RhdHVzOiBEZWxldGVTdGF0dXMpOiB2b2lkIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5nZXRSZXN0b3JlTWVzc2FnZShzdGF0dXMpO1xuXG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIGlmIChzdGF0dXMub25lU3VjY2VlZGVkICYmICFzdGF0dXMuc29tZUZhaWxlZCkge1xuICAgICAgICBjb25zdCBpc1NpdGUgPSB0aGlzLmlzU2l0ZShzdGF0dXMuc3VjY2Vzc1swXS5lbnRyeSk7XG4gICAgICAgIGNvbnN0IHBhdGg6IFBhdGhJbmZvID0gc3RhdHVzLnN1Y2Nlc3NbMF0uZW50cnkucGF0aDtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5lbGVtZW50c1twYXRoLmVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCByb3V0ZSA9IGlzU2l0ZSA/IFsnL2xpYnJhcmllcycsIHBhcmVudC5pZF0gOiBbJy9wZXJzb25hbC1maWxlcycsIHBhcmVudC5pZF07XG5cbiAgICAgICAgbGV0IG5hdmlnYXRlO1xuXG4gICAgICAgIGlmICh0aGlzLmlzTGlicmFyeUNvbnRlbnQocGF0aCkpIHtcbiAgICAgICAgICBuYXZpZ2F0ZSA9IG5ldyBOYXZpZ2F0ZVRvUGFyZW50Rm9sZGVyKHN0YXR1cy5zdWNjZXNzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuYXZpZ2F0ZSA9IG5ldyBOYXZpZ2F0ZVJvdXRlQWN0aW9uKHJvdXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2UudXNlckFjdGlvbiA9IG5ldyBTbmFja2JhclVzZXJBY3Rpb24oJ0FQUC5BQ1RJT05TLlZJRVcnLCBuYXZpZ2F0ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1NpdGUoZW50cnk6IE5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZW50cnkubm9kZVR5cGUgPT09ICdzdDpzaXRlJztcbiAgfVxuXG4gIHByaXZhdGUgaXNMaWJyYXJ5Q29udGVudChwYXRoOiBQYXRoSW5mbyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYXRoICYmIHBhdGguZWxlbWVudHMubGVuZ3RoID49IDIgJiYgcGF0aC5lbGVtZW50c1sxXS5uYW1lID09PSAnU2l0ZXMnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXN0b3JlTWVzc2FnZShzdGF0dXM6IERlbGV0ZVN0YXR1cyk6IFNuYWNrYmFyQWN0aW9uIHtcbiAgICBpZiAoc3RhdHVzLnNvbWVGYWlsZWQgJiYgIXN0YXR1cy5vbmVGYWlsZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5UUkFTSC5OT0RFU19SRVNUT1JFLlBBUlRJQUxfUExVUkFMJywge1xuICAgICAgICBudW1iZXI6IHN0YXR1cy5mYWlsLmxlbmd0aFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVGYWlsZWQgJiYgc3RhdHVzLmZhaWxbMF0uc3RhdHVzQ29kZSkge1xuICAgICAgaWYgKHN0YXR1cy5mYWlsWzBdLnN0YXR1c0NvZGUgPT09IDQwOSkge1xuICAgICAgICByZXR1cm4gbmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuVFJBU0guTk9ERVNfUkVTVE9SRS5OT0RFX0VYSVNUUycsIHtcbiAgICAgICAgICBuYW1lOiBzdGF0dXMuZmFpbFswXS5lbnRyeS5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckVycm9yQWN0aW9uKCdBUFAuTUVTU0FHRVMuRVJST1JTLlRSQVNILk5PREVTX1JFU1RPUkUuR0VORVJJQycsIHtcbiAgICAgICAgICBuYW1lOiBzdGF0dXMuZmFpbFswXS5lbnRyeS5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGF0dXMub25lRmFpbGVkICYmICFzdGF0dXMuZmFpbFswXS5zdGF0dXNDb2RlKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuVFJBU0guTk9ERVNfUkVTVE9SRS5MT0NBVElPTl9NSVNTSU5HJywge1xuICAgICAgICBuYW1lOiBzdGF0dXMuZmFpbFswXS5lbnRyeS5uYW1lXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLmFsbFN1Y2NlZWRlZCAmJiAhc3RhdHVzLm9uZVN1Y2NlZWRlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckluZm9BY3Rpb24oJ0FQUC5NRVNTQUdFUy5JTkZPLlRSQVNILk5PREVTX1JFU1RPUkUuUExVUkFMJyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5hbGxTdWNjZWVkZWQgJiYgc3RhdHVzLm9uZVN1Y2NlZWRlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckluZm9BY3Rpb24oJ0FQUC5NRVNTQUdFUy5JTkZPLlRSQVNILk5PREVTX1JFU1RPUkUuU0lOR1VMQVInLCB7XG4gICAgICAgIG5hbWU6IHN0YXR1cy5zdWNjZXNzWzBdLmVudHJ5Lm5hbWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBkaWZmKHNlbGVjdGlvbjogYW55W10sIGxpc3Q6IGFueVtdLCBmcm9tTGlzdCA9IHRydWUpOiBhbnkge1xuICAgIGNvbnN0IGlkcyA9IHNlbGVjdGlvbi5tYXAoKGl0ZW0pID0+IGl0ZW0uZW50cnkuaWQpO1xuXG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICBpZiAoZnJvbUxpc3QpIHtcbiAgICAgICAgcmV0dXJuIGlkcy5pbmNsdWRlcyhpdGVtLmVudHJ5LmlkKSA/IGl0ZW0gOiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICFpZHMuaW5jbHVkZXMoaXRlbS5lbnRyeS5pZCkgPyBpdGVtIDogbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlTm9kZShub2RlOiBhbnkpOiBPYnNlcnZhYmxlPERlbGV0ZWROb2RlSW5mbz4ge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gbm9kZS5lbnRyeTtcbiAgICBjb25zdCBpZCA9IG5vZGUuZW50cnkubm9kZUlkIHx8IG5vZGUuZW50cnkuaWQ7XG5cbiAgICByZXR1cm4gdGhpcy5jb250ZW50QXBpLmRlbGV0ZU5vZGUoaWQpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4gKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHN0YXR1czogMVxuICAgICAgfSkpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PlxuICAgICAgICBvZih7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBzdGF0dXM6IDBcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWxldGVNZXNzYWdlKHN0YXR1czogRGVsZXRlU3RhdHVzKTogU25hY2tiYXJBY3Rpb24ge1xuICAgIGlmIChzdGF0dXMuYWxsRmFpbGVkICYmICFzdGF0dXMub25lRmFpbGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuTk9ERV9ERUxFVElPTl9QTFVSQUwnLCB7IG51bWJlcjogc3RhdHVzLmZhaWwubGVuZ3RoIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMuYWxsU3VjY2VlZGVkICYmICFzdGF0dXMub25lU3VjY2VlZGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFySW5mb0FjdGlvbignQVBQLk1FU1NBR0VTLklORk8uTk9ERV9ERUxFVElPTi5QTFVSQUwnLCB7XG4gICAgICAgIG51bWJlcjogc3RhdHVzLnN1Y2Nlc3MubGVuZ3RoXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLnNvbWVGYWlsZWQgJiYgc3RhdHVzLnNvbWVTdWNjZWVkZWQgJiYgIXN0YXR1cy5vbmVTdWNjZWVkZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJXYXJuaW5nQWN0aW9uKCdBUFAuTUVTU0FHRVMuSU5GTy5OT0RFX0RFTEVUSU9OLlBBUlRJQUxfUExVUkFMJywge1xuICAgICAgICBzdWNjZXNzOiBzdGF0dXMuc3VjY2Vzcy5sZW5ndGgsXG4gICAgICAgIGZhaWxlZDogc3RhdHVzLmZhaWwubGVuZ3RoXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLnNvbWVGYWlsZWQgJiYgc3RhdHVzLm9uZVN1Y2NlZWRlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2Jhcldhcm5pbmdBY3Rpb24oJ0FQUC5NRVNTQUdFUy5JTkZPLk5PREVfREVMRVRJT04uUEFSVElBTF9TSU5HVUxBUicsIHtcbiAgICAgICAgc3VjY2Vzczogc3RhdHVzLnN1Y2Nlc3MubGVuZ3RoLFxuICAgICAgICBmYWlsZWQ6IHN0YXR1cy5mYWlsLmxlbmd0aFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVGYWlsZWQgJiYgIXN0YXR1cy5zb21lU3VjY2VlZGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuTk9ERV9ERUxFVElPTicsIHtcbiAgICAgICAgbmFtZTogc3RhdHVzLmZhaWxbMF0ubmFtZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVTdWNjZWVkZWQgJiYgIXN0YXR1cy5zb21lRmFpbGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFySW5mb0FjdGlvbignQVBQLk1FU1NBR0VTLklORk8uTk9ERV9ERUxFVElPTi5TSU5HVUxBUicsIHsgbmFtZTogc3RhdHVzLnN1Y2Nlc3NbMF0ubmFtZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd01vdmVNZXNzYWdlKG5vZGVzOiBBcnJheTxOb2RlRW50cnk+LCBpbmZvOiBhbnksIG1vdmVSZXNwb25zZT86IGFueSkge1xuICAgIGNvbnN0IHN1Y2NlZWRlZCA9IG1vdmVSZXNwb25zZT8uWydzdWNjZWVkZWQnXS5sZW5ndGggPz8gMDtcbiAgICBjb25zdCBwYXJ0aWFsbHlTdWNjZWVkZWQgPSBtb3ZlUmVzcG9uc2U/LlsncGFydGlhbGx5U3VjY2VlZGVkJ10ubGVuZ3RoID8/IDA7XG4gICAgY29uc3QgZmFpbHVyZXMgPSBtb3ZlUmVzcG9uc2U/LlsnZmFpbGVkJ10ubGVuZ3RoID8/IDA7XG5cbiAgICBsZXQgc3VjY2Vzc01lc3NhZ2UgPSAnJztcbiAgICBsZXQgcGFydGlhbFN1Y2Nlc3NNZXNzYWdlID0gJyc7XG4gICAgbGV0IGZhaWxlZE1lc3NhZ2UgPSAnJztcbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gJyc7XG5cbiAgICBpZiAodHlwZW9mIGluZm8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBpbiBjYXNlIG9mIHN1Y2Nlc3NcbiAgICAgIGlmIChpbmZvLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignc3VjY2VzJykgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGkxOG5NZXNzYWdlU3RyaW5nID0gJ0FQUC5NRVNTQUdFUy5JTkZPLk5PREVfTU9WRS4nO1xuICAgICAgICBsZXQgaTE4TWVzc2FnZVN1ZmZpeCA9ICcnO1xuXG4gICAgICAgIGlmIChzdWNjZWVkZWQpIHtcbiAgICAgICAgICBpMThNZXNzYWdlU3VmZml4ID0gc3VjY2VlZGVkID09PSAxID8gJ1NJTkdVTEFSJyA6ICdQTFVSQUwnO1xuICAgICAgICAgIHN1Y2Nlc3NNZXNzYWdlID0gYCR7aTE4bk1lc3NhZ2VTdHJpbmd9JHtpMThNZXNzYWdlU3VmZml4fWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydGlhbGx5U3VjY2VlZGVkKSB7XG4gICAgICAgICAgaTE4TWVzc2FnZVN1ZmZpeCA9IHBhcnRpYWxseVN1Y2NlZWRlZCA9PT0gMSA/ICdQQVJUSUFMLlNJTkdVTEFSJyA6ICdQQVJUSUFMLlBMVVJBTCc7XG4gICAgICAgICAgcGFydGlhbFN1Y2Nlc3NNZXNzYWdlID0gYCR7aTE4bk1lc3NhZ2VTdHJpbmd9JHtpMThNZXNzYWdlU3VmZml4fWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmFpbHVyZXMpIHtcbiAgICAgICAgICAvLyBpZiBtb3ZpbmcgZmFpbGVkIGZvciBBTEwgbm9kZXMsIGVtaXQgZXJyb3JcbiAgICAgICAgICBpZiAoZmFpbHVyZXMgPT09IG5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuZmxhdHRlbihtb3ZlUmVzcG9uc2VbJ2ZhaWxlZCddKTtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yc1swXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkxOE1lc3NhZ2VTdWZmaXggPSAnUEFSVElBTC5GQUlMJztcbiAgICAgICAgICAgIGZhaWxlZE1lc3NhZ2UgPSBgJHtpMThuTWVzc2FnZVN0cmluZ30ke2kxOE1lc3NhZ2VTdWZmaXh9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yTWVzc2FnZSA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLkdFTkVSSUMnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSB0aGlzLmdldEVycm9yTWVzc2FnZShpbmZvKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bmRvID0gc3VjY2VlZGVkICsgcGFydGlhbGx5U3VjY2VlZGVkID4gMCA/IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQVBQLkFDVElPTlMuVU5ETycpIDogJyc7XG4gICAgZmFpbGVkTWVzc2FnZSA9IGVycm9yTWVzc2FnZSA/IGVycm9yTWVzc2FnZSA6IGZhaWxlZE1lc3NhZ2U7XG5cbiAgICBjb25zdCBiZWZvcmVQYXJ0aWFsU3VjY2Vzc01lc3NhZ2UgPSBzdWNjZXNzTWVzc2FnZSAmJiBwYXJ0aWFsU3VjY2Vzc01lc3NhZ2UgPyAnICcgOiAnJztcbiAgICBjb25zdCBiZWZvcmVGYWlsZWRNZXNzYWdlID0gKHN1Y2Nlc3NNZXNzYWdlIHx8IHBhcnRpYWxTdWNjZXNzTWVzc2FnZSkgJiYgZmFpbGVkTWVzc2FnZSA/ICcgJyA6ICcnO1xuXG4gICAgY29uc3QgaW5pdGlhbFBhcmVudElkID0gdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuZ2V0RW50cnlQYXJlbnRJZChub2Rlc1swXS5lbnRyeSk7XG5cbiAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudChbc3VjY2Vzc01lc3NhZ2UsIHBhcnRpYWxTdWNjZXNzTWVzc2FnZSwgZmFpbGVkTWVzc2FnZV0sIHtcbiAgICAgIHN1Y2Nlc3M6IHN1Y2NlZWRlZCxcbiAgICAgIGZhaWxlZDogZmFpbHVyZXMsXG4gICAgICBwYXJ0aWFsbHk6IHBhcnRpYWxseVN1Y2NlZWRlZFxuICAgIH0pO1xuXG4gICAgLy8gVE9ETzogcmV2aWV3IGluIHRlcm1zIG9mIGkxOG5cbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2VcbiAgICAgIC5vcGVuU25hY2tNZXNzYWdlQWN0aW9uKFxuICAgICAgICBtZXNzYWdlc1tzdWNjZXNzTWVzc2FnZV0gKyBiZWZvcmVQYXJ0aWFsU3VjY2Vzc01lc3NhZ2UgKyBtZXNzYWdlc1twYXJ0aWFsU3VjY2Vzc01lc3NhZ2VdICsgYmVmb3JlRmFpbGVkTWVzc2FnZSArIG1lc3NhZ2VzW2ZhaWxlZE1lc3NhZ2VdLFxuICAgICAgICB1bmRvLFxuICAgICAgICB7XG4gICAgICAgICAgcGFuZWxDbGFzczogJ2luZm8tc25hY2tiYXInXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIC5vbkFjdGlvbigpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMudW5kb01vdmVOb2Rlcyhtb3ZlUmVzcG9uc2UsIGluaXRpYWxQYXJlbnRJZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRTZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGZvY3VzZWRFbGVtZW50U2VsZWN0b3IpIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGZvY3VzZWRFbGVtZW50U2VsZWN0b3IpPy5mb2N1cygpO1xuICAgIH1cbiAgfVxufVxuIl19