@sumaris-net/ngx-components 2.6.26 → 2.7.0-rc10

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 (738) hide show
  1. package/esm2022/public_api.mjs +339 -0
  2. package/{esm2020 → esm2022}/src/app/admin/admin-routing.module.mjs +8 -8
  3. package/{esm2020 → esm2022}/src/app/admin/admin.module.mjs +12 -12
  4. package/esm2022/src/app/admin/services/filter/person.filter.mjs +69 -0
  5. package/esm2022/src/app/admin/services/person.service.mjs +174 -0
  6. package/esm2022/src/app/admin/services/validator/person.validator.mjs +72 -0
  7. package/esm2022/src/app/admin/users/users.mjs +264 -0
  8. package/esm2022/src/app/admin/users/users.module.mjs +58 -0
  9. package/{esm2020 → esm2022}/src/app/core/about/about.modal.mjs +20 -7
  10. package/{esm2020 → esm2022}/src/app/core/about/about.module.mjs +9 -9
  11. package/{esm2020 → esm2022}/src/app/core/account/account.module.mjs +22 -22
  12. package/esm2022/src/app/core/account/account.page.mjs +337 -0
  13. package/esm2022/src/app/core/account/new-token.modal.mjs +130 -0
  14. package/esm2022/src/app/core/account/token.table.mjs +146 -0
  15. package/esm2022/src/app/core/auth/auth.form.mjs +140 -0
  16. package/esm2022/src/app/core/auth/auth.modal.mjs +76 -0
  17. package/{esm2020 → esm2022}/src/app/core/auth/auth.module.mjs +16 -16
  18. package/{esm2020 → esm2022}/src/app/core/core.module.mjs +87 -87
  19. package/esm2022/src/app/core/core.testing.module.mjs +93 -0
  20. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +109 -0
  21. package/{esm2020 → esm2022}/src/app/core/form/buttons/form-buttons-bar.module.mjs +10 -10
  22. package/esm2022/src/app/core/form/entity/editor.class.mjs +718 -0
  23. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +436 -0
  24. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +730 -0
  25. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +24 -0
  26. package/{esm2020 → esm2022}/src/app/core/form/entity/entity.module.mjs +11 -11
  27. package/esm2022/src/app/core/form/form.class.mjs +353 -0
  28. package/{esm2020 → esm2022}/src/app/core/form/form.module.mjs +30 -30
  29. package/esm2022/src/app/core/form/form.utils.mjs +485 -0
  30. package/esm2022/src/app/core/form/list/list.form.mjs +233 -0
  31. package/{esm2020 → esm2022}/src/app/core/form/list/list.module.mjs +10 -10
  32. package/esm2022/src/app/core/form/properties/properties.form.mjs +143 -0
  33. package/{esm2020 → esm2022}/src/app/core/form/properties/properties.module.mjs +13 -13
  34. package/esm2022/src/app/core/form/properties/properties.table.mjs +269 -0
  35. package/esm2022/src/app/core/form/properties/property.validator.mjs +24 -0
  36. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +95 -0
  37. package/{esm2020 → esm2022}/src/app/core/form/properties/testing/properties-form.testing.module.mjs +11 -11
  38. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +73 -0
  39. package/{esm2020 → esm2022}/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +10 -10
  40. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +152 -0
  41. package/{esm2020 → esm2022}/src/app/core/form/text-popover/text-popover.module.mjs +10 -10
  42. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.module.mjs +6 -6
  43. package/esm2022/src/app/core/graphql/graphql.service.mjs +788 -0
  44. package/esm2022/src/app/core/graphql/graphql.utils.mjs +118 -0
  45. package/esm2022/src/app/core/home/home.mjs +282 -0
  46. package/esm2022/src/app/core/home/home.module.mjs +51 -0
  47. package/esm2022/src/app/core/icon/icon.component.mjs +40 -0
  48. package/{esm2020 → esm2022}/src/app/core/icon/icon.module.mjs +7 -7
  49. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +358 -0
  50. package/{esm2020 → esm2022}/src/app/core/install/install-upgrade-card.module.mjs +10 -10
  51. package/esm2022/src/app/core/menu/menu.component.mjs +264 -0
  52. package/esm2022/src/app/core/menu/menu.model.mjs +269 -0
  53. package/esm2022/src/app/core/menu/menu.module.mjs +52 -0
  54. package/esm2022/src/app/core/menu/menu.service.mjs +671 -0
  55. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +109 -0
  56. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu-other.testing.mjs +5 -5
  57. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +122 -0
  58. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu.testing.module.mjs +12 -12
  59. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +29 -0
  60. package/{esm2020 → esm2022}/src/app/core/offline/update-offline-mode-card.module.mjs +10 -10
  61. package/esm2022/src/app/core/peer/select-peer.modal.mjs +193 -0
  62. package/{esm2020 → esm2022}/src/app/core/peer/select-peer.module.mjs +13 -13
  63. package/{esm2020 → esm2022}/src/app/core/register/register-confirm.page.mjs +16 -9
  64. package/esm2022/src/app/core/register/register.form.mjs +194 -0
  65. package/esm2022/src/app/core/register/register.modal.mjs +55 -0
  66. package/{esm2020 → esm2022}/src/app/core/register/register.module.mjs +13 -13
  67. package/esm2022/src/app/core/services/account.service.mjs +1243 -0
  68. package/esm2022/src/app/core/services/auth-guard.service.mjs +76 -0
  69. package/esm2022/src/app/core/services/base-entity-service.class.mjs +482 -0
  70. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +224 -0
  71. package/esm2022/src/app/core/services/base58.mjs +79 -0
  72. package/esm2022/src/app/core/services/config.service.mjs +367 -0
  73. package/esm2022/src/app/core/services/crypto.service.mjs +107 -0
  74. package/{esm2020 → esm2022}/src/app/core/services/errors.mjs +3 -3
  75. package/esm2022/src/app/core/services/local-settings.service.mjs +468 -0
  76. package/esm2022/src/app/core/services/model/account.model.mjs +155 -0
  77. package/esm2022/src/app/core/services/model/config.model.mjs +107 -0
  78. package/esm2022/src/app/core/services/model/department.model.mjs +34 -0
  79. package/esm2022/src/app/core/services/model/entity.decorators.mjs +97 -0
  80. package/esm2022/src/app/core/services/model/entity.model.mjs +228 -0
  81. package/{esm2020 → esm2022}/src/app/core/services/model/filter.model.mjs +1 -1
  82. package/esm2022/src/app/core/services/model/peer.model.mjs +83 -0
  83. package/esm2022/src/app/core/services/model/person.model.mjs +110 -0
  84. package/esm2022/src/app/core/services/model/referential.model.mjs +189 -0
  85. package/esm2022/src/app/core/services/model/token.model.mjs +57 -0
  86. package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +199 -0
  87. package/esm2022/src/app/core/services/network.service.mjs +626 -0
  88. package/esm2022/src/app/core/services/network.types.mjs +20 -0
  89. package/esm2022/src/app/core/services/network.utils.mjs +15 -0
  90. package/{esm2020 → esm2022}/src/app/core/services/pipes/account.pipes.mjs +9 -9
  91. package/{esm2020 → esm2022}/src/app/core/services/pipes/department-to-string.pipe.mjs +5 -5
  92. package/{esm2020 → esm2022}/src/app/core/services/pipes/person-to-string.pipe.mjs +5 -5
  93. package/{esm2020 → esm2022}/src/app/core/services/pipes/usage-mode.pipes.mjs +9 -9
  94. package/esm2022/src/app/core/services/platform.service.mjs +557 -0
  95. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +434 -0
  96. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +458 -0
  97. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +25 -0
  98. package/esm2022/src/app/core/services/testing/referential.validator.mjs +46 -0
  99. package/esm2022/src/app/core/services/validator/account.validator.mjs +45 -0
  100. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +49 -0
  101. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +67 -0
  102. package/{esm2020 → esm2022}/src/app/core/services/validator/user-settings.validator.mjs +5 -5
  103. package/{esm2020 → esm2022}/src/app/core/services/validator/user-token.validator.mjs +5 -5
  104. package/{esm2020 → esm2022}/src/app/core/settings/settings.module.mjs +9 -9
  105. package/esm2022/src/app/core/settings/settings.page.mjs +328 -0
  106. package/esm2022/src/app/core/table/actions-column.component.mjs +115 -0
  107. package/esm2022/src/app/core/table/async-table.class.mjs +1740 -0
  108. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +386 -0
  109. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +401 -0
  110. package/esm2022/src/app/core/table/memory-table.class.mjs +57 -0
  111. package/esm2022/src/app/core/table/table-select-columns.component.mjs +46 -0
  112. package/esm2022/src/app/core/table/table.class.mjs +1781 -0
  113. package/esm2022/src/app/core/table/table.model.mjs +16 -0
  114. package/{esm2020 → esm2022}/src/app/core/table/table.module.mjs +12 -12
  115. package/esm2022/src/app/core/table/table.utils.mjs +33 -0
  116. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +28 -0
  117. package/esm2022/src/app/core/table/testing/table.testing.mjs +291 -0
  118. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +50 -0
  119. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +25 -0
  120. package/esm2022/src/app/core/table/testing/table2.testing.mjs +250 -0
  121. package/esm2022/src/app/shared/alerts.mjs +239 -0
  122. package/esm2022/src/app/shared/audio/audio.mjs +251 -0
  123. package/esm2022/src/app/shared/audio/audio.testing.mjs +32 -0
  124. package/{esm2020 → esm2022}/src/app/shared/audio/audio.testing.module.mjs +10 -10
  125. package/esm2022/src/app/shared/capacitor/keyboard.mjs +42 -0
  126. package/esm2022/src/app/shared/capacitor/plugins.mjs +9 -0
  127. package/esm2022/src/app/shared/dates.mjs +149 -0
  128. package/esm2022/src/app/shared/debug/debug.component.mjs +40 -0
  129. package/{esm2020 → esm2022}/src/app/shared/debug/debug.module.mjs +14 -14
  130. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +98 -0
  131. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +32 -0
  132. package/{esm2020 → esm2022}/src/app/shared/directives/directives.module.mjs +13 -13
  133. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +52 -0
  134. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +33 -0
  135. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +62 -0
  136. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +45 -0
  137. package/{esm2020 → esm2022}/src/app/shared/directives/resizable/resizable.module.mjs +5 -5
  138. package/esm2022/src/app/shared/events.mjs +65 -0
  139. package/esm2022/src/app/shared/file/csv.utils.mjs +72 -0
  140. package/esm2022/src/app/shared/file/file.service.mjs +122 -0
  141. package/esm2022/src/app/shared/file/file.utils.mjs +113 -0
  142. package/esm2022/src/app/shared/file/images.utils.mjs +161 -0
  143. package/{esm2020 → esm2022}/src/app/shared/file/json.utils.mjs +1 -1
  144. package/esm2022/src/app/shared/file/uri.utils.mjs +24 -0
  145. package/esm2022/src/app/shared/form/field.component.mjs +353 -0
  146. package/{esm2020 → esm2022}/src/app/shared/form/field.model.mjs +1 -1
  147. package/esm2022/src/app/shared/form/loading-spinner.mjs +35 -0
  148. package/esm2022/src/app/shared/forms.mjs +414 -0
  149. package/esm2022/src/app/shared/functions.mjs +483 -0
  150. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +82 -0
  151. package/esm2022/src/app/shared/gesture/gesture-config.mjs +46 -0
  152. package/{esm2020 → esm2022}/src/app/shared/graph/colors.utils.mjs +1 -1
  153. package/esm2022/src/app/shared/graph/graph-colors.mjs +219 -0
  154. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +59 -0
  155. package/esm2022/src/app/shared/help/help.modal.mjs +63 -0
  156. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
  157. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +85 -0
  158. package/{esm2020 → esm2022}/src/app/shared/hotkeys/shared-hotkeys.module.mjs +13 -13
  159. package/esm2022/src/app/shared/http/http.utils.mjs +56 -0
  160. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +388 -0
  161. package/{esm2020 → esm2022}/src/app/shared/image/gallery/image-gallery.module.mjs +22 -22
  162. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +26 -0
  163. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +90 -0
  164. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +41 -0
  165. package/{esm2020 → esm2022}/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +16 -16
  166. package/{esm2020 → esm2022}/src/app/shared/image/image.module.mjs +11 -11
  167. package/esm2022/src/app/shared/image/image.service.mjs +104 -0
  168. package/esm2022/src/app/shared/inputs.mjs +231 -0
  169. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +28 -0
  170. package/esm2022/src/app/shared/logging/logger.model.mjs +47 -0
  171. package/esm2022/src/app/shared/logging/logging-service.class.mjs +128 -0
  172. package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.module.mjs +8 -8
  173. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +49 -0
  174. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +967 -0
  175. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +82 -0
  176. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +17 -0
  177. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +217 -0
  178. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +209 -0
  179. package/{esm2020 → esm2022}/src/app/shared/material/badge/badge.module.mjs +9 -9
  180. package/esm2022/src/app/shared/material/badge/badge.test.mjs +42 -0
  181. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +67 -0
  182. package/esm2022/src/app/shared/material/boolean/material-boolean.mjs +262 -0
  183. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +53 -0
  184. package/esm2022/src/app/shared/material/chips/chips.module.mjs +76 -0
  185. package/esm2022/src/app/shared/material/chips/material.chips.mjs +719 -0
  186. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +148 -0
  187. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +90 -0
  188. package/esm2022/src/app/shared/material/datetime/material.date.mjs +424 -0
  189. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +432 -0
  190. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +612 -0
  191. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +132 -0
  192. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +123 -0
  193. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +115 -0
  194. package/esm2022/src/app/shared/material/duration/duration.module.mjs +70 -0
  195. package/esm2022/src/app/shared/material/duration/duration.utils.mjs +36 -0
  196. package/esm2022/src/app/shared/material/duration/material.duration.mjs +273 -0
  197. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +79 -0
  198. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +266 -0
  199. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +440 -0
  200. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +72 -0
  201. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +113 -0
  202. package/esm2022/src/app/shared/material/material.module.mjs +229 -0
  203. package/esm2022/src/app/shared/material/material.testing.module.mjs +221 -0
  204. package/esm2022/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +104 -0
  205. package/{esm2020 → esm2022}/src/app/shared/material/numpad/numpad.component.mjs +19 -16
  206. package/esm2022/src/app/shared/material/numpad/numpad.container.mjs +203 -0
  207. package/esm2022/src/app/shared/material/numpad/numpad.content.mjs +19 -0
  208. package/esm2022/src/app/shared/material/numpad/numpad.directive.mjs +168 -0
  209. package/esm2022/src/app/shared/material/numpad/numpad.dom-service.mjs +36 -0
  210. package/esm2022/src/app/shared/material/numpad/numpad.model.mjs +16 -0
  211. package/{esm2020 → esm2022}/src/app/shared/material/numpad/numpad.module.mjs +21 -21
  212. package/esm2022/src/app/shared/material/numpad/testing/numpad.test.mjs +48 -0
  213. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +48 -0
  214. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +23 -0
  215. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +368 -0
  216. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +56 -0
  217. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +67 -0
  218. package/esm2022/src/app/shared/material/testing/common.test.mjs +105 -0
  219. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +31 -0
  220. package/esm2022/src/app/shared/material/text/text-form.component.mjs +97 -0
  221. package/{esm2020 → esm2022}/src/app/shared/material/text/text-form.module.mjs +24 -24
  222. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +246 -0
  223. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +49 -0
  224. package/{esm2020 → esm2022}/src/app/shared/named-filter/named-filter.module.mjs +5 -5
  225. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +69 -0
  226. package/esm2022/src/app/shared/observables.mjs +104 -0
  227. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +141 -0
  228. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +27 -0
  229. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +51 -0
  230. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +72 -0
  231. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +28 -0
  232. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +36 -0
  233. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +60 -0
  234. package/esm2022/src/app/shared/pipes/form.pipes.mjs +194 -0
  235. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +48 -0
  236. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +42 -0
  237. package/{esm2020 → esm2022}/src/app/shared/pipes/maps.pipe.mjs +13 -13
  238. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +69 -0
  239. package/esm2022/src/app/shared/pipes/math.pipes.mjs +59 -0
  240. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +19 -0
  241. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +30 -0
  242. package/esm2022/src/app/shared/pipes/pipes.module.mjs +252 -0
  243. package/esm2022/src/app/shared/pipes/property.pipes.mjs +97 -0
  244. package/esm2022/src/app/shared/pipes/string.pipes.mjs +135 -0
  245. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +44 -0
  246. package/esm2022/src/app/shared/pipes/types.pipes.mjs +58 -0
  247. package/esm2022/src/app/shared/platforms.mjs +43 -0
  248. package/esm2022/src/app/shared/rx-state.module.mjs +23 -0
  249. package/esm2022/src/app/shared/services/job.utils.mjs +92 -0
  250. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +347 -0
  251. package/esm2022/src/app/shared/services/progress-bar.service.mjs +31 -0
  252. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +121 -0
  253. package/esm2022/src/app/shared/services/startable-service.class.mjs +113 -0
  254. package/esm2022/src/app/shared/services/translate-context.service.mjs +104 -0
  255. package/esm2022/src/app/shared/services.mjs +62 -0
  256. package/esm2022/src/app/shared/shared-routing.module.mjs +71 -0
  257. package/esm2022/src/app/shared/shared.module.mjs +231 -0
  258. package/{esm2020 → esm2022}/src/app/shared/shared.testing.module.mjs +40 -40
  259. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +286 -0
  260. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +46 -0
  261. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +7 -7
  262. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing.module.mjs +6 -6
  263. package/esm2022/src/app/shared/storage/storage.service.mjs +134 -0
  264. package/{esm2020 → esm2022}/src/app/shared/storage/storage.utils.mjs +1 -1
  265. package/esm2022/src/app/shared/testing/observable.test.mjs +96 -0
  266. package/esm2022/src/app/shared/testing/tests.page.mjs +37 -0
  267. package/esm2022/src/app/shared/toast/toast.testing.mjs +52 -0
  268. package/{esm2020 → esm2022}/src/app/shared/toast/toast.testing.module.mjs +10 -10
  269. package/esm2022/src/app/shared/toast/toasts.mjs +144 -0
  270. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +60 -0
  271. package/esm2022/src/app/shared/toolbar/toolbar.mjs +263 -0
  272. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +57 -0
  273. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +59 -0
  274. package/{esm2020 → esm2022}/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +10 -10
  275. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +107 -0
  276. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +211 -0
  277. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +27 -0
  278. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +106 -0
  279. package/esm2022/src/app/shared/validator/validators.mjs +580 -0
  280. package/esm2022/src/app/shared/version/versions.mjs +81 -0
  281. package/esm2022/src/app/social/job/job.module.mjs +42 -0
  282. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +35 -0
  283. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +232 -0
  284. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +50 -0
  285. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +29 -0
  286. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +73 -0
  287. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +43 -0
  288. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +53 -0
  289. package/{esm2020 → esm2022}/src/app/social/job/testing/job.testing.module.mjs +9 -9
  290. package/esm2022/src/app/social/message/message.form.mjs +140 -0
  291. package/esm2022/src/app/social/message/message.modal.mjs +110 -0
  292. package/esm2022/src/app/social/message/message.model.mjs +75 -0
  293. package/{esm2020 → esm2022}/src/app/social/message/message.module.mjs +5 -5
  294. package/esm2022/src/app/social/message/message.service.mjs +110 -0
  295. package/{esm2020 → esm2022}/src/app/social/social.module.mjs +19 -19
  296. package/{esm2020 → esm2022}/src/app/social/social.testing.module.mjs +10 -10
  297. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +123 -0
  298. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +263 -0
  299. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +233 -0
  300. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +129 -0
  301. package/{esm2020 → esm2022}/src/app/social/user-event/testing/user-event.testing.module.mjs +9 -9
  302. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +116 -0
  303. package/esm2022/src/app/social/user-event/user-event.module.mjs +43 -0
  304. package/esm2022/src/app/social/user-event/user-event.service.mjs +512 -0
  305. package/esm2022/src/environments/environment.class.mjs +50 -0
  306. package/esm2022/src/environments/environment.loader.mjs +83 -0
  307. package/esm2022/src/environments/environment.mjs +97 -0
  308. package/{fesm2020 → fesm2022}/sumaris-net.ngx-components.mjs +13100 -10864
  309. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -0
  310. package/package.json +37 -17
  311. package/public_api.d.ts +12 -5
  312. package/src/app/admin/users/users.d.ts +1 -1
  313. package/src/app/admin/users/users.module.d.ts +2 -1
  314. package/src/app/core/about/about.modal.d.ts +1 -1
  315. package/src/app/core/account/account.page.d.ts +1 -1
  316. package/src/app/core/account/new-token.modal.d.ts +1 -1
  317. package/src/app/core/account/token.table.d.ts +1 -1
  318. package/src/app/core/auth/auth.form.d.ts +1 -1
  319. package/src/app/core/auth/auth.modal.d.ts +1 -1
  320. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +1 -1
  321. package/src/app/core/form/entity/editor.class.d.ts +3 -3
  322. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +1 -1
  323. package/src/app/core/form/entity/entity-editor.class.d.ts +1 -1
  324. package/src/app/core/form/entity/entity-metadata.component.d.ts +1 -1
  325. package/src/app/core/form/form.class.d.ts +1 -1
  326. package/src/app/core/form/list/list.form.d.ts +1 -1
  327. package/src/app/core/form/properties/properties.form.d.ts +1 -1
  328. package/src/app/core/form/properties/properties.table.d.ts +2 -3
  329. package/src/app/core/form/properties/property.validator.d.ts +1 -1
  330. package/src/app/core/form/properties/testing/properties-form.test.d.ts +1 -1
  331. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +1 -1
  332. package/src/app/core/form/text-popover/text-popover.component.d.ts +1 -1
  333. package/src/app/core/graphql/graphql.utils.d.ts +1 -1
  334. package/src/app/core/home/home.d.ts +1 -1
  335. package/src/app/core/home/home.module.d.ts +4 -3
  336. package/src/app/core/icon/icon.component.d.ts +1 -1
  337. package/src/app/core/install/install-upgrade-card.component.d.ts +1 -1
  338. package/src/app/core/menu/menu.component.d.ts +2 -2
  339. package/src/app/core/menu/menu.model.d.ts +0 -1
  340. package/src/app/core/menu/menu.module.d.ts +3 -5
  341. package/src/app/core/menu/menu.service.d.ts +1 -1
  342. package/src/app/core/menu/sub-menu-tab.directive.d.ts +1 -1
  343. package/src/app/core/menu/testing/menu-other.testing.d.ts +1 -1
  344. package/src/app/core/menu/testing/menu.testing.d.ts +1 -1
  345. package/src/app/core/offline/update-offline-mode-card.component.d.ts +1 -1
  346. package/src/app/core/peer/select-peer.modal.d.ts +1 -1
  347. package/src/app/core/register/register-confirm.page.d.ts +1 -1
  348. package/src/app/core/register/register.form.d.ts +1 -1
  349. package/src/app/core/register/register.modal.d.ts +1 -1
  350. package/src/app/core/services/base-entity-service.class.d.ts +2 -2
  351. package/src/app/core/services/base-graphql-service.class.d.ts +1 -1
  352. package/src/app/core/services/model/person.model.d.ts +1 -1
  353. package/src/app/core/services/model/settings.model.d.ts +1 -1
  354. package/src/app/core/services/network.types.d.ts +2 -2
  355. package/src/app/core/services/storage/entity-store.class.d.ts +1 -1
  356. package/src/app/core/services/validator/base.validator.class.d.ts +1 -1
  357. package/src/app/core/settings/settings.page.d.ts +1 -1
  358. package/src/app/core/table/actions-column.component.d.ts +2 -2
  359. package/src/app/core/table/async-table.class.d.ts +1 -1
  360. package/src/app/core/table/entities-async-table-datasource.class.d.ts +1 -1
  361. package/src/app/core/table/entities-table-datasource.class.d.ts +1 -1
  362. package/src/app/core/table/memory-table.class.d.ts +3 -3
  363. package/src/app/core/table/table-select-columns.component.d.ts +1 -1
  364. package/src/app/core/table/table.class.d.ts +4 -3
  365. package/src/app/core/table/table.model.d.ts +1 -1
  366. package/src/app/core/table/testing/table.testing.d.ts +5 -4
  367. package/src/app/core/table/testing/table.testing.module.d.ts +8 -5
  368. package/src/app/core/table/testing/table2-validator.service.d.ts +15 -0
  369. package/src/app/core/table/testing/table2.testing.d.ts +45 -0
  370. package/src/app/shared/audio/audio.d.ts +1 -1
  371. package/src/app/shared/audio/audio.testing.d.ts +1 -1
  372. package/src/app/shared/debug/debug.component.d.ts +1 -1
  373. package/src/app/shared/directives/autofocus.directive.d.ts +1 -1
  374. package/src/app/shared/directives/autotitle.directive.d.ts +1 -1
  375. package/src/app/shared/directives/drag-and-drop.directive.d.ts +1 -1
  376. package/src/app/shared/directives/ng-var.directive.d.ts +1 -1
  377. package/src/app/shared/directives/resizable/resizable.component.d.ts +1 -1
  378. package/src/app/shared/directives/resizable/resizable.directive.d.ts +1 -1
  379. package/src/app/shared/events.d.ts +1 -1
  380. package/src/app/shared/form/field.component.d.ts +4 -5
  381. package/src/app/shared/form/field.model.d.ts +2 -0
  382. package/src/app/shared/form/loading-spinner.d.ts +1 -1
  383. package/src/app/shared/functions.d.ts +2 -2
  384. package/src/app/shared/help/help.modal.d.ts +2 -2
  385. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +3 -5
  386. package/src/app/shared/hotkeys/hotkeys.service.d.ts +3 -3
  387. package/src/app/shared/image/gallery/image-gallery.component.d.ts +3 -3
  388. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +2 -2
  389. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +10 -8
  390. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +10 -9
  391. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +1 -1
  392. package/src/app/shared/material/badge/badge.directive.d.ts +1 -1
  393. package/src/app/shared/material/badge/badge.test.d.ts +1 -1
  394. package/src/app/shared/material/boolean/boolean.module.d.ts +5 -5
  395. package/src/app/shared/material/boolean/{material.boolean.d.ts → material-boolean.d.ts} +20 -23
  396. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +21 -0
  397. package/src/app/shared/material/chips/material.chips.d.ts +8 -9
  398. package/src/app/shared/material/chips/testing/chips.test.d.ts +2 -2
  399. package/src/app/shared/material/datetime/datetime.module.d.ts +2 -2
  400. package/src/app/shared/material/datetime/material.date.d.ts +8 -5
  401. package/src/app/shared/material/datetime/material.dateshort.d.ts +11 -8
  402. package/src/app/shared/material/datetime/material.datetime.d.ts +24 -12
  403. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +7 -1
  404. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +3 -1
  405. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +3 -1
  406. package/src/app/shared/material/duration/duration.module.d.ts +6 -5
  407. package/src/app/shared/material/duration/material.duration.d.ts +6 -5
  408. package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +22 -0
  409. package/src/app/shared/material/latlong/material.latlong.d.ts +16 -9
  410. package/src/app/shared/material/latlong/material.latlong.module.d.ts +9 -8
  411. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +3 -1
  412. package/src/app/shared/material/material.testing.module.d.ts +23 -19
  413. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +1 -1
  414. package/src/app/shared/material/numpad/numpad.component.d.ts +1 -1
  415. package/src/app/shared/material/numpad/numpad.container.d.ts +1 -1
  416. package/src/app/shared/material/numpad/numpad.content.d.ts +1 -1
  417. package/src/app/shared/material/numpad/numpad.directive.d.ts +1 -1
  418. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +3 -3
  419. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +1 -1
  420. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +0 -3
  421. package/src/app/shared/material/swipe/material.swipe.d.ts +6 -6
  422. package/src/app/shared/material/swipe/swipe.module.d.ts +2 -1
  423. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +1 -1
  424. package/src/app/shared/material/testing/common.test.d.ts +25 -0
  425. package/src/app/shared/material/text/testing/text-form.testing.d.ts +1 -1
  426. package/src/app/shared/material/text/text-form.component.d.ts +1 -1
  427. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +4 -1
  428. package/src/app/shared/named-filter/named-filter.service.d.ts +1 -1
  429. package/src/app/shared/pipes/maskito.pipe.d.ts +9 -0
  430. package/src/app/shared/pipes/ng-init.pipe.d.ts +1 -1
  431. package/src/app/shared/pipes/pipes.module.d.ts +5 -4
  432. package/src/app/shared/pipes/string.pipes.d.ts +6 -0
  433. package/src/app/shared/pipes/types.pipes.d.ts +7 -0
  434. package/src/app/shared/rx-state.module.d.ts +10 -0
  435. package/src/app/shared/services/job.utils.d.ts +1 -1
  436. package/src/app/shared/services/memory-entity-service.class.d.ts +1 -1
  437. package/src/app/shared/services/startable-observable-service.class.d.ts +3 -0
  438. package/src/app/shared/services/startable-service.class.d.ts +3 -0
  439. package/src/app/shared/shared.module.d.ts +4 -4
  440. package/src/app/shared/storage/storage-explorer.component.d.ts +1 -1
  441. package/src/app/shared/storage/storage-explorer.module.d.ts +3 -3
  442. package/src/app/shared/storage/storage.service.d.ts +1 -1
  443. package/src/app/shared/storage/storage.utils.d.ts +1 -1
  444. package/src/app/shared/testing/observable.test.d.ts +1 -1
  445. package/src/app/shared/testing/tests.page.d.ts +1 -1
  446. package/src/app/shared/toast/toast.testing.d.ts +1 -1
  447. package/src/app/shared/toolbar/modal-toolbar.d.ts +1 -1
  448. package/src/app/shared/toolbar/toolbar.d.ts +1 -1
  449. package/src/app/shared/toolbar/toolbar.module.d.ts +4 -3
  450. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +1 -1
  451. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +1 -1
  452. package/src/app/shared/upload-file/upload-file.component.d.ts +1 -1
  453. package/src/app/shared/upload-file/upload-file.model.d.ts +2 -2
  454. package/src/app/social/job/progression/job-progression.component.d.ts +17 -3
  455. package/src/app/social/job/progression/job-progression.icon.d.ts +24 -10
  456. package/src/app/social/job/progression/job-progression.list.d.ts +3 -3
  457. package/src/app/social/job/progression/job-progression.model.d.ts +0 -1
  458. package/src/app/social/job/testing/job-progression.testing.d.ts +3 -6
  459. package/src/app/social/message/message.form.d.ts +1 -1
  460. package/src/app/social/message/message.modal.d.ts +1 -1
  461. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -3
  462. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +1 -1
  463. package/src/app/social/user-event/testing/user-event.testing.d.ts +1 -1
  464. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +0 -1
  465. package/src/app/social/user-event/user-event.model.d.ts +2 -2
  466. package/src/app/social/user-event/user-event.module.d.ts +3 -2
  467. package/src/app/social/user-event/user-event.service.d.ts +1 -1
  468. package/src/assets/i18n/fr.json +2 -2
  469. package/src/assets/img/logo/logo-eis.png +0 -0
  470. package/src/assets/manifest.json +1 -1
  471. package/src/environments/environment.loader.d.ts +1 -1
  472. package/src/theme/_material.globals.scss +51 -19
  473. package/src/theme/_material.scss +35 -19
  474. package/src/theme/_mixins.scss +4 -4
  475. package/src/theme/_ngx-components.globals.scss +6 -1
  476. package/src/theme/_ngx-components.scss +262 -538
  477. package/src/theme/_ngx-components.table.scss +597 -0
  478. package/src/theme/_theme.scss +1 -0
  479. package/esm2020/public_api.mjs +0 -332
  480. package/esm2020/src/app/admin/services/filter/person.filter.mjs +0 -59
  481. package/esm2020/src/app/admin/services/person.service.mjs +0 -170
  482. package/esm2020/src/app/admin/services/validator/person.validator.mjs +0 -71
  483. package/esm2020/src/app/admin/users/users.mjs +0 -250
  484. package/esm2020/src/app/admin/users/users.module.mjs +0 -54
  485. package/esm2020/src/app/core/account/account.page.mjs +0 -319
  486. package/esm2020/src/app/core/account/new-token.modal.mjs +0 -121
  487. package/esm2020/src/app/core/account/token.table.mjs +0 -141
  488. package/esm2020/src/app/core/auth/auth.form.mjs +0 -131
  489. package/esm2020/src/app/core/auth/auth.modal.mjs +0 -72
  490. package/esm2020/src/app/core/core.testing.module.mjs +0 -86
  491. package/esm2020/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -107
  492. package/esm2020/src/app/core/form/entity/editor.class.mjs +0 -685
  493. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -422
  494. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +0 -696
  495. package/esm2020/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
  496. package/esm2020/src/app/core/form/form.class.mjs +0 -345
  497. package/esm2020/src/app/core/form/form.utils.mjs +0 -476
  498. package/esm2020/src/app/core/form/list/list.form.mjs +0 -222
  499. package/esm2020/src/app/core/form/properties/properties.form.mjs +0 -132
  500. package/esm2020/src/app/core/form/properties/properties.table.mjs +0 -267
  501. package/esm2020/src/app/core/form/properties/property.validator.mjs +0 -23
  502. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +0 -90
  503. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -70
  504. package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +0 -146
  505. package/esm2020/src/app/core/graphql/graphql.service.mjs +0 -776
  506. package/esm2020/src/app/core/graphql/graphql.utils.mjs +0 -117
  507. package/esm2020/src/app/core/home/home.mjs +0 -257
  508. package/esm2020/src/app/core/home/home.module.mjs +0 -48
  509. package/esm2020/src/app/core/icon/icon.component.mjs +0 -41
  510. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +0 -344
  511. package/esm2020/src/app/core/menu/menu.component.mjs +0 -242
  512. package/esm2020/src/app/core/menu/menu.model.mjs +0 -247
  513. package/esm2020/src/app/core/menu/menu.module.mjs +0 -57
  514. package/esm2020/src/app/core/menu/menu.service.mjs +0 -660
  515. package/esm2020/src/app/core/menu/sub-menu-tab.directive.mjs +0 -98
  516. package/esm2020/src/app/core/menu/testing/menu.testing.mjs +0 -121
  517. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +0 -27
  518. package/esm2020/src/app/core/peer/select-peer.modal.mjs +0 -183
  519. package/esm2020/src/app/core/register/register.form.mjs +0 -183
  520. package/esm2020/src/app/core/register/register.modal.mjs +0 -52
  521. package/esm2020/src/app/core/services/account.service.mjs +0 -1235
  522. package/esm2020/src/app/core/services/auth-guard.service.mjs +0 -71
  523. package/esm2020/src/app/core/services/base-entity-service.class.mjs +0 -468
  524. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +0 -221
  525. package/esm2020/src/app/core/services/base58.mjs +0 -78
  526. package/esm2020/src/app/core/services/config.service.mjs +0 -357
  527. package/esm2020/src/app/core/services/crypto.service.mjs +0 -107
  528. package/esm2020/src/app/core/services/local-settings.service.mjs +0 -460
  529. package/esm2020/src/app/core/services/model/account.model.mjs +0 -147
  530. package/esm2020/src/app/core/services/model/config.model.mjs +0 -92
  531. package/esm2020/src/app/core/services/model/department.model.mjs +0 -30
  532. package/esm2020/src/app/core/services/model/entity.decorators.mjs +0 -97
  533. package/esm2020/src/app/core/services/model/entity.model.mjs +0 -225
  534. package/esm2020/src/app/core/services/model/peer.model.mjs +0 -68
  535. package/esm2020/src/app/core/services/model/person.model.mjs +0 -97
  536. package/esm2020/src/app/core/services/model/referential.model.mjs +0 -167
  537. package/esm2020/src/app/core/services/model/token.model.mjs +0 -52
  538. package/esm2020/src/app/core/services/model/tree-item-entity.model.mjs +0 -199
  539. package/esm2020/src/app/core/services/network.service.mjs +0 -607
  540. package/esm2020/src/app/core/services/network.types.mjs +0 -20
  541. package/esm2020/src/app/core/services/network.utils.mjs +0 -15
  542. package/esm2020/src/app/core/services/platform.service.mjs +0 -535
  543. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +0 -428
  544. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +0 -449
  545. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +0 -23
  546. package/esm2020/src/app/core/services/testing/referential.validator.mjs +0 -45
  547. package/esm2020/src/app/core/services/validator/account.validator.mjs +0 -41
  548. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +0 -47
  549. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +0 -66
  550. package/esm2020/src/app/core/settings/settings.page.mjs +0 -312
  551. package/esm2020/src/app/core/table/actions-column.component.mjs +0 -102
  552. package/esm2020/src/app/core/table/async-table.class.mjs +0 -1698
  553. package/esm2020/src/app/core/table/entities-async-table-datasource.class.mjs +0 -384
  554. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +0 -399
  555. package/esm2020/src/app/core/table/memory-table.class.mjs +0 -53
  556. package/esm2020/src/app/core/table/table-select-columns.component.mjs +0 -43
  557. package/esm2020/src/app/core/table/table.class.mjs +0 -1733
  558. package/esm2020/src/app/core/table/table.model.mjs +0 -12
  559. package/esm2020/src/app/core/table/table.utils.mjs +0 -33
  560. package/esm2020/src/app/core/table/testing/table-validator.service.mjs +0 -27
  561. package/esm2020/src/app/core/table/testing/table.testing.mjs +0 -281
  562. package/esm2020/src/app/core/table/testing/table.testing.module.mjs +0 -38
  563. package/esm2020/src/app/shared/alerts.mjs +0 -239
  564. package/esm2020/src/app/shared/audio/audio.mjs +0 -248
  565. package/esm2020/src/app/shared/audio/audio.testing.mjs +0 -31
  566. package/esm2020/src/app/shared/capacitor/keyboard.mjs +0 -40
  567. package/esm2020/src/app/shared/capacitor/plugins.mjs +0 -9
  568. package/esm2020/src/app/shared/dates.mjs +0 -149
  569. package/esm2020/src/app/shared/debug/debug.component.mjs +0 -39
  570. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +0 -93
  571. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +0 -30
  572. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +0 -53
  573. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +0 -31
  574. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +0 -59
  575. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +0 -40
  576. package/esm2020/src/app/shared/events.mjs +0 -65
  577. package/esm2020/src/app/shared/file/csv.utils.mjs +0 -72
  578. package/esm2020/src/app/shared/file/file.service.mjs +0 -117
  579. package/esm2020/src/app/shared/file/file.utils.mjs +0 -113
  580. package/esm2020/src/app/shared/file/images.utils.mjs +0 -161
  581. package/esm2020/src/app/shared/file/uri.utils.mjs +0 -24
  582. package/esm2020/src/app/shared/form/field.component.mjs +0 -332
  583. package/esm2020/src/app/shared/form/loading-spinner.mjs +0 -36
  584. package/esm2020/src/app/shared/forms.mjs +0 -414
  585. package/esm2020/src/app/shared/functions.mjs +0 -482
  586. package/esm2020/src/app/shared/geolocation/geolocation.utils.mjs +0 -80
  587. package/esm2020/src/app/shared/gesture/gesture-config.mjs +0 -49
  588. package/esm2020/src/app/shared/graph/graph-colors.mjs +0 -212
  589. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +0 -57
  590. package/esm2020/src/app/shared/help/help.modal.mjs +0 -53
  591. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  592. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +0 -84
  593. package/esm2020/src/app/shared/http/http.utils.mjs +0 -56
  594. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +0 -368
  595. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -27
  596. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -90
  597. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -39
  598. package/esm2020/src/app/shared/image/image.service.mjs +0 -98
  599. package/esm2020/src/app/shared/inputs.mjs +0 -231
  600. package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  601. package/esm2020/src/app/shared/logging/logger.model.mjs +0 -47
  602. package/esm2020/src/app/shared/logging/logging-service.class.mjs +0 -121
  603. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -47
  604. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -920
  605. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -78
  606. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -17
  607. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -209
  608. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +0 -199
  609. package/esm2020/src/app/shared/material/badge/badge.test.mjs +0 -41
  610. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +0 -68
  611. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +0 -253
  612. package/esm2020/src/app/shared/material/chips/chips.module.mjs +0 -76
  613. package/esm2020/src/app/shared/material/chips/material.chips.mjs +0 -696
  614. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +0 -143
  615. package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +0 -91
  616. package/esm2020/src/app/shared/material/datetime/material.date.mjs +0 -376
  617. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +0 -385
  618. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +0 -499
  619. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -109
  620. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -111
  621. package/esm2020/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -103
  622. package/esm2020/src/app/shared/material/duration/duration.module.mjs +0 -67
  623. package/esm2020/src/app/shared/material/duration/duration.utils.mjs +0 -36
  624. package/esm2020/src/app/shared/material/duration/material.duration.mjs +0 -257
  625. package/esm2020/src/app/shared/material/latlong/latlong.utils.mjs +0 -266
  626. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +0 -382
  627. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +0 -67
  628. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -102
  629. package/esm2020/src/app/shared/material/material.module.mjs +0 -229
  630. package/esm2020/src/app/shared/material/material.testing.module.mjs +0 -179
  631. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +0 -98
  632. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +0 -190
  633. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +0 -17
  634. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +0 -162
  635. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +0 -37
  636. package/esm2020/src/app/shared/material/numpad/numpad.model.mjs +0 -15
  637. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +0 -46
  638. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -46
  639. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -22
  640. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +0 -344
  641. package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +0 -52
  642. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -64
  643. package/esm2020/src/app/shared/material/text/testing/text-form.testing.mjs +0 -29
  644. package/esm2020/src/app/shared/material/text/text-form.component.mjs +0 -89
  645. package/esm2020/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -224
  646. package/esm2020/src/app/shared/named-filter/named-filter.model.mjs +0 -45
  647. package/esm2020/src/app/shared/named-filter/named-filter.service.mjs +0 -63
  648. package/esm2020/src/app/shared/observables.mjs +0 -104
  649. package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +0 -141
  650. package/esm2020/src/app/shared/pipes/colors.pipe.mjs +0 -25
  651. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -48
  652. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +0 -66
  653. package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +0 -27
  654. package/esm2020/src/app/shared/pipes/duration.pipe.mjs +0 -34
  655. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +0 -62
  656. package/esm2020/src/app/shared/pipes/form.pipes.mjs +0 -187
  657. package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +0 -48
  658. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +0 -46
  659. package/esm2020/src/app/shared/pipes/math.pipes.mjs +0 -59
  660. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +0 -21
  661. package/esm2020/src/app/shared/pipes/number-format.pipe.mjs +0 -30
  662. package/esm2020/src/app/shared/pipes/pipes.module.mjs +0 -239
  663. package/esm2020/src/app/shared/pipes/property.pipes.mjs +0 -93
  664. package/esm2020/src/app/shared/pipes/string.pipes.mjs +0 -121
  665. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +0 -43
  666. package/esm2020/src/app/shared/pipes/types.pipes.mjs +0 -45
  667. package/esm2020/src/app/shared/platforms.mjs +0 -43
  668. package/esm2020/src/app/shared/services/job.utils.mjs +0 -92
  669. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +0 -339
  670. package/esm2020/src/app/shared/services/progress-bar.service.mjs +0 -33
  671. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +0 -118
  672. package/esm2020/src/app/shared/services/startable-service.class.mjs +0 -110
  673. package/esm2020/src/app/shared/services/translate-context.service.mjs +0 -103
  674. package/esm2020/src/app/shared/services.mjs +0 -62
  675. package/esm2020/src/app/shared/shared-routing.module.mjs +0 -71
  676. package/esm2020/src/app/shared/shared.module.mjs +0 -229
  677. package/esm2020/src/app/shared/storage/storage-explorer.component.mjs +0 -268
  678. package/esm2020/src/app/shared/storage/storage-explorer.module.mjs +0 -47
  679. package/esm2020/src/app/shared/storage/storage.service.mjs +0 -132
  680. package/esm2020/src/app/shared/testing/observable.test.mjs +0 -95
  681. package/esm2020/src/app/shared/testing/tests.page.mjs +0 -33
  682. package/esm2020/src/app/shared/toast/toast.testing.mjs +0 -51
  683. package/esm2020/src/app/shared/toast/toasts.mjs +0 -144
  684. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +0 -58
  685. package/esm2020/src/app/shared/toolbar/toolbar.mjs +0 -251
  686. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +0 -53
  687. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -58
  688. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -97
  689. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +0 -204
  690. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +0 -20
  691. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +0 -104
  692. package/esm2020/src/app/shared/validator/validators.mjs +0 -580
  693. package/esm2020/src/app/shared/version/versions.mjs +0 -81
  694. package/esm2020/src/app/social/job/job.module.mjs +0 -42
  695. package/esm2020/src/app/social/job/progression/job-progression.component.mjs +0 -20
  696. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +0 -216
  697. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +0 -43
  698. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +0 -23
  699. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +0 -71
  700. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +0 -52
  701. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +0 -55
  702. package/esm2020/src/app/social/message/message.form.mjs +0 -136
  703. package/esm2020/src/app/social/message/message.modal.mjs +0 -99
  704. package/esm2020/src/app/social/message/message.model.mjs +0 -67
  705. package/esm2020/src/app/social/message/message.service.mjs +0 -105
  706. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -114
  707. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -246
  708. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +0 -227
  709. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -112
  710. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -111
  711. package/esm2020/src/app/social/user-event/user-event.module.mjs +0 -39
  712. package/esm2020/src/app/social/user-event/user-event.service.mjs +0 -501
  713. package/esm2020/src/environments/environment.class.mjs +0 -5
  714. package/esm2020/src/environments/environment.loader.mjs +0 -79
  715. package/esm2020/src/environments/environment.mjs +0 -97
  716. package/fesm2015/sumaris-net.ngx-components.mjs +0 -41105
  717. package/fesm2015/sumaris-net.ngx-components.mjs.map +0 -1
  718. package/fesm2020/sumaris-net.ngx-components.mjs.map +0 -1
  719. package/resources/README.md +0 -7
  720. /package/{esm2020 → esm2022}/src/app/core/services/config/core.config.mjs +0 -0
  721. /package/{esm2020 → esm2022}/src/app/core/services/model/history.model.mjs +0 -0
  722. /package/{esm2020 → esm2022}/src/app/core/services/model/model.enum.mjs +0 -0
  723. /package/{esm2020 → esm2022}/src/app/core/services/model/settings.model.mjs +0 -0
  724. /package/{esm2020 → esm2022}/src/app/shared/constants.mjs +0 -0
  725. /package/{esm2020 → esm2022}/src/app/shared/debug/debug-service.class.mjs +0 -0
  726. /package/{esm2020 → esm2022}/src/app/shared/focusable.mjs +0 -0
  727. /package/{esm2020 → esm2022}/src/app/shared/gesture/hammer.utils.mjs +0 -0
  728. /package/{esm2020 → esm2022}/src/app/shared/image/image.model.mjs +0 -0
  729. /package/{esm2020 → esm2022}/src/app/shared/logging/log-level.model.mjs +0 -0
  730. /package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.config.mjs +0 -0
  731. /package/{esm2020 → esm2022}/src/app/shared/material/material.animations.mjs +0 -0
  732. /package/{esm2020 → esm2022}/src/app/shared/modules.mjs +0 -0
  733. /package/{esm2020 → esm2022}/src/app/shared/services/entity-service.class.mjs +0 -0
  734. /package/{esm2020 → esm2022}/src/app/shared/services/validator-service.class.mjs +0 -0
  735. /package/{esm2020 → esm2022}/src/app/shared/types.mjs +0 -0
  736. /package/{esm2020 → esm2022}/src/app/social/social.errors.mjs +0 -0
  737. /package/{esm2020 → esm2022}/src/app/social/user-event/user-event.model.mjs +0 -0
  738. /package/{esm2020 → esm2022}/sumaris-net.ngx-components.mjs +0 -0
