@sumaris-net/ngx-components 2.6.17 → 4.0.0-rc1

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