@sumaris-net/ngx-components 2.18.0-beta8 → 2.21.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 (715) hide show
  1. package/README.md +3 -0
  2. package/doc/build.md +14 -14
  3. package/doc/changelog.md +1386 -88
  4. package/doc/feed/feed-en.json +26 -0
  5. package/doc/feed/feed-fr.json +28 -0
  6. package/fesm2022/sumaris-net.ngx-components.mjs +32441 -22724
  7. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  8. package/package.json +42 -39
  9. package/src/assets/environments/environment-test.json +2 -2
  10. package/src/assets/i18n/en-US.json +143 -45
  11. package/src/assets/i18n/en.json +142 -43
  12. package/src/assets/i18n/fr.json +147 -47
  13. package/src/assets/manifest.json +1 -1
  14. package/src/theme/_icons.scss +8 -12
  15. package/src/theme/_ionic.globals.scss +8 -1
  16. package/src/theme/_markdown.scss +1 -1
  17. package/src/theme/_material.globals.scss +4 -1
  18. package/src/theme/_material.scss +60 -17
  19. package/src/theme/_mixins.scss +39 -4
  20. package/src/theme/_ngx-components.forms.scss +115 -89
  21. package/src/theme/_ngx-components.globals.scss +4 -1
  22. package/src/theme/_ngx-components.scss +162 -110
  23. package/src/theme/_ngx-components.table.scss +105 -44
  24. package/src/theme/_ngx-components.tabs.scss +46 -14
  25. package/src/theme/_responsive.scss +15 -0
  26. package/src/theme/_roboto.scss +3 -0
  27. package/src/theme/_theme.scss +11 -14
  28. package/src/theme/_theme.variables.scss +7 -3
  29. package/src/theme/ionic/ionic.functions.color.scss +13 -5
  30. package/src/theme/ionic/ionic.globals.scss +4 -4
  31. package/src/theme/ionic/ionic.theme.default.scss +2 -0
  32. package/types/sumaris-net.ngx-components.d.ts +14132 -0
  33. package/esm2022/public_api.mjs +0 -358
  34. package/esm2022/src/app/admin/admin-routing.module.mjs +0 -34
  35. package/esm2022/src/app/admin/admin.module.mjs +0 -32
  36. package/esm2022/src/app/admin/services/filter/person.filter.mjs +0 -69
  37. package/esm2022/src/app/admin/services/person.service.mjs +0 -174
  38. package/esm2022/src/app/admin/services/validator/person.validator.mjs +0 -72
  39. package/esm2022/src/app/admin/users/users.mjs +0 -267
  40. package/esm2022/src/app/admin/users/users.module.mjs +0 -56
  41. package/esm2022/src/app/core/about/about.modal.mjs +0 -84
  42. package/esm2022/src/app/core/about/about.module.mjs +0 -21
  43. package/esm2022/src/app/core/account/account.module.mjs +0 -68
  44. package/esm2022/src/app/core/account/account.page.mjs +0 -351
  45. package/esm2022/src/app/core/account/new-token.modal.mjs +0 -132
  46. package/esm2022/src/app/core/account/password/change-password.form.mjs +0 -60
  47. package/esm2022/src/app/core/account/password/change-password.module.mjs +0 -22
  48. package/esm2022/src/app/core/account/password/change-password.page.mjs +0 -144
  49. package/esm2022/src/app/core/account/token.table.mjs +0 -152
  50. package/esm2022/src/app/core/auth/auth.form.mjs +0 -159
  51. package/esm2022/src/app/core/auth/auth.modal.mjs +0 -76
  52. package/esm2022/src/app/core/auth/auth.module.mjs +0 -56
  53. package/esm2022/src/app/core/auth/reset-password.modal.mjs +0 -77
  54. package/esm2022/src/app/core/core.module.mjs +0 -151
  55. package/esm2022/src/app/core/core.testing.module.mjs +0 -107
  56. package/esm2022/src/app/core/form/array/form-array.mjs +0 -325
  57. package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +0 -23
  58. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +0 -94
  59. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -108
  60. package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +0 -31
  61. package/esm2022/src/app/core/form/entity/editor.class.mjs +0 -265
  62. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -420
  63. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +0 -731
  64. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +0 -24
  65. package/esm2022/src/app/core/form/entity/entity.module.mjs +0 -32
  66. package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +0 -194
  67. package/esm2022/src/app/core/form/form-container.class.mjs +0 -327
  68. package/esm2022/src/app/core/form/form.class.mjs +0 -336
  69. package/esm2022/src/app/core/form/form.module.mjs +0 -70
  70. package/esm2022/src/app/core/form/form.utils.mjs +0 -197
  71. package/esm2022/src/app/core/form/list/list.form.mjs +0 -235
  72. package/esm2022/src/app/core/form/list/list.module.mjs +0 -31
  73. package/esm2022/src/app/core/form/properties/properties.form.mjs +0 -225
  74. package/esm2022/src/app/core/form/properties/properties.module.mjs +0 -37
  75. package/esm2022/src/app/core/form/properties/properties.table.mjs +0 -268
  76. package/esm2022/src/app/core/form/properties/properties.utils.mjs +0 -60
  77. package/esm2022/src/app/core/form/properties/property.validator.mjs +0 -38
  78. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +0 -95
  79. package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +0 -23
  80. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -73
  81. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +0 -30
  82. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +0 -152
  83. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +0 -31
  84. package/esm2022/src/app/core/form/username/username.form.mjs +0 -52
  85. package/esm2022/src/app/core/form/username/username.module.mjs +0 -20
  86. package/esm2022/src/app/core/graphql/graphql.module.mjs +0 -14
  87. package/esm2022/src/app/core/graphql/graphql.service.mjs +0 -783
  88. package/esm2022/src/app/core/graphql/graphql.utils.mjs +0 -119
  89. package/esm2022/src/app/core/home/home.mjs +0 -311
  90. package/esm2022/src/app/core/home/home.module.mjs +0 -42
  91. package/esm2022/src/app/core/icon/icon.component.mjs +0 -40
  92. package/esm2022/src/app/core/icon/icon.module.mjs +0 -20
  93. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +0 -354
  94. package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +0 -31
  95. package/esm2022/src/app/core/menu/menu.component.mjs +0 -263
  96. package/esm2022/src/app/core/menu/menu.model.mjs +0 -272
  97. package/esm2022/src/app/core/menu/menu.module.mjs +0 -47
  98. package/esm2022/src/app/core/menu/menu.service.mjs +0 -655
  99. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +0 -109
  100. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +0 -49
  101. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +0 -157
  102. package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +0 -60
  103. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +0 -28
  104. package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +0 -31
  105. package/esm2022/src/app/core/peer/select-peer.modal.mjs +0 -203
  106. package/esm2022/src/app/core/peer/select-peer.module.mjs +0 -30
  107. package/esm2022/src/app/core/register/register-confirm.page.mjs +0 -90
  108. package/esm2022/src/app/core/register/register.form.mjs +0 -194
  109. package/esm2022/src/app/core/register/register.modal.mjs +0 -55
  110. package/esm2022/src/app/core/register/register.module.mjs +0 -23
  111. package/esm2022/src/app/core/services/account.service.mjs +0 -1346
  112. package/esm2022/src/app/core/services/auth-guard.service.mjs +0 -74
  113. package/esm2022/src/app/core/services/base-entity-service.class.mjs +0 -473
  114. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +0 -230
  115. package/esm2022/src/app/core/services/base58.mjs +0 -83
  116. package/esm2022/src/app/core/services/config/core.config.mjs +0 -233
  117. package/esm2022/src/app/core/services/config.service.mjs +0 -384
  118. package/esm2022/src/app/core/services/crypto.service.mjs +0 -107
  119. package/esm2022/src/app/core/services/errors.mjs +0 -52
  120. package/esm2022/src/app/core/services/local-settings.service.mjs +0 -482
  121. package/esm2022/src/app/core/services/model/account.model.mjs +0 -150
  122. package/esm2022/src/app/core/services/model/config.model.mjs +0 -107
  123. package/esm2022/src/app/core/services/model/department.model.mjs +0 -35
  124. package/esm2022/src/app/core/services/model/entity.decorators.mjs +0 -97
  125. package/esm2022/src/app/core/services/model/entity.model.mjs +0 -224
  126. package/esm2022/src/app/core/services/model/filter.model.mjs +0 -93
  127. package/esm2022/src/app/core/services/model/history.model.mjs +0 -2
  128. package/esm2022/src/app/core/services/model/model.enum.mjs +0 -11
  129. package/esm2022/src/app/core/services/model/peer.model.mjs +0 -93
  130. package/esm2022/src/app/core/services/model/person.model.mjs +0 -114
  131. package/esm2022/src/app/core/services/model/referential.model.mjs +0 -202
  132. package/esm2022/src/app/core/services/model/settings.model.mjs +0 -4
  133. package/esm2022/src/app/core/services/model/token.model.mjs +0 -56
  134. package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +0 -195
  135. package/esm2022/src/app/core/services/network.service.mjs +0 -631
  136. package/esm2022/src/app/core/services/network.types.mjs +0 -20
  137. package/esm2022/src/app/core/services/network.utils.mjs +0 -15
  138. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +0 -38
  139. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +0 -23
  140. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +0 -23
  141. package/esm2022/src/app/core/services/pipes/pipes.module.mjs +0 -54
  142. package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +0 -21
  143. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +0 -37
  144. package/esm2022/src/app/core/services/platform.service.mjs +0 -583
  145. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +0 -427
  146. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +0 -449
  147. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +0 -25
  148. package/esm2022/src/app/core/services/testing/referential.validator.mjs +0 -46
  149. package/esm2022/src/app/core/services/validator/account.validator.mjs +0 -45
  150. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +0 -49
  151. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +0 -81
  152. package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +0 -27
  153. package/esm2022/src/app/core/services/validator/user-token.validator.mjs +0 -55
  154. package/esm2022/src/app/core/settings/settings.module.mjs +0 -22
  155. package/esm2022/src/app/core/settings/settings.page.mjs +0 -341
  156. package/esm2022/src/app/core/table/async-table.class.mjs +0 -1753
  157. package/esm2022/src/app/core/table/column/actions-column.component.mjs +0 -127
  158. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +0 -117
  159. package/esm2022/src/app/core/table/column/row-field.component.mjs +0 -116
  160. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +0 -384
  161. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +0 -401
  162. package/esm2022/src/app/core/table/memory-table.class.mjs +0 -57
  163. package/esm2022/src/app/core/table/table-select-columns.component.mjs +0 -46
  164. package/esm2022/src/app/core/table/table.class.mjs +0 -1816
  165. package/esm2022/src/app/core/table/table.model.mjs +0 -16
  166. package/esm2022/src/app/core/table/table.module.mjs +0 -51
  167. package/esm2022/src/app/core/table/table.pipes.mjs +0 -77
  168. package/esm2022/src/app/core/table/table.utils.mjs +0 -31
  169. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +0 -32
  170. package/esm2022/src/app/core/table/testing/table.testing.mjs +0 -329
  171. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +0 -25
  172. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +0 -25
  173. package/esm2022/src/app/core/table/testing/table2.testing.mjs +0 -273
  174. package/esm2022/src/app/shared/alerts.mjs +0 -243
  175. package/esm2022/src/app/shared/audio/audio.mjs +0 -249
  176. package/esm2022/src/app/shared/audio/audio.testing.mjs +0 -32
  177. package/esm2022/src/app/shared/audio/audio.testing.module.mjs +0 -30
  178. package/esm2022/src/app/shared/capacitor/keyboard.mjs +0 -42
  179. package/esm2022/src/app/shared/capacitor/plugins.mjs +0 -9
  180. package/esm2022/src/app/shared/constants.mjs +0 -16
  181. package/esm2022/src/app/shared/dates.mjs +0 -151
  182. package/esm2022/src/app/shared/debug/debug-service.class.mjs +0 -3
  183. package/esm2022/src/app/shared/debug/debug.component.mjs +0 -40
  184. package/esm2022/src/app/shared/debug/debug.module.mjs +0 -23
  185. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +0 -91
  186. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +0 -32
  187. package/esm2022/src/app/shared/directives/directives.module.mjs +0 -22
  188. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +0 -52
  189. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +0 -33
  190. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +0 -62
  191. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +0 -45
  192. package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +0 -17
  193. package/esm2022/src/app/shared/events.mjs +0 -63
  194. package/esm2022/src/app/shared/file/csv.utils.mjs +0 -92
  195. package/esm2022/src/app/shared/file/file.service.mjs +0 -118
  196. package/esm2022/src/app/shared/file/file.utils.mjs +0 -115
  197. package/esm2022/src/app/shared/file/images.utils.mjs +0 -186
  198. package/esm2022/src/app/shared/file/json.utils.mjs +0 -58
  199. package/esm2022/src/app/shared/file/uri.utils.mjs +0 -24
  200. package/esm2022/src/app/shared/focusable.mjs +0 -6
  201. package/esm2022/src/app/shared/form/field.component.mjs +0 -379
  202. package/esm2022/src/app/shared/form/field.model.mjs +0 -25
  203. package/esm2022/src/app/shared/form/loading-spinner.mjs +0 -35
  204. package/esm2022/src/app/shared/forms.mjs +0 -459
  205. package/esm2022/src/app/shared/functions.mjs +0 -551
  206. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +0 -82
  207. package/esm2022/src/app/shared/gesture/gesture-config.mjs +0 -46
  208. package/esm2022/src/app/shared/gesture/hammer.utils.mjs +0 -2
  209. package/esm2022/src/app/shared/graph/colors.utils.mjs +0 -60
  210. package/esm2022/src/app/shared/graph/graph-colors.mjs +0 -213
  211. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +0 -59
  212. package/esm2022/src/app/shared/help/help.modal.mjs +0 -63
  213. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  214. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +0 -112
  215. package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +0 -24
  216. package/esm2022/src/app/shared/http/http.utils.mjs +0 -56
  217. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +0 -388
  218. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +0 -62
  219. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -26
  220. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -87
  221. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -37
  222. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +0 -59
  223. package/esm2022/src/app/shared/image/image.model.mjs +0 -2
  224. package/esm2022/src/app/shared/image/image.module.mjs +0 -24
  225. package/esm2022/src/app/shared/image/image.service.mjs +0 -106
  226. package/esm2022/src/app/shared/inputs.mjs +0 -263
  227. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  228. package/esm2022/src/app/shared/logging/log-level.model.mjs +0 -48
  229. package/esm2022/src/app/shared/logging/logger.model.mjs +0 -47
  230. package/esm2022/src/app/shared/logging/logging-service.class.mjs +0 -125
  231. package/esm2022/src/app/shared/logging/logging-service.config.mjs +0 -2
  232. package/esm2022/src/app/shared/logging/logging-service.module.mjs +0 -30
  233. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -46
  234. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -1071
  235. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -79
  236. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -18
  237. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -231
  238. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +0 -251
  239. package/esm2022/src/app/shared/material/badge/badge.module.mjs +0 -20
  240. package/esm2022/src/app/shared/material/badge/badge.test.mjs +0 -42
  241. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +0 -71
  242. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +0 -376
  243. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +0 -61
  244. package/esm2022/src/app/shared/material/chips/chips.module.mjs +0 -75
  245. package/esm2022/src/app/shared/material/chips/material.chips.mjs +0 -779
  246. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +0 -147
  247. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +0 -76
  248. package/esm2022/src/app/shared/material/datetime/material.date.mjs +0 -471
  249. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +0 -457
  250. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +0 -681
  251. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -136
  252. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -127
  253. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -118
  254. package/esm2022/src/app/shared/material/duration/duration.module.mjs +0 -65
  255. package/esm2022/src/app/shared/material/duration/duration.utils.mjs +0 -33
  256. package/esm2022/src/app/shared/material/duration/material.duration.mjs +0 -274
  257. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +0 -80
  258. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +0 -313
  259. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +0 -381
  260. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +0 -67
  261. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -118
  262. package/esm2022/src/app/shared/material/material.animations.mjs +0 -143
  263. package/esm2022/src/app/shared/material/material.config.mjs +0 -3
  264. package/esm2022/src/app/shared/material/material.module.mjs +0 -229
  265. package/esm2022/src/app/shared/material/material.testing.module.mjs +0 -234
  266. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -51
  267. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -23
  268. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +0 -375
  269. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +0 -52
  270. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -67
  271. package/esm2022/src/app/shared/material/testing/common.test.mjs +0 -111
  272. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +0 -42
  273. package/esm2022/src/app/shared/material/text/text-form.component.mjs +0 -204
  274. package/esm2022/src/app/shared/material/text/text-form.module.mjs +0 -63
  275. package/esm2022/src/app/shared/modules.mjs +0 -12
  276. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -303
  277. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +0 -49
  278. package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +0 -24
  279. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +0 -69
  280. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +0 -74
  281. package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +0 -28
  282. package/esm2022/src/app/shared/observables.mjs +0 -100
  283. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +0 -156
  284. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +0 -24
  285. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +0 -29
  286. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -49
  287. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +0 -72
  288. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +0 -28
  289. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +0 -36
  290. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +0 -53
  291. package/esm2022/src/app/shared/pipes/form.pipes.mjs +0 -219
  292. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +0 -48
  293. package/esm2022/src/app/shared/pipes/html.pipes.mjs +0 -52
  294. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +0 -42
  295. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +0 -63
  296. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +0 -67
  297. package/esm2022/src/app/shared/pipes/math.pipes.mjs +0 -59
  298. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +0 -19
  299. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +0 -30
  300. package/esm2022/src/app/shared/pipes/pipes.module.mjs +0 -236
  301. package/esm2022/src/app/shared/pipes/property.pipes.mjs +0 -136
  302. package/esm2022/src/app/shared/pipes/selection.pipes.mjs +0 -180
  303. package/esm2022/src/app/shared/pipes/string.pipes.mjs +0 -136
  304. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +0 -44
  305. package/esm2022/src/app/shared/pipes/types.pipes.mjs +0 -74
  306. package/esm2022/src/app/shared/platforms.mjs +0 -45
  307. package/esm2022/src/app/shared/rx-state.module.mjs +0 -19
  308. package/esm2022/src/app/shared/services/entity-service.class.mjs +0 -7
  309. package/esm2022/src/app/shared/services/job.utils.mjs +0 -92
  310. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +0 -349
  311. package/esm2022/src/app/shared/services/progress-bar.service.mjs +0 -31
  312. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +0 -118
  313. package/esm2022/src/app/shared/services/startable-service.class.mjs +0 -107
  314. package/esm2022/src/app/shared/services/translate-context.service.mjs +0 -107
  315. package/esm2022/src/app/shared/services/validator-service.class.mjs +0 -2
  316. package/esm2022/src/app/shared/services.mjs +0 -62
  317. package/esm2022/src/app/shared/shared-routing.module.mjs +0 -72
  318. package/esm2022/src/app/shared/shared.module.mjs +0 -234
  319. package/esm2022/src/app/shared/shared.testing.module.mjs +0 -100
  320. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +0 -279
  321. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +0 -42
  322. package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +0 -27
  323. package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +0 -25
  324. package/esm2022/src/app/shared/storage/storage.service.mjs +0 -134
  325. package/esm2022/src/app/shared/storage/storage.utils.mjs +0 -13
  326. package/esm2022/src/app/shared/testing/maskito.test.mjs +0 -41
  327. package/esm2022/src/app/shared/testing/observable.test.mjs +0 -94
  328. package/esm2022/src/app/shared/testing/tests.page.mjs +0 -37
  329. package/esm2022/src/app/shared/toast/toast.testing.mjs +0 -52
  330. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +0 -30
  331. package/esm2022/src/app/shared/toast/toasts.mjs +0 -144
  332. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +0 -62
  333. package/esm2022/src/app/shared/toolbar/toolbar.mjs +0 -263
  334. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +0 -26
  335. package/esm2022/src/app/shared/types.mjs +0 -2
  336. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -59
  337. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +0 -30
  338. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -106
  339. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +0 -213
  340. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +0 -26
  341. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +0 -114
  342. package/esm2022/src/app/shared/validator/validators.mjs +0 -601
  343. package/esm2022/src/app/shared/version/versions.mjs +0 -81
  344. package/esm2022/src/app/social/job/job.module.mjs +0 -23
  345. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +0 -35
  346. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +0 -235
  347. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +0 -47
  348. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +0 -29
  349. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +0 -91
  350. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +0 -38
  351. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +0 -34
  352. package/esm2022/src/app/social/job/testing/job.testing.module.mjs +0 -22
  353. package/esm2022/src/app/social/message/message.form.mjs +0 -140
  354. package/esm2022/src/app/social/message/message.modal.mjs +0 -110
  355. package/esm2022/src/app/social/message/message.model.mjs +0 -75
  356. package/esm2022/src/app/social/message/message.module.mjs +0 -22
  357. package/esm2022/src/app/social/message/message.service.mjs +0 -110
  358. package/esm2022/src/app/social/social.errors.mjs +0 -10
  359. package/esm2022/src/app/social/social.module.mjs +0 -22
  360. package/esm2022/src/app/social/social.testing.module.mjs +0 -40
  361. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -127
  362. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -260
  363. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +0 -257
  364. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -129
  365. package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +0 -22
  366. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -128
  367. package/esm2022/src/app/social/user-event/user-event.model.mjs +0 -2
  368. package/esm2022/src/app/social/user-event/user-event.module.mjs +0 -23
  369. package/esm2022/src/app/social/user-event/user-event.service.mjs +0 -509
  370. package/esm2022/src/environments/environment.class.mjs +0 -57
  371. package/esm2022/src/environments/environment.loader.mjs +0 -77
  372. package/esm2022/src/environments/environment.mjs +0 -105
  373. package/esm2022/sumaris-net.ngx-components.mjs +0 -5
  374. package/index.d.ts +0 -5
  375. package/public_api.d.ts +0 -322
  376. package/src/app/admin/admin-routing.module.d.ts +0 -9
  377. package/src/app/admin/admin.module.d.ts +0 -10
  378. package/src/app/admin/services/filter/person.filter.d.ts +0 -21
  379. package/src/app/admin/services/person.service.d.ts +0 -49
  380. package/src/app/admin/services/validator/person.validator.d.ts +0 -23
  381. package/src/app/admin/users/users.d.ts +0 -45
  382. package/src/app/admin/users/users.module.d.ts +0 -14
  383. package/src/app/core/about/about.modal.d.ts +0 -32
  384. package/src/app/core/about/about.module.d.ts +0 -10
  385. package/src/app/core/account/account.module.d.ts +0 -16
  386. package/src/app/core/account/account.page.d.ts +0 -80
  387. package/src/app/core/account/new-token.modal.d.ts +0 -41
  388. package/src/app/core/account/password/change-password.form.d.ts +0 -19
  389. package/src/app/core/account/password/change-password.module.d.ts +0 -11
  390. package/src/app/core/account/password/change-password.page.d.ts +0 -36
  391. package/src/app/core/account/token.table.d.ts +0 -27
  392. package/src/app/core/auth/auth.form.d.ts +0 -38
  393. package/src/app/core/auth/auth.modal.d.ts +0 -24
  394. package/src/app/core/auth/auth.module.d.ts +0 -13
  395. package/src/app/core/auth/reset-password.modal.d.ts +0 -26
  396. package/src/app/core/core.module.d.ts +0 -28
  397. package/src/app/core/core.testing.module.d.ts +0 -15
  398. package/src/app/core/form/array/form-array.d.ts +0 -136
  399. package/src/app/core/form/array/testing/form-array-test.module.d.ts +0 -12
  400. package/src/app/core/form/array/testing/form-array.test.d.ts +0 -26
  401. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +0 -37
  402. package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +0 -9
  403. package/src/app/core/form/entity/editor.class.d.ts +0 -83
  404. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +0 -126
  405. package/src/app/core/form/entity/entity-editor.class.d.ts +0 -204
  406. package/src/app/core/form/entity/entity-metadata.component.d.ts +0 -13
  407. package/src/app/core/form/entity/entity.module.d.ts +0 -10
  408. package/src/app/core/form/entity/tab-editor.class.d.ts +0 -70
  409. package/src/app/core/form/form-container.class.d.ts +0 -126
  410. package/src/app/core/form/form.class.d.ts +0 -144
  411. package/src/app/core/form/form.module.d.ts +0 -14
  412. package/src/app/core/form/form.utils.d.ts +0 -251
  413. package/src/app/core/form/list/list.form.d.ts +0 -81
  414. package/src/app/core/form/list/list.module.d.ts +0 -9
  415. package/src/app/core/form/properties/properties.form.d.ts +0 -66
  416. package/src/app/core/form/properties/properties.module.d.ts +0 -11
  417. package/src/app/core/form/properties/properties.table.d.ts +0 -78
  418. package/src/app/core/form/properties/properties.utils.d.ts +0 -27
  419. package/src/app/core/form/properties/property.validator.d.ts +0 -19
  420. package/src/app/core/form/properties/testing/properties-form.test.d.ts +0 -19
  421. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +0 -12
  422. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +0 -16
  423. package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +0 -11
  424. package/src/app/core/form/text-popover/text-popover.component.d.ts +0 -71
  425. package/src/app/core/form/text-popover/text-popover.module.d.ts +0 -9
  426. package/src/app/core/form/username/username.form.d.ts +0 -19
  427. package/src/app/core/form/username/username.module.d.ts +0 -9
  428. package/src/app/core/graphql/graphql.module.d.ts +0 -7
  429. package/src/app/core/graphql/graphql.service.d.ts +0 -147
  430. package/src/app/core/graphql/graphql.utils.d.ts +0 -42
  431. package/src/app/core/home/home.d.ts +0 -94
  432. package/src/app/core/home/home.module.d.ts +0 -13
  433. package/src/app/core/icon/icon.component.d.ts +0 -13
  434. package/src/app/core/icon/icon.module.d.ts +0 -9
  435. package/src/app/core/install/install-upgrade-card.component.d.ts +0 -64
  436. package/src/app/core/install/install-upgrade-card.module.d.ts +0 -9
  437. package/src/app/core/menu/menu.component.d.ts +0 -69
  438. package/src/app/core/menu/menu.model.d.ts +0 -144
  439. package/src/app/core/menu/menu.module.d.ts +0 -12
  440. package/src/app/core/menu/menu.service.d.ts +0 -94
  441. package/src/app/core/menu/sub-menu-tab.directive.d.ts +0 -29
  442. package/src/app/core/menu/testing/menu-other.testing.d.ts +0 -15
  443. package/src/app/core/menu/testing/menu.testing.d.ts +0 -51
  444. package/src/app/core/menu/testing/menu.testing.module.d.ts +0 -12
  445. package/src/app/core/offline/update-offline-mode-card.component.d.ts +0 -11
  446. package/src/app/core/offline/update-offline-mode-card.module.d.ts +0 -9
  447. package/src/app/core/peer/select-peer.modal.d.ts +0 -60
  448. package/src/app/core/peer/select-peer.module.d.ts +0 -10
  449. package/src/app/core/register/register-confirm.page.d.ts +0 -24
  450. package/src/app/core/register/register.form.d.ts +0 -49
  451. package/src/app/core/register/register.modal.d.ts +0 -14
  452. package/src/app/core/register/register.module.d.ts +0 -12
  453. package/src/app/core/services/account.service.d.ts +0 -205
  454. package/src/app/core/services/auth-guard.service.d.ts +0 -17
  455. package/src/app/core/services/base-entity-service.class.d.ts +0 -123
  456. package/src/app/core/services/base-graphql-service.class.d.ts +0 -77
  457. package/src/app/core/services/base58.d.ts +0 -7
  458. package/src/app/core/services/config/core.config.d.ts +0 -41
  459. package/src/app/core/services/config.service.d.ts +0 -63
  460. package/src/app/core/services/crypto.service.d.ts +0 -44
  461. package/src/app/core/services/errors.d.ts +0 -63
  462. package/src/app/core/services/local-settings.service.d.ts +0 -95
  463. package/src/app/core/services/model/account.model.d.ts +0 -41
  464. package/src/app/core/services/model/config.model.d.ts +0 -36
  465. package/src/app/core/services/model/department.model.d.ts +0 -11
  466. package/src/app/core/services/model/entity.decorators.d.ts +0 -17
  467. package/src/app/core/services/model/entity.model.d.ts +0 -87
  468. package/src/app/core/services/model/filter.model.d.ts +0 -37
  469. package/src/app/core/services/model/history.model.d.ts +0 -20
  470. package/src/app/core/services/model/model.enum.d.ts +0 -7
  471. package/src/app/core/services/model/peer.model.d.ts +0 -30
  472. package/src/app/core/services/model/person.model.d.ts +0 -37
  473. package/src/app/core/services/model/referential.model.d.ts +0 -83
  474. package/src/app/core/services/model/settings.model.d.ts +0 -28
  475. package/src/app/core/services/model/token.model.d.ts +0 -22
  476. package/src/app/core/services/model/tree-item-entity.model.d.ts +0 -53
  477. package/src/app/core/services/network.service.d.ts +0 -151
  478. package/src/app/core/services/network.types.d.ts +0 -5
  479. package/src/app/core/services/network.utils.d.ts +0 -31
  480. package/src/app/core/services/pipes/account.pipes.d.ts +0 -15
  481. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +0 -9
  482. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +0 -11
  483. package/src/app/core/services/pipes/pipes.module.d.ts +0 -11
  484. package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +0 -13
  485. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +0 -15
  486. package/src/app/core/services/platform.service.d.ts +0 -100
  487. package/src/app/core/services/storage/entities-storage.service.d.ts +0 -108
  488. package/src/app/core/services/storage/entity-store.class.d.ts +0 -113
  489. package/src/app/core/services/testing/referential-filter.model.d.ts +0 -9
  490. package/src/app/core/services/testing/referential.validator.d.ts +0 -22
  491. package/src/app/core/services/validator/account.validator.d.ts +0 -24
  492. package/src/app/core/services/validator/base.validator.class.d.ts +0 -21
  493. package/src/app/core/services/validator/local-settings.validator.d.ts +0 -22
  494. package/src/app/core/services/validator/user-settings.validator.d.ts +0 -10
  495. package/src/app/core/services/validator/user-token.validator.d.ts +0 -13
  496. package/src/app/core/settings/settings.module.d.ts +0 -11
  497. package/src/app/core/settings/settings.page.d.ts +0 -81
  498. package/src/app/core/table/async-table.class.d.ts +0 -389
  499. package/src/app/core/table/column/actions-column.component.d.ts +0 -59
  500. package/src/app/core/table/column/nav-actions-column.component.d.ts +0 -46
  501. package/src/app/core/table/column/row-field.component.d.ts +0 -40
  502. package/src/app/core/table/entities-async-table-datasource.class.d.ts +0 -81
  503. package/src/app/core/table/entities-table-datasource.class.d.ts +0 -95
  504. package/src/app/core/table/memory-table.class.d.ts +0 -25
  505. package/src/app/core/table/table-select-columns.component.d.ts +0 -22
  506. package/src/app/core/table/table.class.d.ts +0 -394
  507. package/src/app/core/table/table.model.d.ts +0 -26
  508. package/src/app/core/table/table.module.d.ts +0 -14
  509. package/src/app/core/table/table.pipes.d.ts +0 -28
  510. package/src/app/core/table/table.utils.d.ts +0 -11
  511. package/src/app/core/table/testing/table-validator.service.d.ts +0 -17
  512. package/src/app/core/table/testing/table.testing.d.ts +0 -54
  513. package/src/app/core/table/testing/table.testing.module.d.ts +0 -14
  514. package/src/app/core/table/testing/table2-validator.service.d.ts +0 -15
  515. package/src/app/core/table/testing/table2.testing.d.ts +0 -48
  516. package/src/app/shared/alerts.d.ts +0 -55
  517. package/src/app/shared/audio/audio.d.ts +0 -44
  518. package/src/app/shared/audio/audio.testing.d.ts +0 -13
  519. package/src/app/shared/audio/audio.testing.module.d.ts +0 -11
  520. package/src/app/shared/capacitor/keyboard.d.ts +0 -16
  521. package/src/app/shared/capacitor/plugins.d.ts +0 -7
  522. package/src/app/shared/constants.d.ts +0 -13
  523. package/src/app/shared/dates.d.ts +0 -48
  524. package/src/app/shared/debug/debug-service.class.d.ts +0 -5
  525. package/src/app/shared/debug/debug.component.d.ts +0 -13
  526. package/src/app/shared/debug/debug.module.d.ts +0 -12
  527. package/src/app/shared/directives/autofocus.directive.d.ts +0 -18
  528. package/src/app/shared/directives/autotitle.directive.d.ts +0 -10
  529. package/src/app/shared/directives/directives.module.d.ts +0 -12
  530. package/src/app/shared/directives/drag-and-drop.directive.d.ts +0 -17
  531. package/src/app/shared/directives/ng-var.directive.d.ts +0 -12
  532. package/src/app/shared/directives/resizable/resizable.component.d.ts +0 -21
  533. package/src/app/shared/directives/resizable/resizable.directive.d.ts +0 -12
  534. package/src/app/shared/directives/resizable/resizable.module.d.ts +0 -8
  535. package/src/app/shared/events.d.ts +0 -28
  536. package/src/app/shared/file/csv.utils.d.ts +0 -24
  537. package/src/app/shared/file/file.service.d.ts +0 -23
  538. package/src/app/shared/file/file.utils.d.ts +0 -20
  539. package/src/app/shared/file/images.utils.d.ts +0 -36
  540. package/src/app/shared/file/json.utils.d.ts +0 -19
  541. package/src/app/shared/file/uri.utils.d.ts +0 -8
  542. package/src/app/shared/focusable.d.ts +0 -4
  543. package/src/app/shared/form/field.component.d.ts +0 -74
  544. package/src/app/shared/form/field.model.d.ts +0 -39
  545. package/src/app/shared/form/loading-spinner.d.ts +0 -8
  546. package/src/app/shared/forms.d.ts +0 -103
  547. package/src/app/shared/functions.d.ts +0 -152
  548. package/src/app/shared/geolocation/geolocation.utils.d.ts +0 -19
  549. package/src/app/shared/gesture/gesture-config.d.ts +0 -15
  550. package/src/app/shared/gesture/hammer.utils.d.ts +0 -16
  551. package/src/app/shared/graph/colors.utils.d.ts +0 -17
  552. package/src/app/shared/graph/graph-colors.d.ts +0 -63
  553. package/src/app/shared/guard/component-dirty.guard.d.ts +0 -14
  554. package/src/app/shared/help/help.modal.d.ts +0 -33
  555. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +0 -8
  556. package/src/app/shared/hotkeys/hotkeys.service.d.ts +0 -42
  557. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +0 -11
  558. package/src/app/shared/http/http.utils.d.ts +0 -28
  559. package/src/app/shared/image/gallery/image-gallery.component.d.ts +0 -98
  560. package/src/app/shared/image/gallery/image-gallery.module.d.ts +0 -15
  561. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +0 -12
  562. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +0 -33
  563. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +0 -16
  564. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +0 -13
  565. package/src/app/shared/image/image.model.d.ts +0 -5
  566. package/src/app/shared/image/image.module.d.ts +0 -8
  567. package/src/app/shared/image/image.service.d.ts +0 -32
  568. package/src/app/shared/inputs.d.ts +0 -34
  569. package/src/app/shared/interceptors/progess.interceptor.d.ts +0 -8
  570. package/src/app/shared/logging/log-level.model.d.ts +0 -38
  571. package/src/app/shared/logging/logger.model.d.ts +0 -68
  572. package/src/app/shared/logging/logging-service.class.d.ts +0 -39
  573. package/src/app/shared/logging/logging-service.config.d.ts +0 -25
  574. package/src/app/shared/logging/logging-service.module.d.ts +0 -9
  575. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +0 -55
  576. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +0 -180
  577. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +0 -22
  578. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +0 -5
  579. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +0 -46
  580. package/src/app/shared/material/badge/badge.directive.d.ts +0 -43
  581. package/src/app/shared/material/badge/badge.module.d.ts +0 -10
  582. package/src/app/shared/material/badge/badge.test.d.ts +0 -21
  583. package/src/app/shared/material/boolean/boolean.module.d.ts +0 -21
  584. package/src/app/shared/material/boolean/material.boolean.d.ts +0 -93
  585. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +0 -22
  586. package/src/app/shared/material/chips/chips.module.d.ts +0 -22
  587. package/src/app/shared/material/chips/material.chips.d.ts +0 -150
  588. package/src/app/shared/material/chips/testing/chips.test.d.ts +0 -32
  589. package/src/app/shared/material/datetime/datetime.module.d.ts +0 -24
  590. package/src/app/shared/material/datetime/material.date.d.ts +0 -90
  591. package/src/app/shared/material/datetime/material.dateshort.d.ts +0 -89
  592. package/src/app/shared/material/datetime/material.datetime.d.ts +0 -121
  593. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +0 -37
  594. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +0 -32
  595. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +0 -31
  596. package/src/app/shared/material/duration/duration.module.d.ts +0 -19
  597. package/src/app/shared/material/duration/duration.utils.d.ts +0 -3
  598. package/src/app/shared/material/duration/material.duration.d.ts +0 -58
  599. package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +0 -22
  600. package/src/app/shared/material/latlong/latlong.utils.d.ts +0 -21
  601. package/src/app/shared/material/latlong/material.latlong.d.ts +0 -70
  602. package/src/app/shared/material/latlong/material.latlong.module.d.ts +0 -20
  603. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +0 -27
  604. package/src/app/shared/material/material.animations.d.ts +0 -6
  605. package/src/app/shared/material/material.config.d.ts +0 -3
  606. package/src/app/shared/material/material.module.d.ts +0 -45
  607. package/src/app/shared/material/material.testing.module.d.ts +0 -31
  608. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +0 -12
  609. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +0 -10
  610. package/src/app/shared/material/swipe/material.swipe.d.ts +0 -90
  611. package/src/app/shared/material/swipe/swipe.module.d.ts +0 -16
  612. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +0 -22
  613. package/src/app/shared/material/testing/common.test.d.ts +0 -25
  614. package/src/app/shared/material/text/testing/text-form.testing.d.ts +0 -19
  615. package/src/app/shared/material/text/text-form.component.d.ts +0 -66
  616. package/src/app/shared/material/text/text-form.module.d.ts +0 -16
  617. package/src/app/shared/modules.d.ts +0 -9
  618. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +0 -60
  619. package/src/app/shared/named-filter/named-filter.model.d.ts +0 -32
  620. package/src/app/shared/named-filter/named-filter.module.d.ts +0 -13
  621. package/src/app/shared/named-filter/named-filter.service.d.ts +0 -32
  622. package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +0 -34
  623. package/src/app/shared/named-filter/testing/named-filter.testing.module.d.ts +0 -10
  624. package/src/app/shared/observables.d.ts +0 -30
  625. package/src/app/shared/pipes/arrays.pipe.d.ts +0 -59
  626. package/src/app/shared/pipes/badge.pipes.d.ts +0 -7
  627. package/src/app/shared/pipes/colors.pipe.d.ts +0 -9
  628. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +0 -23
  629. package/src/app/shared/pipes/date-format.pipe.d.ts +0 -35
  630. package/src/app/shared/pipes/date-from-now.pipe.d.ts +0 -12
  631. package/src/app/shared/pipes/duration.pipe.d.ts +0 -13
  632. package/src/app/shared/pipes/file-size.pipe.d.ts +0 -30
  633. package/src/app/shared/pipes/form.pipes.d.ts +0 -69
  634. package/src/app/shared/pipes/highlight.pipe.d.ts +0 -11
  635. package/src/app/shared/pipes/html.pipes.d.ts +0 -15
  636. package/src/app/shared/pipes/latlong-format.pipe.d.ts +0 -20
  637. package/src/app/shared/pipes/maps.pipe.d.ts +0 -22
  638. package/src/app/shared/pipes/maskito.pipe.d.ts +0 -14
  639. package/src/app/shared/pipes/math.pipes.d.ts +0 -20
  640. package/src/app/shared/pipes/ng-init.pipe.d.ts +0 -8
  641. package/src/app/shared/pipes/number-format.pipe.d.ts +0 -10
  642. package/src/app/shared/pipes/pipes.module.d.ts +0 -31
  643. package/src/app/shared/pipes/property.pipes.d.ts +0 -47
  644. package/src/app/shared/pipes/selection.pipes.d.ts +0 -62
  645. package/src/app/shared/pipes/string.pipes.d.ts +0 -53
  646. package/src/app/shared/pipes/translate-context.pipe.d.ts +0 -17
  647. package/src/app/shared/pipes/types.pipes.d.ts +0 -30
  648. package/src/app/shared/platforms.d.ts +0 -8
  649. package/src/app/shared/rx-state.module.d.ts +0 -10
  650. package/src/app/shared/services/entity-service.class.d.ts +0 -71
  651. package/src/app/shared/services/job.utils.d.ts +0 -20
  652. package/src/app/shared/services/memory-entity-service.class.d.ts +0 -78
  653. package/src/app/shared/services/progress-bar.service.d.ts +0 -20
  654. package/src/app/shared/services/startable-observable-service.class.d.ts +0 -36
  655. package/src/app/shared/services/startable-service.class.d.ts +0 -37
  656. package/src/app/shared/services/translate-context.service.d.ts +0 -29
  657. package/src/app/shared/services/validator-service.class.d.ts +0 -11
  658. package/src/app/shared/services.d.ts +0 -10
  659. package/src/app/shared/shared-routing.module.d.ts +0 -23
  660. package/src/app/shared/shared.module.d.ts +0 -34
  661. package/src/app/shared/shared.testing.module.d.ts +0 -19
  662. package/src/app/shared/storage/storage-explorer.component.d.ts +0 -59
  663. package/src/app/shared/storage/storage-explorer.module.d.ts +0 -13
  664. package/src/app/shared/storage/storage-explorer.testing-routing.module.d.ts +0 -9
  665. package/src/app/shared/storage/storage-explorer.testing.module.d.ts +0 -10
  666. package/src/app/shared/storage/storage.service.d.ts +0 -22
  667. package/src/app/shared/storage/storage.utils.d.ts +0 -19
  668. package/src/app/shared/testing/maskito.test.d.ts +0 -10
  669. package/src/app/shared/testing/observable.test.d.ts +0 -25
  670. package/src/app/shared/testing/tests.page.d.ts +0 -20
  671. package/src/app/shared/toast/toast.testing.d.ts +0 -15
  672. package/src/app/shared/toast/toast.testing.module.d.ts +0 -11
  673. package/src/app/shared/toast/toasts.d.ts +0 -17
  674. package/src/app/shared/toolbar/modal-toolbar.d.ts +0 -21
  675. package/src/app/shared/toolbar/toolbar.d.ts +0 -68
  676. package/src/app/shared/toolbar/toolbar.module.d.ts +0 -16
  677. package/src/app/shared/types.d.ts +0 -31
  678. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +0 -21
  679. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +0 -11
  680. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +0 -39
  681. package/src/app/shared/upload-file/upload-file.component.d.ts +0 -49
  682. package/src/app/shared/upload-file/upload-file.model.d.ts +0 -30
  683. package/src/app/shared/validator/form-error-adapter.class.d.ts +0 -33
  684. package/src/app/shared/validator/validators.d.ts +0 -130
  685. package/src/app/shared/version/versions.d.ts +0 -26
  686. package/src/app/social/job/job.module.d.ts +0 -12
  687. package/src/app/social/job/progression/job-progression.component.d.ts +0 -23
  688. package/src/app/social/job/progression/job-progression.icon.d.ts +0 -62
  689. package/src/app/social/job/progression/job-progression.list.d.ts +0 -19
  690. package/src/app/social/job/progression/job-progression.model.d.ts +0 -10
  691. package/src/app/social/job/progression/job-progression.service.d.ts +0 -33
  692. package/src/app/social/job/testing/job-progression.testing.d.ts +0 -13
  693. package/src/app/social/job/testing/job-progression.testing.service.d.ts +0 -9
  694. package/src/app/social/job/testing/job.testing.module.d.ts +0 -11
  695. package/src/app/social/message/message.form.d.ts +0 -36
  696. package/src/app/social/message/message.modal.d.ts +0 -43
  697. package/src/app/social/message/message.model.d.ts +0 -33
  698. package/src/app/social/message/message.module.d.ts +0 -12
  699. package/src/app/social/message/message.service.d.ts +0 -32
  700. package/src/app/social/social.errors.d.ts +0 -9
  701. package/src/app/social/social.module.d.ts +0 -20
  702. package/src/app/social/social.testing.module.d.ts +0 -13
  703. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +0 -32
  704. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +0 -71
  705. package/src/app/social/user-event/testing/user-event.testing.d.ts +0 -35
  706. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +0 -42
  707. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +0 -11
  708. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +0 -42
  709. package/src/app/social/user-event/user-event.model.d.ts +0 -44
  710. package/src/app/social/user-event/user-event.module.d.ts +0 -13
  711. package/src/app/social/user-event/user-event.service.d.ts +0 -129
  712. package/src/environments/environment.class.d.ts +0 -68
  713. package/src/environments/environment.d.ts +0 -2
  714. package/src/environments/environment.loader.d.ts +0 -24
  715. package/src/theme/_globals.scss +0 -5