@@ -0,0 +1,730 @@
1
+ import { ChangeDetectorRef, Directive, EventEmitter, Optional } from '@angular/core';
2
+ import { ActivatedRoute, Router } from '@angular/router';
3
+ import { AlertController, IonRouterOutlet, NavController, ToastController } from '@ionic/angular';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import { BehaviorSubject, of } from 'rxjs';
6
+ import { isMoment } from 'moment';
7
+ import { LocalSettingsService } from '../../services/local-settings.service';
8
+ import { debounceTime, filter, mapTo, mergeMap } from 'rxjs/operators';
9
+ import { AppTabEditor, AppTabEditorOptions } from './editor.class';
10
+ import { AppFormUtils } from '../form.utils';
11
+ import { Alerts } from '../../../shared/alerts';
12
+ import { ErrorCodes, ServerErrorCodes } from '../../services/errors';
13
+ import { equals, isInt, isNil, isNilOrBlank, isNotEmptyArray, isNotNil, isNotNilOrBlank, toBoolean, toNumber } from '../../../shared/functions';
14
+ import { DateFormatService } from '../../../shared/pipes/date-format.pipe';
15
+ import { ENVIRONMENT } from '../../../../environments/environment.class';
16
+ import { firstFalse, waitForFalse } from '../../../shared/observables';
17
+ import { FormErrorTranslator } from '../../../shared/validator/form-error-adapter.class';
18
+ import { isStartableService } from '../../../shared/services/startable-service.class';
19
+ import * as i0 from "@angular/core";
20
+ export class AppEditorOptions extends AppTabEditorOptions {
21
+ autoLoad;
22
+ autoLoadDelay;
23
+ pathIdAttribute;
24
+ enableListenChanges;
25
+ listenIntervalInSeconds;
26
+ /**
27
+ * Change page route (window URL) when saving for the first time
28
+ */
29
+ autoUpdateRoute; // Default to true
30
+ /**
31
+ * Open the next tab, after saving for the first time
32
+ */
33
+ autoOpenNextTab; // Default to true
34
+ i18nPrefix;
35
+ }
36
+ // @dynamic
37
+ // eslint-disable-next-line @angular-eslint/directive-class-suffix
38
+ export class AppEntityEditor extends AppTabEditor {
39
+ dataType;
40
+ dataService;
41
+ data;
42
+ defaultBackHref;
43
+ historyIcon;
44
+ titleSubject = new BehaviorSubject(undefined);
45
+ onUpdateView = new EventEmitter();
46
+ /**
47
+ * @deprecated
48
+ */
49
+ get $title() {
50
+ return this.titleSubject;
51
+ }
52
+ dateFormat;
53
+ cd;
54
+ settings;
55
+ environment;
56
+ routerOutlet;
57
+ errorTranslator;
58
+ _usageMode;
59
+ _enableListenChanges;
60
+ _listenIntervalInSeconds;
61
+ _pathIdAttribute;
62
+ _autoLoad;
63
+ _autoLoadDelay;
64
+ _autoUpdateRoute;
65
+ _autoOpenNextTab;
66
+ _listenChangesSubscription;
67
+ get usageMode() {
68
+ return this._usageMode;
69
+ }
70
+ set usageMode(value) {
71
+ if (this._usageMode !== value) {
72
+ this._usageMode = value;
73
+ this.markForCheck();
74
+ }
75
+ }
76
+ get isOnFieldMode() {
77
+ return this.settings.isOnFieldMode(this._usageMode);
78
+ }
79
+ get isNewData() {
80
+ return isNil(this.data?.id);
81
+ }
82
+ get service() {
83
+ return this.dataService;
84
+ }
85
+ get autoOpenNextTab() {
86
+ return this._autoOpenNextTab;
87
+ }
88
+ set autoOpenNextTab(value) {
89
+ this._autoOpenNextTab = value;
90
+ }
91
+ get pathIdAttribute() {
92
+ return this._pathIdAttribute;
93
+ }
94
+ constructor(injector, dataType, dataService, options) {
95
+ super(injector.get(ActivatedRoute), injector.get(Router), injector.get(NavController), injector.get(AlertController), injector.get(TranslateService), options);
96
+ this.dataType = dataType;
97
+ this.dataService = dataService;
98
+ this.environment = injector.get(ENVIRONMENT);
99
+ options = {
100
+ // Default options
101
+ enableListenChanges: this.environment.entityEditor?.enableListenChanges || false, // False by default
102
+ listenIntervalInSeconds: toNumber(this.environment.entityEditor?.listenIntervalInSeconds, 0), // no timer by default
103
+ pathIdAttribute: 'id',
104
+ autoLoad: true,
105
+ autoUpdateRoute: true,
106
+ i18nPrefix: '',
107
+ // Following options are override inside ngOnInit()
108
+ // autoOpenNextTab: ...,
109
+ // Override defaults
110
+ ...options
111
+ };
112
+ this.settings = injector.get(LocalSettingsService);
113
+ this.errorTranslator = injector.get(FormErrorTranslator);
114
+ this.routerOutlet = injector.get(IonRouterOutlet);
115
+ this.cd = injector.get(ChangeDetectorRef);
116
+ this.dateFormat = injector.get(DateFormatService);
117
+ this.toastController = injector.get(ToastController);
118
+ this._enableListenChanges = options.enableListenChanges;
119
+ this._listenIntervalInSeconds = options.listenIntervalInSeconds;
120
+ this._pathIdAttribute = options.pathIdAttribute;
121
+ this._autoLoad = options.autoLoad;
122
+ this._autoLoadDelay = options.autoLoadDelay;
123
+ this._autoUpdateRoute = options.autoUpdateRoute;
124
+ this._autoOpenNextTab = options.autoOpenNextTab;
125
+ this.i18nContext = {
126
+ prefix: options.i18nPrefix,
127
+ suffix: ''
128
+ };
129
+ // FOR DEV ONLY ----
130
+ //this.debug = !environment.production;
131
+ }
132
+ ngOnInit() {
133
+ super.ngOnInit();
134
+ // Defaults
135
+ this._autoOpenNextTab = toBoolean(this._autoOpenNextTab, !this.isOnFieldMode);
136
+ this.historyIcon = this.historyIcon || { icon: 'list' };
137
+ // Register forms
138
+ this.registerForms();
139
+ // Disable page, during load
140
+ this.disable();
141
+ }
142
+ ngAfterViewInit() {
143
+ super.ngAfterViewInit();
144
+ // Load data
145
+ if (this._autoLoad) {
146
+ setTimeout(() => this.loadFromRoute(), this._autoLoadDelay);
147
+ }
148
+ }
149
+ ngOnDestroy() {
150
+ super.ngOnDestroy();
151
+ this.titleSubject.complete();
152
+ this.titleSubject.unsubscribe();
153
+ this.onUpdateView.complete();
154
+ this.onUpdateView.unsubscribe();
155
+ this.savingSubject.unsubscribe();
156
+ }
157
+ waitIdle(opts) {
158
+ // Wait end of saving
159
+ if (this.saving)
160
+ return waitForFalse(this.savingSubject);
161
+ return super.waitIdle(opts);
162
+ }
163
+ /**
164
+ * Load data from id, using the dataService
165
+ *
166
+ * @param id
167
+ * @param opts
168
+ */
169
+ async load(id, opts) {
170
+ if (!this.dataService)
171
+ throw new Error('Cannot load data: missing \'dataService\'!');
172
+ this.resetError();
173
+ // New data
174
+ if (isNil(id)) {
175
+ try {
176
+ // Create using default values
177
+ const data = new this.dataType();
178
+ this._usageMode = this.computeUsageMode(data);
179
+ await this.onNewEntity(data, opts);
180
+ await this.updateView(data, {
181
+ openTabIndex: 0,
182
+ ...opts
183
+ });
184
+ }
185
+ catch (err) {
186
+ this.setError(err, { emitEvent: false });
187
+ this.selectedTabIndex = 0;
188
+ }
189
+ finally {
190
+ this.markAsLoaded();
191
+ }
192
+ }
193
+ // Load existing data
194
+ else {
195
+ try {
196
+ const data = await this.dataService.load(id, opts);
197
+ if (!data)
198
+ throw { code: ErrorCodes.DATA_NOT_FOUND_ERROR, message: 'ERROR.DATA_NO_FOUND' };
199
+ this._usageMode = this.computeUsageMode(data);
200
+ await this.onEntityLoaded(data, opts);
201
+ await this.updateView(data, opts);
202
+ this.startListenChanges();
203
+ }
204
+ catch (err) {
205
+ this.setError(err);
206
+ this.selectedTabIndex = 0;
207
+ }
208
+ finally {
209
+ this.markAsLoaded();
210
+ }
211
+ }
212
+ }
213
+ canUserWrite(data, opts) {
214
+ return this.dataService.canUserWrite(data, opts);
215
+ }
216
+ startListenChanges() {
217
+ // Skip if disabled, or already listening
218
+ if (this._listenChangesSubscription || !this._enableListenChanges)
219
+ return;
220
+ // Skip if new (nothing to listen)
221
+ if (this.isNewData)
222
+ return;
223
+ // Listen for changes on server
224
+ const subscription = this.listenChanges(this.data.id, {
225
+ interval: this._listenIntervalInSeconds
226
+ })?.pipe(filter(isNotNil), mergeMap((data) => this.saving
227
+ // If saving, wait end, to avoid to detect self changes
228
+ ? firstFalse(this.savingSubject).pipe(mapTo(data), debounceTime(500))
229
+ : of(data)))
230
+ .subscribe((data) => {
231
+ const isNewer = isMoment(data.updateDate) && (!this.data.updateDate || data.updateDate.isAfter(this.data.updateDate));
232
+ if (!isNewer)
233
+ return; // Skip
234
+ // Editor has no changes: reload
235
+ if (!this.dirty) {
236
+ if (this.debug)
237
+ console.debug(`[data-editor] Changes detected on server, at {${data.updateDate}}: reloading page...`);
238
+ this.reload();
239
+ }
240
+ // Cannot reload: alert the user
241
+ else {
242
+ if (this.debug)
243
+ console.debug(`[data-editor] Changes detected on server, at {${data.updateDate}}, but page is dirty: skip reloading.`);
244
+ this.showToast({ message: 'ERROR.DATA_UPDATE_DATE_CHANGED', type: 'warning', showCloseButton: true });
245
+ }
246
+ });
247
+ // Register subscription
248
+ if (subscription) {
249
+ this._listenChangesSubscription = subscription;
250
+ this.registerSubscription(this._listenChangesSubscription);
251
+ subscription.add(() => {
252
+ this.unregisterSubscription(subscription);
253
+ this._listenChangesSubscription = null;
254
+ });
255
+ }
256
+ }
257
+ stopListenChanges() {
258
+ this._listenChangesSubscription?.unsubscribe();
259
+ }
260
+ async ready(opts) {
261
+ await super.ready(opts);
262
+ // Wait service to be ready
263
+ if (isStartableService(this.dataService)) {
264
+ await this.dataService.ready();
265
+ }
266
+ }
267
+ async updateView(data, opts) {
268
+ const idChanged = isNotNil(data.id)
269
+ && this.previousDataId !== undefined // Ignore if first loading (=undefined)
270
+ && this.previousDataId !== data.id;
271
+ opts = {
272
+ updateRoute: this._autoUpdateRoute && idChanged && !this.loading,
273
+ ...opts
274
+ };
275
+ this.data = data;
276
+ this.previousDataId = data.id || null;
277
+ await this.ready();
278
+ await this.setValue(data);
279
+ if (!opts || opts.emitEvent !== false) {
280
+ this.markAsPristine();
281
+ this.markAsUntouched();
282
+ this.updateViewState(data);
283
+ // Need to update route
284
+ if (opts.updateRoute === true) {
285
+ this.updateTabAndRoute(data, opts)
286
+ // Update the title - should be executed AFTER updateRoute because of path change - fix #185
287
+ .then(() => this.updateTitle(data));
288
+ }
289
+ else {
290
+ // Update the next tab
291
+ this.updateTabIndex(opts.openTabIndex);
292
+ // Update the title.
293
+ this.updateTitle(data);
294
+ }
295
+ this.onUpdateView.emit(data);
296
+ }
297
+ }
298
+ /**
299
+ * Enable or disable state
300
+ */
301
+ updateViewState(data, opts) {
302
+ if (this.isNewData || this.canUserWrite(data)) {
303
+ this.enable(opts);
304
+ }
305
+ else {
306
+ this.disable(opts);
307
+ // Allow to sort table
308
+ this.tables?.forEach(t => t.enableSort());
309
+ }
310
+ }
311
+ /**
312
+ * Update the route location, and open the next tab
313
+ */
314
+ async updateTabAndRoute(data, opts) {
315
+ const queryParams = { ...this.queryParams };
316
+ // Open the next tab
317
+ this.updateTabIndex(opts && opts.openTabIndex);
318
+ if (!this.queryTabIndexParamName || !this.route)
319
+ return; // Skip route update
320
+ // Update route location
321
+ queryParams[this.queryTabIndexParamName] = this.selectedTabIndex !== 0 ? this.selectedTabIndex : undefined;
322
+ await this.updateRoute(data, queryParams);
323
+ }
324
+ /**
325
+ * Update the route location, and open the next tab
326
+ */
327
+ updateTabIndex(tabIndex) {
328
+ if (isNotNil(tabIndex) && tabIndex >= 0 && tabIndex !== this.selectedTabIndex) {
329
+ this.selectedTabIndex = tabIndex;
330
+ this.markForCheck();
331
+ }
332
+ }
333
+ async saveAndClose(event, options) {
334
+ const saved = await this.save(event);
335
+ if (saved) {
336
+ await this.close(event);
337
+ }
338
+ return saved;
339
+ }
340
+ async close(event) {
341
+ if (event) {
342
+ if (event.defaultPrevented)
343
+ return;
344
+ event.preventDefault();
345
+ event.stopPropagation();
346
+ }
347
+ return this.goBack();
348
+ }
349
+ /**
350
+ * Save the editor, by calling the dataService.save().
351
+ * Ensure that editor if valid. If not, display an error
352
+ *
353
+ * @param event
354
+ * @param opts
355
+ */
356
+ async save(event, opts) {
357
+ if (this.loading || this.saving) {
358
+ console.debug('[data-editor] Skip save: editor is busy (loading or saving)');
359
+ return false;
360
+ }
361
+ if (!this.dirty) {
362
+ console.debug('[data-editor] Skip save: editor not dirty');
363
+ return true;
364
+ }
365
+ // Wait end of async validation
366
+ await this.waitWhilePending();
367
+ // If invalid
368
+ if (this.invalid) {
369
+ this.logFormErrors();
370
+ this.openFirstInvalidTab();
371
+ this.scrollToTop();
372
+ this.markAllAsTouched();
373
+ this.submitted = true;
374
+ return false;
375
+ }
376
+ this.markAsSaving();
377
+ this.resetError();
378
+ if (this.debug)
379
+ console.debug('[data-editor] Saving data...');
380
+ try {
381
+ // Compute next tab index (if enable)
382
+ const nextTabIndex = this._autoOpenNextTab && isNil(this.previousDataId) && this.computeNextTabIndex();
383
+ // Save all dirty tables
384
+ const saved = await this.saveDirtyChildren();
385
+ if (!saved)
386
+ return false;
387
+ // Get data
388
+ const data = await this.getValue();
389
+ this.disable();
390
+ // Save form
391
+ const updatedData = await this.dataService.save(data, opts);
392
+ await this.onEntitySaved(updatedData);
393
+ // Update the view (e.g metadata)
394
+ await this.updateView(updatedData, {
395
+ // Open next tab only if user has not changed it
396
+ openTabIndex: nextTabIndex > this._selectedTabIndex ? nextTabIndex : undefined,
397
+ ...opts
398
+ });
399
+ // Subscribe to remote changes
400
+ if (!this._listenChangesSubscription)
401
+ this.startListenChanges();
402
+ this.submitted = false;
403
+ return true;
404
+ }
405
+ catch (err) {
406
+ this.submitted = true;
407
+ this.selectedTabIndex = 0; // Can be override by subclasses, using setError()
408
+ this.setError(err);
409
+ this.scrollToTop(); // Scroll to top (to show error)
410
+ this.markAsDirty();
411
+ this.enable();
412
+ // Concurrent change on pod
413
+ if (err.code === ServerErrorCodes.BAD_UPDATE_DATE && isNotNil(this.data.id)) {
414
+ // Call a data reload (in background), to update the GraphQL cache, and allow to cancel changes
415
+ this.dataService.load(this.data.id, { fetchPolicy: 'network-only' }).then(() => {
416
+ console.debug('[data-editor] Data cache reloaded. User can reload page');
417
+ });
418
+ }
419
+ return false;
420
+ }
421
+ finally {
422
+ this.markAsSaved();
423
+ }
424
+ }
425
+ /**
426
+ * Save data (if dirty and valid), and return it. Otherwise, return nil value.
427
+ */
428
+ async saveAndGetDataIfValid() {
429
+ // Form is not valid
430
+ if (!this.valid) {
431
+ // Make sure validation is finished
432
+ await AppFormUtils.waitWhilePending(this);
433
+ // If invalid: Open the first tab in error
434
+ if (this.invalid) {
435
+ this.openFirstInvalidTab();
436
+ return undefined;
437
+ }
438
+ // Continue (valid)
439
+ }
440
+ // Form is valid, but not saved
441
+ if (this.dirty) {
442
+ const saved = await this.save(new Event('save'));
443
+ if (!saved)
444
+ return undefined;
445
+ }
446
+ // Valid and saved data
447
+ return this.data;
448
+ }
449
+ async delete(event) {
450
+ if (this.loading || this.saving)
451
+ return false;
452
+ // Ask user confirmation
453
+ const confirmation = await Alerts.askDeleteConfirmation(this.alertCtrl, this.translate);
454
+ if (!confirmation)
455
+ return;
456
+ console.debug('[data-editor] Asking to delete...');
457
+ this.markAsSaving();
458
+ this.resetError();
459
+ try {
460
+ // Get data
461
+ const data = await this.getValue();
462
+ const isNew = this.isNewData;
463
+ this.disable();
464
+ if (!isNew) {
465
+ await this.dataService.delete(data);
466
+ }
467
+ await this.onEntityDeleted(data);
468
+ // Remove page history
469
+ this.removePageHistory();
470
+ }
471
+ catch (err) {
472
+ this.submitted = true;
473
+ this.selectedTabIndex = 0;
474
+ this.setError(err);
475
+ this.markAsSaved();
476
+ this.enable();
477
+ return false;
478
+ }
479
+ // Wait, then go back (wait is need in order to update back href is need)
480
+ await setTimeout(() => this.goBack(), 500);
481
+ return true;
482
+ }
483
+ async reload() {
484
+ this.markAsLoading();
485
+ await this.load(this.data?.id, { fetchPolicy: 'network-only' });
486
+ }
487
+ async unload(opts) {
488
+ await super.unload(opts);
489
+ this.stopListenChanges();
490
+ this.form.reset();
491
+ this.registerForms();
492
+ this.data = null;
493
+ // TODO: find a way to remove current page from the navigation history
494
+ }
495
+ async goBack(event) {
496
+ // Go back
497
+ if (this.toolbar?.canGoBack) {
498
+ return this.toolbar.goBack();
499
+ }
500
+ else if (this.defaultBackHref) {
501
+ return this.navController.navigateBack(this.defaultBackHref);
502
+ }
503
+ else {
504
+ // Back to home
505
+ return this.navController.navigateBack('/');
506
+ }
507
+ }
508
+ resetError(opts) {
509
+ super.resetError(opts);
510
+ }
511
+ setError(err, opts) {
512
+ if (!err) {
513
+ super.setError(undefined, opts);
514
+ }
515
+ else if (typeof err === 'string') {
516
+ console.error('[entity-editor] Error: ' + (err || ''));
517
+ super.setError(err, opts);
518
+ }
519
+ else {
520
+ console.error('[entity-editor] Error: ' + err.message || '', err);
521
+ let userMessage = err.message && this.translate.instant(err.message) || err;
522
+ // Add details error (if any) under the main message
523
+ const detailMessage = (!err.details || typeof err.details === 'string')
524
+ ? err.details
525
+ : err.details.message;
526
+ if (isNotNilOrBlank(detailMessage)) {
527
+ const cssClass = opts?.detailsCssClass || 'error-details';
528
+ userMessage += `<br/><small class="${cssClass}" title="${detailMessage}">`;
529
+ userMessage += detailMessage.length < 70 ? detailMessage : detailMessage.substring(0, 67) + '...';
530
+ userMessage += '</small>';
531
+ }
532
+ super.setError(userMessage, opts);
533
+ }
534
+ }
535
+ /**
536
+ * Load data from the snapshot route
537
+ *
538
+ * @protected
539
+ */
540
+ loadFromRoute() {
541
+ const route = this.route.snapshot;
542
+ if (!route || isNilOrBlank(this._pathIdAttribute)) {
543
+ throw new Error('Unable to load from route: missing \'route\' or \'options.pathIdAttribute\'.');
544
+ }
545
+ let id = route.params[this._pathIdAttribute];
546
+ if (isNil(id) || id === 'new') {
547
+ return this.load(undefined, route.params);
548
+ }
549
+ else {
550
+ // Convert as number, if need
551
+ if (isInt(id)) {
552
+ id = parseInt(id);
553
+ }
554
+ return this.load(id, route.params);
555
+ }
556
+ }
557
+ /**
558
+ * Return undefined to keep same tab
559
+ *
560
+ * @protected
561
+ */
562
+ computeNextTabIndex() {
563
+ const nextTabIndex = this.selectedTabIndex + 1;
564
+ return nextTabIndex < this.tabCount ? nextTabIndex : undefined;
565
+ }
566
+ async onBeforeEntityLoad() {
567
+ // can be overwritten by subclasses
568
+ }
569
+ async onNewEntity(data, options) {
570
+ // can be overwritten by subclasses
571
+ }
572
+ async onEntityLoaded(data, options) {
573
+ // can be overwritten by subclasses
574
+ }
575
+ async onEntitySaved(data) {
576
+ // can be overwritten by subclasses
577
+ }
578
+ async onEntityDeleted(data) {
579
+ // can be overwritten by subclasses
580
+ }
581
+ computeUsageMode(data) {
582
+ return this.settings.isUsageMode('FIELD') ? 'FIELD' : 'DESK';
583
+ }
584
+ waitWhilePending(opts) {
585
+ return AppFormUtils.waitWhilePending(this, opts);
586
+ }
587
+ async getValue() {
588
+ const json = await this.getJsonValueToSave();
589
+ const res = new this.dataType();
590
+ res.fromObject(json);
591
+ return res;
592
+ }
593
+ getJsonValueToSave() {
594
+ return Promise.resolve(this.form.value);
595
+ }
596
+ /**
597
+ * Compute the title
598
+ *
599
+ * @param data
600
+ */
601
+ async updateTitle(data) {
602
+ data = data || this.data;
603
+ const title = await this.computeTitle(data);
604
+ this.titleSubject.next(title);
605
+ // If NOT data, then add to page history
606
+ if (!this.isNewData) {
607
+ const page = await this.computePageHistory(title);
608
+ if (page)
609
+ return this.addToPageHistory(page);
610
+ }
611
+ }
612
+ async addToPageHistory(page, opts) {
613
+ if (!page)
614
+ return; // Skip
615
+ return this.settings.addToPageHistory(page, {
616
+ removePathQueryParams: true,
617
+ removeTitleSmallTag: true,
618
+ emitEvent: false,
619
+ ...opts
620
+ });
621
+ }
622
+ async computePageHistory(title) {
623
+ if (this.debug)
624
+ console.debug('[entity-editor] Computing page history, using url: ' + this.router.url);
625
+ return {
626
+ title,
627
+ path: this.router.url
628
+ };
629
+ }
630
+ async removePageHistory(opts) {
631
+ return this.settings.removePageHistory(this.router.url, opts);
632
+ }
633
+ computePageUrl(id) {
634
+ const parentUrl = this.getParentPageUrl();
635
+ return parentUrl && `${parentUrl}/${id}`;
636
+ }
637
+ getParentPageUrl(withQueryParams) {
638
+ let parentUrl = this.defaultBackHref;
639
+ // Remove query params
640
+ if (withQueryParams !== true && parentUrl && parentUrl.indexOf('?') !== -1) {
641
+ parentUrl = parentUrl.substring(0, parentUrl.indexOf('?'));
642
+ }
643
+ return parentUrl;
644
+ }
645
+ listenChanges(id, opts) {
646
+ return this.dataService.listenChanges(this.data.id, {
647
+ // Make sure to skip cache, because NOT the full graph will be fetched by subscription
648
+ // When a changes occur, we call reload() to force refetching the full graph
649
+ fetchPolicy: 'no-cache',
650
+ ...opts
651
+ });
652
+ }
653
+ markForCheck() {
654
+ this.cd?.markForCheck();
655
+ }
656
+ /**
657
+ * Update the route, without reloading the component
658
+ *
659
+ * @param data
660
+ * @param queryParams
661
+ * @protected
662
+ */
663
+ async updateRoute(data, queryParams) {
664
+ const currId = this.route.snapshot.paramMap.get(this.pathIdAttribute);
665
+ const futureId = isNotNil(data.id) ? data.id.toString() : 'new';
666
+ this.queryParams = {
667
+ ...this.queryParams,
668
+ ...queryParams
669
+ };
670
+ if (currId === futureId) {
671
+ // Update queryParam only (not the path)
672
+ if (!equals(this.route.snapshot.queryParams, this.queryParams)) {
673
+ if (this.debug)
674
+ console.debug('[entity-editor] Updating route using queryParams: ', queryParams);
675
+ return await this.router.navigate(['.'], {
676
+ relativeTo: this.route,
677
+ queryParams: this.queryParams,
678
+ state: { animated: false }
679
+ });
680
+ }
681
+ }
682
+ else {
683
+ // Current route was '/new' => change to '/new?id=:id' (to allow CustomReuseStrategy to detect that route can be reused)
684
+ if (currId === 'new') {
685
+ const res = await this.router.navigate(['.'], {
686
+ relativeTo: this.route,
687
+ replaceUrl: true,
688
+ queryParams: {
689
+ ...this.queryParams,
690
+ [this.pathIdAttribute]: futureId
691
+ },
692
+ state: { animated: false }
693
+ });
694
+ if (!res)
695
+ return false;
696
+ }
697
+ const path = this.computePageUrl(isNotNil(data.id) ? data.id : 'new');
698
+ const commands = (path && typeof path === 'string') ? path.split('/').slice(1) : path;
699
+ if (isNotEmptyArray(commands)) {
700
+ if (this.debug)
701
+ console.debug('[entity-editor] Updating route to: ' + path);
702
+ return await this.router.navigate(commands, {
703
+ replaceUrl: true,
704
+ queryParams: this.queryParams,
705
+ state: { animated: false }
706
+ });
707
+ }
708
+ return Promise.reject('Missing page URL');
709
+ }
710
+ }
711
+ /* -- private functions -- */
712
+ /**
713
+ * Open the first tab that is invalid
714
+ */
715
+ openFirstInvalidTab() {
716
+ const invalidTabIndex = this.getFirstInvalidTabIndex();
717
+ if (invalidTabIndex !== -1 && this.selectedTabIndex !== invalidTabIndex) {
718
+ this.selectedTabIndex = invalidTabIndex;
719
+ this.markForCheck();
720
+ }
721
+ }
722
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: AppEntityEditor, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
723
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.1", type: AppEntityEditor, usesInheritance: true, ngImport: i0 });
724
+ }
725
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: AppEntityEditor, decorators: [{
726
+ type: Directive
727
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: undefined }, { type: undefined }, { type: AppEditorOptions, decorators: [{
728
+ type: Optional
729
+ }] }] });
730
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWVkaXRvci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9mb3JtL2VudGl0eS9lbnRpdHktZWRpdG9yLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBK0IsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pJLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUF5QixNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBMkIsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN0RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBaUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLGVBQWUs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QWUsRUFBRSxDQUFDO1lBQ3hFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQUM7WUFDeEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO3VHQWp6Qm1CLGVBQWU7MkZBQWYsZUFBZTs7MkZBQWYsZUFBZTtrQkFGcEMsU0FBUzs7MEJBaUZMLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyLCBJb25Sb3V0ZXJPdXRsZXQsIE5hdkNvbnRyb2xsZXIsIFRvYXN0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpc01vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBBZGRUb1BhZ2VIaXN0b3J5T3B0aW9ucywgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBtYXBUbywgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgVXNhZ2VNb2RlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvc2V0dGluZ3MubW9kZWwnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQXBwVGFiRWRpdG9yLCBBcHBUYWJFZGl0b3JPcHRpb25zLCBJQXBwVGFiRWRpdG9yIH0gZnJvbSAnLi9lZGl0b3IuY2xhc3MnO1xuaW1wb3J0IHsgQXBwRm9ybVV0aWxzIH0gZnJvbSAnLi4vZm9ybS51dGlscyc7XG5pbXBvcnQgeyBBbGVydHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvYWxlcnRzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFNlcnZlckVycm9yQ29kZXMgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lcnJvcnMnO1xuaW1wb3J0IHsgZXF1YWxzLCBpc0ludCwgaXNOaWwsIGlzTmlsT3JCbGFuaywgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbCwgaXNOb3ROaWxPckJsYW5rLCB0b0Jvb2xlYW4sIHRvTnVtYmVyIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBFbnRpdHlTZXJ2aWNlTG9hZE9wdGlvbnMsIElFbnRpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IERhdGVGb3JtYXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3BpcGVzL2RhdGUtZm9ybWF0LnBpcGUnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IEhpc3RvcnlQYWdlUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvaGlzdG9yeS5tb2RlbCc7XG5pbXBvcnQgeyBmaXJzdEZhbHNlLCB3YWl0Rm9yRmFsc2UsIFdhaXRGb3JPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL29ic2VydmFibGVzJztcbmltcG9ydCB7IEZvcm1FcnJvclRyYW5zbGF0b3IgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdmFsaWRhdG9yL2Zvcm0tZXJyb3ItYWRhcHRlci5jbGFzcyc7XG5pbXBvcnQgeyBGb3JtRXJyb3JzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Zvcm1zJztcbmltcG9ydCB7IGlzU3RhcnRhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zdGFydGFibGUtc2VydmljZS5jbGFzcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFwcEVudGl0eUVkaXRvciBleHRlbmRzIElBcHBUYWJFZGl0b3Ige1xuICB1c2FnZU1vZGU6IFVzYWdlTW9kZTtcbiAgaXNOZXdEYXRhOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgQXBwRWRpdG9yT3B0aW9ucyBleHRlbmRzIEFwcFRhYkVkaXRvck9wdGlvbnMge1xuICBhdXRvTG9hZD86IGJvb2xlYW47XG4gIGF1dG9Mb2FkRGVsYXk/OiBudW1iZXI7XG4gIHBhdGhJZEF0dHJpYnV0ZT86IHN0cmluZztcbiAgZW5hYmxlTGlzdGVuQ2hhbmdlcz86IGJvb2xlYW47XG4gIGxpc3RlbkludGVydmFsSW5TZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDaGFuZ2UgcGFnZSByb3V0ZSAod2luZG93IFVSTCkgd2hlbiBzYXZpbmcgZm9yIHRoZSBmaXJzdCB0aW1lXG4gICAqL1xuICBhdXRvVXBkYXRlUm91dGU/OiBib29sZWFuOyAvLyBEZWZhdWx0IHRvIHRydWVcblxuICAvKipcbiAgICogT3BlbiB0aGUgbmV4dCB0YWIsIGFmdGVyIHNhdmluZyBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICovXG4gIGF1dG9PcGVuTmV4dFRhYj86IGJvb2xlYW47IC8vIERlZmF1bHQgdG8gdHJ1ZVxuXG4gIGkxOG5QcmVmaXg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwRXJyb3Ige1xuICBjb2RlPzogbnVtYmVyO1xuICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwRXJyb3JXaXRoRGV0YWlscyBleHRlbmRzIEFwcEVycm9yIHtcbiAgZGV0YWlsczogQXBwRXJyb3IgJiB7ZXJyb3JzPzogRm9ybUVycm9yc307XG59XG5cbi8vIEBkeW5hbWljXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFwcEVudGl0eUVkaXRvcjxcbiAgVCBleHRlbmRzIEVudGl0eTxULCBJRD4sXG4gIFMgZXh0ZW5kcyBJRW50aXR5U2VydmljZTxULCBJRD4gPSBJRW50aXR5U2VydmljZTxULCBhbnk+LFxuICBJRCA9IG51bWJlcixcbiAgTE8gZXh0ZW5kcyBFbnRpdHlTZXJ2aWNlTG9hZE9wdGlvbnMgPSBFbnRpdHlTZXJ2aWNlTG9hZE9wdGlvbnNcbiAgPlxuICBleHRlbmRzIEFwcFRhYkVkaXRvcjxULCBJRCwgTE8+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIElBcHBFbnRpdHlFZGl0b3Ige1xuXG4gIGRhdGE6IFQ7XG4gIGRlZmF1bHRCYWNrSHJlZjogc3RyaW5nO1xuICBoaXN0b3J5SWNvbjoge2ljb24/OiBzdHJpbmc7IG1hdEljb24/OiBzdHJpbmcgfTtcblxuICByZWFkb25seSB0aXRsZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgb25VcGRhdGVWaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIC8qKlxuICAgKiAgQGRlcHJlY2F0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgJHRpdGxlKCk6IFN1YmplY3Q8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGl0bGVTdWJqZWN0O1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGVGb3JtYXQ6IERhdGVGb3JtYXRTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm91dGVyT3V0bGV0OiBJb25Sb3V0ZXJPdXRsZXQ7XG4gIHByb3RlY3RlZCBlcnJvclRyYW5zbGF0b3I6IEZvcm1FcnJvclRyYW5zbGF0b3I7XG5cbiAgcHJpdmF0ZSBfdXNhZ2VNb2RlOiBVc2FnZU1vZGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2VuYWJsZUxpc3RlbkNoYW5nZXM6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xpc3RlbkludGVydmFsSW5TZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhdGhJZEF0dHJpYnV0ZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hdXRvTG9hZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYXV0b0xvYWREZWxheTogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hdXRvVXBkYXRlUm91dGU6IGJvb2xlYW47XG4gIHByaXZhdGUgX2F1dG9PcGVuTmV4dFRhYjogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGdldCB1c2FnZU1vZGUoKTogVXNhZ2VNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fdXNhZ2VNb2RlO1xuICB9XG5cbiAgc2V0IHVzYWdlTW9kZSh2YWx1ZTogVXNhZ2VNb2RlKSB7XG4gICAgaWYgKHRoaXMuX3VzYWdlTW9kZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3VzYWdlTW9kZSA9IHZhbHVlO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNPbkZpZWxkTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5pc09uRmllbGRNb2RlKHRoaXMuX3VzYWdlTW9kZSk7XG4gIH1cblxuICBnZXQgaXNOZXdEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05pbCh0aGlzLmRhdGE/LmlkKTtcbiAgfVxuXG4gIGdldCBzZXJ2aWNlKCk6IFMge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlO1xuICB9XG5cbiAgZ2V0IGF1dG9PcGVuTmV4dFRhYigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0b09wZW5OZXh0VGFiO1xuICB9XG5cbiAgc2V0IGF1dG9PcGVuTmV4dFRhYih2YWx1ZTogYm9vbGVhbil7XG4gICAgdGhpcy5fYXV0b09wZW5OZXh0VGFiID0gdmFsdWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHBhdGhJZEF0dHJpYnV0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXRoSWRBdHRyaWJ1dGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCBkYXRhVHlwZTogbmV3KCkgPT4gVCxcbiAgICBwcm90ZWN0ZWQgZGF0YVNlcnZpY2U/OiBTLFxuICAgIEBPcHRpb25hbCgpIG9wdGlvbnM/OiBBcHBFZGl0b3JPcHRpb25zXG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yLmdldChBY3RpdmF0ZWRSb3V0ZSksXG4gICAgICBpbmplY3Rvci5nZXQoUm91dGVyKSxcbiAgICAgIGluamVjdG9yLmdldChOYXZDb250cm9sbGVyKSxcbiAgICAgIGluamVjdG9yLmdldChBbGVydENvbnRyb2xsZXIpLFxuICAgICAgaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLFxuICAgICAgb3B0aW9ucyk7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IGluamVjdG9yLmdldChFTlZJUk9OTUVOVCk7XG4gICAgb3B0aW9ucyA9IDxBcHBFZGl0b3JPcHRpb25zPntcbiAgICAgIC8vIERlZmF1bHQgb3B0aW9uc1xuICAgICAgZW5hYmxlTGlzdGVuQ2hhbmdlczogdGhpcy5lbnZpcm9ubWVudC5lbnRpdHlFZGl0b3I/LmVuYWJsZUxpc3RlbkNoYW5nZXMgfHwgZmFsc2UsIC8vIEZhbHNlICBieSBkZWZhdWx0XG4gICAgICBsaXN0ZW5JbnRlcnZhbEluU2Vjb25kczogdG9OdW1iZXIodGhpcy5lbnZpcm9ubWVudC5lbnRpdHlFZGl0b3I/Lmxpc3RlbkludGVydmFsSW5TZWNvbmRzLCAwKSwgLy8gbm8gdGltZXIgYnkgZGVmYXVsdFxuICAgICAgcGF0aElkQXR0cmlidXRlOiAnaWQnLFxuICAgICAgYXV0b0xvYWQ6IHRydWUsXG4gICAgICBhdXRvVXBkYXRlUm91dGU6IHRydWUsXG4gICAgICBpMThuUHJlZml4OiAnJyxcblxuICAgICAgLy8gRm9sbG93aW5nIG9wdGlvbnMgYXJlIG92ZXJyaWRlIGluc2lkZSBuZ09uSW5pdCgpXG4gICAgICAvLyBhdXRvT3Blbk5leHRUYWI6IC4uLixcblxuICAgICAgLy8gT3ZlcnJpZGUgZGVmYXVsdHNcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9O1xuXG4gICAgdGhpcy5zZXR0aW5ncyA9IGluamVjdG9yLmdldChMb2NhbFNldHRpbmdzU2VydmljZSk7XG4gICAgdGhpcy5lcnJvclRyYW5zbGF0b3IgPSBpbmplY3Rvci5nZXQoRm9ybUVycm9yVHJhbnNsYXRvcik7XG4gICAgdGhpcy5yb3V0ZXJPdXRsZXQgPSBpbmplY3Rvci5nZXQoSW9uUm91dGVyT3V0bGV0KTtcbiAgICB0aGlzLmNkID0gaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICB0aGlzLmRhdGVGb3JtYXQgPSBpbmplY3Rvci5nZXQoRGF0ZUZvcm1hdFNlcnZpY2UpO1xuICAgIHRoaXMudG9hc3RDb250cm9sbGVyID0gaW5qZWN0b3IuZ2V0KFRvYXN0Q29udHJvbGxlcik7XG4gICAgdGhpcy5fZW5hYmxlTGlzdGVuQ2hhbmdlcyA9IG9wdGlvbnMuZW5hYmxlTGlzdGVuQ2hhbmdlcztcbiAgICB0aGlzLl9saXN0ZW5JbnRlcnZhbEluU2Vjb25kcyA9IG9wdGlvbnMubGlzdGVuSW50ZXJ2YWxJblNlY29uZHM7XG4gICAgdGhpcy5fcGF0aElkQXR0cmlidXRlID0gb3B0aW9ucy5wYXRoSWRBdHRyaWJ1dGU7XG4gICAgdGhpcy5fYXV0b0xvYWQgPSBvcHRpb25zLmF1dG9Mb2FkO1xuICAgIHRoaXMuX2F1dG9Mb2FkRGVsYXkgPSBvcHRpb25zLmF1dG9Mb2FkRGVsYXk7XG4gICAgdGhpcy5fYXV0b1VwZGF0ZVJvdXRlID0gb3B0aW9ucy5hdXRvVXBkYXRlUm91dGU7XG4gICAgdGhpcy5fYXV0b09wZW5OZXh0VGFiID0gb3B0aW9ucy5hdXRvT3Blbk5leHRUYWI7XG4gICAgdGhpcy5pMThuQ29udGV4dCA9IHtcbiAgICAgIHByZWZpeDogb3B0aW9ucy5pMThuUHJlZml4LFxuICAgICAgc3VmZml4OiAnJ1xuICAgIH07XG5cbiAgICAvLyBGT1IgREVWIE9OTFkgLS0tLVxuICAgIC8vdGhpcy5kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIC8vIERlZmF1bHRzXG4gICAgdGhpcy5fYXV0b09wZW5OZXh0VGFiID0gdG9Cb29sZWFuKHRoaXMuX2F1dG9PcGVuTmV4dFRhYiwgIXRoaXMuaXNPbkZpZWxkTW9kZSk7XG4gICAgdGhpcy5oaXN0b3J5SWNvbiA9IHRoaXMuaGlzdG9yeUljb24gfHwge2ljb246ICdsaXN0J307XG5cbiAgICAvLyBSZWdpc3RlciBmb3Jtc1xuICAgIHRoaXMucmVnaXN0ZXJGb3JtcygpO1xuXG4gICAgLy8gRGlzYWJsZSBwYWdlLCBkdXJpbmcgbG9hZFxuICAgIHRoaXMuZGlzYWJsZSgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuXG4gICAgLy8gTG9hZCBkYXRhXG4gICAgaWYgKHRoaXMuX2F1dG9Mb2FkKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubG9hZEZyb21Sb3V0ZSgpLCB0aGlzLl9hdXRvTG9hZERlbGF5KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMudGl0bGVTdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgdGhpcy50aXRsZVN1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uVXBkYXRlVmlldy5jb21wbGV0ZSgpO1xuICAgIHRoaXMub25VcGRhdGVWaWV3LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zYXZpbmdTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB3YWl0SWRsZShvcHRzPzogV2FpdEZvck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBXYWl0IGVuZCBvZiBzYXZpbmdcbiAgICBpZiAodGhpcy5zYXZpbmcpIHJldHVybiB3YWl0Rm9yRmFsc2UodGhpcy5zYXZpbmdTdWJqZWN0KTtcblxuICAgIHJldHVybiBzdXBlci53YWl0SWRsZShvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGRhdGEgZnJvbSBpZCwgdXNpbmcgdGhlIGRhdGFTZXJ2aWNlXG4gICAqXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgYXN5bmMgbG9hZChpZD86IElELCBvcHRzPzogRW50aXR5U2VydmljZUxvYWRPcHRpb25zICYge1xuICAgIGVtaXRFdmVudD86IGJvb2xlYW47XG4gICAgb3BlblRhYkluZGV4PzogbnVtYmVyO1xuICAgIHVwZGF0ZVJvdXRlPzogYm9vbGVhbjtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIH0pIHtcbiAgICBpZiAoIXRoaXMuZGF0YVNlcnZpY2UpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGxvYWQgZGF0YTogbWlzc2luZyBcXCdkYXRhU2VydmljZVxcJyEnKTtcblxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuXG4gICAgLy8gTmV3IGRhdGFcbiAgICBpZiAoaXNOaWwoaWQpKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDcmVhdGUgdXNpbmcgZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyB0aGlzLmRhdGFUeXBlKCk7XG4gICAgICAgIHRoaXMuX3VzYWdlTW9kZSA9IHRoaXMuY29tcHV0ZVVzYWdlTW9kZShkYXRhKTtcbiAgICAgICAgYXdhaXQgdGhpcy5vbk5ld0VudGl0eShkYXRhLCBvcHRzKTtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVWaWV3KGRhdGEsIHtcbiAgICAgICAgICBvcGVuVGFiSW5kZXg6IDAsXG4gICAgICAgICAgLi4ub3B0c1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5zZXRFcnJvcihlcnIsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IDA7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2FkIGV4aXN0aW5nIGRhdGFcbiAgICBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmRhdGFTZXJ2aWNlLmxvYWQoaWQsIG9wdHMpO1xuICAgICAgICBpZiAoIWRhdGEpIHRocm93IHtjb2RlOiBFcnJvckNvZGVzLkRBVEFfTk9UX0ZPVU5EX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuREFUQV9OT19GT1VORCd9O1xuICAgICAgICB0aGlzLl91c2FnZU1vZGUgPSB0aGlzLmNvbXB1dGVVc2FnZU1vZGUoZGF0YSk7XG4gICAgICAgIGF3YWl0IHRoaXMub25FbnRpdHlMb2FkZWQoZGF0YSwgb3B0cyk7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVmlldyhkYXRhLCBvcHRzKTtcbiAgICAgICAgdGhpcy5zdGFydExpc3RlbkNoYW5nZXMoKTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5zZXRFcnJvcihlcnIpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSAwO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7XG4gICAgICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FuVXNlcldyaXRlKGRhdGE6IFQsIG9wdHM/OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5jYW5Vc2VyV3JpdGUoZGF0YSwgb3B0cyk7XG4gIH1cblxuICBzdGFydExpc3RlbkNoYW5nZXMoKSB7XG4gICAgLy8gU2tpcCBpZiBkaXNhYmxlZCwgb3IgYWxyZWFkeSBsaXN0ZW5pbmdcbiAgICBpZiAodGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbiB8fCAhdGhpcy5fZW5hYmxlTGlzdGVuQ2hhbmdlcykgcmV0dXJuO1xuICAgIC8vIFNraXAgaWYgbmV3IChub3RoaW5nIHRvIGxpc3RlbilcbiAgICBpZiAodGhpcy5pc05ld0RhdGEpIHJldHVybjtcblxuICAgIC8vIExpc3RlbiBmb3IgY2hhbmdlcyBvbiBzZXJ2ZXJcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbkNoYW5nZXModGhpcy5kYXRhLmlkLCB7XG4gICAgICBpbnRlcnZhbDogdGhpcy5fbGlzdGVuSW50ZXJ2YWxJblNlY29uZHNcbiAgICB9KT8ucGlwZShcbiAgICAgICAgZmlsdGVyKGlzTm90TmlsKSxcbiAgICAgICAgbWVyZ2VNYXAoKGRhdGEpID0+IHRoaXMuc2F2aW5nXG4gICAgICAgICAgLy8gSWYgc2F2aW5nLCB3YWl0IGVuZCwgdG8gYXZvaWQgdG8gZGV0ZWN0IHNlbGYgY2hhbmdlc1xuICAgICAgICAgID8gZmlyc3RGYWxzZSh0aGlzLnNhdmluZ1N1YmplY3QpLnBpcGUobWFwVG8oZGF0YSksIGRlYm91bmNlVGltZSg1MDApKVxuICAgICAgICAgIDogb2YoZGF0YSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBUKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzTmV3ZXIgPSBpc01vbWVudChkYXRhLnVwZGF0ZURhdGUpICYmICghdGhpcy5kYXRhLnVwZGF0ZURhdGUgfHwgZGF0YS51cGRhdGVEYXRlLmlzQWZ0ZXIodGhpcy5kYXRhLnVwZGF0ZURhdGUpKTtcbiAgICAgICAgaWYgKCFpc05ld2VyKSByZXR1cm47IC8vIFNraXBcblxuICAgICAgICAvLyBFZGl0b3IgaGFzIG5vIGNoYW5nZXM6IHJlbG9hZFxuICAgICAgICBpZiAoIXRoaXMuZGlydHkpIHtcbiAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2RhdGEtZWRpdG9yXSBDaGFuZ2VzIGRldGVjdGVkIG9uIHNlcnZlciwgYXQgeyR7ZGF0YS51cGRhdGVEYXRlfX06IHJlbG9hZGluZyBwYWdlLi4uYCk7XG4gICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYW5ub3QgcmVsb2FkOiBhbGVydCB0aGUgdXNlclxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2RhdGEtZWRpdG9yXSBDaGFuZ2VzIGRldGVjdGVkIG9uIHNlcnZlciwgYXQgeyR7ZGF0YS51cGRhdGVEYXRlfX0sIGJ1dCBwYWdlIGlzIGRpcnR5OiBza2lwIHJlbG9hZGluZy5gKTtcbiAgICAgICAgICB0aGlzLnNob3dUb2FzdCh7bWVzc2FnZTogJ0VSUk9SLkRBVEFfVVBEQVRFX0RBVEVfQ0hBTkdFRCcsIHR5cGU6ICd3YXJuaW5nJywgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gUmVnaXN0ZXIgc3Vic2NyaXB0aW9uXG4gICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbjtcbiAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24odGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbik7XG4gICAgICBzdWJzY3JpcHRpb24uYWRkKCgpID0+IHtcbiAgICAgICAgdGhpcy51bnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIHRoaXMuX2xpc3RlbkNoYW5nZXNTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc3RvcExpc3RlbkNoYW5nZXMoKXtcbiAgICB0aGlzLl9saXN0ZW5DaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgYXN5bmMgcmVhZHkob3B0cz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIucmVhZHkob3B0cyk7XG5cbiAgICAvLyBXYWl0IHNlcnZpY2UgdG8gYmUgcmVhZHlcbiAgICBpZiAoaXNTdGFydGFibGVTZXJ2aWNlKHRoaXMuZGF0YVNlcnZpY2UpKSB7XG4gICAgICBhd2FpdCB0aGlzLmRhdGFTZXJ2aWNlLnJlYWR5KCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlVmlldyhkYXRhOiBUIHwgbnVsbCwgb3B0cz86IHtcbiAgICBlbWl0RXZlbnQ/OiBib29sZWFuO1xuICAgIG9wZW5UYWJJbmRleD86IG51bWJlcjtcbiAgICB1cGRhdGVSb3V0ZT86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpZENoYW5nZWQgPSBpc05vdE5pbChkYXRhLmlkKVxuICAgICAgJiYgdGhpcy5wcmV2aW91c0RhdGFJZCAhPT0gdW5kZWZpbmVkIC8vIElnbm9yZSBpZiBmaXJzdCBsb2FkaW5nICg9dW5kZWZpbmVkKVxuICAgICAgJiYgdGhpcy5wcmV2aW91c0RhdGFJZCAhPT0gZGF0YS5pZDtcblxuICAgIG9wdHMgPSB7XG4gICAgICB1cGRhdGVSb3V0ZTogdGhpcy5fYXV0b1VwZGF0ZVJvdXRlICYmIGlkQ2hhbmdlZCAmJiAhdGhpcy5sb2FkaW5nLFxuICAgICAgLi4ub3B0c1xuICAgIH07XG5cbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucHJldmlvdXNEYXRhSWQgPSBkYXRhLmlkIHx8IG51bGw7XG5cbiAgICBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgYXdhaXQgdGhpcy5zZXRWYWx1ZShkYXRhKTtcblxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgIHRoaXMubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXdTdGF0ZShkYXRhKTtcblxuICAgICAgLy8gTmVlZCB0byB1cGRhdGUgcm91dGVcbiAgICAgIGlmIChvcHRzLnVwZGF0ZVJvdXRlID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVGFiQW5kUm91dGUoZGF0YSwgb3B0cylcbiAgICAgICAgICAvLyBVcGRhdGUgdGhlIHRpdGxlIC0gc2hvdWxkIGJlIGV4ZWN1dGVkIEFGVEVSIHVwZGF0ZVJvdXRlIGJlY2F1c2Ugb2YgcGF0aCBjaGFuZ2UgLSBmaXggIzE4NVxuICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMudXBkYXRlVGl0bGUoZGF0YSkpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgbmV4dCB0YWJcbiAgICAgICAgdGhpcy51cGRhdGVUYWJJbmRleChvcHRzLm9wZW5UYWJJbmRleCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSB0aXRsZS5cbiAgICAgICAgdGhpcy51cGRhdGVUaXRsZShkYXRhKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vblVwZGF0ZVZpZXcuZW1pdChkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIG9yIGRpc2FibGUgc3RhdGVcbiAgICovXG4gIHVwZGF0ZVZpZXdTdGF0ZShkYXRhOiBULCBvcHRzPzoge29ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuaXNOZXdEYXRhIHx8IHRoaXMuY2FuVXNlcldyaXRlKGRhdGEpKSB7XG4gICAgICB0aGlzLmVuYWJsZShvcHRzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGUob3B0cyk7XG5cbiAgICAgIC8vIEFsbG93IHRvIHNvcnQgdGFibGVcbiAgICAgIHRoaXMudGFibGVzPy5mb3JFYWNoKHQgPT4gdC5lbmFibGVTb3J0KCkpO1xuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgcm91dGUgbG9jYXRpb24sIGFuZCBvcGVuIHRoZSBuZXh0IHRhYlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlVGFiQW5kUm91dGUoZGF0YTogVCwgb3B0cz86IHtcbiAgICBvcGVuVGFiSW5kZXg/OiBudW1iZXI7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHsuLi50aGlzLnF1ZXJ5UGFyYW1zfTtcblxuICAgIC8vIE9wZW4gdGhlIG5leHQgdGFiXG4gICAgdGhpcy51cGRhdGVUYWJJbmRleChvcHRzICYmIG9wdHMub3BlblRhYkluZGV4KTtcblxuICAgIGlmICghdGhpcy5xdWVyeVRhYkluZGV4UGFyYW1OYW1lIHx8ICF0aGlzLnJvdXRlKSByZXR1cm47IC8vIFNraXAgcm91dGUgdXBkYXRlXG5cbiAgICAvLyBVcGRhdGUgcm91dGUgbG9jYXRpb25cbiAgICBxdWVyeVBhcmFtc1t0aGlzLnF1ZXJ5VGFiSW5kZXhQYXJhbU5hbWVdID0gdGhpcy5zZWxlY3RlZFRhYkluZGV4ICE9PSAwID8gdGhpcy5zZWxlY3RlZFRhYkluZGV4IDogdW5kZWZpbmVkO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlUm91dGUoZGF0YSwgcXVlcnlQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgcm91dGUgbG9jYXRpb24sIGFuZCBvcGVuIHRoZSBuZXh0IHRhYlxuICAgKi9cbiAgdXBkYXRlVGFiSW5kZXgodGFiSW5kZXg/OiBudW1iZXIpIHtcbiAgICBpZiAoaXNOb3ROaWwodGFiSW5kZXgpICYmIHRhYkluZGV4ID49IDAgJiYgdGFiSW5kZXggIT09IHRoaXMuc2VsZWN0ZWRUYWJJbmRleCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gdGFiSW5kZXg7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmVBbmRDbG9zZShldmVudDogRXZlbnQsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblxuICAgIGNvbnN0IHNhdmVkID0gYXdhaXQgdGhpcy5zYXZlKGV2ZW50KTtcbiAgICBpZiAoc2F2ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gc2F2ZWQ7XG4gIH1cblxuICBhc3luYyBjbG9zZShldmVudDogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdvQmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIGVkaXRvciwgYnkgY2FsbGluZyB0aGUgZGF0YVNlcnZpY2Uuc2F2ZSgpLlxuICAgKiBFbnN1cmUgdGhhdCBlZGl0b3IgaWYgdmFsaWQuIElmIG5vdCwgZGlzcGxheSBhbiBlcnJvclxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIGFzeW5jIHNhdmUoZXZlbnQ/OiBFdmVudCwgb3B0cz86IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmxvYWRpbmcgfHwgdGhpcy5zYXZpbmcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tkYXRhLWVkaXRvcl0gU2tpcCBzYXZlOiBlZGl0b3IgaXMgYnVzeSAobG9hZGluZyBvciBzYXZpbmcpJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5kaXJ0eSkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2RhdGEtZWRpdG9yXSBTa2lwIHNhdmU6IGVkaXRvciBub3QgZGlydHknKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFdhaXQgZW5kIG9mIGFzeW5jIHZhbGlkYXRpb25cbiAgICBhd2FpdCB0aGlzLndhaXRXaGlsZVBlbmRpbmcoKTtcblxuICAgIC8vIElmIGludmFsaWRcbiAgICBpZiAodGhpcy5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmxvZ0Zvcm1FcnJvcnMoKTtcbiAgICAgIHRoaXMub3BlbkZpcnN0SW52YWxpZFRhYigpO1xuICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkKCk7XG5cbiAgICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcmtBc1NhdmluZygpO1xuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuXG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1tkYXRhLWVkaXRvcl0gU2F2aW5nIGRhdGEuLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDb21wdXRlIG5leHQgdGFiIGluZGV4IChpZiBlbmFibGUpXG4gICAgICBjb25zdCBuZXh0VGFiSW5kZXggPSB0aGlzLl9hdXRvT3Blbk5leHRUYWIgJiYgaXNOaWwodGhpcy5wcmV2aW91c0RhdGFJZCkgJiYgdGhpcy5jb21wdXRlTmV4dFRhYkluZGV4KCk7XG5cbiAgICAgIC8vIFNhdmUgYWxsIGRpcnR5IHRhYmxlc1xuICAgICAgY29uc3Qgc2F2ZWQgPSBhd2FpdCB0aGlzLnNhdmVEaXJ0eUNoaWxkcmVuKCk7XG4gICAgICBpZiAoIXNhdmVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEdldCBkYXRhXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5nZXRWYWx1ZSgpO1xuXG4gICAgICB0aGlzLmRpc2FibGUoKTtcblxuICAgICAgLy8gU2F2ZSBmb3JtXG4gICAgICBjb25zdCB1cGRhdGVkRGF0YSA9IGF3YWl0IHRoaXMuZGF0YVNlcnZpY2Uuc2F2ZShkYXRhLCBvcHRzKTtcblxuICAgICAgYXdhaXQgdGhpcy5vbkVudGl0eVNhdmVkKHVwZGF0ZWREYXRhKTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSB2aWV3IChlLmcgbWV0YWRhdGEpXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVZpZXcodXBkYXRlZERhdGEsIHtcbiAgICAgICAgLy8gT3BlbiBuZXh0IHRhYiBvbmx5IGlmIHVzZXIgaGFzIG5vdCBjaGFuZ2VkIGl0XG4gICAgICAgIG9wZW5UYWJJbmRleDogbmV4dFRhYkluZGV4ID4gdGhpcy5fc2VsZWN0ZWRUYWJJbmRleCA/IG5leHRUYWJJbmRleCA6IHVuZGVmaW5lZCxcbiAgICAgICAgLi4ub3B0c1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFN1YnNjcmliZSB0byByZW1vdGUgY2hhbmdlc1xuICAgICAgaWYgKCF0aGlzLl9saXN0ZW5DaGFuZ2VzU3Vic2NyaXB0aW9uKSB0aGlzLnN0YXJ0TGlzdGVuQ2hhbmdlcygpO1xuXG4gICAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IDA7IC8vIENhbiBiZSBvdmVycmlkZSBieSBzdWJjbGFzc2VzLCB1c2luZyBzZXRFcnJvcigpXG4gICAgICB0aGlzLnNldEVycm9yKGVycik7XG4gICAgICB0aGlzLnNjcm9sbFRvVG9wKCk7IC8vIFNjcm9sbCB0byB0b3AgKHRvIHNob3cgZXJyb3IpXG4gICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLmVuYWJsZSgpO1xuXG4gICAgICAvLyBDb25jdXJyZW50IGNoYW5nZSBvbiBwb2RcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gU2VydmVyRXJyb3JDb2Rlcy5CQURfVVBEQVRFX0RBVEUgJiYgaXNOb3ROaWwodGhpcy5kYXRhLmlkKSkge1xuICAgICAgICAvLyBDYWxsIGEgZGF0YSByZWxvYWQgKGluIGJhY2tncm91bmQpLCB0byB1cGRhdGUgdGhlIEdyYXBoUUwgY2FjaGUsIGFuZCBhbGxvdyB0byBjYW5jZWwgY2hhbmdlc1xuICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLmxvYWQodGhpcy5kYXRhLmlkLCB7ZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5kZWJ1ZygnW2RhdGEtZWRpdG9yXSBEYXRhIGNhY2hlIHJlbG9hZGVkLiBVc2VyIGNhbiByZWxvYWQgcGFnZScpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtBc1NhdmVkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgZGF0YSAoaWYgZGlydHkgYW5kIHZhbGlkKSwgYW5kIHJldHVybiBpdC4gT3RoZXJ3aXNlLCByZXR1cm4gbmlsIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgc2F2ZUFuZEdldERhdGFJZlZhbGlkKCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIEZvcm0gaXMgbm90IHZhbGlkXG4gICAgaWYgKCF0aGlzLnZhbGlkKSB7XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB2YWxpZGF0aW9uIGlzIGZpbmlzaGVkXG4gICAgICBhd2FpdCBBcHBGb3JtVXRpbHMud2FpdFdoaWxlUGVuZGluZyh0aGlzKTtcblxuICAgICAgLy8gSWYgaW52YWxpZDogT3BlbiB0aGUgZmlyc3QgdGFiIGluIGVycm9yXG4gICAgICBpZiAodGhpcy5pbnZhbGlkKSB7XG4gICAgICAgIHRoaXMub3BlbkZpcnN0SW52YWxpZFRhYigpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDb250aW51ZSAodmFsaWQpXG4gICAgfVxuXG4gICAgLy8gRm9ybSBpcyB2YWxpZCwgYnV0IG5vdCBzYXZlZFxuICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICBjb25zdCBzYXZlZCA9IGF3YWl0IHRoaXMuc2F2ZShuZXcgRXZlbnQoJ3NhdmUnKSk7XG4gICAgICBpZiAoIXNhdmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFZhbGlkIGFuZCBzYXZlZCBkYXRhXG4gICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShldmVudD86IEV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMubG9hZGluZyB8fCB0aGlzLnNhdmluZykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gQXNrIHVzZXIgY29uZmlybWF0aW9uXG4gICAgY29uc3QgY29uZmlybWF0aW9uID0gYXdhaXQgQWxlcnRzLmFza0RlbGV0ZUNvbmZpcm1hdGlvbih0aGlzLmFsZXJ0Q3RybCwgdGhpcy50cmFuc2xhdGUpO1xuICAgIGlmICghY29uZmlybWF0aW9uKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmRlYnVnKCdbZGF0YS1lZGl0b3JdIEFza2luZyB0byBkZWxldGUuLi4nKTtcblxuICAgIHRoaXMubWFya0FzU2F2aW5nKCk7XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gR2V0IGRhdGFcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmdldFZhbHVlKCk7XG4gICAgICBjb25zdCBpc05ldyA9IHRoaXMuaXNOZXdEYXRhO1xuXG4gICAgICB0aGlzLmRpc2FibGUoKTtcblxuICAgICAgaWYgKCFpc05ldykge1xuICAgICAgICBhd2FpdCB0aGlzLmRhdGFTZXJ2aWNlLmRlbGV0ZShkYXRhKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5vbkVudGl0eURlbGV0ZWQoZGF0YSk7XG5cbiAgICAgIC8vIFJlbW92ZSBwYWdlIGhpc3RvcnlcbiAgICAgIHRoaXMucmVtb3ZlUGFnZUhpc3RvcnkoKTtcblxuXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSAwO1xuICAgICAgdGhpcy5zZXRFcnJvcihlcnIpO1xuICAgICAgdGhpcy5tYXJrQXNTYXZlZCgpO1xuICAgICAgdGhpcy5lbmFibGUoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBXYWl0LCB0aGVuIGdvIGJhY2sgKHdhaXQgaXMgbmVlZCBpbiBvcmRlciB0byB1cGRhdGUgYmFjayBocmVmIGlzIG5lZWQpXG4gICAgYXdhaXQgc2V0VGltZW91dCgoKSA9PiB0aGlzLmdvQmFjaygpLCA1MDApO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyByZWxvYWQoKSB7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG4gICAgYXdhaXQgdGhpcy5sb2FkKHRoaXMuZGF0YT8uaWQsIHtmZXRjaFBvbGljeTogJ25ldHdvcmstb25seSd9KTtcbiAgfVxuXG4gIGFzeW5jIHVubG9hZChvcHRzPzoge2VtaXRFdmVudD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLnVubG9hZChvcHRzKTtcbiAgICB0aGlzLnN0b3BMaXN0ZW5DaGFuZ2VzKCk7XG4gICAgdGhpcy5mb3JtLnJlc2V0KCk7XG4gICAgdGhpcy5yZWdpc3RlckZvcm1zKCk7XG4gICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICAvLyBUT0RPOiBmaW5kIGEgd2F5IHRvIHJlbW92ZSBjdXJyZW50IHBhZ2UgZnJvbSB0aGUgbmF2aWdhdGlvbiBoaXN0b3J5XG4gIH1cblxuICBhc3luYyBnb0JhY2soZXZlbnQ/OiBFdmVudCk6IFByb21pc2U8dm9pZCB8IGJvb2xlYW4+IHtcbiAgICAvLyBHbyBiYWNrXG4gICAgaWYgKHRoaXMudG9vbGJhcj8uY2FuR29CYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy50b29sYmFyLmdvQmFjaygpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLmRlZmF1bHRCYWNrSHJlZikge1xuICAgICAgcmV0dXJuIHRoaXMubmF2Q29udHJvbGxlci5uYXZpZ2F0ZUJhY2sodGhpcy5kZWZhdWx0QmFja0hyZWYpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCYWNrIHRvIGhvbWVcbiAgICAgIHJldHVybiB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVCYWNrKCcvJyk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRFcnJvcihvcHRzPzoge2VtaXRFdmVudD86IGJvb2xlYW59KSB7XG4gICAgc3VwZXIucmVzZXRFcnJvcihvcHRzKTtcbiAgfVxuXG4gIHNldEVycm9yKGVycjogc3RyaW5nIHwgQXBwRXJyb3JXaXRoRGV0YWlscywgb3B0cz86IHtlbWl0RXZlbnQ/OiBib29sZWFuOyBkZXRhaWxzQ3NzQ2xhc3M/OiBzdHJpbmcgfSkge1xuICAgIGlmICghZXJyKSB7XG4gICAgICBzdXBlci5zZXRFcnJvcih1bmRlZmluZWQsIG9wdHMpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc29sZS5lcnJvcignW2VudGl0eS1lZGl0b3JdIEVycm9yOiAnICsgKGVyciB8fCAnJykpO1xuICAgICAgc3VwZXIuc2V0RXJyb3IoZXJyIGFzIHN0cmluZywgb3B0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignW2VudGl0eS1lZGl0b3JdIEVycm9yOiAnICsgZXJyLm1lc3NhZ2UgfHwgJycsIGVycik7XG4gICAgICBsZXQgdXNlck1lc3NhZ2UgPSBlcnIubWVzc2FnZSAmJiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGVyci5tZXNzYWdlKSB8fCBlcnI7XG5cbiAgICAgIC8vIEFkZCBkZXRhaWxzIGVycm9yIChpZiBhbnkpIHVuZGVyIHRoZSBtYWluIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGRldGFpbE1lc3NhZ2UgPSAoIWVyci5kZXRhaWxzIHx8IHR5cGVvZiBlcnIuZGV0YWlscyA9PT0gJ3N0cmluZycpXG4gICAgICAgID8gZXJyLmRldGFpbHMgYXMgc3RyaW5nXG4gICAgICAgIDogZXJyLmRldGFpbHMubWVzc2FnZTtcbiAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsoZGV0YWlsTWVzc2FnZSkpIHtcbiAgICAgICAgY29uc3QgY3NzQ2xhc3MgPSBvcHRzPy5kZXRhaWxzQ3NzQ2xhc3MgfHwgJ2Vycm9yLWRldGFpbHMnO1xuICAgICAgICB1c2VyTWVzc2FnZSArPSBgPGJyLz48c21hbGwgY2xhc3M9XCIke2Nzc0NsYXNzfVwiIHRpdGxlPVwiJHtkZXRhaWxNZXNzYWdlfVwiPmA7XG4gICAgICAgIHVzZXJNZXNzYWdlICs9IGRldGFpbE1lc3NhZ2UubGVuZ3RoIDwgNzAgPyBkZXRhaWxNZXNzYWdlIDogZGV0YWlsTWVzc2FnZS5zdWJzdHJpbmcoMCwgNjcpICsgJy4uLic7XG4gICAgICAgIHVzZXJNZXNzYWdlICs9ICc8L3NtYWxsPic7XG4gICAgICB9XG4gICAgICBzdXBlci5zZXRFcnJvcih1c2VyTWVzc2FnZSwgb3B0cyk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogTG9hZCBkYXRhIGZyb20gdGhlIHNuYXBzaG90IHJvdXRlXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBsb2FkRnJvbVJvdXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvdXRlID0gdGhpcy5yb3V0ZS5zbmFwc2hvdDtcbiAgICBpZiAoIXJvdXRlIHx8IGlzTmlsT3JCbGFuayh0aGlzLl9wYXRoSWRBdHRyaWJ1dGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBsb2FkIGZyb20gcm91dGU6IG1pc3NpbmcgXFwncm91dGVcXCcgb3IgXFwnb3B0aW9ucy5wYXRoSWRBdHRyaWJ1dGVcXCcuJyk7XG4gICAgfVxuICAgIGxldCBpZCA9IHJvdXRlLnBhcmFtc1t0aGlzLl9wYXRoSWRBdHRyaWJ1dGVdO1xuICAgIGlmIChpc05pbChpZCkgfHwgaWQgPT09ICduZXcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkKHVuZGVmaW5lZCwgcm91dGUucGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCBhcyBudW1iZXIsIGlmIG5lZWRcbiAgICAgIGlmIChpc0ludChpZCkpIHtcbiAgICAgICAgaWQgPSBwYXJzZUludChpZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5sb2FkKGlkLCByb3V0ZS5wYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdW5kZWZpbmVkIHRvIGtlZXAgc2FtZSB0YWJcbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbXB1dGVOZXh0VGFiSW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBuZXh0VGFiSW5kZXggPSB0aGlzLnNlbGVjdGVkVGFiSW5kZXggKyAxO1xuICAgIHJldHVybiBuZXh0VGFiSW5kZXggPCB0aGlzLnRhYkNvdW50ID8gbmV4dFRhYkluZGV4IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQmVmb3JlRW50aXR5TG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgc3ViY2xhc3Nlc1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG9uTmV3RW50aXR5KGRhdGE6IFQsIG9wdGlvbnM/OiBFbnRpdHlTZXJ2aWNlTG9hZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgc3ViY2xhc3Nlc1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG9uRW50aXR5TG9hZGVkKGRhdGE6IFQsIG9wdGlvbnM/OiBFbnRpdHlTZXJ2aWNlTG9hZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgc3ViY2xhc3Nlc1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG9uRW50aXR5U2F2ZWQoZGF0YTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBzdWJjbGFzc2VzXG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgb25FbnRpdHlEZWxldGVkKGRhdGE6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgc3ViY2xhc3Nlc1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbXB1dGVVc2FnZU1vZGUoZGF0YTogVCk6IFVzYWdlTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuaXNVc2FnZU1vZGUoJ0ZJRUxEJykgPyAnRklFTEQnIDogJ0RFU0snO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRXaGlsZVBlbmRpbmcob3B0cz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIEFwcEZvcm1VdGlscy53YWl0V2hpbGVQZW5kaW5nKHRoaXMsIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFZhbHVlKCk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCB0aGlzLmdldEpzb25WYWx1ZVRvU2F2ZSgpO1xuXG4gICAgY29uc3QgcmVzID0gbmV3IHRoaXMuZGF0YVR5cGUoKTtcbiAgICByZXMuZnJvbU9iamVjdChqc29uKTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SnNvblZhbHVlVG9TYXZlKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmZvcm0udmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIHRpdGxlXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlVGl0bGUoZGF0YT86IFQpIHtcbiAgICBkYXRhID0gZGF0YSB8fCB0aGlzLmRhdGE7XG4gICAgY29uc3QgdGl0bGUgPSBhd2FpdCB0aGlzLmNvbXB1dGVUaXRsZShkYXRhKTtcbiAgICB0aGlzLnRpdGxlU3ViamVjdC5uZXh0KHRpdGxlKTtcblxuICAgIC8vIElmIE5PVCBkYXRhLCB0aGVuIGFkZCB0byBwYWdlIGhpc3RvcnlcbiAgICBpZiAoIXRoaXMuaXNOZXdEYXRhKSB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5jb21wdXRlUGFnZUhpc3RvcnkodGl0bGUpO1xuICAgICAgaWYgKHBhZ2UpIHJldHVybiB0aGlzLmFkZFRvUGFnZUhpc3RvcnkocGFnZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFkZFRvUGFnZUhpc3RvcnkocGFnZTogSGlzdG9yeVBhZ2VSZWZlcmVuY2UsIG9wdHM/OiBBZGRUb1BhZ2VIaXN0b3J5T3B0aW9ucykge1xuICAgIGlmICghcGFnZSkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5hZGRUb1BhZ2VIaXN0b3J5KHBhZ2UsIHtcbiAgICAgIHJlbW92ZVBhdGhRdWVyeVBhcmFtczogdHJ1ZSxcbiAgICAgIHJlbW92ZVRpdGxlU21hbGxUYWc6IHRydWUsXG4gICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgLi4ub3B0c1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNvbXB1dGVQYWdlSGlzdG9yeSh0aXRsZTogc3RyaW5nKTogUHJvbWlzZTxIaXN0b3J5UGFnZVJlZmVyZW5jZT4ge1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbZW50aXR5LWVkaXRvcl0gQ29tcHV0aW5nIHBhZ2UgaGlzdG9yeSwgdXNpbmcgdXJsOiAnICsgdGhpcy5yb3V0ZXIudXJsKTtcbiAgICByZXR1cm4ge1xuICAgICAgdGl0bGUsXG4gICAgICBwYXRoOiB0aGlzLnJvdXRlci51cmxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbW92ZVBhZ2VIaXN0b3J5KG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnJlbW92ZVBhZ2VIaXN0b3J5KHRoaXMucm91dGVyLnVybCwgb3B0cyk7XG4gIH1cblxuXG4gIHByb3RlY3RlZCBjb21wdXRlUGFnZVVybChpZDogSUR8J25ldycpOiBzdHJpbmcgfCBhbnlbXSB7XG4gICAgY29uc3QgcGFyZW50VXJsID0gdGhpcy5nZXRQYXJlbnRQYWdlVXJsKCk7XG4gICAgcmV0dXJuIHBhcmVudFVybCAmJiBgJHtwYXJlbnRVcmx9LyR7aWR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQYXJlbnRQYWdlVXJsKHdpdGhRdWVyeVBhcmFtcz86IGJvb2xlYW4pIHtcbiAgICBsZXQgcGFyZW50VXJsID0gdGhpcy5kZWZhdWx0QmFja0hyZWY7XG5cbiAgICAvLyBSZW1vdmUgcXVlcnkgcGFyYW1zXG4gICAgaWYgKHdpdGhRdWVyeVBhcmFtcyAhPT0gdHJ1ZSAmJiBwYXJlbnRVcmwgJiYgcGFyZW50VXJsLmluZGV4T2YoJz8nKSAhPT0gLTEpIHtcbiAgICAgIHBhcmVudFVybCA9IHBhcmVudFVybC5zdWJzdHJpbmcoMCwgcGFyZW50VXJsLmluZGV4T2YoJz8nKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudFVybDtcbiAgfVxuXG4gIHByb3RlY3RlZCBsaXN0ZW5DaGFuZ2VzKGlkOiBJRCwgb3B0cz86IGFueSk6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmxpc3RlbkNoYW5nZXModGhpcy5kYXRhLmlkLCB7XG4gICAgICAvLyBNYWtlIHN1cmUgdG8gc2tpcCBjYWNoZSwgYmVjYXVzZSBOT1QgdGhlIGZ1bGwgZ3JhcGggd2lsbCBiZSBmZXRjaGVkIGJ5IHN1YnNjcmlwdGlvblxuICAgICAgLy8gV2hlbiBhIGNoYW5nZXMgb2NjdXIsIHdlIGNhbGwgcmVsb2FkKCkgdG8gZm9yY2UgcmVmZXRjaGluZyB0aGUgZnVsbCBncmFwaFxuICAgICAgZmV0Y2hQb2xpY3k6ICduby1jYWNoZScsXG4gICAgICAuLi5vcHRzXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2Q/Lm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgcm91dGUsIHdpdGhvdXQgcmVsb2FkaW5nIHRoZSBjb21wb25lbnRcbiAgICpcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIHF1ZXJ5UGFyYW1zXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVSb3V0ZShkYXRhOiBULCBxdWVyeVBhcmFtcz86IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGN1cnJJZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KHRoaXMucGF0aElkQXR0cmlidXRlKTtcbiAgICBjb25zdCBmdXR1cmVJZCA9IGlzTm90TmlsKGRhdGEuaWQpID8gZGF0YS5pZC50b1N0cmluZygpIDogJ25ldyc7XG4gICAgdGhpcy5xdWVyeVBhcmFtcyA9IHtcbiAgICAgIC4uLnRoaXMucXVlcnlQYXJhbXMsXG4gICAgICAuLi5xdWVyeVBhcmFtc1xuICAgIH07XG4gICAgaWYgKGN1cnJJZCA9PT0gZnV0dXJlSWQpIHtcbiAgICAgIC8vIFVwZGF0ZSBxdWVyeVBhcmFtIG9ubHkgKG5vdCB0aGUgcGF0aClcbiAgICAgIGlmICghZXF1YWxzKHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMsIHRoaXMucXVlcnlQYXJhbXMpKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbZW50aXR5LWVkaXRvcl0gVXBkYXRpbmcgcm91dGUgdXNpbmcgcXVlcnlQYXJhbXM6ICcsIHF1ZXJ5UGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLiddLCB7XG4gICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICBxdWVyeVBhcmFtczogdGhpcy5xdWVyeVBhcmFtcyxcbiAgICAgICAgICBzdGF0ZToge2FuaW1hdGVkOiBmYWxzZX1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gQ3VycmVudCByb3V0ZSB3YXMgJy9uZXcnID0+IGNoYW5nZSB0byAnL25ldz9pZD06aWQnICh0byBhbGxvdyBDdXN0b21SZXVzZVN0cmF0ZWd5IHRvIGRldGVjdCB0aGF0IHJvdXRlIGNhbiBiZSByZXVzZWQpXG4gICAgICBpZiAoY3VycklkID09PSAnbmV3Jykge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4nXSwge1xuICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAgICAgLi4udGhpcy5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIFt0aGlzLnBhdGhJZEF0dHJpYnV0ZV06IGZ1dHVyZUlkXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0ZToge2FuaW1hdGVkOiBmYWxzZX1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcmVzKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLmNvbXB1dGVQYWdlVXJsKGlzTm90TmlsKGRhdGEuaWQpID8gZGF0YS5pZCA6ICduZXcnKTtcbiAgICAgIGNvbnN0IGNvbW1hbmRzOiBhbnlbXSA9IChwYXRoICYmIHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykgPyBwYXRoLnNwbGl0KCcvJykuc2xpY2UoMSkgOiBwYXRoIGFzIGFueVtdO1xuICAgICAgaWYgKGlzTm90RW1wdHlBcnJheShjb21tYW5kcykpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1tlbnRpdHktZWRpdG9yXSBVcGRhdGluZyByb3V0ZSB0bzogJyArIHBhdGgpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMsIHtcbiAgICAgICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB0aGlzLnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgIHN0YXRlOiB7YW5pbWF0ZWQ6IGZhbHNlfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnTWlzc2luZyBwYWdlIFVSTCcpO1xuICAgIH1cblxuICB9XG5cblxuICAvKiAtLSBwcml2YXRlIGZ1bmN0aW9ucyAtLSAqL1xuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBmaXJzdCB0YWIgdGhhdCBpcyBpbnZhbGlkXG4gICAqL1xuICBwcml2YXRlIG9wZW5GaXJzdEludmFsaWRUYWIoKSB7XG4gICAgY29uc3QgaW52YWxpZFRhYkluZGV4ID0gdGhpcy5nZXRGaXJzdEludmFsaWRUYWJJbmRleCgpO1xuICAgIGlmIChpbnZhbGlkVGFiSW5kZXggIT09IC0xICYmIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCAhPT0gaW52YWxpZFRhYkluZGV4KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSBpbnZhbGlkVGFiSW5kZXg7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBhYnN0cmFjdCBtZXRob2RzICh0byBvdmVycmlkZSkgLS0gKi9cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVnaXN0ZXJGb3JtcygpO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjb21wdXRlVGl0bGUoZGF0YTogVCk6IFByb21pc2U8c3RyaW5nPjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2V0VmFsdWUoZGF0YTogVCk6IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgZm9ybSgpOiBGb3JtR3JvdXA7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEZpcnN0SW52YWxpZFRhYkluZGV4KCk6IG51bWJlcjtcblxufVxuIl19