@@ -1,1753 +0,0 @@
1
- import { ChangeDetectorRef, Directive, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
- import { MatPaginator } from '@angular/material/paginator';
3
- import { MatSort } from '@angular/material/sort';
4
- import { MatTable } from '@angular/material/table';
5
- import { BehaviorSubject, EMPTY, merge, of, Subject, Subscription } from 'rxjs';
6
- import { catchError, debounceTime, distinctUntilChanged, filter, first, mergeMap, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';
7
- import { SelectionModel } from '@angular/cdk/collections';
8
- import { EntityUtils } from '../services/model/entity.model';
9
- import { AlertController, ModalController, NavController, ToastController } from '@ionic/angular';
10
- import { ActivatedRoute, Router } from '@angular/router';
11
- import { TableSelectColumnsComponent } from './table-select-columns.component';
12
- import { Location } from '@angular/common';
13
- import { ErrorCodes } from '../services/errors';
14
- import { AppFormUtils } from '../form/form.utils';
15
- import { LocalSettingsService } from '../services/local-settings.service';
16
- import { TranslateService } from '@ngx-translate/core';
17
- import { MatAutocompleteConfigHolder, } from '../../shared/material/autocomplete/material.autocomplete.config';
18
- import { createPromiseEventEmitter, emitPromiseEvent } from '../../shared/events';
19
- import { changeCaseToUnderscore, isEmptyArray, isNil, isNotNil, toBoolean } from '../../shared/functions';
20
- import { waitFor, waitForFalse, waitForTrue } from '../../shared/observables';
21
- import { Toasts } from '../../shared/toast/toasts';
22
- import { Alerts } from '../../shared/alerts';
23
- import { FormErrorTranslator } from '../../shared/validator/form-error-adapter.class';
24
- import { DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_REQUIRED_COLUMNS, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, SETTINGS_DISPLAY_COLUMNS, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, } from './table.model';
25
- import { AppTableUtils } from './table.utils';
26
- import * as i0 from "@angular/core";
27
- import * as i1 from "./entities-async-table-datasource.class";
28
- // @dynamic
29
- // noinspection DuplicatedCode
30
- // eslint-disable-next-line @angular-eslint/directive-class-suffix
31
- export class AppAsyncTable {
32
- columns;
33
- _dataSource;
34
- _filter;
35
- _initialized = false;
36
- _subscription = new Subscription();
37
- _dataSourceLoadingSubscription;
38
- _cellValueChangesDefs = {};
39
- _enabled = true;
40
- _autocompleteConfigHolder;
41
- allowRowDetail = true;
42
- cd;
43
- route;
44
- router;
45
- navController;
46
- location;
47
- settings;
48
- translate;
49
- modalCtrl;
50
- alertCtrl;
51
- toastController;
52
- previouslyEditedRowId;
53
- formErrorAdapter;
54
- destroySubject = new Subject();
55
- excludesColumns = [];
56
- displayedColumns;
57
- totalRowCount = null;
58
- visibleRowCount;
59
- errorTranslateOptions;
60
- readySubject = new BehaviorSubject(false);
61
- loadingSubject = new BehaviorSubject(true);
62
- savingSubject = new BehaviorSubject(false);
63
- touchedSubject = new BehaviorSubject(false);
64
- dirtySubject = new BehaviorSubject(false);
65
- errorSubject = new BehaviorSubject(undefined);
66
- get error() {
67
- return this.errorSubject.value;
68
- }
69
- set error(error) {
70
- this.setError(error);
71
- }
72
- selection = new SelectionModel(true, []);
73
- permanentSelection = null;
74
- permanentSelectionChangedPrevented = false;
75
- autocompleteFields;
76
- mobile;
77
- // Table options
78
- settingsId;
79
- debug;
80
- i18nColumnPrefix = 'COMMON.';
81
- i18nColumnSuffix;
82
- autoLoad = true;
83
- readOnly;
84
- inlineEdition;
85
- focusFirstColumn = false;
86
- confirmBeforeDelete = false;
87
- confirmBeforeCancel = false;
88
- undoableDeletion = false;
89
- saveBeforeDelete;
90
- keepEditedRowOnSave;
91
- saveBeforeSort;
92
- saveBeforeFilter;
93
- propagateRowError = false;
94
- permanentSelectionAllowed = false; // Allow keep selected rows over page change or sort change
95
- defaultSortBy;
96
- defaultSortDirection;
97
- defaultPageSize = DEFAULT_PAGE_SIZE;
98
- defaultPageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS;
99
- // Focus manager
100
- focusColumn;
101
- get firstUserColumn() {
102
- return this.displayedColumns[RESERVED_START_COLUMNS.length];
103
- }
104
- get lastUserColumn() {
105
- return this.displayedColumns[this.displayedColumns.length - RESERVED_END_COLUMNS.length - 1];
106
- }
107
- set dataSource(value) {
108
- this.setDatasource(value);
109
- }
110
- get dataSource() {
111
- return this._dataSource;
112
- }
113
- set filter(value) {
114
- this.setFilter(value);
115
- }
116
- get filter() {
117
- return this._filter;
118
- }
119
- get empty() {
120
- return this.loading || this.totalRowCount === 0;
121
- }
122
- get selectedEntities() {
123
- return this.permanentSelection?.selected || AppTableUtils.getEntities(this.selection.selected);
124
- }
125
- onRefresh = new EventEmitter();
126
- onOpenRow = new EventEmitter();
127
- onNewRow = new EventEmitter();
128
- onStartEditingRow = new EventEmitter();
129
- onConfirmEditCreateRow = new EventEmitter();
130
- onCancelOrDeleteRow = new EventEmitter();
131
- onBeforeDeleteRows = createPromiseEventEmitter();
132
- onBeforeCancelRows = createPromiseEventEmitter();
133
- onBeforeSave = createPromiseEventEmitter();
134
- onAfterDeletedRows = new EventEmitter();
135
- onSort = new EventEmitter();
136
- onDirty = new EventEmitter();
137
- onError = new EventEmitter();
138
- get dirty() {
139
- return this.dirtySubject.value;
140
- }
141
- get valid() {
142
- return this.dataSource.getEditingRows().every((row) => (row.editing ? row.valid : true));
143
- }
144
- get invalid() {
145
- return this.dataSource.getEditingRows().some((row) => (row.editing ? row.invalid : false));
146
- }
147
- get pending() {
148
- return this.dataSource.getEditingRows().some((row) => (row.editing ? row.pending : false));
149
- }
150
- get touched() {
151
- return this.touchedSubject.value;
152
- }
153
- get untouched() {
154
- return !this.touchedSubject.value;
155
- }
156
- disable(opts) {
157
- if (this.sort)
158
- this.sort.disabled = true;
159
- this._enabled = false;
160
- if (!opts || opts.emitEvent !== false)
161
- this.markForCheck();
162
- }
163
- enable(opts) {
164
- if (this.sort)
165
- this.sort.disabled = false;
166
- this._enabled = true;
167
- if (!opts || opts.emitEvent !== false)
168
- this.markForCheck();
169
- }
170
- get enabled() {
171
- return this._enabled;
172
- }
173
- // FIXME: need to hidden buttons (in HTML), etc. when disabled
174
- set disabled(value) {
175
- if (value !== !this._enabled) {
176
- if (value)
177
- this.disable({ emitEvent: false });
178
- else
179
- this.enable({ emitEvent: false });
180
- }
181
- }
182
- get disabled() {
183
- return !this._enabled;
184
- }
185
- markAsDirty(opts) {
186
- if (!this.dirtySubject.closed && this.dirtySubject.value !== true) {
187
- this.dirtySubject.next(true);
188
- if (!opts || opts.emitEvent !== false) {
189
- this.markForCheck();
190
- }
191
- }
192
- }
193
- markAsPristine(opts) {
194
- if (!this.dirtySubject.closed && this.dirtySubject.value !== false) {
195
- this.dirtySubject.next(false);
196
- if (!opts || opts.emitEvent !== false) {
197
- this.markForCheck();
198
- }
199
- }
200
- }
201
- async markAsUntouched(opts) {
202
- let needEmitEvent = false;
203
- if (this.touchedSubject.value) {
204
- this.touchedSubject.next(false);
205
- needEmitEvent = true;
206
- }
207
- if (this.dirty) {
208
- for (const row of this.dataSource.getEditingRows()) {
209
- // Cancel the current editing row only if editing and if it was not previously saved
210
- if (row.id === -1) {
211
- await this.dataSource.delete(-1);
212
- }
213
- else if (row.editing) {
214
- await this.dataSource.cancel(row);
215
- }
216
- // Check if row as pristine
217
- await this.checkIfRowPristine(row, { onlySelf: true /* avoid propagation to table - done just after */ });
218
- }
219
- // Check if the table is pristine
220
- await this.checkIfPristine({ emitEvent: false /*will be done just after*/ });
221
- needEmitEvent = true;
222
- }
223
- this.previouslyEditedRowId = undefined;
224
- if (needEmitEvent && (!opts || opts.emitEvent !== false))
225
- this.markForCheck();
226
- }
227
- /**
228
- * @deprecated prefer to use markAllAsTouched()
229
- * @param opts
230
- */
231
- markAsTouched(opts) {
232
- console.warn('TODO: Replace this call by markAllAsTouched() - because of changes in ngx-components >= 0.16.0');
233
- if (this.dataSource.hasSomeEditingRow()) {
234
- this.dataSource.getEditingRows().forEach((row) => row.validator?.markAllAsTouched());
235
- if (!opts || opts.emitEvent !== false) {
236
- this.markForCheck();
237
- }
238
- }
239
- }
240
- markAllAsTouched(opts) {
241
- if (!this.touchedSubject.closed && this.touchedSubject.value !== true) {
242
- this.touchedSubject.next(true);
243
- if (!opts || opts.emitEvent !== false)
244
- this.markForCheck();
245
- }
246
- this.dataSource.getEditingRows().forEach((row) => row.validator?.markAllAsTouched());
247
- }
248
- markAsSaving(opts) {
249
- if (!this.savingSubject.closed && this.savingSubject.value !== true) {
250
- this.focusColumn = undefined; // unselect focus column
251
- this.savingSubject.next(true);
252
- if (!opts || opts.emitEvent !== false)
253
- this.markForCheck();
254
- }
255
- }
256
- markAsSaved(opts) {
257
- if (!this.savingSubject.closed && this.savingSubject.value !== false) {
258
- this.savingSubject.next(false);
259
- if (!opts || opts.emitEvent !== false)
260
- this.markForCheck();
261
- }
262
- }
263
- markAsLoading(opts) {
264
- this.setLoading(true, opts);
265
- }
266
- markAsLoaded(opts) {
267
- this.setLoading(false, opts);
268
- }
269
- markAsReady(opts) {
270
- if (!this.readySubject.closed && this.readySubject.value !== true) {
271
- this.readySubject.next(true);
272
- // If subclasses implements OnReady
273
- if (typeof this['ngOnReady'] === 'function') {
274
- this.ngOnReady();
275
- }
276
- }
277
- }
278
- get loading() {
279
- return this.loadingSubject.value;
280
- }
281
- get loaded() {
282
- return !this.loadingSubject.value;
283
- }
284
- enableSort() {
285
- if (this.sort)
286
- this.sort.disabled = false;
287
- }
288
- disableSort() {
289
- if (this.sort)
290
- this.sort.disabled = true;
291
- }
292
- set pageSize(value) {
293
- this.defaultPageSize = value;
294
- if (this.paginator) {
295
- this.paginator.pageSize = value;
296
- }
297
- }
298
- get pageSize() {
299
- return (this.paginator && this.paginator.pageSize) || this.defaultPageSize || DEFAULT_PAGE_SIZE;
300
- }
301
- get pageOffset() {
302
- return (this.paginator && this.paginator.pageIndex * this.paginator.pageSize) || 0;
303
- }
304
- get sortActive() {
305
- return this.sort && this.sort.active;
306
- }
307
- get sortDirection() {
308
- return (this.sort && this.sort.direction && (this.sort.direction === 'desc' ? 'desc' : 'asc')) || undefined;
309
- }
310
- _paginator = null;
311
- set paginator(value) {
312
- this._paginator = value;
313
- }
314
- get paginator() {
315
- return this._paginator || this.childPaginator;
316
- }
317
- get destroyed() {
318
- return this.destroySubject?.closed !== false;
319
- }
320
- table;
321
- childPaginator;
322
- sort;
323
- constructor(injector, columns, _dataSource, _filter) {
324
- this.columns = columns;
325
- this._dataSource = _dataSource;
326
- this._filter = _filter;
327
- this.cd = injector.get(ChangeDetectorRef);
328
- this.route = injector.get(ActivatedRoute);
329
- this.router = injector.get(Router);
330
- this.navController = injector.get(NavController);
331
- this.location = injector.get(Location);
332
- this.settings = injector.get(LocalSettingsService);
333
- this.translate = injector.get(TranslateService);
334
- this.modalCtrl = injector.get(ModalController);
335
- this.alertCtrl = injector.get(AlertController);
336
- this.toastController = injector.get(ToastController);
337
- this.formErrorAdapter = injector.get(FormErrorTranslator);
338
- this.mobile = this.settings.mobile;
339
- // Autocomplete fields
340
- this._autocompleteConfigHolder = new MatAutocompleteConfigHolder({
341
- getUserAttributes: (a, b) => this.settings.getFieldDisplayAttributes(a, b),
342
- });
343
- this.autocompleteFields = this._autocompleteConfigHolder.fields;
344
- }
345
- ngOnInit() {
346
- if (this._initialized)
347
- return; // Init only once
348
- this._initialized = true;
349
- // Set defaults
350
- this.readOnly = toBoolean(this.readOnly, this.dataSource?.config.readOnly || false); // read/write by default
351
- this.inlineEdition = !this.readOnly && toBoolean(this.inlineEdition, false); // force to false when readonly
352
- this.saveBeforeDelete = toBoolean(this.saveBeforeDelete, !this.readOnly); // force to false when readonly
353
- this.saveBeforeSort = toBoolean(this.saveBeforeSort, !this.readOnly); // force to false when readonly
354
- this.saveBeforeFilter = toBoolean(this.saveBeforeFilter, !this.readOnly); // force to false when readonly
355
- this.keepEditedRowOnSave = toBoolean(this.keepEditedRowOnSave, this.inlineEdition);
356
- this.errorTranslateOptions = this.errorTranslateOptions || { separator: ', ', pathTranslator: this }; // Can be override in subclasses constructors
357
- // Check ask user confirmation is possible
358
- if (this.confirmBeforeDelete && !this.alertCtrl)
359
- throw Error("Missing 'alertCtrl' or 'injector' in component's constructor.");
360
- // Defined unique id for settings for the page
361
- this.settingsId = this.settingsId || this.generateTableId();
362
- this.displayedColumns = this.getDisplayColumns();
363
- // Load the sorted columns, from settings
364
- {
365
- const sortedColumn = this.getSortedColumn();
366
- this.defaultSortBy = sortedColumn.id;
367
- this.defaultSortDirection = sortedColumn.start;
368
- }
369
- this.defaultPageSize = this.getPageSize();
370
- // Propagate error to event emitter
371
- this.registerSubscription(this.errorSubject.subscribe((value) => this.onError.emit(value)));
372
- // Propagate dirty to event emitter
373
- this.registerSubscription(this.dirtySubject.subscribe((value) => this.onDirty.emit(value)));
374
- // Propagate row dirty state to table
375
- this.registerSubscription(this.onStartEditingRow
376
- .pipe(filter((row) => row?.validator && true), mergeMap((row) => row.validator.valueChanges.pipe(filter((row) => row.dirty), first(),
377
- // DEBUG
378
- //tap(() => console.debug("Propagate row's dirty to table..."))
379
- // Stop if next another row, or destroying
380
- takeUntil(this.onStartEditingRow), takeUntil(this.destroySubject))))
381
- .subscribe(() => this.markAsDirty()));
382
- // Call datasource refresh, on each refresh events
383
- this.registerSubscription(this.onRefresh
384
- .pipe(startWith((this.autoLoad ? {} : 'skip')), switchMap((event) => {
385
- this.dirtySubject.next(false);
386
- this.selection.clear();
387
- if (event === 'skip') {
388
- return of(undefined);
389
- }
390
- if (!this._dataSource) {
391
- if (this.debug)
392
- console.debug('[table] Skipping data load: no dataSource defined');
393
- return of(undefined);
394
- }
395
- if (this.debug)
396
- console.debug('[table] Calling dataSource.watchAll()...');
397
- return this._dataSource.watchAll(this.pageOffset, this.pageSize, this.sortActive, this.sortDirection, this._filter);
398
- }), catchError((err) => {
399
- if (this.debug)
400
- console.error(err);
401
- this.setError((err && err.message) || err);
402
- return of(undefined); // Continue
403
- }))
404
- .subscribe((res) => this.updateView(res)));
405
- // Listen dataSource loading events
406
- if (this._dataSource)
407
- this.listenDatasourceLoading(this._dataSource);
408
- // Permanent selection behavior
409
- if (this.permanentSelectionAllowed)
410
- this.initPermanentSelection();
411
- }
412
- ngAfterViewInit() {
413
- // Detect when parent ngOnInit() not call
414
- if (this.debug && !this.displayedColumns)
415
- console.warn(`[table] Missing 'displayedColumns'. Did you call parent ngOnInit() in component ${this.constructor.name} ?`);
416
- // Start listening sort and paginator events
417
- // noinspection JSIgnoredPromiseFromCall
418
- this.listenSortAndPaginationEvents();
419
- }
420
- ngOnDestroy() {
421
- this._subscription.unsubscribe();
422
- // Unsubscribe column value changes
423
- Object.keys(this._cellValueChangesDefs).forEach((col) => this.stopCellValueChanges(col, true));
424
- this._cellValueChangesDefs = {};
425
- this.readySubject.unsubscribe();
426
- this.loadingSubject.unsubscribe();
427
- this.savingSubject.unsubscribe();
428
- this.errorSubject.unsubscribe();
429
- this.dirtySubject.unsubscribe();
430
- this.onRefresh.unsubscribe();
431
- this.onOpenRow.unsubscribe();
432
- this.onNewRow.unsubscribe();
433
- this.onStartEditingRow.unsubscribe();
434
- this.onConfirmEditCreateRow.unsubscribe();
435
- this.onCancelOrDeleteRow.unsubscribe();
436
- this.onBeforeDeleteRows.unsubscribe();
437
- this.onBeforeCancelRows.unsubscribe();
438
- this.onBeforeSave.unsubscribe();
439
- this.onAfterDeletedRows.unsubscribe();
440
- this.onSort.unsubscribe();
441
- this.onDirty.unsubscribe();
442
- this.onError.unsubscribe();
443
- this.destroySubject.next();
444
- this.destroySubject.unsubscribe();
445
- }
446
- async updateView(res, opts) {
447
- if (!res)
448
- return; // Skip (e.g error)
449
- if (res && res.data) {
450
- this.visibleRowCount = res.data.length;
451
- this.totalRowCount = isNotNil(res.total)
452
- ? res.total
453
- : ((this.paginator && this.paginator.pageIndex * (this.paginator.pageSize || DEFAULT_PAGE_SIZE)) || 0) + this.visibleRowCount;
454
- if (this.debug)
455
- console.debug(`[table] ${res.data.length} rows loaded`);
456
- }
457
- else {
458
- //if (this.debug) console.debug('[table] NO rows loaded');
459
- this.totalRowCount = 0;
460
- this.visibleRowCount = 0;
461
- }
462
- if (!opts || opts.emitEvent !== false) {
463
- await this.markAsUntouched({ emitEvent: false });
464
- this.markAsPristine({ emitEvent: false });
465
- this.markAsLoaded({ emitEvent: false });
466
- }
467
- this.markForCheck();
468
- }
469
- setDatasource(datasource) {
470
- if (this._dataSource)
471
- throw new Error('[table] dataSource already set !');
472
- if (datasource && this._dataSource !== datasource) {
473
- this._dataSource = datasource;
474
- if (this._initialized)
475
- this.listenDatasourceLoading(datasource);
476
- }
477
- }
478
- resetDataSource() {
479
- if (this._dataSourceLoadingSubscription) {
480
- this._dataSourceLoadingSubscription.unsubscribe();
481
- this._subscription.remove(this._dataSourceLoadingSubscription);
482
- }
483
- //this._dataSource?.close();
484
- this._dataSource = null;
485
- }
486
- addColumnDef(column) {
487
- this.table.addColumnDef(column);
488
- }
489
- removeColumnDef(column) {
490
- this.table.removeColumnDef(column);
491
- }
492
- async setFilter(filter, opts) {
493
- opts = opts || { emitEvent: true };
494
- // Prevent permanent selection change events
495
- this.permanentSelectionChangedPrevented = toBoolean(opts.permanentSelectionChangedPrevented, this.permanentSelectionChangedPrevented);
496
- if (this.saveBeforeFilter) {
497
- // if a dirty table is to be saved before filter
498
- if (this.dirty) {
499
- // Save
500
- if (await this.saveBeforeAction('filter')) {
501
- // Apply filter only if user didn't cancel the save or the save is ok
502
- this.applyFilter(filter, opts);
503
- }
504
- }
505
- else {
506
- // apply filter on non-dirty table
507
- this.applyFilter(filter, opts);
508
- }
509
- }
510
- else {
511
- // apply filter directly
512
- this.applyFilter(filter, opts);
513
- }
514
- }
515
- async confirmAndAdd(event, row) {
516
- if (!(await this.confirmEditCreate(event, row))) {
517
- return false;
518
- }
519
- // Add row
520
- return this.addRow(event);
521
- }
522
- async confirmAndBackward(event, row) {
523
- // Deleting edited row, if empty and not dirty
524
- if (this.dataSource.hasSomeEditingRow()) {
525
- for (const editingRow of this.dataSource.getEditingRows().filter((row) => row.id === -1 && row.invalid && !row.dirty)) {
526
- await this.deleteNewRow(event, editingRow);
527
- }
528
- // Wait deletion is done, then edit previous row (by id, because of reloading)
529
- await this.waitIdle();
530
- await this.editRowById(event, row.id, { focusColumn: this.lastUserColumn });
531
- return true;
532
- }
533
- // Edit previous row
534
- await this.editRow(event, row, { focusColumn: this.lastUserColumn });
535
- return true;
536
- }
537
- async confirmAndForward(event, row) {
538
- if (!this.inlineEdition)
539
- return false;
540
- const confirmed = await this.confirmEditCreate(event, row);
541
- if (!confirmed)
542
- return false; // Not confirmed
543
- // Edit next row
544
- await this.editRowById(event, row.id + 1, { focusColumn: this.firstUserColumn });
545
- return true;
546
- }
547
- /**
548
- * Confirm the creation of the given row, or if not specified the currently edited row
549
- *
550
- * @param event
551
- * @param row
552
- */
553
- async confirmEditCreate(event, row) {
554
- row = row || this.dataSource.getSingleEditingRow();
555
- if (!row || !row.editing)
556
- return true; // no row to confirm
557
- // Stop event
558
- event?.stopPropagation();
559
- // Confirmation edition or creation
560
- const confirmed = await row.confirmEditCreate();
561
- if (confirmed) {
562
- // Mark table as dirty (if row is dirty)
563
- if (row.dirty) {
564
- this.markAsDirty({ emitEvent: false /* because of resetError() */ });
565
- }
566
- // Clear error
567
- this.resetError();
568
- // Emit the confirm event
569
- this.onConfirmEditCreateRow.next(row);
570
- return true; // Continue
571
- }
572
- if (row.validator) {
573
- // NOT confirmed = row has error
574
- if (this.debug) {
575
- console.warn('[table] Cannot confirm row, because invalid');
576
- AppFormUtils.logFormErrors(row.validator, '[table] ');
577
- }
578
- // fix: mark all controls as touched to show errors
579
- row.validator.markAllAsTouched();
580
- // Compute row error, and propagate to table's error
581
- if (this.propagateRowError) {
582
- const error = this.getRowError(row);
583
- this.setError(error);
584
- }
585
- }
586
- // Not confirmed
587
- return false;
588
- }
589
- async cancelOrDelete(event, row, opts) {
590
- // Delete new row
591
- if (row.id === -1) {
592
- await this.deleteNewRow(event, row);
593
- }
594
- // Delete existing (but not editing) row
595
- else if (!row.editing) {
596
- await this.deleteExistingRow(event, row, opts);
597
- }
598
- // Cancel existing (and editing) row
599
- else {
600
- await this.cancelExistingRow(event, row, opts);
601
- }
602
- }
603
- async addRow(event, insertAt, opts) {
604
- if (this.debug)
605
- console.debug('[table] Asking for new row...');
606
- if (!this._enabled)
607
- return false;
608
- // Use modal if inline edition is disabled
609
- if (!this.inlineEdition) {
610
- await this.openNewRowDetail(event);
611
- return false;
612
- }
613
- // Try to finish edited row first
614
- if (!(await this.confirmEditCreate())) {
615
- return false;
616
- }
617
- // Add new row
618
- const row = await this.addRowToTable(insertAt, opts);
619
- return !!row;
620
- }
621
- async save(opts) {
622
- opts = {
623
- keepEditing: this.keepEditedRowOnSave,
624
- ...opts,
625
- };
626
- if (this.readOnly) {
627
- throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
628
- }
629
- this.resetError();
630
- // Keep edited row id (should be done BEFORE confirmEditCreate() )
631
- const editedRow = this.dataSource.getSingleEditingRow();
632
- this.previouslyEditedRowId = opts.keepEditing ? (editedRow?.editing ? editedRow.id : undefined) || this.singleSelectedRow?.id : undefined;
633
- const previouslyEditedRowId = this.previouslyEditedRowId;
634
- const previouslyEditedData = opts.keepEditing
635
- ? (isNotNil(previouslyEditedRowId) && editedRow?.currentData) || this.singleSelectedRow?.currentData
636
- : undefined;
637
- if (!(await this.confirmEditCreate())) {
638
- throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
639
- }
640
- // Mark as saving
641
- this.markAsSaving();
642
- try {
643
- // Calling service save()
644
- if (this.debug)
645
- console.debug('[table] Calling dataSource.save()...');
646
- const isOK = await this._dataSource.save();
647
- if (isOK)
648
- this.markAsPristine();
649
- return isOK;
650
- }
651
- catch (err) {
652
- this.setError((err && err.message) || err);
653
- throw err;
654
- }
655
- finally {
656
- this.markAsSaved();
657
- // Restore previous row
658
- if (isNotNil(previouslyEditedRowId)) {
659
- await this.selectRowByIdOrData(previouslyEditedRowId, previouslyEditedData);
660
- }
661
- }
662
- }
663
- async cancel(event, opts) {
664
- // Check confirmation
665
- if ((!opts || opts.interactive !== false) && this.dirty && (this.confirmBeforeCancel || this.onBeforeCancelRows.observed)) {
666
- event?.stopPropagation();
667
- if (!(await this.canCancelRows())) {
668
- return;
669
- }
670
- }
671
- this.emitRefresh();
672
- }
673
- async duplicateRow(event, row, opts) {
674
- event?.stopPropagation();
675
- row = row || this.singleSelectedRow;
676
- if (!row || !(await this.confirmEditCreate(event, row))) {
677
- return false;
678
- }
679
- const newRow = await this.addRowToTable(row.id + 1);
680
- if (!newRow)
681
- throw new Error('Cannot add new row to table');
682
- const json = { ...row.currentData, id: null };
683
- // Reset some properties (e.g. rankOrder, etc)
684
- if (opts && opts.skipProperties) {
685
- const newData = newRow.currentData;
686
- opts.skipProperties.forEach((key) => (json[key] = newData[key]));
687
- }
688
- if (newRow.validator) {
689
- newRow.validator.patchValue(json);
690
- newRow.validator.markAsDirty();
691
- }
692
- else {
693
- if (newRow.currentData?.fromObject) {
694
- newRow.currentData.fromObject(json);
695
- }
696
- else {
697
- newRow.currentData = json;
698
- }
699
- this.markAsDirty();
700
- }
701
- // select
702
- await this.clickRow(undefined, newRow);
703
- }
704
- /** Whether the number of selected elements matches the total number of rows. */
705
- isAllSelected() {
706
- // DEBUG
707
- //console.debug('isAllSelected. lengths', this.selection.selected.length, this.totalRowCount);
708
- return this.selection.selected.length === this.totalRowCount || this.selection.selected.length === this.visibleRowCount;
709
- }
710
- /** Selects all rows if they are not all selected; otherwise clear selection. */
711
- async masterToggle() {
712
- if (this.loading)
713
- return;
714
- if (this.isAllSelected()) {
715
- this.selection.clear();
716
- }
717
- else {
718
- const rows = this._dataSource.getRows();
719
- this.selection.setSelection(...rows);
720
- }
721
- }
722
- async deleteSelection(event, opts) {
723
- const deleteCount = await this.deleteRows(event, this.selection.selected, opts);
724
- if (deleteCount > 0)
725
- this.selection.clear();
726
- return deleteCount;
727
- }
728
- /**
729
- *
730
- * @param event
731
- * @param row
732
- * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)
733
- * And to force deletion even if table is busy
734
- */
735
- async deleteRow(event, row, opts) {
736
- const deleteCount = await this.deleteRows(event, [row], opts);
737
- return deleteCount === 1;
738
- }
739
- /**
740
- *
741
- * @param event
742
- * @param rows
743
- * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)
744
- * And to force deletion even if table is busy
745
- */
746
- async deleteRows(event, rows, opts) {
747
- if (this.readOnly) {
748
- throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
749
- }
750
- if (event?.defaultPrevented)
751
- return 0; // SKip
752
- event?.preventDefault();
753
- this.resetError();
754
- if (!this._enabled || isEmptyArray(rows))
755
- return 0; // Skip is disabled, or no rows to delete
756
- if (this.loading && (!opts || opts.interactive !== false)) {
757
- console.warn('[app-table] Skip deleteRows() because table is busy (loading). Use opts.interactive = false to force deletion');
758
- return 0; // Skip if loading
759
- }
760
- // Make sure to keep newly created row
761
- const editedRow = this.dataSource.getSingleEditingRow();
762
- if (editedRow?.id === -1 && editedRow.editing && !rows.includes(editedRow)) {
763
- const confirmed = await this.confirmEditCreate();
764
- if (!confirmed)
765
- return 0; // Cannot delete (e.g. edited row is invalid)
766
- }
767
- // Check if can delete
768
- const canDelete = await this.canDeleteRows(rows, opts);
769
- if (!canDelete)
770
- return 0; // Cannot delete
771
- // Reverse row order (on a copy)
772
- // This is a workaround, need because row.delete() has async execution
773
- // and index cache is updated with a delay
774
- let tempRows = rows.slice().sort((a, b) => (a.id > b.id ? -1 : 1));
775
- const deletedRows = [];
776
- // If data need to be saved first
777
- if (this.saveBeforeDelete) {
778
- // Exclude invalid rows (because of save() will fail, when exists some invalid rows)
779
- tempRows = tempRows.filter((row) => {
780
- // Delete the row :
781
- // - if newly created row (id = -1),
782
- // - or if invalid and not editing (= not cancellable)
783
- if (row.id === -1 || (!row.editing && row.invalid) /*do not use !valid because if row is disabled, it will be always !valid */) {
784
- if (this.debug)
785
- console.debug(`[table] Delete row #${row.id}`);
786
- this.selection.deselect(row);
787
- row.delete();
788
- this.visibleRowCount--;
789
- this.totalRowCount--;
790
- deletedRows.push(row);
791
- return false; // Exclude from the list to delete using the service
792
- }
793
- // Cancel the row (and mark as pristine), when not valid but in edition
794
- else if (row.editing && !row.valid) {
795
- this.selection.deselect(row);
796
- row.cancel();
797
- // Mark row as pristine (if possible)
798
- this.checkIfRowPristine(row, { emitEvent: false, onlySelf: true /*avoid propagation to table*/ });
799
- return true; // Keep the row. the row will be deleted after the save
800
- }
801
- return true;
802
- });
803
- // Apply save, only if there is still some rows to delete
804
- // WARN: If no more rows (e.g. because all has been cancelled) then continue anyway to clear editedRow and selection (issue IMAGINE-669)
805
- if (deletedRows.length || tempRows.length) {
806
- // Save data (e.g. when using memory service)
807
- const saved = await this.saveBeforeAction('delete');
808
- if (!saved) {
809
- // Stop if save cancelled or save failed
810
- return;
811
- }
812
- }
813
- }
814
- try {
815
- // Apply deletion on datasource
816
- // If no more rows to delete, continue anyway to clear editedRow and selection (issue IMAGINE-669)
817
- if (tempRows.length) {
818
- if (this.debug)
819
- console.debug(`[table] Delete ${tempRows.length} rows...`);
820
- await this._dataSource.deleteAll(tempRows);
821
- }
822
- // DO not update manually, because watchALl().subscribe() will update this count
823
- //this.totalRowCount -= deleteCount;
824
- //this.visibleRowCount -= deleteCount;
825
- // Deselect deleted rows
826
- this.selection.deselect(...rows);
827
- this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });
828
- this.markForCheck();
829
- this.onAfterDeletedRows.next(rows);
830
- return rows.length;
831
- }
832
- catch (err) {
833
- this.setError((err && err.message) || err);
834
- throw err;
835
- }
836
- }
837
- async selectRowById(id) {
838
- if (id === undefined)
839
- return false;
840
- await this.waitIdle();
841
- const row = this.dataSource.getRow(id);
842
- if (!row)
843
- return false;
844
- return this.clickRow(null, row);
845
- }
846
- /**
847
- * Try to select row by data. Will use equals() to find same row's data
848
- *
849
- * @param data
850
- */
851
- async selectRowByData(data) {
852
- if (data === undefined)
853
- return Promise.resolve(false);
854
- await this.waitIdle();
855
- const row = this.dataSource.getRows().find((row) => this.equals(row.currentData, data));
856
- if (!row)
857
- return false;
858
- return this.clickRow(null, row);
859
- }
860
- toggleSelectRow(event, row) {
861
- // /!\ DO NOT prevent default, otherwise the checkbox will not be updated
862
- //event?.preventDefault();
863
- event.stopPropagation();
864
- this.selection.toggle(row);
865
- }
866
- async clickRow(event, row) {
867
- if (this.loading) {
868
- // Wait while loading, and loop
869
- if (this.debug)
870
- console.debug('[table] Waiting before apply clickRow() (datasource is busy)...');
871
- await this.waitIdle({ timeout: 2000 });
872
- }
873
- // DEBUG
874
- //console.debug("[table] Detect click on row");
875
- // Cancelled by event
876
- if (event?.defaultPrevented) {
877
- if (this.debug)
878
- console.debug('[table] clickRow event is defaultPrevented');
879
- return false;
880
- }
881
- // Already in edition
882
- if (row.id === -1 || row.editing) {
883
- if (this.debug)
884
- console.debug('[table] Row already editing. Skip clickRow event');
885
- return true;
886
- }
887
- // Open the detail page (if not inline editing)
888
- if (!this.inlineEdition) {
889
- if (event) {
890
- event.stopPropagation();
891
- event.preventDefault();
892
- }
893
- this.markAsLoading();
894
- this.selection.clear();
895
- this.openRow(row.currentData.id, row)
896
- .then(() => this.markAsLoaded())
897
- .catch(() => this.markAsLoaded());
898
- return true;
899
- }
900
- // Start editing row
901
- return this.editRow(event, row, { focusColumn: undefined /*force to use the click target*/ });
902
- }
903
- async moveRow(id, direction) {
904
- await this.dataSource.move(id, direction);
905
- }
906
- ready(opts) {
907
- return waitForTrue(this.readySubject, { stop: this.destroySubject, ...opts });
908
- }
909
- waitIdle(opts) {
910
- if (!this.loadingSubject.value)
911
- return Promise.resolve();
912
- return waitForFalse(this.loadingSubject, { stop: this.destroySubject, ...opts });
913
- }
914
- async openSelectColumnsModal(event) {
915
- event?.preventDefault();
916
- // Copy current columns (deep copy)
917
- const columns = this.getCurrentColumns();
918
- const hasTopModal = !!(await this.modalCtrl.getTop());
919
- const modal = await this.modalCtrl.create({
920
- component: TableSelectColumnsComponent,
921
- componentProps: { columns },
922
- cssClass: hasTopModal && 'stack-modal',
923
- });
924
- // Open the modal
925
- await modal.present();
926
- // On dismiss
927
- const { data } = await modal.onDidDismiss();
928
- if (!data)
929
- return; // CANCELLED
930
- // Apply columns
931
- const userColumns = (data || []).filter((c) => c.canHide === false || c.visible).map((c) => c.name) || [];
932
- this.displayedColumns = RESERVED_START_COLUMNS.concat(userColumns).concat(RESERVED_END_COLUMNS);
933
- this.markForCheck();
934
- // Update user settings
935
- await this.savePageSettings(userColumns, SETTINGS_DISPLAY_COLUMNS);
936
- }
937
- trackByFn(index, row) {
938
- return row.id;
939
- }
940
- doRefresh(event) {
941
- this.emitRefresh(event);
942
- // When target wait for a complete (e.g. IonRefresher)
943
- if (event?.target && event.target.complete) {
944
- setTimeout(async () => {
945
- await this.waitIdle();
946
- event.target.complete();
947
- });
948
- }
949
- }
950
- getCurrentColumns() {
951
- const hiddenColumns = this.columns.slice(RESERVED_START_COLUMNS.length).filter((name) => this.displayedColumns.indexOf(name) === -1);
952
- return this.displayedColumns
953
- .concat(hiddenColumns)
954
- .filter((name) => !RESERVED_START_COLUMNS.includes(name) && !RESERVED_END_COLUMNS.includes(name) && !this.excludesColumns.includes(name))
955
- .map((name) => ({
956
- name,
957
- label: this.getI18nColumnName(name),
958
- visible: this.displayedColumns.indexOf(name) !== -1,
959
- canHide: this.getRequiredColumns().indexOf(name) === -1,
960
- }));
961
- }
962
- async escapeEditingRow(event, row) {
963
- row = row || this.dataSource.getSingleEditingRow();
964
- if (!row || !row.editing)
965
- return;
966
- // DEBUG
967
- //console.debug('[app-table] Cancel the row (keydown.escape)');
968
- if (event) {
969
- // Avoid to cancel the editor
970
- event.preventDefault();
971
- event.stopPropagation();
972
- }
973
- // If new row (no id)
974
- if (row.id === -1) {
975
- if (row.validator) {
976
- // If pending: Wait end of validation, then loop
977
- if (row.pending) {
978
- await AppFormUtils.waitWhilePending(row.validator);
979
- }
980
- // Row is invalid: delete the row
981
- if (row.invalid) {
982
- await this.deleteNewRow(event, row);
983
- return;
984
- }
985
- }
986
- }
987
- // If the row exists (has an id)
988
- else {
989
- // need to call cancel function (if confirmation will be called before)
990
- if (this.confirmBeforeCancel) {
991
- await this.cancelExistingRow(event, row, { keepEditing: false });
992
- return;
993
- }
994
- }
995
- // By default, try to confirm the row
996
- await this.confirmEditCreate(event, row);
997
- }
998
- translateFormPath(path) {
999
- // Can be overridden by subclasses, to resolve all field name
1000
- // Use columns key, has default name
1001
- const i18nColumnKey = this.getI18nColumnName(path);
1002
- return this.translate?.instant(i18nColumnKey) || i18nColumnKey;
1003
- }
1004
- /* -- protected method -- */
1005
- async editRow(event, row, opts) {
1006
- if (!this._enabled || !this.inlineEdition)
1007
- return false;
1008
- if (this.dataSource.getEditingRows().includes(row))
1009
- return true; // Already the edited row
1010
- if (event?.defaultPrevented)
1011
- return false;
1012
- if (!(await this.confirmEditCreate())) {
1013
- return false;
1014
- }
1015
- if (!row.editing && !this.loading) {
1016
- this.focusColumn = (opts && opts.focusColumn) || this.focusColumn;
1017
- await this._dataSource.startEdit(row);
1018
- }
1019
- this.onStartEditingRow.emit(row);
1020
- return true;
1021
- }
1022
- /**
1023
- * Try to select row, by row.id, or by data. WIll use EntityUtils.equals()
1024
- *
1025
- * @param id
1026
- * @param data
1027
- * @protected
1028
- */
1029
- async selectRowByIdOrData(id, data) {
1030
- let done = false;
1031
- try {
1032
- // Select by row id (if NOT a new row)
1033
- if (isNotNil(id) || id !== -1) {
1034
- done = await this.selectRowById(id);
1035
- if (done)
1036
- return true;
1037
- console.warn('[app-table] Save: Cannot reselect row by row.id: ', id);
1038
- }
1039
- // Try by data
1040
- if (data) {
1041
- done = await this.selectRowByData(data);
1042
- if (done)
1043
- return true;
1044
- console.warn('[app-table] Save: Cannot reselect row by data: ', data);
1045
- }
1046
- return false;
1047
- }
1048
- catch (err) {
1049
- // Log, but continue
1050
- console.error((err && err.message) || err);
1051
- return false;
1052
- }
1053
- }
1054
- /**
1055
- * return the selected row if unique in selection
1056
- */
1057
- get singleSelectedRow() {
1058
- return this.selection.selected?.length === 1 ? this.selection.selected[0] : undefined;
1059
- }
1060
- async canDeleteRows(rows, opts) {
1061
- // Check using emitter
1062
- if (this.onBeforeDeleteRows.observed) {
1063
- try {
1064
- const canDelete = await emitPromiseEvent(this.onBeforeDeleteRows, 'canDelete', {
1065
- detail: { rows },
1066
- });
1067
- if (!canDelete)
1068
- return false;
1069
- }
1070
- catch (err) {
1071
- if (err === 'CANCELLED')
1072
- return false; // User cancel
1073
- console.error('Error while checking if can delete rows', err);
1074
- throw err;
1075
- }
1076
- }
1077
- // Ask user confirmation
1078
- if (this.confirmBeforeDelete && (!opts || opts.interactive !== false)) {
1079
- return this.askDeleteConfirmation(null, rows);
1080
- }
1081
- return true;
1082
- }
1083
- async canCancelRows(rows, opts) {
1084
- // Get dirty rows
1085
- rows = rows || this.dataSource.getRows().filter((row) => row.validator?.dirty);
1086
- if (isEmptyArray(rows))
1087
- return true; // No dirty: OK
1088
- // Check using emitter
1089
- if (this.onBeforeCancelRows.observed) {
1090
- try {
1091
- const isCancel = await emitPromiseEvent(this.onBeforeCancelRows, 'canCancel', {
1092
- detail: { rows },
1093
- });
1094
- if (!isCancel)
1095
- return false;
1096
- }
1097
- catch (err) {
1098
- if (err === 'CANCELLED')
1099
- return false; // User cancel
1100
- console.error('Error while checking if can cancel rows', err);
1101
- throw err;
1102
- }
1103
- }
1104
- // Ask user confirmation
1105
- if (this.confirmBeforeCancel && (!opts || opts.interactive !== false)) {
1106
- return this.askCancelConfirmation(null, rows);
1107
- }
1108
- return true;
1109
- }
1110
- async saveBeforeAction(saveAction) {
1111
- if (!this.dirty) {
1112
- // Continue without save
1113
- return true;
1114
- }
1115
- let save;
1116
- switch (saveAction) {
1117
- case 'delete':
1118
- save = this.saveBeforeDelete;
1119
- break;
1120
- case 'filter':
1121
- save = this.saveBeforeFilter;
1122
- break;
1123
- case 'sort':
1124
- save = this.saveBeforeSort;
1125
- break;
1126
- default:
1127
- save = true;
1128
- }
1129
- // Default behavior
1130
- let confirmed = true;
1131
- if (save) {
1132
- if (this.onBeforeSave.observed) {
1133
- // Ask confirmation
1134
- try {
1135
- const res = await emitPromiseEvent(this.onBeforeSave, 'beforeSave', {
1136
- detail: { action: saveAction, valid: this.valid },
1137
- });
1138
- confirmed = res.confirmed;
1139
- save = res.save;
1140
- }
1141
- catch (err) {
1142
- if (err === 'CANCELLED')
1143
- return false; // User cancel
1144
- console.error('Error while checking if can delete rows', err);
1145
- throw err;
1146
- }
1147
- }
1148
- }
1149
- if (confirmed) {
1150
- if (save) {
1151
- // User confirmed save
1152
- const saved = await this.save();
1153
- this.markAsDirty(); // Restore dirty flag
1154
- return saved;
1155
- }
1156
- return true; // No save but continue action
1157
- }
1158
- return false; // User cancel the action
1159
- }
1160
- /**
1161
- * Open a row detail view. By default, will to open row detail page.
1162
- * Can be overridden by subclasses, BUT prefer to subscribe on onOpenRow
1163
- *
1164
- * @param id
1165
- * @param row
1166
- * @protected
1167
- */
1168
- async openRow(id, row) {
1169
- if (this.allowRowDetail) {
1170
- if (this.debug && this.dirty) {
1171
- console.warn('[table] Opening row details, but table has unsaved changes!');
1172
- }
1173
- if (this.onOpenRow.observed) {
1174
- this.onOpenRow.emit(row);
1175
- return true;
1176
- }
1177
- // No ID defined: unable to open details
1178
- if (isNil(id)) {
1179
- console.warn('[table] Opening row details, but data has no id!');
1180
- return false;
1181
- }
1182
- return this.navController.navigateForward(`${this.router.url}/${id}`, {
1183
- queryParams: {},
1184
- });
1185
- }
1186
- return false;
1187
- }
1188
- async openNewRowDetail(event) {
1189
- if (!this.allowRowDetail)
1190
- return false;
1191
- if (this.onNewRow.observed) {
1192
- this.onNewRow.emit(event);
1193
- return true;
1194
- }
1195
- return this.navController.navigateForward(`${this.router.url}/new`);
1196
- }
1197
- // can be overridden to add more required columns
1198
- getRequiredColumns() {
1199
- return DEFAULT_REQUIRED_COLUMNS;
1200
- }
1201
- getUserColumns() {
1202
- return this.getPageSettings(SETTINGS_DISPLAY_COLUMNS);
1203
- }
1204
- getSortedColumn() {
1205
- const data = this.getPageSettings(SETTINGS_SORTED_COLUMN);
1206
- const parts = data && data.split(':');
1207
- if (parts && parts.length === 2 && this.columns.includes(parts[0])) {
1208
- return { id: parts[0], start: parts[1] === 'desc' ? 'desc' : 'asc', disableClear: false };
1209
- }
1210
- if (this.defaultSortBy) {
1211
- return { id: this.defaultSortBy, start: this.defaultSortDirection || 'asc', disableClear: false };
1212
- }
1213
- return { id: 'id', start: 'asc', disableClear: false };
1214
- }
1215
- getPageSize() {
1216
- const pageSize = this.getPageSettings(SETTINGS_PAGE_SIZE);
1217
- return pageSize || this.defaultPageSize;
1218
- }
1219
- getDisplayColumns() {
1220
- let userColumns = this.getUserColumns();
1221
- // No user override
1222
- if (!userColumns) {
1223
- // Return default, without columns to hide
1224
- return this.columns.filter((column) => !this.excludesColumns.includes(column));
1225
- }
1226
- // Get fixed start columns
1227
- const fixedStartColumns = this.columns.filter((c) => RESERVED_START_COLUMNS.includes(c));
1228
- // Remove end columns
1229
- const fixedEndColumns = this.columns.filter((c) => RESERVED_END_COLUMNS.includes(c));
1230
- // Remove fixed columns from user columns
1231
- userColumns = userColumns.filter((c) => !fixedStartColumns.includes(c) && !fixedEndColumns.includes(c) && this.columns.includes(c));
1232
- // Add required columns if missing
1233
- userColumns.push(...this.getRequiredColumns().filter((c) => !fixedStartColumns.includes(c) && !fixedEndColumns.includes(c) && !userColumns.includes(c)));
1234
- return (fixedStartColumns
1235
- .concat(userColumns)
1236
- .concat(fixedEndColumns)
1237
- // Remove columns to hide
1238
- .filter((column) => !this.excludesColumns.includes(column)));
1239
- }
1240
- /**
1241
- * Recompute display columns
1242
- *
1243
- * @protected
1244
- */
1245
- updateColumns() {
1246
- this.displayedColumns = this.getDisplayColumns();
1247
- if (!this.loading)
1248
- this.markForCheck();
1249
- }
1250
- registerSubscription(sub) {
1251
- this._subscription.add(sub);
1252
- }
1253
- unregisterSubscription(sub) {
1254
- this._subscription.remove(sub);
1255
- }
1256
- registerAutocompleteField(fieldName, options) {
1257
- return this._autocompleteConfigHolder.add(fieldName, options);
1258
- }
1259
- getI18nColumnName(columnName) {
1260
- return (this.i18nColumnPrefix || '') + changeCaseToUnderscore(columnName).toUpperCase();
1261
- }
1262
- generateTableId() {
1263
- // noinspection JSNonASCIINames
1264
- const meta = this.constructor['ɵcmp'];
1265
- // Get a component unique name - See https://stackoverflow.com/questions/60114682/how-to-access-components-unique-encapsulation-id-in-angular-9
1266
- const componentId = (meta && (meta.selectors?.[0] || meta.id)) || this.constructor.name;
1267
- const id = this.location
1268
- .path(true)
1269
- .replace(/[?].*$/g, '')
1270
- .replace(/\/\d+/g, '_id') +
1271
- '_' +
1272
- componentId;
1273
- //if (this.debug) console.debug('[table] id = ' + id);
1274
- return id;
1275
- }
1276
- async addRowToTable(insertAt, opts) {
1277
- // Try to finish edited row first
1278
- if (!(await this.confirmEditCreate())) {
1279
- console.warn('[table] Cannot add new row, because the previous edited row cannot be confirmed');
1280
- return undefined;
1281
- }
1282
- const editing = this.inlineEdition && (!opts || opts.editing !== false); // true by default, if inlineEdition
1283
- const row = await this._dataSource.createNew(insertAt, { editing });
1284
- if (!row)
1285
- return undefined;
1286
- if (row.editing) {
1287
- // Update focused column
1288
- this.focusFirstColumn = true;
1289
- this.focusColumn = opts?.focusColumn || this.firstUserColumn;
1290
- // Emit start editing event
1291
- this.onStartEditingRow.emit(row);
1292
- }
1293
- this.totalRowCount++;
1294
- this.visibleRowCount++;
1295
- this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });
1296
- // Emit event
1297
- if (!opts || opts.emitEvent !== false)
1298
- this.markForCheck();
1299
- return row;
1300
- }
1301
- registerCellValueChanges(name, formPath, emitInitialValue) {
1302
- formPath = formPath || name;
1303
- emitInitialValue = emitInitialValue || false;
1304
- let def = this._cellValueChangesDefs[name];
1305
- if (def && (def.formPath !== formPath || def.emitInitialValue !== emitInitialValue)) {
1306
- throw Error("Already register a cell value change for this name, with different 'formPath' or 'emitInitialValue'. Please use same arguments.");
1307
- }
1308
- // Not exists: register new definition
1309
- if (!def) {
1310
- if (this.debug)
1311
- console.debug(`[table] New listener {${name}} for value changes on path ${formPath}`);
1312
- def = {
1313
- subject: new Subject(),
1314
- subscription: null,
1315
- formPath,
1316
- emitInitialValue,
1317
- };
1318
- this._cellValueChangesDefs[name] = def;
1319
- // Start the listener, when editing starts
1320
- this.registerSubscription(this.onStartEditingRow.subscribe((row) => this.startCellValueChanges(name, row)));
1321
- }
1322
- return def.subject;
1323
- }
1324
- setShowColumn(columnName, show, opts) {
1325
- if (!this.excludesColumns.includes(columnName) !== show) {
1326
- if (!show) {
1327
- this.excludesColumns.push(columnName);
1328
- }
1329
- else {
1330
- const index = this.excludesColumns.findIndex((value) => value === columnName);
1331
- if (index >= 0)
1332
- this.excludesColumns.splice(index, 1);
1333
- }
1334
- // Recompute display columns
1335
- if (this.displayedColumns && (!opts || opts.emitEvent !== false)) {
1336
- this.updateColumns();
1337
- }
1338
- }
1339
- }
1340
- getShowColumn(columnName) {
1341
- return !this.excludesColumns.includes(columnName);
1342
- }
1343
- startsWithUpperCase(input, search) {
1344
- return input && input.toUpperCase().startsWith(search);
1345
- }
1346
- markForCheck() {
1347
- this.cd.markForCheck();
1348
- }
1349
- detectChanges() {
1350
- this.cd.detectChanges();
1351
- }
1352
- async askDeleteConfirmation(event, rows) {
1353
- if (this.undoableDeletion) {
1354
- // Special message, for undoable deletion
1355
- return Alerts.askConfirmation(rows?.length === 1 ? 'CONFIRM.DELETE_ROW' : 'CONFIRM.DELETE_ROWS', this.alertCtrl, this.translate, event);
1356
- }
1357
- // Immediate deletion action
1358
- return Alerts.askActionConfirmation(this.alertCtrl, this.translate, true, event);
1359
- }
1360
- async askCancelConfirmation(event, rows) {
1361
- return Alerts.askConfirmation(rows?.length === 1 ? 'CONFIRM.CANCEL_ROW' : 'CONFIRM.CANCEL_ROWS', this.alertCtrl, this.translate, event);
1362
- }
1363
- async askRestoreConfirmation(event) {
1364
- return Alerts.askActionConfirmation(this.alertCtrl, this.translate, false, event);
1365
- }
1366
- async showToast(opts) {
1367
- if (!this.toastController)
1368
- throw new Error("Missing toastController in component's constructor");
1369
- return Toasts.show(this.toastController, this.translate, opts);
1370
- }
1371
- resetError(opts) {
1372
- this.setError(undefined, opts);
1373
- }
1374
- getRowError(row, opts) {
1375
- row = row || this.dataSource.getSingleEditingRow();
1376
- if (!row || !this.formErrorAdapter)
1377
- return undefined;
1378
- return this.formErrorAdapter.translateFormErrors(row.validator, {
1379
- ...this.errorTranslateOptions,
1380
- ...opts,
1381
- });
1382
- }
1383
- setError(value, opts) {
1384
- if (this.errorSubject.value !== value) {
1385
- this.errorSubject.next(value);
1386
- if (!opts || opts.emitEvent !== false) {
1387
- this.markForCheck();
1388
- }
1389
- }
1390
- }
1391
- /**
1392
- * Compare data equality (default by id, using EntityUtils.equals())
1393
- * Can be overridden to add additional properties to compare
1394
- *
1395
- * @param d1
1396
- * @param d2
1397
- * @protected
1398
- */
1399
- equals(d1, d2) {
1400
- return EntityUtils.equals(d1, d2, 'id');
1401
- }
1402
- markRowAsDirty(row, opts) {
1403
- row = row || this.dataSource.getSingleEditingRow();
1404
- if (row)
1405
- row.validator?.markAsDirty(opts);
1406
- this.markAsDirty(opts);
1407
- }
1408
- getPageSettings(propertyName) {
1409
- return this.settings.getPageSettings(this.settingsId, propertyName);
1410
- }
1411
- async savePageSettings(value, propertyName) {
1412
- await this.settings.savePageSetting(this.settingsId, value, propertyName);
1413
- }
1414
- emitRefresh(value) {
1415
- // Emit onRefresh if not closed (can happen if component is destroyed to early)
1416
- if (!!this.onRefresh && !this.onRefresh.closed) {
1417
- this.onRefresh.emit(value);
1418
- }
1419
- }
1420
- /**
1421
- * Initialize the permanent selection model
1422
- *
1423
- * @protected
1424
- */
1425
- initPermanentSelection() {
1426
- if (this.permanentSelection)
1427
- throw new Error('initPermanentSelection() already called!');
1428
- this.permanentSelection = new SelectionModel(true, []);
1429
- // Listen sort change
1430
- this.registerSubscription(this.onSort.subscribe(() => (this.permanentSelectionChangedPrevented = true)) // prevent selection change on sort
1431
- );
1432
- // Listen datasource update
1433
- this.registerSubscription(this.dataSource.rowsSubject
1434
- // restore the 'adding' selection (for example after a page or sort change)
1435
- .subscribe((rows) => {
1436
- this.permanentSelectionChangedPrevented = true;
1437
- try {
1438
- const permanentSelectionIds = (this.permanentSelection.selected || []).map(EntityUtils.getId);
1439
- this.selection.setSelection(...rows.filter((row) => permanentSelectionIds.includes(AppTableUtils.getEntityId(row))));
1440
- this.markForCheck();
1441
- }
1442
- finally {
1443
- this.permanentSelectionChangedPrevented = false;
1444
- }
1445
- }));
1446
- // Listen selection change
1447
- this.registerSubscription(this.selection.changed.pipe(filter(() => !this.permanentSelectionChangedPrevented)).subscribe((selectionChange) => {
1448
- // add to selection
1449
- if (selectionChange.added.length) {
1450
- this.permanentSelection.setSelection(...(this.permanentSelection.selected || [])
1451
- // Add new elements
1452
- .concat(...AppTableUtils.getEntities(selectionChange.added).filter(EntityUtils.hasId))
1453
- // Avoid duplicated entities (Mantis #55351)
1454
- .filter(EntityUtils.arrayDistinctFilterFn));
1455
- }
1456
- // remove from selection
1457
- if (selectionChange.removed.length) {
1458
- const removedIds = AppTableUtils.getEntityIds(selectionChange.removed);
1459
- this.permanentSelection.setSelection(...(this.permanentSelection.selected || []).filter((entity) => EntityUtils.hasId(entity) && !removedIds.includes(entity.id)));
1460
- }
1461
- this.markForCheck();
1462
- }));
1463
- }
1464
- /* -- private method -- */
1465
- async listenSortAndPaginationEvents() {
1466
- if (!this.table) {
1467
- // DEBUG only -- alert user that table not found in template
1468
- if (this.debug) {
1469
- setTimeout(() => !this.table &&
1470
- console.warn(`[table] Missing <mat-table> in the HTML template (after waiting 500ms)! Component: ${this.constructor.name}`), 500);
1471
- }
1472
- // Make sure to wait the table
1473
- await waitFor(() => !!this.table, { stop: this.destroySubject, stopError: false /*avoid error when destorying the table*/ });
1474
- }
1475
- this.registerSubscription(merge(
1476
- // Listen sort events
1477
- (this.sort &&
1478
- this.sort.sortChange.pipe(filter(() => !this.sort.disabled), mergeMap(async () => this.saveBeforeAction('sort')), filter((res) => res === true),
1479
- // Save sort in settings
1480
- tap(() => {
1481
- const value = [this.sort.active, this.sort.direction || 'asc'].join(':');
1482
- this.savePageSettings(value, SETTINGS_SORTED_COLUMN);
1483
- }))) ||
1484
- EMPTY,
1485
- // Listen paginator events
1486
- (this.paginator &&
1487
- this.paginator.page.pipe(mergeMap((_) => this.saveBeforeAction('sort')), filter((saved) => saved === true),
1488
- // Save page size in settings
1489
- tap(() => this.savePageSettings(this.paginator.pageSize, SETTINGS_PAGE_SIZE)))) ||
1490
- EMPTY)
1491
- // Refresh on any sort or paginator events
1492
- .subscribe((value) => {
1493
- this.onSort.emit(value);
1494
- this.emitRefresh(value);
1495
- }));
1496
- // If the user changes the sort order, reset back to the first page.
1497
- if (this.sort && this.paginator) {
1498
- this.registerSubscription(this.sort.sortChange.pipe(filter(() => !this.sort.disabled)).subscribe(() => (this.paginator.pageIndex = 0)));
1499
- }
1500
- }
1501
- async editRowById(event, id, opts) {
1502
- if (id < 0)
1503
- return;
1504
- if (id >= this.visibleRowCount) {
1505
- await this.addRow(event, undefined, { ...opts, editing: true });
1506
- }
1507
- else {
1508
- const row = this.dataSource.getRow(id);
1509
- await this.editRow(event, row, opts);
1510
- }
1511
- }
1512
- setLoading(value, opts) {
1513
- if (this.loadingSubject.value !== value) {
1514
- this.loadingSubject.next(value);
1515
- if (!opts || opts.emitEvent !== false) {
1516
- this.markForCheck();
1517
- }
1518
- }
1519
- }
1520
- async deleteNewRow(event, row) {
1521
- // Make sure row will be cancelled, and NOT deleted
1522
- if (row.id !== -1)
1523
- throw new Error('Row must have id = -1');
1524
- event?.stopPropagation();
1525
- this.selection.clear();
1526
- await this._dataSource.cancelOrDelete(row);
1527
- this.resetError();
1528
- this.onCancelOrDeleteRow.next(row);
1529
- this.totalRowCount--;
1530
- this.visibleRowCount--;
1531
- }
1532
- async deleteExistingRow(event, row, opts) {
1533
- // Make sure row will be cancelled, and NOT deleted
1534
- if (row.id === -1)
1535
- throw new Error('Row must have an id');
1536
- if (event?.defaultPrevented)
1537
- return 0; // SKip
1538
- event?.preventDefault();
1539
- await this.deleteRow(null, row, opts);
1540
- }
1541
- async cancelExistingRow(event, row, opts) {
1542
- // Make sure row will be cancelled, and NOT deleted
1543
- if (row.id === -1 || !row.editing)
1544
- throw new Error('Row cannot be canceling, but only deleting');
1545
- const confirmed = !opts || opts.interactive !== false;
1546
- // Ask user confirmation, if cancel
1547
- if (!confirmed && row.dirty && (this.confirmBeforeCancel || this.onBeforeCancelRows.observed)) {
1548
- event?.stopPropagation();
1549
- if (!(await this.canCancelRows([row], opts))) {
1550
- return;
1551
- }
1552
- }
1553
- const keepEditing = row.editing && (!opts || opts.keepEditing !== false);
1554
- await this._dataSource.cancelOrDelete(row);
1555
- this.onCancelOrDeleteRow.next(row);
1556
- // Mark row as pristine
1557
- await this.checkIfRowPristine(row);
1558
- // Restore editing state
1559
- if (keepEditing) {
1560
- await this.editRow(undefined, row);
1561
- }
1562
- }
1563
- async checkIfRowPristine(row, opts) {
1564
- // Mark row as pristine
1565
- const markRowAsPristine = this.dataSource?.config.restoreOriginalDataOnCancel === true;
1566
- if (markRowAsPristine) {
1567
- row.validator?.markAsPristine();
1568
- // Check if table is now pristine
1569
- if (!opts || opts.onlySelf !== true) {
1570
- await this.checkIfPristine(opts);
1571
- }
1572
- }
1573
- }
1574
- async checkIfPristine(opts) {
1575
- if (!this.dirty)
1576
- return; // Already pristine
1577
- const rows = this._dataSource.getRows();
1578
- const pristine = (rows || []).findIndex((row) => row.dirty) === -1;
1579
- if (pristine)
1580
- this.markAsPristine(opts);
1581
- }
1582
- applyFilter(filter, opts) {
1583
- if (this.debug)
1584
- console.debug('[table] Applying filter', filter);
1585
- this._filter = filter;
1586
- if (opts && opts.emitEvent) {
1587
- if (this.paginator && this.paginator.pageIndex > 0) {
1588
- this.paginator.pageIndex = 0;
1589
- }
1590
- this.emitRefresh();
1591
- }
1592
- }
1593
- listenDatasourceLoading(dataSource) {
1594
- if (!dataSource)
1595
- throw new Error('[table] dataSource not set !');
1596
- // Cleaning previous subscription on datasource
1597
- if (isNotNil(this._dataSourceLoadingSubscription)) {
1598
- if (this.debug)
1599
- console.debug('[table] Many call to listenDatasource(): Cleaning previous subscriptions...');
1600
- this._dataSourceLoadingSubscription.unsubscribe();
1601
- this.unregisterSubscription(this._dataSourceLoadingSubscription);
1602
- }
1603
- // Propage loading to table
1604
- this._dataSourceLoadingSubscription = this._dataSource.loadingSubject
1605
- .pipe(distinctUntilChanged(),
1606
- // If changed to True: propagate as soon as possible
1607
- tap((loading) => loading && this.setLoading(true)),
1608
- // If changed to False: wait 250ms before propagate (to make sure the spinner has been displayed)
1609
- debounceTime(250), tap((loading) => !loading && this.setLoading(false)))
1610
- .subscribe();
1611
- this.registerSubscription(this._dataSourceLoadingSubscription);
1612
- }
1613
- startCellValueChanges(name, row) {
1614
- const def = this._cellValueChangesDefs[name];
1615
- if (!def) {
1616
- console.warn('[table] Listener with name {' + name + '} not registered! Please call registerCellValueChanges() before;');
1617
- return;
1618
- }
1619
- // Stop previous subscription
1620
- if (def.subscription) {
1621
- def.subscription.unsubscribe();
1622
- def.subscription = null;
1623
- }
1624
- else {
1625
- if (this.debug)
1626
- console.debug(`[table] Start values changes on row path {${def.formPath}}`);
1627
- }
1628
- // Listen value changes, and redirect to event emitter
1629
- const control = row.validator && AppFormUtils.getControlFromPath(row.validator, def.formPath);
1630
- if (!control) {
1631
- console.warn(`[table] Could not listen cell changes: no validator or invalid form path {${def.formPath}}`);
1632
- }
1633
- else {
1634
- def.subscription = control.valueChanges
1635
- .pipe(
1636
- // don't emit if control is disabled
1637
- filter(() => control.enabled))
1638
- .subscribe((value) => def.subject.next(value));
1639
- // Emit the actual value
1640
- if (def.emitInitialValue !== false) {
1641
- def.subject.next(control.value);
1642
- }
1643
- }
1644
- }
1645
- stopCellValueChanges(name, destroy) {
1646
- const def = this._cellValueChangesDefs[name];
1647
- if (!def)
1648
- return;
1649
- if (def.subscription) {
1650
- if (this.debug)
1651
- console.debug('[table] Stop value changes on row path {' + def.formPath + '}');
1652
- def.subscription.unsubscribe();
1653
- def.subscription = null;
1654
- }
1655
- if (destroy && def.subject) {
1656
- def.subject.complete();
1657
- def.subject.unsubscribe();
1658
- }
1659
- }
1660
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AppAsyncTable, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
1661
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.8", type: AppAsyncTable, inputs: { settingsId: "settingsId", debug: "debug", i18nColumnPrefix: "i18nColumnPrefix", i18nColumnSuffix: "i18nColumnSuffix", autoLoad: "autoLoad", readOnly: "readOnly", inlineEdition: "inlineEdition", focusFirstColumn: "focusFirstColumn", confirmBeforeDelete: "confirmBeforeDelete", confirmBeforeCancel: "confirmBeforeCancel", undoableDeletion: "undoableDeletion", saveBeforeDelete: "saveBeforeDelete", keepEditedRowOnSave: "keepEditedRowOnSave", saveBeforeSort: "saveBeforeSort", saveBeforeFilter: "saveBeforeFilter", propagateRowError: "propagateRowError", permanentSelectionAllowed: "permanentSelectionAllowed", defaultSortBy: "defaultSortBy", defaultSortDirection: "defaultSortDirection", defaultPageSize: "defaultPageSize", defaultPageSizeOptions: "defaultPageSizeOptions", focusColumn: "focusColumn", dataSource: "dataSource", filter: "filter", disabled: "disabled", paginator: "paginator" }, outputs: { onRefresh: "onRefresh", onOpenRow: "onOpenRow", onNewRow: "onNewRow", onStartEditingRow: "onStartEditingRow", onConfirmEditCreateRow: "onConfirmEditCreateRow", onCancelOrDeleteRow: "onCancelOrDeleteRow", onBeforeDeleteRows: "onBeforeDeleteRows", onBeforeCancelRows: "onBeforeCancelRows", onBeforeSave: "onBeforeSave", onAfterDeletedRows: "onAfterDeletedRows", onSort: "onSort", onDirty: "onDirty", onError: "onError" }, viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "childPaginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0 });
1662
- }
1663
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AppAsyncTable, decorators: [{
1664
- type: Directive
1665
- }], ctorParameters: () => [{ type: i0.Injector }, { type: undefined }, { type: i1.EntitiesAsyncTableDataSource }, { type: undefined }], propDecorators: { settingsId: [{
1666
- type: Input
1667
- }], debug: [{
1668
- type: Input
1669
- }], i18nColumnPrefix: [{
1670
- type: Input
1671
- }], i18nColumnSuffix: [{
1672
- type: Input
1673
- }], autoLoad: [{
1674
- type: Input
1675
- }], readOnly: [{
1676
- type: Input
1677
- }], inlineEdition: [{
1678
- type: Input
1679
- }], focusFirstColumn: [{
1680
- type: Input
1681
- }], confirmBeforeDelete: [{
1682
- type: Input
1683
- }], confirmBeforeCancel: [{
1684
- type: Input
1685
- }], undoableDeletion: [{
1686
- type: Input
1687
- }], saveBeforeDelete: [{
1688
- type: Input
1689
- }], keepEditedRowOnSave: [{
1690
- type: Input
1691
- }], saveBeforeSort: [{
1692
- type: Input
1693
- }], saveBeforeFilter: [{
1694
- type: Input
1695
- }], propagateRowError: [{
1696
- type: Input
1697
- }], permanentSelectionAllowed: [{
1698
- type: Input
1699
- }], defaultSortBy: [{
1700
- type: Input
1701
- }], defaultSortDirection: [{
1702
- type: Input
1703
- }], defaultPageSize: [{
1704
- type: Input
1705
- }], defaultPageSizeOptions: [{
1706
- type: Input
1707
- }], focusColumn: [{
1708
- type: Input
1709
- }], dataSource: [{
1710
- type: Input
1711
- }], filter: [{
1712
- type: Input
1713
- }], onRefresh: [{
1714
- type: Output
1715
- }], onOpenRow: [{
1716
- type: Output
1717
- }], onNewRow: [{
1718
- type: Output
1719
- }], onStartEditingRow: [{
1720
- type: Output
1721
- }], onConfirmEditCreateRow: [{
1722
- type: Output
1723
- }], onCancelOrDeleteRow: [{
1724
- type: Output
1725
- }], onBeforeDeleteRows: [{
1726
- type: Output
1727
- }], onBeforeCancelRows: [{
1728
- type: Output
1729
- }], onBeforeSave: [{
1730
- type: Output
1731
- }], onAfterDeletedRows: [{
1732
- type: Output
1733
- }], onSort: [{
1734
- type: Output
1735
- }], onDirty: [{
1736
- type: Output
1737
- }], onError: [{
1738
- type: Output
1739
- }], disabled: [{
1740
- type: Input
1741
- }], paginator: [{
1742
- type: Input
1743
- }], table: [{
1744
- type: ViewChild,
1745
- args: [MatTable, { static: false }]
1746
- }], childPaginator: [{
1747
- type: ViewChild,
1748
- args: [MatPaginator, { static: false }]
1749
- }], sort: [{
1750
- type: ViewChild,
1751
- args: [MatSort, { static: false }]
1752
- }] } });
1753
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtdGFibGUuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvdGFibGUvYXN5bmMtdGFibGUuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFZLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBOEIsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVGLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9JLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFXLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFjLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0YsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixD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QVE7c0JBQXBCLEtBQUs7Z0JBMEpPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBWWtDLEtBQUs7c0JBQTVDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDTSxjQUFjO3NCQUF6RCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0gsSUFBSTtzQkFBMUMsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNvcnQsIE1hdFNvcnRhYmxlLCBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBNYXRUYWJsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgRU1QVFksIG1lcmdlLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIGZpcnN0LCBtZXJnZU1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgRW50aXR5VXRpbHMsIElFbnRpdHkgfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyLCBNb2RhbENvbnRyb2xsZXIsIE5hdkNvbnRyb2xsZXIsIFRvYXN0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ29sdW1uSXRlbSwgVGFibGVTZWxlY3RDb2x1bW5zQ29tcG9uZW50IH0gZnJvbSAnLi90YWJsZS1zZWxlY3QtY29sdW1ucy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJy4uL3NlcnZpY2VzL2Vycm9ycyc7XG5pbXBvcnQgeyBBcHBGb3JtVXRpbHMsIENhblNhdmUsIElBcHBGb3JtLCBPblJlYWR5IH0gZnJvbSAnLi4vZm9ybS9mb3JtLnV0aWxzJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1xuICBNYXRBdXRvY29tcGxldGVDb25maWdIb2xkZXIsXG4gIE1hdEF1dG9jb21wbGV0ZUZpZWxkQWRkT3B0aW9ucyxcbiAgTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWcsXG59IGZyb20gJy4uLy4uL3NoYXJlZC9tYXRlcmlhbC9hdXRvY29tcGxldGUvbWF0ZXJpYWwuYXV0b2NvbXBsZXRlLmNvbmZpZyc7XG5pbXBvcnQgeyBDb21wbGV0YWJsZUV2ZW50LCBjcmVhdGVQcm9taXNlRXZlbnRFbWl0dGVyLCBlbWl0UHJvbWlzZUV2ZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2V2ZW50cyc7XG5pbXBvcnQgeyBjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlLCBpc0VtcHR5QXJyYXksIGlzTmlsLCBpc05vdE5pbCwgdG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyB3YWl0Rm9yLCB3YWl0Rm9yRmFsc2UsIFdhaXRGb3JPcHRpb25zLCB3YWl0Rm9yVHJ1ZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5pbXBvcnQgeyBTaG93VG9hc3RPcHRpb25zLCBUb2FzdHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdG9hc3QvdG9hc3RzJztcbmltcG9ydCB7IEFsZXJ0cyB9IGZyb20gJy4uLy4uL3NoYXJlZC9hbGVydHMnO1xuaW1wb3J0IHsgQ2RrQ29sdW1uRGVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RhYmxlJztcbmltcG9ydCB7IExvYWRSZXN1bHQgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgRm9ybUVycm9yVHJhbnNsYXRlT3B0aW9ucywgRm9ybUVycm9yVHJhbnNsYXRvciwgSUZvcm1QYXRoVHJhbnNsYXRvciB9IGZyb20gJy4uLy4uL3NoYXJlZC92YWxpZGF0b3IvZm9ybS1lcnJvci1hZGFwdGVyLmNsYXNzJztcbmltcG9ydCB7XG4gIENlbGxWYWx1ZUNoYW5nZUxpc3RlbmVyLFxuICBERUZBVUxUX1BBR0VfU0laRSxcbiAgREVGQVVMVF9QQUdFX1NJWkVfT1BUSU9OUyxcbiAgREVGQVVMVF9SRVFVSVJFRF9DT0xVTU5TLFxuICBSRVNFUlZFRF9FTkRfQ09MVU1OUyxcbiAgUkVTRVJWRURfU1RBUlRfQ09MVU1OUyxcbiAgU2F2ZUFjdGlvblR5cGUsXG4gIFNFVFRJTkdTX0RJU1BMQVlfQ09MVU1OUyxcbiAgU0VUVElOR1NfUEFHRV9TSVpFLFxuICBTRVRUSU5HU19TT1JURURfQ09MVU1OLFxufSBmcm9tICcuL3RhYmxlLm1vZGVsJztcbmltcG9ydCB7IEFzeW5jVGFibGVFbGVtZW50IH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7IEVudGl0aWVzQXN5bmNUYWJsZURhdGFTb3VyY2UgfSBmcm9tICcuL2VudGl0aWVzLWFzeW5jLXRhYmxlLWRhdGFzb3VyY2UuY2xhc3MnO1xuaW1wb3J0IHsgQXBwVGFibGVVdGlscyB9IGZyb20gJy4vdGFibGUudXRpbHMnO1xuXG4vLyBAZHluYW1pY1xuLy8gbm9pbnNwZWN0aW9uIER1cGxpY2F0ZWRDb2RlXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFwcEFzeW5jVGFibGU8VCBleHRlbmRzIElFbnRpdHk8VCwgSUQ+LCBGID0gYW55LCBJRCA9IG51bWJlcj5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgSUFwcEZvcm0sIENhblNhdmUsIElGb3JtUGF0aFRyYW5zbGF0b3JcbntcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF9kYXRhU291cmNlTG9hZGluZ1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgX2NlbGxWYWx1ZUNoYW5nZXNEZWZzOiB7XG4gICAgW2tleTogc3RyaW5nXTogQ2VsbFZhbHVlQ2hhbmdlTGlzdGVuZXI7XG4gIH0gPSB7fTtcblxuICBwcm90ZWN0ZWQgX2VuYWJsZWQgPSB0cnVlO1xuICBwcm90ZWN0ZWQgX2F1dG9jb21wbGV0ZUNvbmZpZ0hvbGRlcjogTWF0QXV0b2NvbXBsZXRlQ29uZmlnSG9sZGVyO1xuICBwcm90ZWN0ZWQgYWxsb3dSb3dEZXRhaWwgPSB0cnVlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmO1xuICBwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlO1xuICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXI7XG4gIHByb3RlY3RlZCBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyO1xuICBwcm90ZWN0ZWQgbG9jYXRpb246IExvY2F0aW9uO1xuICBwcm90ZWN0ZWQgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgbW9kYWxDdHJsOiBNb2RhbENvbnRyb2xsZXI7XG4gIHByb3RlY3RlZCBhbGVydEN0cmw6IEFsZXJ0Q29udHJvbGxlcjtcbiAgcHJvdGVjdGVkIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyO1xuICBwcm90ZWN0ZWQgcHJldmlvdXNseUVkaXRlZFJvd0lkOiBudW1iZXI7XG4gIHByb3RlY3RlZCBmb3JtRXJyb3JBZGFwdGVyOiBGb3JtRXJyb3JUcmFuc2xhdG9yO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVzdHJveVN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGV4Y2x1ZGVzQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW107XG4gIHRvdGFsUm93Q291bnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICB2aXNpYmxlUm93Q291bnQ6IG51bWJlcjtcbiAgZXJyb3JUcmFuc2xhdGVPcHRpb25zOiBGb3JtRXJyb3JUcmFuc2xhdGVPcHRpb25zO1xuXG4gIHJlYWRvbmx5IHJlYWR5U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBsb2FkaW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IHNhdmluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgdG91Y2hlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgZGlydHlTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGVycm9yU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPih1bmRlZmluZWQpO1xuXG4gIGdldCBlcnJvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVycm9yU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIHNldCBlcnJvcihlcnJvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRFcnJvcihlcnJvcik7XG4gIH1cblxuICBzZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8QXN5bmNUYWJsZUVsZW1lbnQ8VD4+KHRydWUsIFtdKTtcbiAgcGVybWFuZW50U2VsZWN0aW9uOiBTZWxlY3Rpb25Nb2RlbDxUPiA9IG51bGw7XG4gIHBlcm1hbmVudFNlbGVjdGlvbkNoYW5nZWRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgYXV0b2NvbXBsZXRlRmllbGRzOiB7IFtrZXk6IHN0cmluZ106IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnIH07XG4gIHJlYWRvbmx5IG1vYmlsZTogYm9vbGVhbjtcblxuICAvLyBUYWJsZSBvcHRpb25zXG4gIEBJbnB1dCgpIHNldHRpbmdzSWQ6IHN0cmluZztcbiAgQElucHV0KCkgZGVidWc6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGkxOG5Db2x1bW5QcmVmaXggPSAnQ09NTU9OLic7XG4gIEBJbnB1dCgpIGkxOG5Db2x1bW5TdWZmaXg6IHN0cmluZztcbiAgQElucHV0KCkgYXV0b0xvYWQgPSB0cnVlO1xuICBASW5wdXQoKSByZWFkT25seTogYm9vbGVhbjtcbiAgQElucHV0KCkgaW5saW5lRWRpdGlvbjogYm9vbGVhbjtcbiAgQElucHV0KCkgZm9jdXNGaXJzdENvbHVtbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjb25maXJtQmVmb3JlRGVsZXRlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbmZpcm1CZWZvcmVDYW5jZWwgPSBmYWxzZTtcbiAgQElucHV0KCkgdW5kb2FibGVEZWxldGlvbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzYXZlQmVmb3JlRGVsZXRlOiBib29sZWFuO1xuICBASW5wdXQoKSBrZWVwRWRpdGVkUm93T25TYXZlOiBib29sZWFuO1xuICBASW5wdXQoKSBzYXZlQmVmb3JlU29ydDogYm9vbGVhbjtcbiAgQElucHV0KCkgc2F2ZUJlZm9yZUZpbHRlcjogYm9vbGVhbjtcbiAgQElucHV0KCkgcHJvcGFnYXRlUm93RXJyb3IgPSBmYWxzZTtcbiAgQElucHV0KCkgcGVybWFuZW50U2VsZWN0aW9uQWxsb3dlZCA9IGZhbHNlOyAvLyBBbGxvdyBrZWVwIHNlbGVjdGVkIHJvd3Mgb3ZlciBwYWdlIGNoYW5nZSBvciBzb3J0IGNoYW5nZVxuXG4gIEBJbnB1dCgpIGRlZmF1bHRTb3J0Qnk6IHN0cmluZztcbiAgQElucHV0KCkgZGVmYXVsdFNvcnREaXJlY3Rpb246IFNvcnREaXJlY3Rpb247XG4gIEBJbnB1dCgpIGRlZmF1bHRQYWdlU2l6ZSA9IERFRkFVTFRfUEFHRV9TSVpFO1xuICBASW5wdXQoKSBkZWZhdWx0UGFnZVNpemVPcHRpb25zID0gREVGQVVMVF9QQUdFX1NJWkVfT1BUSU9OUztcblxuICAvLyBGb2N1cyBtYW5hZ2VyXG4gIEBJbnB1dCgpIGZvY3VzQ29sdW1uOiBzdHJpbmc7XG5cbiAgZ2V0IGZpcnN0VXNlckNvbHVtbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXllZENvbHVtbnNbUkVTRVJWRURfU1RBUlRfQ09MVU1OUy5sZW5ndGhdO1xuICB9XG5cbiAgZ2V0IGxhc3RVc2VyQ29sdW1uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheWVkQ29sdW1uc1t0aGlzLmRpc3BsYXllZENvbHVtbnMubGVuZ3RoIC0gUkVTRVJWRURfRU5EX0NPTFVNTlMubGVuZ3RoIC0gMV07XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGF0YVNvdXJjZSh2YWx1ZTogRW50aXRpZXNBc3luY1RhYmxlRGF0YVNvdXJjZTxULCBGLCBJRD4pIHtcbiAgICB0aGlzLnNldERhdGFzb3VyY2UodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGRhdGFTb3VyY2UoKTogRW50aXRpZXNBc3luY1RhYmxlRGF0YVNvdXJjZTxULCBGLCBJRD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZpbHRlcih2YWx1ZTogRikge1xuICAgIHRoaXMuc2V0RmlsdGVyKHZhbHVlKTtcbiAgfVxuXG4gIGdldCBmaWx0ZXIoKTogRiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcjtcbiAgfVxuXG4gIGdldCBlbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nIHx8IHRoaXMudG90YWxSb3dDb3VudCA9PT0gMDtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZEVudGl0aWVzKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMucGVybWFuZW50U2VsZWN0aW9uPy5zZWxlY3RlZCB8fCBBcHBUYWJsZVV0aWxzLmdldEVudGl0aWVzKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBvblJlZnJlc2ggPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uT3BlblJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8QXN5bmNUYWJsZUVsZW1lbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvbk5ld1JvdyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb25TdGFydEVkaXRpbmdSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPEFzeW5jVGFibGVFbGVtZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Db25maXJtRWRpdENyZWF0ZVJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8QXN5bmNUYWJsZUVsZW1lbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvbkNhbmNlbE9yRGVsZXRlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxBc3luY1RhYmxlRWxlbWVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uQmVmb3JlRGVsZXRlUm93cyA9IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXI8Ym9vbGVhbiwgeyByb3dzOiBBc3luY1RhYmxlRWxlbWVudDxUPltdIH0+KCk7XG4gIEBPdXRwdXQoKSBvbkJlZm9yZUNhbmNlbFJvd3MgPSBjcmVhdGVQcm9taXNlRXZlbnRFbWl0dGVyPGJvb2xlYW4sIHsgcm93czogQXN5bmNUYWJsZUVsZW1lbnQ8VD5bXSB9PigpO1xuICBAT3V0cHV0KCkgb25CZWZvcmVTYXZlID0gY3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlcjx7IGNvbmZpcm1lZDogYm9vbGVhbjsgc2F2ZTogYm9vbGVhbiB9LCB7IGFjdGlvbjogU2F2ZUFjdGlvblR5cGU7IHZhbGlkOiBib29sZWFuIH0+KCk7XG4gIEBPdXRwdXQoKSBvbkFmdGVyRGVsZXRlZFJvd3MgPSBuZXcgRXZlbnRFbWl0dGVyPEFzeW5jVGFibGVFbGVtZW50PFQ+W10+KCk7XG4gIEBPdXRwdXQoKSBvblNvcnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uRGlydHkgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBvbkVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgZ2V0IGRpcnR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpcnR5U3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIGdldCB2YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmdldEVkaXRpbmdSb3dzKCkuZXZlcnkoKHJvdykgPT4gKHJvdy5lZGl0aW5nID8gcm93LnZhbGlkIDogdHJ1ZSkpO1xuICB9XG5cbiAgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5nZXRFZGl0aW5nUm93cygpLnNvbWUoKHJvdykgPT4gKHJvdy5lZGl0aW5nID8gcm93LmludmFsaWQgOiBmYWxzZSkpO1xuICB9XG5cbiAgZ2V0IHBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5nZXRFZGl0aW5nUm93cygpLnNvbWUoKHJvdykgPT4gKHJvdy5lZGl0aW5nID8gcm93LnBlbmRpbmcgOiBmYWxzZSkpO1xuICB9XG5cbiAgZ2V0IHRvdWNoZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG91Y2hlZFN1YmplY3QudmFsdWU7XG4gIH1cblxuICBnZXQgdW50b3VjaGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy50b3VjaGVkU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIGRpc2FibGUob3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy5zb3J0KSB0aGlzLnNvcnQuZGlzYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZW5hYmxlKG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuc29ydCkgdGhpcy5zb3J0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICB9XG5cbiAgLy8gRklYTUU6IG5lZWQgdG8gaGlkZGVuIGJ1dHRvbnMgKGluIEhUTUwpLCBldGMuIHdoZW4gZGlzYWJsZWRcbiAgQElucHV0KCkgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlICE9PSAhdGhpcy5fZW5hYmxlZCkge1xuICAgICAgaWYgKHZhbHVlKSB0aGlzLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgZWxzZSB0aGlzLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIG1hcmtBc0RpcnR5KG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCF0aGlzLmRpcnR5U3ViamVjdC5jbG9zZWQgJiYgdGhpcy5kaXJ0eVN1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuZGlydHlTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbWFya0FzUHJpc3RpbmUob3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuZGlydHlTdWJqZWN0LmNsb3NlZCAmJiB0aGlzLmRpcnR5U3ViamVjdC52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZGlydHlTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG1hcmtBc1VudG91Y2hlZChvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGxldCBuZWVkRW1pdEV2ZW50ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudG91Y2hlZFN1YmplY3QudmFsdWUpIHtcbiAgICAgIHRoaXMudG91Y2hlZFN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICBuZWVkRW1pdEV2ZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMuZGF0YVNvdXJjZS5nZXRFZGl0aW5nUm93cygpKSB7XG4gICAgICAgIC8vIENhbmNlbCB0aGUgY3VycmVudCBlZGl0aW5nIHJvdyBvbmx5IGlmIGVkaXRpbmcgYW5kIGlmIGl0IHdhcyBub3QgcHJldmlvdXNseSBzYXZlZFxuICAgICAgICBpZiAocm93LmlkID09PSAtMSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5kZWxldGUoLTEpO1xuICAgICAgICB9IGVsc2UgaWYgKHJvdy5lZGl0aW5nKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLmNhbmNlbChyb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgcm93IGFzIHByaXN0aW5lXG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZlJvd1ByaXN0aW5lKHJvdywgeyBvbmx5U2VsZjogdHJ1ZSAvKiBhdm9pZCBwcm9wYWdhdGlvbiB0byB0YWJsZSAtIGRvbmUganVzdCBhZnRlciAqLyB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhYmxlIGlzIHByaXN0aW5lXG4gICAgICBhd2FpdCB0aGlzLmNoZWNrSWZQcmlzdGluZSh7IGVtaXRFdmVudDogZmFsc2UgLyp3aWxsIGJlIGRvbmUganVzdCBhZnRlciovIH0pO1xuXG4gICAgICBuZWVkRW1pdEV2ZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5wcmV2aW91c2x5RWRpdGVkUm93SWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKG5lZWRFbWl0RXZlbnQgJiYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkpIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgcHJlZmVyIHRvIHVzZSBtYXJrQWxsQXNUb3VjaGVkKClcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIG1hcmtBc1RvdWNoZWQob3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBjb25zb2xlLndhcm4oJ1RPRE86IFJlcGxhY2UgdGhpcyBjYWxsIGJ5IG1hcmtBbGxBc1RvdWNoZWQoKSAtIGJlY2F1c2Ugb2YgY2hhbmdlcyBpbiBuZ3gtY29tcG9uZW50cyA+PSAwLjE2LjAnKTtcbiAgICBpZiAodGhpcy5kYXRhU291cmNlLmhhc1NvbWVFZGl0aW5nUm93KCkpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5nZXRFZGl0aW5nUm93cygpLmZvckVhY2goKHJvdykgPT4gcm93LnZhbGlkYXRvcj8ubWFya0FsbEFzVG91Y2hlZCgpKTtcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBtYXJrQWxsQXNUb3VjaGVkKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICghdGhpcy50b3VjaGVkU3ViamVjdC5jbG9zZWQgJiYgdGhpcy50b3VjaGVkU3ViamVjdC52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy50b3VjaGVkU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhU291cmNlLmdldEVkaXRpbmdSb3dzKCkuZm9yRWFjaCgocm93KSA9PiByb3cudmFsaWRhdG9yPy5tYXJrQWxsQXNUb3VjaGVkKCkpO1xuICB9XG5cbiAgbWFya0FzU2F2aW5nKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICghdGhpcy5zYXZpbmdTdWJqZWN0LmNsb3NlZCAmJiB0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuZm9jdXNDb2x1bW4gPSB1bmRlZmluZWQ7IC8vIHVuc2VsZWN0IGZvY3VzIGNvbHVtblxuICAgICAgdGhpcy5zYXZpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc1NhdmVkKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICghdGhpcy5zYXZpbmdTdWJqZWN0LmNsb3NlZCAmJiB0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnNhdmluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc0xvYWRpbmcob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5zZXRMb2FkaW5nKHRydWUsIG9wdHMpO1xuICB9XG5cbiAgbWFya0FzTG9hZGVkKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIHRoaXMuc2V0TG9hZGluZyhmYWxzZSwgb3B0cyk7XG4gIH1cblxuICBtYXJrQXNSZWFkeShvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMucmVhZHlTdWJqZWN0LmNsb3NlZCAmJiB0aGlzLnJlYWR5U3ViamVjdC52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5yZWFkeVN1YmplY3QubmV4dCh0cnVlKTtcblxuICAgICAgLy8gSWYgc3ViY2xhc3NlcyBpbXBsZW1lbnRzIE9uUmVhZHlcbiAgICAgIGlmICh0eXBlb2YgdGhpc1snbmdPblJlYWR5J10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgKHRoaXMgYXMgYW55IGFzIE9uUmVhZHkpLm5nT25SZWFkeSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgZ2V0IGxvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMubG9hZGluZ1N1YmplY3QudmFsdWU7XG4gIH1cblxuICBlbmFibGVTb3J0KCkge1xuICAgIGlmICh0aGlzLnNvcnQpIHRoaXMuc29ydC5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgZGlzYWJsZVNvcnQoKSB7XG4gICAgaWYgKHRoaXMuc29ydCkgdGhpcy5zb3J0LmRpc2FibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5kZWZhdWx0UGFnZVNpemUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLnBhZ2luYXRvciAmJiB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSkgfHwgdGhpcy5kZWZhdWx0UGFnZVNpemUgfHwgREVGQVVMVF9QQUdFX1NJWkU7XG4gIH1cblxuICBnZXQgcGFnZU9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5wYWdpbmF0b3IgJiYgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ICogdGhpcy5wYWdpbmF0b3IucGFnZVNpemUpIHx8IDA7XG4gIH1cblxuICBnZXQgc29ydEFjdGl2ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNvcnQgJiYgdGhpcy5zb3J0LmFjdGl2ZTtcbiAgfVxuXG4gIGdldCBzb3J0RGlyZWN0aW9uKCk6ICdhc2MnIHwgJ2Rlc2MnIHtcbiAgICByZXR1cm4gKHRoaXMuc29ydCAmJiB0aGlzLnNvcnQuZGlyZWN0aW9uICYmICh0aGlzLnNvcnQuZGlyZWN0aW9uID09PSAnZGVzYycgPyAnZGVzYycgOiAnYXNjJykpIHx8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX3BhZ2luYXRvcjogTWF0UGFnaW5hdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgc2V0IHBhZ2luYXRvcih2YWx1ZTogTWF0UGFnaW5hdG9yKSB7XG4gICAgdGhpcy5fcGFnaW5hdG9yID0gdmFsdWU7XG4gIH1cblxuICBnZXQgcGFnaW5hdG9yKCk6IE1hdFBhZ2luYXRvciB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2luYXRvciB8fCB0aGlzLmNoaWxkUGFnaW5hdG9yO1xuICB9XG5cbiAgZ2V0IGRlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95U3ViamVjdD8uY2xvc2VkICE9PSBmYWxzZTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUsIHsgc3RhdGljOiBmYWxzZSB9KSB0YWJsZTogTWF0VGFibGU8VD47XG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yLCB7IHN0YXRpYzogZmFsc2UgfSkgY2hpbGRQYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcbiAgQFZpZXdDaGlsZChNYXRTb3J0LCB7IHN0YXRpYzogZmFsc2UgfSkgc29ydDogTWF0U29ydDtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgICBwcm90ZWN0ZWQgX2RhdGFTb3VyY2U/OiBFbnRpdGllc0FzeW5jVGFibGVEYXRhU291cmNlPFQsIEYsIElEPixcbiAgICBwcml2YXRlIF9maWx0ZXI/OiBGXG4gICkge1xuICAgIHRoaXMuY2QgPSBpbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIHRoaXMucm91dGUgPSBpbmplY3Rvci5nZXQoQWN0aXZhdGVkUm91dGUpO1xuICAgIHRoaXMucm91dGVyID0gaW5qZWN0b3IuZ2V0KFJvdXRlcik7XG4gICAgdGhpcy5uYXZDb250cm9sbGVyID0gaW5qZWN0b3IuZ2V0KE5hdkNvbnRyb2xsZXIpO1xuICAgIHRoaXMubG9jYXRpb24gPSBpbmplY3Rvci5nZXQoTG9jYXRpb24pO1xuICAgIHRoaXMuc2V0dGluZ3MgPSBpbmplY3Rvci5nZXQoTG9jYWxTZXR0aW5nc1NlcnZpY2UpO1xuICAgIHRoaXMudHJhbnNsYXRlID0gaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHRoaXMubW9kYWxDdHJsID0gaW5qZWN0b3IuZ2V0KE1vZGFsQ29udHJvbGxlcik7XG4gICAgdGhpcy5hbGVydEN0cmwgPSBpbmplY3Rvci5nZXQoQWxlcnRDb250cm9sbGVyKTtcbiAgICB0aGlzLnRvYXN0Q29udHJvbGxlciA9IGluamVjdG9yLmdldChUb2FzdENvbnRyb2xsZXIpO1xuICAgIHRoaXMuZm9ybUVycm9yQWRhcHRlciA9IGluamVjdG9yLmdldChGb3JtRXJyb3JUcmFuc2xhdG9yKTtcbiAgICB0aGlzLm1vYmlsZSA9IHRoaXMuc2V0dGluZ3MubW9iaWxlO1xuXG4gICAgLy8gQXV0b2NvbXBsZXRlIGZpZWxkc1xuICAgIHRoaXMuX2F1dG9jb21wbGV0ZUNvbmZpZ0hvbGRlciA9IG5ldyBNYXRBdXRvY29tcGxldGVDb25maWdIb2xkZXIoe1xuICAgICAgZ2V0VXNlckF0dHJpYnV0ZXM6IChhLCBiKSA9PiB0aGlzLnNldHRpbmdzLmdldEZpZWxkRGlzcGxheUF0dHJpYnV0ZXMoYSwgYiksXG4gICAgfSk7XG4gICAgdGhpcy5hdXRvY29tcGxldGVGaWVsZHMgPSB0aGlzLl9hdXRvY29tcGxldGVDb25maWdIb2xkZXIuZmllbGRzO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSByZXR1cm47IC8vIEluaXQgb25seSBvbmNlXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgdGhpcy5yZWFkT25seSA9IHRvQm9vbGVhbih0aGlzLnJlYWRPbmx5LCB0aGlzLmRhdGFTb3VyY2U/LmNvbmZpZy5yZWFkT25seSB8fCBmYWxzZSk7IC8vIHJlYWQvd3JpdGUgYnkgZGVmYXVsdFxuICAgIHRoaXMuaW5saW5lRWRpdGlvbiA9ICF0aGlzLnJlYWRPbmx5ICYmIHRvQm9vbGVhbih0aGlzLmlubGluZUVkaXRpb24sIGZhbHNlKTsgLy8gZm9yY2UgdG8gZmFsc2Ugd2hlbiByZWFkb25seVxuICAgIHRoaXMuc2F2ZUJlZm9yZURlbGV0ZSA9IHRvQm9vbGVhbih0aGlzLnNhdmVCZWZvcmVEZWxldGUsICF0aGlzLnJlYWRPbmx5KTsgLy8gZm9yY2UgdG8gZmFsc2Ugd2hlbiByZWFkb25seVxuICAgIHRoaXMuc2F2ZUJlZm9yZVNvcnQgPSB0b0Jvb2xlYW4odGhpcy5zYXZlQmVmb3JlU29ydCwgIXRoaXMucmVhZE9ubHkpOyAvLyBmb3JjZSB0byBmYWxzZSB3aGVuIHJlYWRvbmx5XG4gICAgdGhpcy5zYXZlQmVmb3JlRmlsdGVyID0gdG9Cb29sZWFuKHRoaXMuc2F2ZUJlZm9yZUZpbHRlciwgIXRoaXMucmVhZE9ubHkpOyAvLyBmb3JjZSB0byBmYWxzZSB3aGVuIHJlYWRvbmx5XG4gICAgdGhpcy5rZWVwRWRpdGVkUm93T25TYXZlID0gdG9Cb29sZWFuKHRoaXMua2VlcEVkaXRlZFJvd09uU2F2ZSwgdGhpcy5pbmxpbmVFZGl0aW9uKTtcbiAgICB0aGlzLmVycm9yVHJhbnNsYXRlT3B0aW9ucyA9IHRoaXMuZXJyb3JUcmFuc2xhdGVPcHRpb25zIHx8IHsgc2VwYXJhdG9yOiAnLCAnLCBwYXRoVHJhbnNsYXRvcjogdGhpcyB9OyAvLyBDYW4gYmUgb3ZlcnJpZGUgaW4gc3ViY2xhc3NlcyBjb25zdHJ1Y3RvcnNcblxuICAgIC8vIENoZWNrIGFzayB1c2VyIGNvbmZpcm1hdGlvbiBpcyBwb3NzaWJsZVxuICAgIGlmICh0aGlzLmNvbmZpcm1CZWZvcmVEZWxldGUgJiYgIXRoaXMuYWxlcnRDdHJsKSB0aHJvdyBFcnJvcihcIk1pc3NpbmcgJ2FsZXJ0Q3RybCcgb3IgJ2luamVjdG9yJyBpbiBjb21wb25lbnQncyBjb25zdHJ1Y3Rvci5cIik7XG5cbiAgICAvLyBEZWZpbmVkIHVuaXF1ZSBpZCBmb3Igc2V0dGluZ3MgZm9yIHRoZSBwYWdlXG4gICAgdGhpcy5zZXR0aW5nc0lkID0gdGhpcy5zZXR0aW5nc0lkIHx8IHRoaXMuZ2VuZXJhdGVUYWJsZUlkKCk7XG5cbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmdldERpc3BsYXlDb2x1bW5zKCk7XG5cbiAgICAvLyBMb2FkIHRoZSBzb3J0ZWQgY29sdW1ucywgZnJvbSBzZXR0aW5nc1xuICAgIHtcbiAgICAgIGNvbnN0IHNvcnRlZENvbHVtbiA9IHRoaXMuZ2V0U29ydGVkQ29sdW1uKCk7XG4gICAgICB0aGlzLmRlZmF1bHRTb3J0QnkgPSBzb3J0ZWRDb2x1bW4uaWQ7XG4gICAgICB0aGlzLmRlZmF1bHRTb3J0RGlyZWN0aW9uID0gc29ydGVkQ29sdW1uLnN0YXJ0O1xuICAgIH1cblxuICAgIHRoaXMuZGVmYXVsdFBhZ2VTaXplID0gdGhpcy5nZXRQYWdlU2l6ZSgpO1xuXG4gICAgLy8gUHJvcGFnYXRlIGVycm9yIHRvIGV2ZW50IGVtaXR0ZXJcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHRoaXMuZXJyb3JTdWJqZWN0LnN1YnNjcmliZSgodmFsdWUpID0+IHRoaXMub25FcnJvci5lbWl0KHZhbHVlKSkpO1xuXG4gICAgLy8gUHJvcGFnYXRlIGRpcnR5IHRvIGV2ZW50IGVtaXR0ZXJcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHRoaXMuZGlydHlTdWJqZWN0LnN1YnNjcmliZSgodmFsdWUpID0+IHRoaXMub25EaXJ0eS5lbWl0KHZhbHVlKSkpO1xuXG4gICAgLy8gUHJvcGFnYXRlIHJvdyBkaXJ0eSBzdGF0ZSB0byB0YWJsZVxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLm9uU3RhcnRFZGl0aW5nUm93XG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigocm93KSA9PiByb3c/LnZhbGlkYXRvciAmJiB0cnVlKSxcbiAgICAgICAgICBtZXJnZU1hcCgocm93KSA9PlxuICAgICAgICAgICAgcm93LnZhbGlkYXRvci52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgZmlsdGVyKChyb3cpID0+IHJvdy5kaXJ0eSksXG4gICAgICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgICAgIC8vdGFwKCgpID0+IGNvbnNvbGUuZGVidWcoXCJQcm9wYWdhdGUgcm93J3MgZGlydHkgdG8gdGFibGUuLi5cIikpXG5cbiAgICAgICAgICAgICAgLy8gU3RvcCBpZiBuZXh0IGFub3RoZXIgcm93LCBvciBkZXN0cm95aW5nXG4gICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm9uU3RhcnRFZGl0aW5nUm93KSxcbiAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5tYXJrQXNEaXJ0eSgpKVxuICAgICk7XG5cbiAgICAvLyBDYWxsIGRhdGFzb3VyY2UgcmVmcmVzaCwgb24gZWFjaCByZWZyZXNoIGV2ZW50c1xuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLm9uUmVmcmVzaFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzdGFydFdpdGg8YW55LCBhbnk+KCh0aGlzLmF1dG9Mb2FkID8ge30gOiAnc2tpcCcpIGFzIGFueSksXG4gICAgICAgICAgc3dpdGNoTWFwKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpcnR5U3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgICAgICBpZiAoZXZlbnQgPT09ICdza2lwJykge1xuICAgICAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3RhYmxlXSBTa2lwcGluZyBkYXRhIGxvYWQ6IG5vIGRhdGFTb3VyY2UgZGVmaW5lZCcpO1xuICAgICAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbdGFibGVdIENhbGxpbmcgZGF0YVNvdXJjZS53YXRjaEFsbCgpLi4uJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZS53YXRjaEFsbCh0aGlzLnBhZ2VPZmZzZXQsIHRoaXMucGFnZVNpemUsIHRoaXMuc29ydEFjdGl2ZSwgdGhpcy5zb3J0RGlyZWN0aW9uLCB0aGlzLl9maWx0ZXIpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RXJyb3IoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgZXJyKTtcbiAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpOyAvLyBDb250aW51ZVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocmVzKSA9PiB0aGlzLnVwZGF0ZVZpZXcocmVzIGFzIExvYWRSZXN1bHQ8VD4gfCB1bmRlZmluZWQpKVxuICAgICk7XG5cbiAgICAvLyBMaXN0ZW4gZGF0YVNvdXJjZSBsb2FkaW5nIGV2ZW50c1xuICAgIGlmICh0aGlzLl9kYXRhU291cmNlKSB0aGlzLmxpc3RlbkRhdGFzb3VyY2VMb2FkaW5nKHRoaXMuX2RhdGFTb3VyY2UpO1xuXG4gICAgLy8gUGVybWFuZW50IHNlbGVjdGlvbiBiZWhhdmlvclxuICAgIGlmICh0aGlzLnBlcm1hbmVudFNlbGVjdGlvbkFsbG93ZWQpIHRoaXMuaW5pdFBlcm1hbmVudFNlbGVjdGlvbigpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIERldGVjdCB3aGVuIHBhcmVudCBuZ09uSW5pdCgpIG5vdCBjYWxsXG4gICAgaWYgKHRoaXMuZGVidWcgJiYgIXRoaXMuZGlzcGxheWVkQ29sdW1ucylcbiAgICAgIGNvbnNvbGUud2FybihgW3RhYmxlXSBNaXNzaW5nICdkaXNwbGF5ZWRDb2x1bW5zJy4gRGlkIHlvdSBjYWxsIHBhcmVudCBuZ09uSW5pdCgpIGluIGNvbXBvbmVudCAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gP2ApO1xuXG4gICAgLy8gU3RhcnQgbGlzdGVuaW5nIHNvcnQgYW5kIHBhZ2luYXRvciBldmVudHNcbiAgICAvLyBub2luc3BlY3Rpb24gSlNJZ25vcmVkUHJvbWlzZUZyb21DYWxsXG4gICAgdGhpcy5saXN0ZW5Tb3J0QW5kUGFnaW5hdGlvbkV2ZW50cygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAvLyBVbnN1YnNjcmliZSBjb2x1bW4gdmFsdWUgY2hhbmdlc1xuICAgIE9iamVjdC5rZXlzKHRoaXMuX2NlbGxWYWx1ZUNoYW5nZXNEZWZzKS5mb3JFYWNoKChjb2wpID0+IHRoaXMuc3RvcENlbGxWYWx1ZUNoYW5nZXMoY29sLCB0cnVlKSk7XG4gICAgdGhpcy5fY2VsbFZhbHVlQ2hhbmdlc0RlZnMgPSB7fTtcblxuICAgIHRoaXMucmVhZHlTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2F2aW5nU3ViamVjdC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZXJyb3JTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXJ0eVN1YmplY3QudW5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMub25SZWZyZXNoLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vbk9wZW5Sb3cudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uTmV3Um93LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vblN0YXJ0RWRpdGluZ1Jvdy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25Db25maXJtRWRpdENyZWF0ZVJvdy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25DYW5jZWxPckRlbGV0ZVJvdy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25CZWZvcmVEZWxldGVSb3dzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vbkJlZm9yZUNhbmNlbFJvd3MudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uQmVmb3JlU2F2ZS51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25BZnRlckRlbGV0ZWRSb3dzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vblNvcnQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uRGlydHkudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uRXJyb3IudW5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuZGVzdHJveVN1YmplY3QubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveVN1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVZpZXcoXG4gICAgcmVzOiBMb2FkUmVzdWx0PFQ+IHwgdW5kZWZpbmVkLFxuICAgIG9wdHM/OiB7XG4gICAgICBlbWl0RXZlbnQ/OiBib29sZWFuO1xuICAgIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFyZXMpIHJldHVybjsgLy8gU2tpcCAoZS5nIGVycm9yKVxuICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcbiAgICAgIHRoaXMudmlzaWJsZVJvd0NvdW50ID0gcmVzLmRhdGEubGVuZ3RoO1xuICAgICAgdGhpcy50b3RhbFJvd0NvdW50ID0gaXNOb3ROaWwocmVzLnRvdGFsKVxuICAgICAgICA/IHJlcy50b3RhbFxuICAgICAgICA6ICgodGhpcy5wYWdpbmF0b3IgJiYgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ICogKHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplIHx8IERFRkFVTFRfUEFHRV9TSVpFKSkgfHwgMCkgKyB0aGlzLnZpc2libGVSb3dDb3VudDtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGVdICR7cmVzLmRhdGEubGVuZ3RofSByb3dzIGxvYWRlZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbdGFibGVdIE5PIHJvd3MgbG9hZGVkJyk7XG4gICAgICB0aGlzLnRvdGFsUm93Q291bnQgPSAwO1xuICAgICAgdGhpcy52aXNpYmxlUm93Q291bnQgPSAwO1xuICAgIH1cblxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMubWFya0FzVW50b3VjaGVkKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMubWFya0FzUHJpc3RpbmUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzZXREYXRhc291cmNlKGRhdGFzb3VyY2U6IEVudGl0aWVzQXN5bmNUYWJsZURhdGFTb3VyY2U8VCwgRiwgSUQ+KSB7XG4gICAgaWYgKHRoaXMuX2RhdGFTb3VyY2UpIHRocm93IG5ldyBFcnJvcignW3RhYmxlXSBkYXRhU291cmNlIGFscmVhZHkgc2V0ICEnKTtcbiAgICBpZiAoZGF0YXNvdXJjZSAmJiB0aGlzLl9kYXRhU291cmNlICE9PSBkYXRhc291cmNlKSB7XG4gICAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YXNvdXJjZTtcbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkgdGhpcy5saXN0ZW5EYXRhc291cmNlTG9hZGluZyhkYXRhc291cmNlKTtcbiAgICB9XG4gIH1cblxuICByZXNldERhdGFTb3VyY2UoKSB7XG4gICAgaWYgKHRoaXMuX2RhdGFTb3VyY2VMb2FkaW5nU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9kYXRhU291cmNlTG9hZGluZ1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9kYXRhU291cmNlTG9hZGluZ1N1YnNjcmlwdGlvbik7XG4gICAgfVxuICAgIC8vdGhpcy5fZGF0YVNvdXJjZT8uY2xvc2UoKTtcbiAgICB0aGlzLl9kYXRhU291cmNlID0gbnVsbDtcbiAgfVxuXG4gIGFkZENvbHVtbkRlZihjb2x1bW46IENka0NvbHVtbkRlZikge1xuICAgIHRoaXMudGFibGUuYWRkQ29sdW1uRGVmKGNvbHVtbik7XG4gIH1cblxuICByZW1vdmVDb2x1bW5EZWYoY29sdW1uOiBDZGtDb2x1bW5EZWYpIHtcbiAgICB0aGlzLnRhYmxlLnJlbW92ZUNvbHVtbkRlZihjb2x1bW4pO1xuICB9XG5cbiAgYXN5bmMgc2V0RmlsdGVyKGZpbHRlcjogRiwgb3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbjsgcGVybWFuZW50U2VsZWN0aW9uQ2hhbmdlZFByZXZlbnRlZD86IGJvb2xlYW4gfSkge1xuICAgIG9wdHMgPSBvcHRzIHx8IHsgZW1pdEV2ZW50OiB0cnVlIH07XG5cbiAgICAvLyBQcmV2ZW50IHBlcm1hbmVudCBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50c1xuICAgIHRoaXMucGVybWFuZW50U2VsZWN0aW9uQ2hhbmdlZFByZXZlbnRlZCA9IHRvQm9vbGVhbihvcHRzLnBlcm1hbmVudFNlbGVjdGlvbkNoYW5nZWRQcmV2ZW50ZWQsIHRoaXMucGVybWFuZW50U2VsZWN0aW9uQ2hhbmdlZFByZXZlbnRlZCk7XG5cbiAgICBpZiAodGhpcy5zYXZlQmVmb3JlRmlsdGVyKSB7XG4gICAgICAvLyBpZiBhIGRpcnR5IHRhYmxlIGlzIHRvIGJlIHNhdmVkIGJlZm9yZSBmaWx0ZXJcbiAgICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICAgIC8vIFNhdmVcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuc2F2ZUJlZm9yZUFjdGlvbignZmlsdGVyJykpIHtcbiAgICAgICAgICAvLyBBcHBseSBmaWx0ZXIgb25seSBpZiB1c2VyIGRpZG4ndCBjYW5jZWwgdGhlIHNhdmUgb3IgdGhlIHNhdmUgaXMgb2tcbiAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKGZpbHRlciwgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFwcGx5IGZpbHRlciBvbiBub24tZGlydHkgdGFibGVcbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcihmaWx0ZXIsIG9wdHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhcHBseSBmaWx0ZXIgZGlyZWN0bHlcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoZmlsdGVyLCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjb25maXJtQW5kQWRkKGV2ZW50PzogRXZlbnQsIHJvdz86IEFzeW5jVGFibGVFbGVtZW50PFQ+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5jb25maXJtRWRpdENyZWF0ZShldmVudCwgcm93KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gQWRkIHJvd1xuICAgIHJldHVybiB0aGlzLmFkZFJvdyhldmVudCk7XG4gIH1cblxuICBhc3luYyBjb25maXJtQW5kQmFja3dhcmQoZXZlbnQ/OiBFdmVudCwgcm93PzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBEZWxldGluZyBlZGl0ZWQgcm93LCBpZiBlbXB0eSBhbmQgbm90IGRpcnR5XG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZS5oYXNTb21lRWRpdGluZ1JvdygpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRpbmdSb3cgb2YgdGhpcy5kYXRhU291cmNlLmdldEVkaXRpbmdSb3dzKCkuZmlsdGVyKChyb3cpID0+IHJvdy5pZCA9PT0gLTEgJiYgcm93LmludmFsaWQgJiYgIXJvdy5kaXJ0eSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVOZXdSb3coZXZlbnQsIGVkaXRpbmdSb3cpO1xuICAgICAgfVxuXG4gICAgICAvLyBXYWl0IGRlbGV0aW9uIGlzIGRvbmUsIHRoZW4gZWRpdCBwcmV2aW91cyByb3cgKGJ5IGlkLCBiZWNhdXNlIG9mIHJlbG9hZGluZylcbiAgICAgIGF3YWl0IHRoaXMud2FpdElkbGUoKTtcbiAgICAgIGF3YWl0IHRoaXMuZWRpdFJvd0J5SWQoZXZlbnQsIHJvdy5pZCwgeyBmb2N1c0NvbHVtbjogdGhpcy5sYXN0VXNlckNvbHVtbiB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEVkaXQgcHJldmlvdXMgcm93XG4gICAgYXdhaXQgdGhpcy5lZGl0Um93KGV2ZW50LCByb3csIHsgZm9jdXNDb2x1bW46IHRoaXMubGFzdFVzZXJDb2x1bW4gfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBjb25maXJtQW5kRm9yd2FyZChldmVudD86IEV2ZW50LCByb3c/OiBBc3luY1RhYmxlRWxlbWVudDxUPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5pbmxpbmVFZGl0aW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1FZGl0Q3JlYXRlKGV2ZW50LCByb3cpO1xuICAgIGlmICghY29uZmlybWVkKSByZXR1cm4gZmFsc2U7IC8vIE5vdCBjb25maXJtZWRcblxuICAgIC8vIEVkaXQgbmV4dCByb3dcbiAgICBhd2FpdCB0aGlzLmVkaXRSb3dCeUlkKGV2ZW50LCByb3cuaWQgKyAxLCB7IGZvY3VzQ29sdW1uOiB0aGlzLmZpcnN0VXNlckNvbHVtbiB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maXJtIHRoZSBjcmVhdGlvbiBvZiB0aGUgZ2l2ZW4gcm93LCBvciBpZiBub3Qgc3BlY2lmaWVkIHRoZSBjdXJyZW50bHkgZWRpdGVkIHJvd1xuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHBhcmFtIHJvd1xuICAgKi9cbiAgYXN5bmMgY29uZmlybUVkaXRDcmVhdGUoZXZlbnQ/OiBFdmVudCwgcm93PzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByb3cgPSByb3cgfHwgdGhpcy5kYXRhU291cmNlLmdldFNpbmdsZUVkaXRpbmdSb3coKTtcbiAgICBpZiAoIXJvdyB8fCAhcm93LmVkaXRpbmcpIHJldHVybiB0cnVlOyAvLyBubyByb3cgdG8gY29uZmlybVxuXG4gICAgLy8gU3RvcCBldmVudFxuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIENvbmZpcm1hdGlvbiBlZGl0aW9uIG9yIGNyZWF0aW9uXG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgcm93LmNvbmZpcm1FZGl0Q3JlYXRlKCk7XG5cbiAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAvLyBNYXJrIHRhYmxlIGFzIGRpcnR5IChpZiByb3cgaXMgZGlydHkpXG4gICAgICBpZiAocm93LmRpcnR5KSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoeyBlbWl0RXZlbnQ6IGZhbHNlIC8qIGJlY2F1c2Ugb2YgcmVzZXRFcnJvcigpICovIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciBlcnJvclxuICAgICAgdGhpcy5yZXNldEVycm9yKCk7XG5cbiAgICAgIC8vIEVtaXQgdGhlIGNvbmZpcm0gZXZlbnRcbiAgICAgIHRoaXMub25Db25maXJtRWRpdENyZWF0ZVJvdy5uZXh0KHJvdyk7XG5cbiAgICAgIHJldHVybiB0cnVlOyAvLyBDb250aW51ZVxuICAgIH1cblxuICAgIGlmIChyb3cudmFsaWRhdG9yKSB7XG4gICAgICAvLyBOT1QgY29uZmlybWVkID0gcm93IGhhcyBlcnJvclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbdGFibGVdIENhbm5vdCBjb25maXJtIHJvdywgYmVjYXVzZSBpbnZhbGlkJyk7XG4gICAgICAgIEFwcEZvcm1VdGlscy5sb2dGb3JtRXJyb3JzKHJvdy52YWxpZGF0b3IsICdbdGFibGVdICcpO1xuICAgICAgfVxuXG4gICAgICAvLyBmaXg6IG1hcmsgYWxsIGNvbnRyb2xzIGFzIHRvdWNoZWQgdG8gc2hvdyBlcnJvcnNcbiAgICAgIHJvdy52YWxpZGF0b3IubWFya0FsbEFzVG91Y2hlZCgpO1xuXG4gICAgICAvLyBDb21wdXRlIHJvdyBlcnJvciwgYW5kIHByb3BhZ2F0ZSB0byB0YWJsZSdzIGVycm9yXG4gICAgICBpZiAodGhpcy5wcm9wYWdhdGVSb3dFcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuZ2V0Um93RXJyb3Iocm93KTtcbiAgICAgICAgdGhpcy5zZXRFcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm90IGNvbmZpcm1lZFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIGNhbmNlbE9yRGVsZXRlKGV2ZW50OiBFdmVudCwgcm93OiBBc3luY1RhYmxlRWxlbWVudDxUPiwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuOyBrZWVwRWRpdGluZz86IGJvb2xlYW4gfSkge1xuICAgIC8vIERlbGV0ZSBuZXcgcm93XG4gICAgaWYgKHJvdy5pZCA9PT0gLTEpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlTmV3Um93KGV2ZW50LCByb3cpO1xuICAgIH1cbiAgICAvLyBEZWxldGUgZXhpc3RpbmcgKGJ1dCBub3QgZWRpdGluZykgcm93XG4gICAgZWxzZSBpZiAoIXJvdy5lZGl0aW5nKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUV4aXN0aW5nUm93KGV2ZW50LCByb3csIG9wdHMpO1xuICAgIH1cbiAgICAvLyBDYW5jZWwgZXhpc3RpbmcgKGFuZCBlZGl0aW5nKSByb3dcbiAgICBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FuY2VsRXhpc3RpbmdSb3coZXZlbnQsIHJvdywgb3B0cyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRkUm93KGV2ZW50PzogRXZlbnQsIGluc2VydEF0PzogbnVtYmVyLCBvcHRzPzogeyBmb2N1c0NvbHVtbj86IHN0cmluZzsgZWRpdGluZz86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbdGFibGVdIEFza2luZyBmb3IgbmV3IHJvdy4uLicpO1xuICAgIGlmICghdGhpcy5fZW5hYmxlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gVXNlIG1vZGFsIGlmIGlubGluZSBlZGl0aW9uIGlzIGRpc2FibGVkXG4gICAgaWYgKCF0aGlzLmlubGluZUVkaXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMub3Blbk5ld1Jvd0RldGFpbChldmVudCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGZpbmlzaCBlZGl0ZWQgcm93IGZpcnN0XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5jb25maXJtRWRpdENyZWF0ZSgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFkZCBuZXcgcm93XG4gICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5hZGRSb3dUb1RhYmxlKGluc2VydEF0LCBvcHRzKTtcbiAgICByZXR1cm4gISFyb3c7XG4gIH1cblxuICBhc3luYyBzYXZlKG9wdHM/OiB7IGtlZXBFZGl0aW5nPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgb3B0cyA9IHtcbiAgICAgIGtlZXBFZGl0aW5nOiB0aGlzLmtlZXBFZGl0ZWRSb3dPblNhdmUsXG4gICAgICAuLi5vcHRzLFxuICAgIH07XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHRocm93IHsgY29kZTogRXJyb3JDb2Rlcy5UQUJMRV9SRUFEX09OTFksIG1lc3NhZ2U6ICdFUlJPUi5UQUJMRV9SRUFEX09OTFknIH07XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG5cbiAgICAvLyBLZWVwIGVkaXRlZCByb3cgaWQgKHNob3VsZCBiZSBkb25lIEJFRk9SRSBjb25maXJtRWRpdENyZWF0ZSgpIClcbiAgICBjb25zdCBlZGl0ZWRSb3cgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0U2luZ2xlRWRpdGluZ1JvdygpO1xuICAgIHRoaXMucHJldmlvdXNseUVkaXRlZFJvd0lkID0gb3B0cy5rZWVwRWRpdGluZyA/IChlZGl0ZWRSb3c/LmVkaXRpbmcgPyBlZGl0ZWRSb3cuaWQgOiB1bmRlZmluZWQpIHx8IHRoaXMuc2luZ2xlU2VsZWN0ZWRSb3c/LmlkIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByZXZpb3VzbHlFZGl0ZWRSb3dJZCA9IHRoaXMucHJldmlvdXNseUVkaXRlZFJvd0lkO1xuICAgIGNvbnN0IHByZXZpb3VzbHlFZGl0ZWREYXRhID0gb3B0cy5rZWVwRWRpdGluZ1xuICAgICAgPyAoaXNOb3ROaWwocHJldmlvdXNseUVkaXRlZFJvd0lkKSAmJiBlZGl0ZWRSb3c/LmN1cnJlbnREYXRhKSB8fCB0aGlzLnNpbmdsZVNlbGVjdGVkUm93Py5jdXJyZW50RGF0YVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIShhd2FpdCB0aGlzLmNvbmZpcm1FZGl0Q3JlYXRlKCkpKSB7XG4gICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuVEFCTEVfSU5WQUxJRF9ST1dfRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5UQUJMRV9JTlZBTElEX1JPV19FUlJPUicgfTtcbiAgICB9XG5cbiAgICAvLyBNYXJrIGFzIHNhdmluZ1xuICAgIHRoaXMubWFya0FzU2F2aW5nKCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ2FsbGluZyBzZXJ2aWNlIHNhdmUoKVxuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZV0gQ2FsbGluZyBkYXRhU291cmNlLnNhdmUoKS4uLicpO1xuICAgICAgY29uc3QgaXNPSyA9IGF3YWl0IHRoaXMuX2RhdGFTb3VyY2Uuc2F2ZSgpO1xuXG4gICAgICBpZiAoaXNPSykgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuXG4gICAgICByZXR1cm4gaXNPSztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2V0RXJyb3IoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrQXNTYXZlZCgpO1xuXG4gICAgICAvLyBSZXN0b3JlIHByZXZpb3VzIHJvd1xuICAgICAgaWYgKGlzTm90TmlsKHByZXZpb3VzbHlFZGl0ZWRSb3dJZCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZWxlY3RSb3dCeUlkT3JEYXRhKHByZXZpb3VzbHlFZGl0ZWRSb3dJZCwgcHJldmlvdXNseUVkaXRlZERhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNhbmNlbChldmVudD86IEV2ZW50LCBvcHRzPzogeyBpbnRlcmFjdGl2ZT86IGJvb2xlYW4gfSkge1xuICAgIC8vIENoZWNrIGNvbmZpcm1hdGlvblxuICAgIGlmICgoIW9wdHMgfHwgb3B0cy5pbnRlcmFjdGl2ZSAhPT0gZmFsc2UpICYmIHRoaXMuZGlydHkgJiYgKHRoaXMuY29uZmlybUJlZm9yZUNhbmNlbCB8fCB0aGlzLm9uQmVmb3JlQ2FuY2VsUm93cy5vYnNlcnZlZCkpIHtcbiAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2FuQ2FuY2VsUm93cygpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0UmVmcmVzaCgpO1xuICB9XG5cbiAgYXN5bmMgZHVwbGljYXRlUm93KFxuICAgIGV2ZW50PzogRXZlbnQsXG4gICAgcm93PzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4sXG4gICAgb3B0cz86IHtcbiAgICAgIHNraXBQcm9wZXJ0aWVzPzogc3RyaW5nW107XG4gICAgfVxuICApIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICByb3cgPSByb3cgfHwgdGhpcy5zaW5nbGVTZWxlY3RlZFJvdztcbiAgICBpZiAoIXJvdyB8fCAhKGF3YWl0IHRoaXMuY29uZmlybUVkaXRDcmVhdGUoZXZlbnQsIHJvdykpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Um93ID0gYXdhaXQgdGhpcy5hZGRSb3dUb1RhYmxlKHJvdy5pZCArIDEpO1xuICAgIGlmICghbmV3Um93KSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgbmV3IHJvdyB0byB0YWJsZScpO1xuICAgIGNvbnN0IGpzb24gPSB7IC4uLnJvdy5jdXJyZW50RGF0YSwgaWQ6IG51bGwgfTtcblxuICAgIC8vIFJlc2V0IHNvbWUgcHJvcGVydGllcyAoZS5nLiByYW5rT3JkZXIsIGV0YylcbiAgICBpZiAob3B0cyAmJiBvcHRzLnNraXBQcm9wZXJ0aWVzKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gbmV3Um93LmN1cnJlbnREYXRhO1xuICAgICAgb3B0cy5za2lwUHJvcGVydGllcy5mb3JFYWNoKChrZXkpID0+IChqc29uW2tleV0gPSBuZXdEYXRhW2tleV0pKTtcbiAgICB9XG5cbiAgICBpZiAobmV3Um93LnZhbGlkYXRvcikge1xuICAgICAgbmV3Um93LnZhbGlkYXRvci5wYXRjaFZhbHVlKGpzb24pO1xuICAgICAgbmV3Um93LnZhbGlkYXRvci5tYXJrQXNEaXJ0eSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV3Um93LmN1cnJlbnREYXRhPy5mcm9tT2JqZWN0KSB7XG4gICAgICAgIG5ld1Jvdy5jdXJyZW50RGF0YS5mcm9tT2JqZWN0KGpzb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3Um93LmN1cnJlbnREYXRhID0ganNvbjtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICB9XG5cbiAgICAvLyBzZWxlY3RcbiAgICBhd2FpdCB0aGlzLmNsaWNrUm93KHVuZGVmaW5lZCwgbmV3Um93KTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgZWxlbWVudHMgbWF0Y2hlcyB0aGUgdG90YWwgbnVtYmVyIG9mIHJvd3MuICovXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcoJ2lzQWxsU2VsZWN0ZWQuIGxlbmd0aHMnLCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGgsIHRoaXMudG90YWxSb3dDb3VudCk7XG5cbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID09PSB0aGlzLnRvdGFsUm93Q291bnQgfHwgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID09PSB0aGlzLnZpc2libGVSb3dDb3VudDtcbiAgfVxuXG4gIC8qKiBTZWxlY3RzIGFsbCByb3dzIGlmIHRoZXkgYXJlIG5vdCBhbGwgc2VsZWN0ZWQ7IG90aGVyd2lzZSBjbGVhciBzZWxlY3Rpb24uICovXG4gIGFzeW5jIG1hc3RlclRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByb3dzID0gdGhpcy5fZGF0YVNvdXJjZS5nZXRSb3dzKCk7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oLi4ucm93cyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2VsZWN0aW9uKGV2ZW50OiBFdmVudCwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGRlbGV0ZUNvdW50ID0gYXdhaXQgdGhpcy5kZWxldGVSb3dzKGV2ZW50LCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCwgb3B0cyk7XG4gICAgaWYgKGRlbGV0ZUNvdW50ID4gMCkgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICByZXR1cm4gZGVsZXRlQ291bnQ7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwYXJhbSByb3dcbiAgICogQHBhcmFtIG9wdHMgVXNlIGludGVyYWN0aXZlPWZhbHNlIHRvIGF2b2lkIHVzZXIgaW50ZXJhY3Rpb24gKGUuZy4gdXNlciBjb25maXJtYXRpb24pXG4gICAqICBBbmQgdG8gZm9yY2UgZGVsZXRpb24gZXZlbiBpZiB0YWJsZSBpcyBidXN5XG4gICAqL1xuICBhc3luYyBkZWxldGVSb3coZXZlbnQ6IEV2ZW50IHwgbnVsbCwgcm93OiBBc3luY1RhYmxlRWxlbWVudDxUPiwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBkZWxldGVDb3VudCA9IGF3YWl0IHRoaXMuZGVsZXRlUm93cyhldmVudCwgW3Jvd10sIG9wdHMpO1xuICAgIHJldHVybiBkZWxldGVDb3VudCA9PT0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHBhcmFtIHJvd3NcbiAgICogQHBhcmFtIG9wdHMgVXNlIGludGVyYWN0aXZlPWZhbHNlIHRvIGF2b2lkIHVzZXIgaW50ZXJhY3Rpb24gKGUuZy4gdXNlciBjb25maXJtYXRpb24pXG4gICAqICAgIEFuZCB0byBmb3JjZSBkZWxldGlvbiBldmVuIGlmIHRhYmxlIGlzIGJ1c3lcbiAgICovXG4gIGFzeW5jIGRlbGV0ZVJvd3MoZXZlbnQ6IEV2ZW50IHwgbnVsbCwgcm93czogQXN5bmNUYWJsZUVsZW1lbnQ8VD5bXSwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuVEFCTEVfUkVBRF9PTkxZLCBtZXNzYWdlOiAnRVJST1IuVEFCTEVfUkVBRF9PTkxZJyB9O1xuICAgIH1cbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybiAwOyAvLyBTS2lwXG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG5cbiAgICBpZiAoIXRoaXMuX2VuYWJsZWQgfHwgaXNFbXB0eUFycmF5KHJvd3MpKSByZXR1cm4gMDsgLy8gU2tpcCBpcyBkaXNhYmxlZCwgb3Igbm8gcm93cyB0byBkZWxldGVcblxuICAgIGlmICh0aGlzLmxvYWRpbmcgJiYgKCFvcHRzIHx8IG9wdHMuaW50ZXJhY3RpdmUgIT09IGZhbHNlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdbYXBwLXRhYmxlXSBTa2lwIGRlbGV0ZVJvd3MoKSBiZWNhdXNlIHRhYmxlIGlzIGJ1c3kgKGxvYWRpbmcpLiBVc2Ugb3B0cy5pbnRlcmFjdGl2ZSA9IGZhbHNlIHRvIGZvcmNlIGRlbGV0aW9uJyk7XG4gICAgICByZXR1cm4gMDsgLy8gU2tpcCBpZiBsb2FkaW5nXG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIHRvIGtlZXAgbmV3bHkgY3JlYXRlZCByb3dcbiAgICBjb25zdCBlZGl0ZWRSb3cgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0U2luZ2xlRWRpdGluZ1JvdygpO1xuICAgIGlmIChlZGl0ZWRSb3c/LmlkID09PSAtMSAmJiBlZGl0ZWRSb3cuZWRpdGluZyAmJiAhcm93cy5pbmNsdWRlcyhlZGl0ZWRSb3cpKSB7XG4gICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1FZGl0Q3JlYXRlKCk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIDA7IC8vIENhbm5vdCBkZWxldGUgKGUuZy4gZWRpdGVkIHJvdyBpcyBpbnZhbGlkKVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGNhbiBkZWxldGVcbiAgICBjb25zdCBjYW5EZWxldGUgPSBhd2FpdCB0aGlzLmNhbkRlbGV0ZVJvd3Mocm93cywgb3B0cyk7XG4gICAgaWYgKCFjYW5EZWxldGUpIHJldHVybiAwOyAvLyBDYW5ub3QgZGVsZXRlXG5cbiAgICAvLyBSZXZlcnNlIHJvdyBvcmRlciAob24gYSBjb3B5KVxuICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kLCBuZWVkIGJlY2F1c2Ugcm93LmRlbGV0ZSgpIGhhcyBhc3luYyBleGVjdXRpb25cbiAgICAvLyBhbmQgaW5kZXggY2FjaGUgaXMgdXBkYXRlZCB3aXRoIGEgZGVsYXlcbiAgICBsZXQgdGVtcFJvd3MgPSByb3dzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gKGEuaWQgPiBiLmlkID8gLTEgOiAxKSk7XG5cbiAgICBjb25zdCBkZWxldGVkUm93czogQXN5bmNUYWJsZUVsZW1lbnQ8VD5bXSA9IFtdO1xuXG4gICAgLy8gSWYgZGF0YSBuZWVkIHRvIGJlIHNhdmVkIGZpcnN0XG4gICAgaWYgKHRoaXMuc2F2ZUJlZm9yZURlbGV0ZSkge1xuICAgICAgLy8gRXhjbHVkZSBpbnZhbGlkIHJvd3MgKGJlY2F1c2Ugb2Ygc2F2ZSgpIHdpbGwgZmFpbCwgd2hlbiBleGlzdHMgc29tZSBpbnZhbGlkIHJvd3MpXG4gICAgICB0ZW1wUm93cyA9IHRlbXBSb3dzLmZpbHRlcigocm93KSA9PiB7XG4gICAgICAgIC8vIERlbGV0ZSB0aGUgcm93IDpcbiAgICAgICAgLy8gLSBpZiBuZXdseSBjcmVhdGVkIHJvdyAoaWQgPSAtMSksXG4gICAgICAgIC8vIC0gb3IgaWYgaW52YWxpZCBhbmQgbm90IGVkaXRpbmcgKD0gbm90IGNhbmNlbGxhYmxlKVxuICAgICAgICBpZiAocm93LmlkID09PSAtMSB8fCAoIXJvdy5lZGl0aW5nICYmIHJvdy5pbnZhbGlkKSAvKmRvIG5vdCB1c2UgIXZhbGlkIGJlY2F1c2UgaWYgcm93IGlzIGRpc2FibGVkLCBpdCB3aWxsIGJlIGFsd2F5cyAhdmFsaWQgKi8pIHtcbiAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3RhYmxlXSBEZWxldGUgcm93ICMke3Jvdy5pZH1gKTtcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdChyb3cpO1xuICAgICAgICAgIHJvdy5kZWxldGUoKTtcbiAgICAgICAgICB0aGlzLnZpc2libGVSb3dDb3VudC0tO1xuICAgICAgICAgIHRoaXMudG90YWxSb3dDb3VudC0tO1xuICAgICAgICAgIGRlbGV0ZWRSb3dzLnB1c2gocm93KTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEV4Y2x1ZGUgZnJvbSB0aGUgbGlzdCB0byBkZWxldGUgdXNpbmcgdGhlIHNlcnZpY2VcbiAgICAgICAgfVxuICAgICAgICAvLyBDYW5jZWwgdGhlIHJvdyAoYW5kIG1hcmsgYXMgcHJpc3RpbmUpLCB3aGVuIG5vdCB2YWxpZCBidXQgaW4gZWRpdGlvblxuICAgICAgICBlbHNlIGlmIChyb3cuZWRpdGluZyAmJiAhcm93LnZhbGlkKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3Qocm93KTtcbiAgICAgICAgICByb3cuY2FuY2VsKCk7XG4gICAgICAgICAgLy8gTWFyayByb3cgYXMgcHJpc3RpbmUgKGlmIHBvc3NpYmxlKVxuICAgICAgICAgIHRoaXMuY2hlY2tJZlJvd1ByaXN0aW5lKHJvdywgeyBlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZSAvKmF2b2lkIHByb3BhZ2F0aW9uIHRvIHRhYmxlKi8gfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgdGhlIHJvdy4gdGhlIHJvdyB3aWxsIGJlIGRlbGV0ZWQgYWZ0ZXIgdGhlIHNhdmVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFwcGx5IHNhdmUsIG9ubHkgaWYgdGhlcmUgaXMgc3RpbGwgc29tZSByb3dzIHRvIGRlbGV0ZVxuICAgICAgLy8gV0FSTjogSWYgbm8gbW9yZSByb3dzIChlLmcuIGJlY2F1c2UgYWxsIGhhcyBiZWVuIGNhbmNlbGxlZCkgdGhlbiBjb250aW51ZSBhbnl3YXkgdG8gY2xlYXIgZWRpdGVkUm93IGFuZCBzZWxlY3Rpb24gKGlzc3VlIElNQUdJTkUtNjY5KVxuICAgICAgaWYgKGRlbGV0ZWRSb3dzLmxlbmd0aCB8fCB0ZW1wUm93cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gU2F2ZSBkYXRhIChlLmcuIHdoZW4gdXNpbmcgbWVtb3J5IHNlcnZpY2UpXG4gICAgICAgIGNvbnN0IHNhdmVkID0gYXdhaXQgdGhpcy5zYXZlQmVmb3JlQWN0aW9uKCdkZWxldGUnKTtcbiAgICAgICAgaWYgKCFzYXZlZCkge1xuICAgICAgICAgIC8vIFN0b3AgaWYgc2F2ZSBjYW5jZWxsZWQgb3Igc2F2ZSBmYWlsZWRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQXBwbHkgZGVsZXRpb24gb24gZGF0YXNvdXJjZVxuICAgICAgLy8gSWYgbm8gbW9yZSByb3dzIHRvIGRlbGV0ZSwgY29udGludWUgYW55d2F5IHRvIGNsZWFyIGVkaXRlZFJvdyBhbmQgc2VsZWN0aW9uIChpc3N1ZSBJTUFHSU5FLTY2OSlcbiAgICAgIGlmICh0ZW1wUm93cy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZV0gRGVsZXRlICR7dGVtcFJvd3MubGVuZ3RofSByb3dzLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuZGVsZXRlQWxsKHRlbXBSb3dzKTtcbiAgICAgIH1cblxuICAgICAgLy8gRE8gbm90IHVwZGF0ZSBtYW51YWxseSwgYmVjYXVzZSB3YXRjaEFMbCgpLnN1YnNjcmliZSgpIHdpbGwgdXBkYXRlIHRoaXMgY291bnRcbiAgICAgIC8vdGhpcy50b3RhbFJvd0NvdW50IC09IGRlbGV0ZUNvdW50O1xuICAgICAgLy90aGlzLnZpc2libGVSb3dDb3VudCAtPSBkZWxldGVDb3VudDtcblxuICAgICAgLy8gRGVzZWxlY3QgZGVsZXRlZCByb3dzXG4gICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdCguLi5yb3dzKTtcblxuICAgICAgdGhpcy5tYXJrQXNEaXJ0eSh7IGVtaXRFdmVudDogZmFsc2UgLyptYXJrRm9yQ2hlY2soKSBpcyBjYWxsZWQganVzdCBhZnRlciovIH0pO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgdGhpcy5vbkFmdGVyRGVsZXRlZFJvd3MubmV4dChyb3dzKTtcblxuICAgICAgcmV0dXJuIHJvd3MubGVuZ3RoO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zZXRFcnJvcigoZXJyICYmIGVyci5tZXNzYWdlKSB8fCBlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlbGVjdFJvd0J5SWQoaWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgdGhpcy53YWl0SWRsZSgpO1xuICAgIGNvbnN0IHJvdyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSb3coaWQpO1xuICAgIGlmICghcm93KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuY2xpY2tSb3cobnVsbCwgcm93KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gc2VsZWN0IHJvdyBieSBkYXRhLiBXaWxsIHVzZSBlcXVhbHMoKSB0byBmaW5kIHNhbWUgcm93J3MgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgYXN5bmMgc2VsZWN0Um93QnlEYXRhKGRhdGE6IFQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLndhaXRJZGxlKCk7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhU291cmNlLmdldFJvd3MoKS5maW5kKChyb3cpID0+IHRoaXMuZXF1YWxzKHJvdy5jdXJyZW50RGF0YSwgZGF0YSkpO1xuICAgIGlmICghcm93KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuY2xpY2tSb3cobnVsbCwgcm93KTtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdFJvdyhldmVudDogRXZlbnQsIHJvdzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICAvLyAvIVxcIERPIE5PVCBwcmV2ZW50IGRlZmF1bHQsIG90aGVyd2lzZSB0aGUgY2hlY2tib3ggd2lsbCBub3QgYmUgdXBkYXRlZFxuICAgIC8vZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zZWxlY3Rpb24udG9nZ2xlKHJvdyk7XG4gIH1cblxuICBhc3luYyBjbGlja1JvdyhldmVudDogRXZlbnQgfCB1bmRlZmluZWQsIHJvdzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKSB7XG4gICAgICAvLyBXYWl0IHdoaWxlIGxvYWRpbmcsIGFuZCBsb29wXG4gICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3RhYmxlXSBXYWl0aW5nIGJlZm9yZSBhcHBseSBjbGlja1JvdygpIChkYXRhc291cmNlIGlzIGJ1c3kpLi4uJyk7XG4gICAgICBhd2FpdCB0aGlzLndhaXRJZGxlKHsgdGltZW91dDogMjAwMCB9KTtcbiAgICB9XG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZyhcIlt0YWJsZV0gRGV0ZWN0IGNsaWNrIG9uIHJvd1wiKTtcblxuICAgIC8vIENhbmNlbGxlZCBieSBldmVudFxuICAgIGlmIChldmVudD8uZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZV0gY2xpY2tSb3cgZXZlbnQgaXMgZGVmYXVsdFByZXZlbnRlZCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFscmVhZHkgaW4gZWRpdGlvblxuICAgIGlmIChyb3cuaWQgPT09IC0xIHx8IHJvdy5lZGl0aW5nKSB7XG4gICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3RhYmxlXSBSb3cgYWxyZWFkeSBlZGl0aW5nLiBTa2lwIGNsaWNrUm93IGV2ZW50Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBPcGVuIHRoZSBkZXRhaWwgcGFnZSAoaWYgbm90IGlubGluZSBlZGl0aW5nKVxuICAgIGlmICghdGhpcy5pbmxpbmVFZGl0aW9uKSB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcblxuICAgICAgdGhpcy5vcGVuUm93KHJvdy5jdXJyZW50RGF0YS5pZCwgcm93KVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLm1hcmtBc0xvYWRlZCgpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gdGhpcy5tYXJrQXNMb2FkZWQoKSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IGVkaXRpbmcgcm93XG4gICAgcmV0dXJuIHRoaXMuZWRpdFJvdyhldmVudCwgcm93LCB7IGZvY3VzQ29sdW1uOiB1bmRlZmluZWQgLypmb3JjZSB0byB1c2UgdGhlIGNsaWNrIHRhcmdldCovIH0pO1xuICB9XG5cbiAgYXN5bmMgbW92ZVJvdyhpZDogbnVtYmVyLCBkaXJlY3Rpb246IG51bWJlcikge1xuICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5tb3ZlKGlkLCBkaXJlY3Rpb24pO1xuICB9XG5cbiAgcmVhZHkob3B0cz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHdhaXRGb3JUcnVlKHRoaXMucmVhZHlTdWJqZWN0LCB7IHN0b3A6IHRoaXMuZGVzdHJveVN1YmplY3QsIC4uLm9wdHMgfSk7XG4gIH1cblxuICB3YWl0SWRsZShvcHRzPzogV2FpdEZvck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubG9hZGluZ1N1YmplY3QudmFsdWUpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICByZXR1cm4gd2FpdEZvckZhbHNlKHRoaXMubG9hZGluZ1N1YmplY3QsIHsgc3RvcDogdGhpcy5kZXN0cm95U3ViamVjdCwgLi4ub3B0cyB9KTtcbiAgfVxuXG4gIGFzeW5jIG9wZW5TZWxlY3RDb2x1bW5zTW9kYWwoZXZlbnQ/OiBFdmVudCk6IFByb21pc2U8YW55PiB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBDb3B5IGN1cnJlbnQgY29sdW1ucyAoZGVlcCBjb3B5KVxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEN1cnJlbnRDb2x1bW5zKCk7XG5cbiAgICBjb25zdCBoYXNUb3BNb2RhbCA9ICEhKGF3YWl0IHRoaXMubW9kYWxDdHJsLmdldFRvcCgpKTtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDdHJsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IFRhYmxlU2VsZWN0Q29sdW1uc0NvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudFByb3BzOiB7IGNvbHVtbnMgfSxcbiAgICAgIGNzc0NsYXNzOiBoYXNUb3BNb2RhbCAmJiAnc3RhY2stbW9kYWwnLFxuICAgIH0pO1xuXG4gICAgLy8gT3BlbiB0aGUgbW9kYWxcbiAgICBhd2FpdCBtb2RhbC5wcmVzZW50KCk7XG5cbiAgICAvLyBPbiBkaXNtaXNzXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBtb2RhbC5vbkRpZERpc21pc3MoKTtcbiAgICBpZiAoIWRhdGEpIHJldHVybjsgLy8gQ0FOQ0VMTEVEXG5cbiAgICAvLyBBcHBseSBjb2x1bW5zXG4gICAgY29uc3QgdXNlckNvbHVtbnMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKChjKSA9PiBjLmNhbkhpZGUgPT09IGZhbHNlIHx8IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLm5hbWUpIHx8IFtdO1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IFJFU0VSVkVEX1NUQVJUX0NPTFVNTlMuY29uY2F0KHVzZXJDb2x1bW5zKS5jb25jYXQoUkVTRVJWRURfRU5EX0NPTFVNTlMpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG5cbiAgICAvLyBVcGRhdGUgdXNlciBzZXR0aW5nc1xuICAgIGF3YWl0IHRoaXMuc2F2ZVBhZ2VTZXR0aW5ncyh1c2VyQ29sdW1ucywgU0VUVElOR1NfRElTUExBWV9DT0xVTU5TKTtcbiAgfVxuXG4gIHRyYWNrQnlGbihpbmRleDogbnVtYmVyLCByb3c6IEFzeW5jVGFibGVFbGVtZW50PFQ+KSB7XG4gICAgcmV0dXJuIHJvdy5pZDtcbiAgfVxuXG4gIGRvUmVmcmVzaChldmVudD86IENvbXBsZXRhYmxlRXZlbnQpIHtcbiAgICB0aGlzLmVtaXRSZWZyZXNoKGV2ZW50KTtcblxuICAgIC8vIFdoZW4gdGFyZ2V0IHdhaXQgZm9yIGEgY29tcGxldGUgKGUuZy4gSW9uUmVmcmVzaGVyKVxuICAgIGlmIChldmVudD8udGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5jb21wbGV0ZSkge1xuICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdElkbGUoKTtcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNvbXBsZXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRDdXJyZW50Q29sdW1ucygpOiBDb2x1bW5JdGVtW10ge1xuICAgIGNvbnN0IGhpZGRlbkNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuc2xpY2UoUkVTRVJWRURfU1RBUlRfQ09MVU1OUy5sZW5ndGgpLmZpbHRlcigobmFtZSkgPT4gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zXG4gICAgICAuY29uY2F0KGhpZGRlbkNvbHVtbnMpXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiAhUkVTRVJWRURfU1RBUlRfQ09MVU1OUy5pbmNsdWRlcyhuYW1lKSAmJiAhUkVTRVJWRURfRU5EX0NPTFVNTlMuaW5jbHVkZXMobmFtZSkgJiYgIXRoaXMuZXhjbHVkZXNDb2x1bW5zLmluY2x1ZGVzKG5hbWUpKVxuICAgICAgLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbGFiZWw6IHRoaXMuZ2V0STE4bkNvbHVtbk5hbWUobmFtZSksXG4gICAgICAgIHZpc2libGU6IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5pbmRleE9mKG5hbWUpICE9PSAtMSxcbiAgICAgICAgY2FuSGlkZTogdGhpcy5nZXRSZXF1aXJlZENvbHVtbnMoKS5pbmRleE9mKG5hbWUpID09PSAtMSxcbiAgICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIGVzY2FwZUVkaXRpbmdSb3coZXZlbnQ/OiBFdmVudCwgcm93PzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICByb3cgPSByb3cgfHwgdGhpcy5kYXRhU291cmNlLmdldFNpbmdsZUVkaXRpbmdSb3coKTtcbiAgICBpZiAoIXJvdyB8fCAhcm93LmVkaXRpbmcpIHJldHVybjtcblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKCdbYXBwLXRhYmxlXSBDYW5jZWwgdGhlIHJvdyAoa2V5ZG93bi5lc2NhcGUpJyk7XG5cbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIC8vIEF2b2lkIHRvIGNhbmNlbCB0aGUgZWRpdG9yXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLy8gSWYgbmV3IHJvdyAobm8gaWQpXG4gICAgaWYgKHJvdy5pZCA9PT0gLTEpIHtcbiAgICAgIGlmIChyb3cudmFsaWRhdG9yKSB7XG4gICAgICAgIC8vIElmIHBlbmRpbmc6IFdhaXQgZW5kIG9mIHZhbGlkYXRpb24sIHRoZW4gbG9vcFxuICAgICAgICBpZiAocm93LnBlbmRpbmcpIHtcbiAgICAgICAgICBhd2FpdCBBcHBGb3JtVXRpbHMud2FpdFdoaWxlUGVuZGluZyhyb3cudmFsaWRhdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJvdyBpcyBpbnZhbGlkOiBkZWxldGUgdGhlIHJvd1xuICAgICAgICBpZiAocm93LmludmFsaWQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZU5ld1JvdyhldmVudCwgcm93KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIHJvdyBleGlzdHMgKGhhcyBhbiBpZClcbiAgICBlbHNlIHtcbiAgICAgIC8vIG5lZWQgdG8gY2FsbCBjYW5jZWwgZnVuY3Rpb24gKGlmIGNvbmZpcm1hdGlvbiB3aWxsIGJlIGNhbGxlZCBiZWZvcmUpXG4gICAgICBpZiAodGhpcy5jb25maXJtQmVmb3JlQ2FuY2VsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2FuY2VsRXhpc3RpbmdSb3coZXZlbnQsIHJvdywgeyBrZWVwRWRpdGluZzogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0LCB0cnkgdG8gY29uZmlybSB0aGUgcm93XG4gICAgYXdhaXQgdGhpcy5jb25maXJtRWRpdENyZWF0ZShldmVudCwgcm93KTtcbiAgfVxuXG4gIHRyYW5zbGF0ZUZvcm1QYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcywgdG8gcmVzb2x2ZSBhbGwgZmllbGQgbmFtZVxuXG4gICAgLy8gVXNlIGNvbHVtbnMga2V5LCBoYXMgZGVmYXVsdCBuYW1lXG4gICAgY29uc3QgaTE4bkNvbHVtbktleSA9IHRoaXMuZ2V0STE4bkNvbHVtbk5hbWUocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlPy5pbnN0YW50KGkxOG5Db2x1bW5LZXkpIHx8IGkxOG5Db2x1bW5LZXk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kIC0tICovXG5cbiAgcHJvdGVjdGVkIGFzeW5jIGVkaXRSb3coZXZlbnQ6IEV2ZW50IHwgdW5kZWZpbmVkLCByb3c6IEFzeW5jVGFibGVFbGVtZW50PFQ+LCBvcHRzPzogeyBmb2N1c0NvbHVtbj86IHN0cmluZyB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLl9lbmFibGVkIHx8ICF0aGlzLmlubGluZUVkaXRpb24pIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5kYXRhU291cmNlLmdldEVkaXRpbmdSb3dzKCkuaW5jbHVkZXMocm93KSkgcmV0dXJuIHRydWU7IC8vIEFscmVhZHkgdGhlIGVkaXRlZCByb3dcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICghKGF3YWl0IHRoaXMuY29uZmlybUVkaXRDcmVhdGUoKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXJvdy5lZGl0aW5nICYmICF0aGlzLmxvYWRpbmcpIHtcbiAgICAgIHRoaXMuZm9jdXNDb2x1bW4gPSAob3B0cyAmJiBvcHRzLmZvY3VzQ29sdW1uKSB8fCB0aGlzLmZvY3VzQ29sdW1uO1xuICAgICAgYXdhaXQgdGhpcy5fZGF0YVNvdXJjZS5zdGFydEVkaXQocm93KTtcbiAgICB9XG4gICAgdGhpcy5vblN0YXJ0RWRpdGluZ1Jvdy5lbWl0KHJvdyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHNlbGVjdCByb3csIGJ5IHJvdy5pZCwgb3IgYnkgZGF0YS4gV0lsbCB1c2UgRW50aXR5VXRpbHMuZXF1YWxzKClcbiAgICpcbiAgICogQHBhcmFtIGlkXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBzZWxlY3RSb3dCeUlkT3JEYXRhKGlkOiBudW1iZXIsIGRhdGE/OiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgLy8gU2VsZWN0IGJ5IHJvdyBpZCAoaWYgTk9UIGEgbmV3IHJvdylcbiAgICAgIGlmIChpc05vdE5pbChpZCkgfHwgaWQgIT09IC0xKSB7XG4gICAgICAgIGRvbmUgPSBhd2FpdCB0aGlzLnNlbGVjdFJvd0J5SWQoaWQpO1xuICAgICAgICBpZiAoZG9uZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnNvbGUud2FybignW2FwcC10YWJsZV0gU2F2ZTogQ2Fubm90IHJlc2VsZWN0IHJvdyBieSByb3cuaWQ6ICcsIGlkKTtcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IGJ5IGRhdGFcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRvbmUgPSBhd2FpdCB0aGlzLnNlbGVjdFJvd0J5RGF0YShkYXRhKTtcbiAgICAgICAgaWYgKGRvbmUpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zb2xlLndhcm4oJ1thcHAtdGFibGVdIFNhdmU6IENhbm5vdCByZXNlbGVjdCByb3cgYnkgZGF0YTogJywgZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIExvZywgYnV0IGNvbnRpbnVlXG4gICAgICBjb25zb2xlLmVycm9yKChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8IGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiB0aGUgc2VsZWN0ZWQgcm93IGlmIHVuaXF1ZSBpbiBzZWxlY3Rpb25cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc2luZ2xlU2VsZWN0ZWRSb3coKTogQXN5bmNUYWJsZUVsZW1lbnQ8VD4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZD8ubGVuZ3RoID09PSAxID8gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRbMF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2FuRGVsZXRlUm93cyhyb3dzOiBBc3luY1RhYmxlRWxlbWVudDxUPltdLCBvcHRzPzogeyBpbnRlcmFjdGl2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIENoZWNrIHVzaW5nIGVtaXR0ZXJcbiAgICBpZiAodGhpcy5vbkJlZm9yZURlbGV0ZVJvd3Mub2JzZXJ2ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhbkRlbGV0ZSA9IGF3YWl0IGVtaXRQcm9taXNlRXZlbnQodGhpcy5vbkJlZm9yZURlbGV0ZVJvd3MsICdjYW5EZWxldGUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IHJvd3MgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY2FuRGVsZXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiBmYWxzZTsgLy8gVXNlciBjYW5jZWxcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgY2FuIGRlbGV0ZSByb3dzJywgZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFzayB1c2VyIGNvbmZpcm1hdGlvblxuICAgIGlmICh0aGlzLmNvbmZpcm1CZWZvcmVEZWxldGUgJiYgKCFvcHRzIHx8IG9wdHMuaW50ZXJhY3RpdmUgIT09IGZhbHNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXNrRGVsZXRlQ29uZmlybWF0aW9uKG51bGwsIHJvd3MpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjYW5DYW5jZWxSb3dzKHJvd3M/OiBBc3luY1RhYmxlRWxlbWVudDxUPltdLCBvcHRzPzogeyBpbnRlcmFjdGl2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIEdldCBkaXJ0eSByb3dzXG4gICAgcm93cyA9IHJvd3MgfHwgdGhpcy5kYXRhU291cmNlLmdldFJvd3MoKS5maWx0ZXIoKHJvdykgPT4gcm93LnZhbGlkYXRvcj8uZGlydHkpO1xuXG4gICAgaWYgKGlzRW1wdHlBcnJheShyb3dzKSkgcmV0dXJuIHRydWU7IC8vIE5vIGRpcnR5OiBPS1xuXG4gICAgLy8gQ2hlY2sgdXNpbmcgZW1pdHRlclxuICAgIGlmICh0aGlzLm9uQmVmb3JlQ2FuY2VsUm93cy5vYnNlcnZlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaXNDYW5jZWwgPSBhd2FpdCBlbWl0UHJvbWlzZUV2ZW50KHRoaXMub25CZWZvcmVDYW5jZWxSb3dzLCAnY2FuQ2FuY2VsJywge1xuICAgICAgICAgIGRldGFpbDogeyByb3dzIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWlzQ2FuY2VsKSByZXR1cm4gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiBmYWxzZTsgLy8gVXNlciBjYW5jZWxcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgY2FuIGNhbmNlbCByb3dzJywgZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFzayB1c2VyIGNvbmZpcm1hdGlvblxuICAgIGlmICh0aGlzLmNvbmZpcm1CZWZvcmVDYW5jZWwgJiYgKCFvcHRzIHx8IG9wdHMuaW50ZXJhY3RpdmUgIT09IGZhbHNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXNrQ2FuY2VsQ29uZmlybWF0aW9uKG51bGwsIHJvd3MpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzYXZlQmVmb3JlQWN0aW9uKHNhdmVBY3Rpb246IFNhdmVBY3Rpb25UeXBlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmRpcnR5KSB7XG4gICAgICAvLyBDb250aW51ZSB3aXRob3V0IHNhdmVcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGxldCBzYXZlOiBib29sZWFuO1xuICAgIHN3aXRjaCAoc2F2ZUFjdGlvbikge1xuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc2F2ZSA9IHRoaXMuc2F2ZUJlZm9yZURlbGV0ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmaWx0ZXInOlxuICAgICAgICBzYXZlID0gdGhpcy5zYXZlQmVmb3JlRmlsdGVyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NvcnQnOlxuICAgICAgICBzYXZlID0gdGhpcy5zYXZlQmVmb3JlU29ydDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzYXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGJlaGF2aW9yXG4gICAgbGV0IGNvbmZpcm1lZCA9IHRydWU7XG5cbiAgICBpZiAoc2F2ZSkge1xuICAgICAgaWYgKHRoaXMub25CZWZvcmVTYXZlLm9ic2VydmVkKSB7XG4gICAgICAgIC8vIEFzayBjb25maXJtYXRpb25cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBlbWl0UHJvbWlzZUV2ZW50KHRoaXMub25CZWZvcmVTYXZlLCAnYmVmb3JlU2F2ZScsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBhY3Rpb246IHNhdmVBY3Rpb24sIHZhbGlkOiB0aGlzLnZhbGlkIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uZmlybWVkID0gcmVzLmNvbmZpcm1lZDtcbiAgICAgICAgICBzYXZlID0gcmVzLnNhdmU7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChlcnIgPT09ICdDQU5DRUxMRUQnKSByZXR1cm4gZmFsc2U7IC8vIFVzZXIgY2FuY2VsXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgY2FuIGRlbGV0ZSByb3dzJywgZXJyKTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICBpZiAoc2F2ZSkge1xuICAgICAgICAvLyBVc2VyIGNvbmZpcm1lZCBzYXZlXG4gICAgICAgIGNvbnN0IHNhdmVkID0gYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTsgLy8gUmVzdG9yZSBkaXJ0eSBmbGFnXG4gICAgICAgIHJldHVybiBzYXZlZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlOyAvLyBObyBzYXZlIGJ1dCBjb250aW51ZSBhY3Rpb25cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7IC8vIFVzZXIgY2FuY2VsIHRoZSBhY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgcm93IGRldGFpbCB2aWV3LiBCeSBkZWZhdWx0LCB3aWxsIHRvIG9wZW4gcm93IGRldGFpbCBwYWdlLlxuICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLCBCVVQgcHJlZmVyIHRvIHN1YnNjcmliZSBvbiBvbk9wZW5Sb3dcbiAgICpcbiAgICogQHBhcmFtIGlkXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9wZW5Sb3coaWQ6IElELCByb3c6IEFzeW5jVGFibGVFbGVtZW50PFQ+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuYWxsb3dSb3dEZXRhaWwpIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnICYmIHRoaXMuZGlydHkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbdGFibGVdIE9wZW5pbmcgcm93IGRldGFpbHMsIGJ1dCB0YWJsZSBoYXMgdW5zYXZlZCBjaGFuZ2VzIScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vbk9wZW5Sb3cub2JzZXJ2ZWQpIHtcbiAgICAgICAgdGhpcy5vbk9wZW5Sb3cuZW1pdChyb3cpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTm8gSUQgZGVmaW5lZDogdW5hYmxlIHRvIG9wZW4gZGV0YWlsc1xuICAgICAgaWYgKGlzTmlsKGlkKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1t0YWJsZV0gT3BlbmluZyByb3cgZGV0YWlscywgYnV0IGRhdGEgaGFzIG5vIGlkIScpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVGb3J3YXJkKGAke3RoaXMucm91dGVyLnVybH0vJHtpZH1gLCB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgb3Blbk5ld1Jvd0RldGFpbChldmVudD86IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5hbGxvd1Jvd0RldGFpbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHRoaXMub25OZXdSb3cub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMub25OZXdSb3cuZW1pdChldmVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5uYXZDb250cm9sbGVyLm5hdmlnYXRlRm9yd2FyZChgJHt0aGlzLnJvdXRlci51cmx9L25ld2ApO1xuICB9XG5cbiAgLy8gY2FuIGJlIG92ZXJyaWRkZW4gdG8gYWRkIG1vcmUgcmVxdWlyZWQgY29sdW1uc1xuICBwcm90ZWN0ZWQgZ2V0UmVxdWlyZWRDb2x1bW5zKCkge1xuICAgIHJldHVybiBERUZBVUxUX1JFUVVJUkVEX0NPTFVNTlM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VXNlckNvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2VTZXR0aW5ncyhTRVRUSU5HU19ESVNQTEFZX0NPTFVNTlMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNvcnRlZENvbHVtbigpOiBNYXRTb3J0YWJsZSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0UGFnZVNldHRpbmdzKFNFVFRJTkdTX1NPUlRFRF9DT0xVTU4pO1xuICAgIGNvbnN0IHBhcnRzID0gZGF0YSAmJiBkYXRhLnNwbGl0KCc6Jyk7XG4gICAgaWYgKHBhcnRzICYmIHBhcnRzLmxlbmd0aCA9PT0gMiAmJiB0aGlzLmNvbHVtbnMuaW5jbHVkZXMocGFydHNbMF0pKSB7XG4gICAgICByZXR1cm4geyBpZDogcGFydHNbMF0sIHN0YXJ0OiBwYXJ0c1sxXSA9PT0gJ2Rlc2MnID8gJ2Rlc2MnIDogJ2FzYycsIGRpc2FibGVDbGVhcjogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVmYXVsdFNvcnRCeSkge1xuICAgICAgcmV0dXJuIHsgaWQ6IHRoaXMuZGVmYXVsdFNvcnRCeSwgc3RhcnQ6IHRoaXMuZGVmYXVsdFNvcnREaXJlY3Rpb24gfHwgJ2FzYycsIGRpc2FibGVDbGVhcjogZmFsc2UgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaWQ6ICdpZCcsIHN0YXJ0OiAnYXNjJywgZGlzYWJsZUNsZWFyOiBmYWxzZSB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgY29uc3QgcGFnZVNpemUgPSB0aGlzLmdldFBhZ2VTZXR0aW5nczxudW1iZXI+KFNFVFRJTkdTX1BBR0VfU0laRSk7XG4gICAgcmV0dXJuIHBhZ2VTaXplIHx8IHRoaXMuZGVmYXVsdFBhZ2VTaXplO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICBsZXQgdXNlckNvbHVtbnMgPSB0aGlzLmdldFVzZXJDb2x1bW5zKCk7XG5cbiAgICAvLyBObyB1c2VyIG92ZXJyaWRlXG4gICAgaWYgKCF1c2VyQ29sdW1ucykge1xuICAgICAgLy8gUmV0dXJuIGRlZmF1bHQsIHdpdGhvdXQgY29sdW1ucyB0byBoaWRlXG4gICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiAhdGhpcy5leGNsdWRlc0NvbHVtbnMuaW5jbHVkZXMoY29sdW1uKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGZpeGVkIHN0YXJ0IGNvbHVtbnNcbiAgICBjb25zdCBmaXhlZFN0YXJ0Q29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoKGMpID0+IFJFU0VSVkVEX1NUQVJUX0NPTFVNTlMuaW5jbHVkZXMoYykpO1xuXG4gICAgLy8gUmVtb3ZlIGVuZCBjb2x1bW5zXG4gICAgY29uc3QgZml4ZWRFbmRDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcigoYykgPT4gUkVTRVJWRURfRU5EX0NPTFVNTlMuaW5jbHVkZXMoYykpO1xuXG4gICAgLy8gUmVtb3ZlIGZpeGVkIGNvbHVtbnMgZnJvbSB1c2VyIGNvbHVtbnNcbiAgICB1c2VyQ29sdW1ucyA9IHVzZXJDb2x1bW5zLmZpbHRlcigoYykgPT4gIWZpeGVkU3RhcnRDb2x1bW5zLmluY2x1ZGVzKGMpICYmICFmaXhlZEVuZENvbHVtbnMuaW5jbHVkZXMoYykgJiYgdGhpcy5jb2x1bW5zLmluY2x1ZGVzKGMpKTtcblxuICAgIC8vIEFkZCByZXF1aXJlZCBjb2x1bW5zIGlmIG1pc3NpbmdcbiAgICB1c2VyQ29sdW1ucy5wdXNoKFxuICAgICAgLi4udGhpcy5nZXRSZXF1aXJlZENvbHVtbnMoKS5maWx0ZXIoKGMpID0+ICFmaXhlZFN0YXJ0Q29sdW1ucy5pbmNsdWRlcyhjKSAmJiAhZml4ZWRFbmRDb2x1bW5zLmluY2x1ZGVzKGMpICYmICF1c2VyQ29sdW1ucy5pbmNsdWRlcyhjKSlcbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGZpeGVkU3RhcnRDb2x1bW5zXG4gICAgICAgIC5jb25jYXQodXNlckNvbHVtbnMpXG4gICAgICAgIC5jb25jYXQoZml4ZWRFbmRDb2x1bW5zKVxuICAgICAgICAvLyBSZW1vdmUgY29sdW1ucyB0byBoaWRlXG4gICAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gIXRoaXMuZXhjbHVkZXNDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGUgZGlzcGxheSBjb2x1bW5zXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVDb2x1bW5zKCkge1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuZ2V0RGlzcGxheUNvbHVtbnMoKTtcbiAgICBpZiAoIXRoaXMubG9hZGluZykgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlclN1YnNjcmlwdGlvbihzdWI6IFN1YnNjcmlwdGlvbikge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoc3ViKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1bnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHN1YjogU3Vic2NyaXB0aW9uKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZShzdWIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyQXV0b2NvbXBsZXRlRmllbGQ8RSA9IGFueSwgRUYgPSBhbnk+KFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBNYXRBdXRvY29tcGxldGVGaWVsZEFkZE9wdGlvbnM8RSwgRUY+XG4gICk6IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnPEUsIEVGPiB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dG9jb21wbGV0ZUNvbmZpZ0hvbGRlci5hZGQoZmllbGROYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRJMThuQ29sdW1uTmFtZShjb2x1bW5OYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKHRoaXMuaTE4bkNvbHVtblByZWZpeCB8fCAnJykgKyBjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlKGNvbHVtbk5hbWUpLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVUYWJsZUlkKCkge1xuICAgIC8vIG5vaW5zcGVjdGlvbiBKU05vbkFTQ0lJTmFtZXNcbiAgICBjb25zdCBtZXRhID0gdGhpcy5jb25zdHJ1Y3RvclsnybVjbXAnXTtcbiAgICAvLyBHZXQgYSBjb21wb25lbnQgdW5pcXVlIG5hbWUgLSBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjAxMTQ2ODIvaG93LXRvLWFjY2Vzcy1jb21wb25lbnRzLXVuaXF1ZS1lbmNhcHN1bGF0aW9uLWlkLWluLWFuZ3VsYXItOVxuICAgIGNvbnN0IGNvbXBvbmVudElkID0gKG1ldGEgJiYgKG1ldGEuc2VsZWN0b3JzPy5bMF0gfHwgbWV0YS5pZCkpIHx8IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICBjb25zdCBpZCA9XG4gICAgICB0aGlzLmxvY2F0aW9uXG4gICAgICAgIC5wYXRoKHRydWUpXG4gICAgICAgIC5yZXBsYWNlKC9bP10uKiQvZywgJycpXG4gICAgICAgIC5yZXBsYWNlKC9cXC9cXGQrL2csICdfaWQnKSArXG4gICAgICAnXycgK1xuICAgICAgY29tcG9uZW50SWQ7XG4gICAgLy9pZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3RhYmxlXSBpZCA9ICcgKyBpZCk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFkZFJvd1RvVGFibGUoXG4gICAgaW5zZXJ0QXQ/OiBudW1iZXIsXG4gICAgb3B0cz86IHsgZm9jdXNDb2x1bW4/OiBzdHJpbmc7IGVkaXRpbmc/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH1cbiAgKTogUHJvbWlzZTxBc3luY1RhYmxlRWxlbWVudDxUPiB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIFRyeSB0byBmaW5pc2ggZWRpdGVkIHJvdyBmaXJzdFxuICAgIGlmICghKGF3YWl0IHRoaXMuY29uZmlybUVkaXRDcmVhdGUoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3RhYmxlXSBDYW5ub3QgYWRkIG5ldyByb3csIGJlY2F1c2UgdGhlIHByZXZpb3VzIGVkaXRlZCByb3cgY2Fubm90IGJlIGNvbmZpcm1lZCcpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBlZGl0aW5nID0gdGhpcy5pbmxpbmVFZGl0aW9uICYmICghb3B0cyB8fCBvcHRzLmVkaXRpbmcgIT09IGZhbHNlKTsgLy8gdHJ1ZSBieSBkZWZhdWx0LCBpZiBpbmxpbmVFZGl0aW9uXG5cbiAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLl9kYXRhU291cmNlLmNyZWF0ZU5ldyhpbnNlcnRBdCwgeyBlZGl0aW5nIH0pO1xuICAgIGlmICghcm93KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHJvdy5lZGl0aW5nKSB7XG4gICAgICAvLyBVcGRhdGUgZm9jdXNlZCBjb2x1bW5cbiAgICAgIHRoaXMuZm9jdXNGaXJzdENvbHVtbiA9IHRydWU7XG4gICAgICB0aGlzLmZvY3VzQ29sdW1uID0gb3B0cz8uZm9jdXNDb2x1bW4gfHwgdGhpcy5maXJzdFVzZXJDb2x1bW47XG5cbiAgICAgIC8vIEVtaXQgc3RhcnQgZWRpdGluZyBldmVudFxuICAgICAgdGhpcy5vblN0YXJ0RWRpdGluZ1Jvdy5lbWl0KHJvdyk7XG4gICAgfVxuXG4gICAgdGhpcy50b3RhbFJvd0NvdW50Kys7XG4gICAgdGhpcy52aXNpYmxlUm93Q291bnQrKztcblxuICAgIHRoaXMubWFya0FzRGlydHkoeyBlbWl0RXZlbnQ6IGZhbHNlIC8qbWFya0ZvckNoZWNrKCkgaXMgY2FsbGVkIGp1c3QgYWZ0ZXIqLyB9KTtcblxuICAgIC8vIEVtaXQgZXZlbnRcbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgcmV0dXJuIHJvdztcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlckNlbGxWYWx1ZUNoYW5nZXMobmFtZTogc3RyaW5nLCBmb3JtUGF0aD86IHN0cmluZywgZW1pdEluaXRpYWxWYWx1ZT86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGZvcm1QYXRoID0gZm9ybVBhdGggfHwgbmFtZTtcbiAgICBlbWl0SW5pdGlhbFZhbHVlID0gZW1pdEluaXRpYWxWYWx1ZSB8fCBmYWxzZTtcbiAgICBsZXQgZGVmID0gdGhpcy5fY2VsbFZhbHVlQ2hhbmdlc0RlZnNbbmFtZV07XG4gICAgaWYgKGRlZiAmJiAoZGVmLmZvcm1QYXRoICE9PSBmb3JtUGF0aCB8fCBkZWYuZW1pdEluaXRpYWxWYWx1ZSAhPT0gZW1pdEluaXRpYWxWYWx1ZSkpIHtcbiAgICAgIHRocm93IEVycm9yKFwiQWxyZWFkeSByZWdpc3RlciBhIGNlbGwgdmFsdWUgY2hhbmdlIGZvciB0aGlzIG5hbWUsIHdpdGggZGlmZmVyZW50ICdmb3JtUGF0aCcgb3IgJ2VtaXRJbml0aWFsVmFsdWUnLiBQbGVhc2UgdXNlIHNhbWUgYXJndW1lbnRzLlwiKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgZXhpc3RzOiByZWdpc3RlciBuZXcgZGVmaW5pdGlvblxuICAgIGlmICghZGVmKSB7XG4gICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3RhYmxlXSBOZXcgbGlzdGVuZXIgeyR7bmFtZX19IGZvciB2YWx1ZSBjaGFuZ2VzIG9uIHBhdGggJHtmb3JtUGF0aH1gKTtcbiAgICAgIGRlZiA9IHtcbiAgICAgICAgc3ViamVjdDogbmV3IFN1YmplY3Q8YW55PigpLFxuICAgICAgICBzdWJzY3JpcHRpb246IG51bGwsXG4gICAgICAgIGZvcm1QYXRoLFxuICAgICAgICBlbWl0SW5pdGlhbFZhbHVlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuX2NlbGxWYWx1ZUNoYW5nZXNEZWZzW25hbWVdID0gZGVmO1xuXG4gICAgICAvLyBTdGFydCB0aGUgbGlzdGVuZXIsIHdoZW4gZWRpdGluZyBzdGFydHNcbiAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24odGhpcy5vblN0YXJ0RWRpdGluZ1Jvdy5zdWJzY3JpYmUoKHJvdykgPT4gdGhpcy5zdGFydENlbGxWYWx1ZUNoYW5nZXMobmFtZSwgcm93KSkpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWYuc3ViamVjdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRTaG93Q29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZywgc2hvdzogYm9vbGVhbiwgb3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCF0aGlzLmV4Y2x1ZGVzQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW5OYW1lKSAhPT0gc2hvdykge1xuICAgICAgaWYgKCFzaG93KSB7XG4gICAgICAgIHRoaXMuZXhjbHVkZXNDb2x1bW5zLnB1c2goY29sdW1uTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZXhjbHVkZXNDb2x1bW5zLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlID09PSBjb2x1bW5OYW1lKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHRoaXMuZXhjbHVkZXNDb2x1bW5zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlY29tcHV0ZSBkaXNwbGF5IGNvbHVtbnNcbiAgICAgIGlmICh0aGlzLmRpc3BsYXllZENvbHVtbnMgJiYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNob3dDb2x1bW4oY29sdW1uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmV4Y2x1ZGVzQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW5OYW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydHNXaXRoVXBwZXJDYXNlKGlucHV0OiBzdHJpbmcsIHNlYXJjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlucHV0ICYmIGlucHV0LnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChzZWFyY2gpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRldGVjdENoYW5nZXMoKSB7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYXNrRGVsZXRlQ29uZmlybWF0aW9uKGV2ZW50PzogRXZlbnQsIHJvd3M/OiBBc3luY1RhYmxlRWxlbWVudDxUPltdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMudW5kb2FibGVEZWxldGlvbikge1xuICAgICAgLy8gU3BlY2lhbCBtZXNzYWdlLCBmb3IgdW5kb2FibGUgZGVsZXRpb25cbiAgICAgIHJldHVybiBBbGVydHMuYXNrQ29uZmlybWF0aW9uKHJvd3M/Lmxlbmd0aCA9PT0gMSA/ICdDT05GSVJNLkRFTEVURV9ST1cnIDogJ0NPTkZJUk0uREVMRVRFX1JPV1MnLCB0aGlzLmFsZXJ0Q3RybCwgdGhpcy50cmFuc2xhdGUsIGV2ZW50KTtcbiAgICB9XG4gICAgLy8gSW1tZWRpYXRlIGRlbGV0aW9uIGFjdGlvblxuICAgIHJldHVybiBBbGVydHMuYXNrQWN0aW9uQ29uZmlybWF0aW9uKHRoaXMuYWxlcnRDdHJsLCB0aGlzLnRyYW5zbGF0ZSwgdHJ1ZSwgZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFza0NhbmNlbENvbmZpcm1hdGlvbihldmVudD86IEV2ZW50LCByb3dzPzogQXN5bmNUYWJsZUVsZW1lbnQ8VD5bXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBBbGVydHMuYXNrQ29uZmlybWF0aW9uKHJvd3M/Lmxlbmd0aCA9PT0gMSA/ICdDT05GSVJNLkNBTkNFTF9ST1cnIDogJ0NPTkZJUk0uQ0FOQ0VMX1JPV1MnLCB0aGlzLmFsZXJ0Q3RybCwgdGhpcy50cmFuc2xhdGUsIGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhc2tSZXN0b3JlQ29uZmlybWF0aW9uKGV2ZW50PzogRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gQWxlcnRzLmFza0FjdGlvbkNvbmZpcm1hdGlvbih0aGlzLmFsZXJ0Q3RybCwgdGhpcy50cmFuc2xhdGUsIGZhbHNlLCBldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2hvd1RvYXN0KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMudG9hc3RDb250cm9sbGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHRvYXN0Q29udHJvbGxlciBpbiBjb21wb25lbnQncyBjb25zdHJ1Y3RvclwiKTtcbiAgICByZXR1cm4gVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCBvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEVycm9yKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIHRoaXMuc2V0RXJyb3IodW5kZWZpbmVkLCBvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dFcnJvcihyb3c/OiBBc3luY1RhYmxlRWxlbWVudDxUPiwgb3B0cz86IEZvcm1FcnJvclRyYW5zbGF0ZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJvdyA9IHJvdyB8fCB0aGlzLmRhdGFTb3VyY2UuZ2V0U2luZ2xlRWRpdGluZ1JvdygpO1xuICAgIGlmICghcm93IHx8ICF0aGlzLmZvcm1FcnJvckFkYXB0ZXIpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gdGhpcy5mb3JtRXJyb3JBZGFwdGVyLnRyYW5zbGF0ZUZvcm1FcnJvcnMocm93LnZhbGlkYXRvciwge1xuICAgICAgLi4udGhpcy5lcnJvclRyYW5zbGF0ZU9wdGlvbnMsXG4gICAgICAuLi5vcHRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEVycm9yKHZhbHVlOiBzdHJpbmcsIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmVycm9yU3ViamVjdC52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuZXJyb3JTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIGRhdGEgZXF1YWxpdHkgKGRlZmF1bHQgYnkgaWQsIHVzaW5nIEVudGl0eVV0aWxzLmVxdWFscygpKVxuICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiB0byBhZGQgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGNvbXBhcmVcbiAgICpcbiAgICogQHBhcmFtIGQxXG4gICAqIEBwYXJhbSBkMlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZXF1YWxzKGQxOiBULCBkMjogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBFbnRpdHlVdGlscy5lcXVhbHMoZDEsIGQyLCAnaWQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrUm93QXNEaXJ0eShyb3c/OiBBc3luY1RhYmxlRWxlbWVudDxUPiwgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RVZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICByb3cgPSByb3cgfHwgdGhpcy5kYXRhU291cmNlLmdldFNpbmdsZUVkaXRpbmdSb3coKTtcbiAgICBpZiAocm93KSByb3cudmFsaWRhdG9yPy5tYXJrQXNEaXJ0eShvcHRzKTtcbiAgICB0aGlzLm1hcmtBc0RpcnR5KG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBhZ2VTZXR0aW5nczxUID0gYW55Pihwcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5nZXRQYWdlU2V0dGluZ3ModGhpcy5zZXR0aW5nc0lkLCBwcm9wZXJ0eU5hbWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVQYWdlU2V0dGluZ3ModmFsdWU6IGFueSwgcHJvcGVydHlOYW1lPzogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5zZXR0aW5ncy5zYXZlUGFnZVNldHRpbmcodGhpcy5zZXR0aW5nc0lkLCB2YWx1ZSwgcHJvcGVydHlOYW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0UmVmcmVzaCh2YWx1ZT86IGFueSkge1xuICAgIC8vIEVtaXQgb25SZWZyZXNoIGlmIG5vdCBjbG9zZWQgKGNhbiBoYXBwZW4gaWYgY29tcG9uZW50IGlzIGRlc3Ryb3llZCB0byBlYXJseSlcbiAgICBpZiAoISF0aGlzLm9uUmVmcmVzaCAmJiAhdGhpcy5vblJlZnJlc2guY2xvc2VkKSB7XG4gICAgICB0aGlzLm9uUmVmcmVzaC5lbWl0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgcGVybWFuZW50IHNlbGVjdGlvbiBtb2RlbFxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdFBlcm1hbmVudFNlbGVjdGlvbigpIHtcbiAgICBpZiAodGhpcy5wZXJtYW5lbnRTZWxlY3Rpb24pIHRocm93IG5ldyBFcnJvcignaW5pdFBlcm1hbmVudFNlbGVjdGlvbigpIGFscmVhZHkgY2FsbGVkIScpO1xuXG4gICAgdGhpcy5wZXJtYW5lbnRTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8VD4odHJ1ZSwgW10pO1xuXG4gICAgLy8gTGlzdGVuIHNvcnQgY2hhbmdlXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMub25Tb3J0LnN1YnNjcmliZSgoKSA9PiAodGhpcy5wZXJtYW5lbnRTZWxlY3Rpb25DaGFuZ2VkUHJldmVudGVkID0gdHJ1ZSkpIC8vIHByZXZlbnQgc2VsZWN0aW9uIGNoYW5nZSBvbiBzb3J0XG4gICAgKTtcblxuICAgIC8vIExpc3RlbiBkYXRhc291cmNlIHVwZGF0ZVxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLmRhdGFTb3VyY2Uucm93c1N1YmplY3RcbiAgICAgICAgLy8gcmVzdG9yZSB0aGUgJ2FkZGluZycgc2VsZWN0aW9uIChmb3IgZXhhbXBsZSBhZnRlciBhIHBhZ2Ugb3Igc29ydCBjaGFuZ2UpXG4gICAgICAgIC5zdWJzY3JpYmUoKHJvd3MpID0+IHtcbiAgICAgICAgICB0aGlzLnBlcm1hbmVudFNlbGVjdGlvbkNoYW5nZWRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwZXJtYW5lbnRTZWxlY3Rpb25JZHMgPSAodGhpcy5wZXJtYW5lbnRTZWxlY3Rpb24uc2VsZWN0ZWQgfHwgW10pLm1hcChFbnRpdHlVdGlscy5nZXRJZCk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oLi4ucm93cy5maWx0ZXIoKHJvdykgPT4gcGVybWFuZW50U2VsZWN0aW9uSWRzLmluY2x1ZGVzKEFwcFRhYmxlVXRpbHMuZ2V0RW50aXR5SWQocm93KSkpKTtcbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMucGVybWFuZW50U2VsZWN0aW9uQ2hhbmdlZFByZXZlbnRlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gTGlzdGVuIHNlbGVjdGlvbiBjaGFuZ2VcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5zZWxlY3Rpb24uY2hhbmdlZC5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5wZXJtYW5lbnRTZWxlY3Rpb25DaGFuZ2VkUHJldmVudGVkKSkuc3Vic2NyaWJlKChzZWxlY3Rpb25DaGFuZ2UpID0+IHtcbiAgICAgICAgLy8gYWRkIHRvIHNlbGVjdGlvblxuICAgICAgICBpZiAoc2VsZWN0aW9uQ2hhbmdlLmFkZGVkLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMucGVybWFuZW50U2VsZWN0aW9uLnNldFNlbGVjdGlvbihcbiAgICAgICAgICAgIC4uLih0aGlzLnBlcm1hbmVudFNlbGVjdGlvbi5zZWxlY3RlZCB8fCBbXSlcbiAgICAgICAgICAgICAgLy8gQWRkIG5ldyBlbGVtZW50c1xuICAgICAgICAgICAgICAuY29uY2F0KC4uLkFwcFRhYmxlVXRpbHMuZ2V0RW50aXRpZXMoc2VsZWN0aW9uQ2hhbmdlLmFkZGVkKS5maWx0ZXIoRW50aXR5VXRpbHMuaGFzSWQpKVxuICAgICAgICAgICAgICAvLyBBdm9pZCBkdXBsaWNhdGVkIGVudGl0aWVzIChNYW50aXMgIzU1MzUxKVxuICAgICAgICAgICAgICAuZmlsdGVyKEVudGl0eVV0aWxzLmFycmF5RGlzdGluY3RGaWx0ZXJGbilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlbW92ZSBmcm9tIHNlbGVjdGlvblxuICAgICAgICBpZiAoc2VsZWN0aW9uQ2hhbmdlLnJlbW92ZWQubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgcmVtb3ZlZElkcyA9IEFwcFRhYmxlVXRpbHMuZ2V0RW50aXR5SWRzKHNlbGVjdGlvbkNoYW5nZS5yZW1vdmVkKTtcbiAgICAgICAgICB0aGlzLnBlcm1hbmVudFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oXG4gICAgICAgICAgICAuLi4odGhpcy5wZXJtYW5lbnRTZWxlY3Rpb24uc2VsZWN0ZWQgfHwgW10pLmZpbHRlcigoZW50aXR5KSA9PiBFbnRpdHlVdGlscy5oYXNJZChlbnRpdHkpICYmICFyZW1vdmVkSWRzLmluY2x1ZGVzKGVudGl0eS5pZCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyogLS0gcHJpdmF0ZSBtZXRob2QgLS0gKi9cblxuICBwcml2YXRlIGFzeW5jIGxpc3RlblNvcnRBbmRQYWdpbmF0aW9uRXZlbnRzKCkge1xuICAgIGlmICghdGhpcy50YWJsZSkge1xuICAgICAgLy8gREVCVUcgb25seSAtLSBhbGVydCB1c2VyIHRoYXQgdGFibGUgbm90IGZvdW5kIGluIHRlbXBsYXRlXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAhdGhpcy50YWJsZSAmJlxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbdGFibGVdIE1pc3NpbmcgPG1hdC10YWJsZT4gaW4gdGhlIEhUTUwgdGVtcGxhdGUgKGFmdGVyIHdhaXRpbmcgNTAwbXMpISBDb21wb25lbnQ6ICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfWApLFxuICAgICAgICAgIDUwMFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgdG8gd2FpdCB0aGUgdGFibGVcbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4gISF0aGlzLnRhYmxlLCB7IHN0b3A6IHRoaXMuZGVzdHJveVN1YmplY3QsIHN0b3BFcnJvcjogZmFsc2UgLyphdm9pZCBlcnJvciB3aGVuIGRlc3RvcnlpbmcgdGhlIHRhYmxlKi8gfSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIG1lcmdlKFxuICAgICAgICAvLyBMaXN0ZW4gc29ydCBldmVudHNcbiAgICAgICAgKHRoaXMuc29ydCAmJlxuICAgICAgICAgIHRoaXMuc29ydC5zb3J0Q2hhbmdlLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuc29ydC5kaXNhYmxlZCksXG4gICAgICAgICAgICBtZXJnZU1hcChhc3luYyAoKSA9PiB0aGlzLnNhdmVCZWZvcmVBY3Rpb24oJ3NvcnQnKSksXG4gICAgICAgICAgICBmaWx0ZXIoKHJlcykgPT4gcmVzID09PSB0cnVlKSxcbiAgICAgICAgICAgIC8vIFNhdmUgc29ydCBpbiBzZXR0aW5nc1xuICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBbdGhpcy5zb3J0LmFjdGl2ZSwgdGhpcy5zb3J0LmRpcmVjdGlvbiB8fCAnYXNjJ10uam9pbignOicpO1xuICAgICAgICAgICAgICB0aGlzLnNhdmVQYWdlU2V0dGluZ3ModmFsdWUsIFNFVFRJTkdTX1NPUlRFRF9DT0xVTU4pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApKSB8fFxuICAgICAgICAgIEVNUFRZLFxuXG4gICAgICAgIC8vIExpc3RlbiBwYWdpbmF0b3IgZXZlbnRzXG4gICAgICAgICh0aGlzLnBhZ2luYXRvciAmJlxuICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UucGlwZShcbiAgICAgICAgICAgIG1lcmdlTWFwKChfKSA9PiB0aGlzLnNhdmVCZWZvcmVBY3Rpb24oJ3NvcnQnKSksXG4gICAgICAgICAgICBmaWx0ZXIoKHNhdmVkKSA9PiBzYXZlZCA9PT0gdHJ1ZSksXG4gICAgICAgICAgICAvLyBTYXZlIHBhZ2Ugc2l6ZSBpbiBzZXR0aW5nc1xuICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMuc2F2ZVBhZ2VTZXR0aW5ncyh0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSwgU0VUVElOR1NfUEFHRV9TSVpFKSlcbiAgICAgICAgICApKSB8fFxuICAgICAgICAgIEVNUFRZXG4gICAgICApXG4gICAgICAgIC8vIFJlZnJlc2ggb24gYW55IHNvcnQgb3IgcGFnaW5hdG9yIGV2ZW50c1xuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMub25Tb3J0LmVtaXQodmFsdWUpO1xuICAgICAgICAgIHRoaXMuZW1pdFJlZnJlc2godmFsdWUpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBJZiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBzb3J0IG9yZGVyLCByZXNldCBiYWNrIHRvIHRoZSBmaXJzdCBwYWdlLlxuICAgIGlmICh0aGlzLnNvcnQgJiYgdGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24odGhpcy5zb3J0LnNvcnRDaGFuZ2UucGlwZShmaWx0ZXIoKCkgPT4gIXRoaXMuc29ydC5kaXNhYmxlZCkpLnN1YnNjcmliZSgoKSA9PiAodGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gMCkpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVkaXRSb3dCeUlkKGV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZCwgaWQ6IG51bWJlciwgb3B0cz86IHsgZm9jdXNDb2x1bW4/OiBzdHJpbmcgfSkge1xuICAgIGlmIChpZCA8IDApIHJldHVybjtcbiAgICBpZiAoaWQgPj0gdGhpcy52aXNpYmxlUm93Q291bnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRkUm93KGV2ZW50LCB1bmRlZmluZWQsIHsgLi4ub3B0cywgZWRpdGluZzogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhU291cmNlLmdldFJvdyhpZCk7XG4gICAgICBhd2FpdCB0aGlzLmVkaXRSb3coZXZlbnQsIHJvdywgb3B0cyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRMb2FkaW5nKHZhbHVlOiBib29sZWFuLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh2YWx1ZSk7XG5cbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZU5ld1JvdyhldmVudDogRXZlbnQgfCB1bmRlZmluZWQsIHJvdzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICAvLyBNYWtlIHN1cmUgcm93IHdpbGwgYmUgY2FuY2VsbGVkLCBhbmQgTk9UIGRlbGV0ZWRcbiAgICBpZiAocm93LmlkICE9PSAtMSkgdGhyb3cgbmV3IEVycm9yKCdSb3cgbXVzdCBoYXZlIGlkID0gLTEnKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuY2FuY2VsT3JEZWxldGUocm93KTtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcblxuICAgIHRoaXMub25DYW5jZWxPckRlbGV0ZVJvdy5uZXh0KHJvdyk7XG4gICAgdGhpcy50b3RhbFJvd0NvdW50LS07XG4gICAgdGhpcy52aXNpYmxlUm93Q291bnQtLTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlRXhpc3RpbmdSb3coZXZlbnQ6IEV2ZW50IHwgbnVsbCwgcm93OiBBc3luY1RhYmxlRWxlbWVudDxUPiwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuIH0pIHtcbiAgICAvLyBNYWtlIHN1cmUgcm93IHdpbGwgYmUgY2FuY2VsbGVkLCBhbmQgTk9UIGRlbGV0ZWRcbiAgICBpZiAocm93LmlkID09PSAtMSkgdGhyb3cgbmV3IEVycm9yKCdSb3cgbXVzdCBoYXZlIGFuIGlkJyk7XG5cbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybiAwOyAvLyBTS2lwXG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBhd2FpdCB0aGlzLmRlbGV0ZVJvdyhudWxsLCByb3csIG9wdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYW5jZWxFeGlzdGluZ1JvdyhldmVudDogRXZlbnQgfCB1bmRlZmluZWQsIHJvdzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7IGludGVyYWN0aXZlPzogYm9vbGVhbjsga2VlcEVkaXRpbmc/OiBib29sZWFuIH0pIHtcbiAgICAvLyBNYWtlIHN1cmUgcm93IHdpbGwgYmUgY2FuY2VsbGVkLCBhbmQgTk9UIGRlbGV0ZWRcbiAgICBpZiAocm93LmlkID09PSAtMSB8fCAhcm93LmVkaXRpbmcpIHRocm93IG5ldyBFcnJvcignUm93IGNhbm5vdCBiZSBjYW5jZWxpbmcsIGJ1dCBvbmx5IGRlbGV0aW5nJyk7XG5cbiAgICBjb25zdCBjb25maXJtZWQgPSAhb3B0cyB8fCBvcHRzLmludGVyYWN0aXZlICE9PSBmYWxzZTtcblxuICAgIC8vIEFzayB1c2VyIGNvbmZpcm1hdGlvbiwgaWYgY2FuY2VsXG4gICAgaWYgKCFjb25maXJtZWQgJiYgcm93LmRpcnR5ICYmICh0aGlzLmNvbmZpcm1CZWZvcmVDYW5jZWwgfHwgdGhpcy5vbkJlZm9yZUNhbmNlbFJvd3Mub2JzZXJ2ZWQpKSB7XG4gICAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmNhbkNhbmNlbFJvd3MoW3Jvd10sIG9wdHMpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qga2VlcEVkaXRpbmcgPSByb3cuZWRpdGluZyAmJiAoIW9wdHMgfHwgb3B0cy5rZWVwRWRpdGluZyAhPT0gZmFsc2UpO1xuICAgIGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuY2FuY2VsT3JEZWxldGUocm93KTtcbiAgICB0aGlzLm9uQ2FuY2VsT3JEZWxldGVSb3cubmV4dChyb3cpO1xuXG4gICAgLy8gTWFyayByb3cgYXMgcHJpc3RpbmVcbiAgICBhd2FpdCB0aGlzLmNoZWNrSWZSb3dQcmlzdGluZShyb3cpO1xuXG4gICAgLy8gUmVzdG9yZSBlZGl0aW5nIHN0YXRlXG4gICAgaWYgKGtlZXBFZGl0aW5nKSB7XG4gICAgICBhd2FpdCB0aGlzLmVkaXRSb3codW5kZWZpbmVkLCByb3cpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tJZlJvd1ByaXN0aW5lKHJvdzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW47IG9ubHlTZWxmPzogYm9vbGVhbiB9KSB7XG4gICAgLy8gTWFyayByb3cgYXMgcHJpc3RpbmVcbiAgICBjb25zdCBtYXJrUm93QXNQcmlzdGluZSA9IHRoaXMuZGF0YVNvdXJjZT8uY29uZmlnLnJlc3RvcmVPcmlnaW5hbERhdGFPbkNhbmNlbCA9PT0gdHJ1ZTtcbiAgICBpZiAobWFya1Jvd0FzUHJpc3RpbmUpIHtcbiAgICAgIHJvdy52YWxpZGF0b3I/Lm1hcmtBc1ByaXN0aW5lKCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRhYmxlIGlzIG5vdyBwcmlzdGluZVxuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMub25seVNlbGYgIT09IHRydWUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmUHJpc3RpbmUob3B0cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0lmUHJpc3RpbmUob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCF0aGlzLmRpcnR5KSByZXR1cm47IC8vIEFscmVhZHkgcHJpc3RpbmVcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLl9kYXRhU291cmNlLmdldFJvd3MoKTtcbiAgICBjb25zdCBwcmlzdGluZSA9IChyb3dzIHx8IFtdKS5maW5kSW5kZXgoKHJvdykgPT4gcm93LmRpcnR5KSA9PT0gLTE7XG4gICAgaWYgKHByaXN0aW5lKSB0aGlzLm1hcmtBc1ByaXN0aW5lKG9wdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZpbHRlcihmaWx0ZXI6IEYsIG9wdHM6IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZV0gQXBwbHlpbmcgZmlsdGVyJywgZmlsdGVyKTtcbiAgICB0aGlzLl9maWx0ZXIgPSBmaWx0ZXI7XG4gICAgaWYgKG9wdHMgJiYgb3B0cy5lbWl0RXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLnBhZ2luYXRvciAmJiB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPiAwKSB7XG4gICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXRSZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5EYXRhc291cmNlTG9hZGluZyhkYXRhU291cmNlOiBFbnRpdGllc0FzeW5jVGFibGVEYXRhU291cmNlPFQsIEYsIElEPikge1xuICAgIGlmICghZGF0YVNvdXJjZSkgdGhyb3cgbmV3IEVycm9yKCdbdGFibGVdIGRhdGFTb3VyY2Ugbm90IHNldCAhJyk7XG5cbiAgICAvLyBDbGVhbmluZyBwcmV2aW91cyBzdWJzY3JpcHRpb24gb24gZGF0YXNvdXJjZVxuICAgIGlmIChpc05vdE5pbCh0aGlzLl9kYXRhU291cmNlTG9hZGluZ1N1YnNjcmlwdGlvbikpIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbdGFibGVdIE1hbnkgY2FsbCB0byBsaXN0ZW5EYXRhc291cmNlKCk6IENsZWFuaW5nIHByZXZpb3VzIHN1YnNjcmlwdGlvbnMuLi4nKTtcbiAgICAgIHRoaXMuX2RhdGFTb3VyY2VMb2FkaW5nU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJTdWJzY3JpcHRpb24odGhpcy5fZGF0YVNvdXJjZUxvYWRpbmdTdWJzY3JpcHRpb24pO1xuICAgIH1cblxuICAgIC8vIFByb3BhZ2UgbG9hZGluZyB0byB0YWJsZVxuICAgIHRoaXMuX2RhdGFTb3VyY2VMb2FkaW5nU3Vic2NyaXB0aW9uID0gdGhpcy5fZGF0YVNvdXJjZS5sb2FkaW5nU3ViamVjdFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG5cbiAgICAgICAgLy8gSWYgY2hhbmdlZCB0byBUcnVlOiBwcm9wYWdhdGUgYXMgc29vbiBhcyBwb3NzaWJsZVxuICAgICAgICB0YXAoKGxvYWRpbmcpID0+IGxvYWRpbmcgJiYgdGhpcy5zZXRMb2FkaW5nKHRydWUpKSxcblxuICAgICAgICAvLyBJZiBjaGFuZ2VkIHRvIEZhbHNlOiB3YWl0IDI1MG1zIGJlZm9yZSBwcm9wYWdhdGUgKHRvIG1ha2Ugc3VyZSB0aGUgc3Bpbm5lciBoYXMgYmVlbiBkaXNwbGF5ZWQpXG4gICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICB0YXAoKGxvYWRpbmcpID0+ICFsb2FkaW5nICYmIHRoaXMuc2V0TG9hZGluZyhmYWxzZSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLl9kYXRhU291cmNlTG9hZGluZ1N1YnNjcmlwdGlvbik7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0Q2VsbFZhbHVlQ2hhbmdlcyhuYW1lOiBzdHJpbmcsIHJvdzogQXN5bmNUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICBjb25zdCBkZWYgPSB0aGlzLl9jZWxsVmFsdWVDaGFuZ2VzRGVmc1tuYW1lXTtcbiAgICBpZiAoIWRlZikge1xuICAgICAgY29uc29sZS53YXJuKCdbdGFibGVdIExpc3RlbmVyIHdpdGggbmFtZSB7JyArIG5hbWUgKyAnfSBub3QgcmVnaXN0ZXJlZCEgUGxlYXNlIGNhbGwgcmVnaXN0ZXJDZWxsVmFsdWVDaGFuZ2VzKCkgYmVmb3JlOycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTdG9wIHByZXZpb3VzIHN1YnNjcmlwdGlvblxuICAgIGlmIChkZWYuc3Vic2NyaXB0aW9uKSB7XG4gICAgICBkZWYuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICBkZWYuc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZV0gU3RhcnQgdmFsdWVzIGNoYW5nZXMgb24gcm93IHBhdGggeyR7ZGVmLmZvcm1QYXRofX1gKTtcbiAgICB9XG5cbiAgICAvLyBMaXN0ZW4gdmFsdWUgY2hhbmdlcywgYW5kIHJlZGlyZWN0IHRvIGV2ZW50IGVtaXR0ZXJcbiAgICBjb25zdCBjb250cm9sID0gcm93LnZhbGlkYXRvciAmJiBBcHBGb3JtVXRpbHMuZ2V0Q29udHJvbEZyb21QYXRoKHJvdy52YWxpZGF0b3IsIGRlZi5mb3JtUGF0aCk7XG4gICAgaWYgKCFjb250cm9sKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFt0YWJsZV0gQ291bGQgbm90IGxpc3RlbiBjZWxsIGNoYW5nZXM6IG5vIHZhbGlkYXRvciBvciBpbnZhbGlkIGZvcm0gcGF0aCB7JHtkZWYuZm9ybVBhdGh9fWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWYuc3Vic2NyaXB0aW9uID0gY29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gZG9uJ3QgZW1pdCBpZiBjb250cm9sIGlzIGRpc2FibGVkXG4gICAgICAgICAgZmlsdGVyKCgpID0+IGNvbnRyb2wuZW5hYmxlZClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gZGVmLnN1YmplY3QubmV4dCh2YWx1ZSkpO1xuXG4gICAgICAvLyBFbWl0IHRoZSBhY3R1YWwgdmFsdWVcbiAgICAgIGlmIChkZWYuZW1pdEluaXRpYWxWYWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgZGVmLnN1YmplY3QubmV4dChjb250cm9sLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0b3BDZWxsVmFsdWVDaGFuZ2VzKG5hbWU6IHN0cmluZywgZGVzdHJveT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBkZWYgPSB0aGlzLl9jZWxsVmFsdWVDaGFuZ2VzRGVmc1tuYW1lXTtcbiAgICBpZiAoIWRlZikgcmV0dXJuO1xuICAgIGlmIChkZWYuc3Vic2NyaXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3RhYmxlXSBTdG9wIHZhbHVlIGNoYW5nZXMgb24gcm93IHBhdGggeycgKyBkZWYuZm9ybVBhdGggKyAnfScpO1xuICAgICAgZGVmLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgZGVmLnN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChkZXN0cm95ICYmIGRlZi5zdWJqZWN0KSB7XG4gICAgICBkZWYuc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgZGVmLnN1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==