@sumaris-net/ngx-components 18.23.62 → 21.0.0-rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (799) hide show
  1. package/README.md +2 -0
  2. package/doc/build.md +3 -5
  3. package/fesm2022/sumaris-net.ngx-components.mjs +2383 -2150
  4. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  5. package/package.json +15 -15
  6. package/src/assets/environments/environment-test.json +2 -2
  7. package/src/assets/i18n/en-US.json +4 -1
  8. package/src/assets/i18n/en.json +4 -1
  9. package/src/assets/i18n/fr.json +10 -6
  10. package/src/assets/manifest.json +1 -1
  11. package/src/theme/_icons.scss +8 -12
  12. package/src/theme/_ionic.globals.scss +8 -1
  13. package/src/theme/_material.globals.scss +4 -1
  14. package/src/theme/_material.scss +16 -13
  15. package/src/theme/_mixins.scss +7 -1
  16. package/src/theme/_ngx-components.forms.scss +87 -84
  17. package/src/theme/_ngx-components.globals.scss +2 -0
  18. package/src/theme/_ngx-components.scss +19 -4
  19. package/src/theme/_ngx-components.table.scss +31 -26
  20. package/src/theme/_ngx-components.tabs.scss +16 -14
  21. package/src/theme/_responsive.scss +2 -0
  22. package/src/theme/_roboto.scss +3 -0
  23. package/src/theme/_theme.scss +11 -14
  24. package/src/theme/_theme.variables.scss +6 -1
  25. package/src/theme/ionic/ionic.functions.color.scss +13 -5
  26. package/src/theme/ionic/ionic.globals.scss +4 -4
  27. package/src/theme/ionic/ionic.theme.default.scss +2 -0
  28. package/types/sumaris-net.ngx-components.d.ts +14132 -0
  29. package/esm2022/public_api.mjs +0 -403
  30. package/esm2022/src/app/admin/admin-routing.module.mjs +0 -34
  31. package/esm2022/src/app/admin/admin.module.mjs +0 -32
  32. package/esm2022/src/app/admin/users/person.filter.mjs +0 -157
  33. package/esm2022/src/app/admin/users/person.service.mjs +0 -226
  34. package/esm2022/src/app/admin/users/person.validator.mjs +0 -78
  35. package/esm2022/src/app/admin/users/users-select.modal.mjs +0 -167
  36. package/esm2022/src/app/admin/users/users.mjs +0 -502
  37. package/esm2022/src/app/admin/users/users.module.mjs +0 -59
  38. package/esm2022/src/app/admin/users/users.utils.mjs +0 -29
  39. package/esm2022/src/app/core/about/about.modal.mjs +0 -119
  40. package/esm2022/src/app/core/about/about.module.mjs +0 -22
  41. package/esm2022/src/app/core/account/account.module.mjs +0 -75
  42. package/esm2022/src/app/core/account/account.page.mjs +0 -426
  43. package/esm2022/src/app/core/account/new-token.form.mjs +0 -109
  44. package/esm2022/src/app/core/account/new-token.modal.mjs +0 -66
  45. package/esm2022/src/app/core/account/password/change-password.form.mjs +0 -63
  46. package/esm2022/src/app/core/account/password/change-password.module.mjs +0 -22
  47. package/esm2022/src/app/core/account/password/change-password.page.mjs +0 -150
  48. package/esm2022/src/app/core/account/token.table.mjs +0 -160
  49. package/esm2022/src/app/core/auth/auth.form.mjs +0 -159
  50. package/esm2022/src/app/core/auth/auth.modal.mjs +0 -76
  51. package/esm2022/src/app/core/auth/auth.module.mjs +0 -56
  52. package/esm2022/src/app/core/auth/reset-password.modal.mjs +0 -89
  53. package/esm2022/src/app/core/core.module.mjs +0 -157
  54. package/esm2022/src/app/core/core.testing.module.mjs +0 -128
  55. package/esm2022/src/app/core/form/array/form-array.mjs +0 -328
  56. package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +0 -23
  57. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +0 -97
  58. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -111
  59. package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +0 -31
  60. package/esm2022/src/app/core/form/entity/editor.class.mjs +0 -268
  61. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -420
  62. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +0 -748
  63. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
  64. package/esm2022/src/app/core/form/entity/entity.module.mjs +0 -33
  65. package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +0 -190
  66. package/esm2022/src/app/core/form/form-container.class.mjs +0 -347
  67. package/esm2022/src/app/core/form/form.class.mjs +0 -342
  68. package/esm2022/src/app/core/form/form.module.mjs +0 -77
  69. package/esm2022/src/app/core/form/form.utils.mjs +0 -238
  70. package/esm2022/src/app/core/form/list/list.form.mjs +0 -243
  71. package/esm2022/src/app/core/form/list/list.module.mjs +0 -31
  72. package/esm2022/src/app/core/form/properties/properties-file.service.mjs +0 -133
  73. package/esm2022/src/app/core/form/properties/properties.form.mjs +0 -397
  74. package/esm2022/src/app/core/form/properties/properties.module.mjs +0 -85
  75. package/esm2022/src/app/core/form/properties/properties.table.mjs +0 -267
  76. package/esm2022/src/app/core/form/properties/properties.utils.mjs +0 -304
  77. package/esm2022/src/app/core/form/properties/property.validator.mjs +0 -70
  78. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +0 -103
  79. package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +0 -23
  80. package/esm2022/src/app/core/form/text/testing/text-form.testing.mjs +0 -42
  81. package/esm2022/src/app/core/form/text/testing/text-form.testing.module.mjs +0 -25
  82. package/esm2022/src/app/core/form/text/text-form.component.mjs +0 -205
  83. package/esm2022/src/app/core/form/text/text-form.module.mjs +0 -31
  84. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -73
  85. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +0 -22
  86. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +0 -164
  87. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +0 -32
  88. package/esm2022/src/app/core/form/username/username.form.mjs +0 -55
  89. package/esm2022/src/app/core/form/username/username.module.mjs +0 -20
  90. package/esm2022/src/app/core/graphql/graphql.module.mjs +0 -14
  91. package/esm2022/src/app/core/graphql/graphql.service.mjs +0 -781
  92. package/esm2022/src/app/core/graphql/graphql.utils.mjs +0 -119
  93. package/esm2022/src/app/core/home/home.mjs +0 -472
  94. package/esm2022/src/app/core/home/home.module.mjs +0 -54
  95. package/esm2022/src/app/core/icon/icon.component.mjs +0 -40
  96. package/esm2022/src/app/core/icon/icon.module.mjs +0 -20
  97. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +0 -394
  98. package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +0 -31
  99. package/esm2022/src/app/core/menu/menu.component.mjs +0 -273
  100. package/esm2022/src/app/core/menu/menu.model.mjs +0 -327
  101. package/esm2022/src/app/core/menu/menu.module.mjs +0 -47
  102. package/esm2022/src/app/core/menu/menu.service.mjs +0 -666
  103. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +0 -113
  104. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +0 -51
  105. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +0 -165
  106. package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +0 -60
  107. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +0 -28
  108. package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +0 -31
  109. package/esm2022/src/app/core/peer/select-peer.modal.mjs +0 -350
  110. package/esm2022/src/app/core/peer/select-peer.module.mjs +0 -36
  111. package/esm2022/src/app/core/register/register-confirm.page.mjs +0 -90
  112. package/esm2022/src/app/core/register/register.form.mjs +0 -197
  113. package/esm2022/src/app/core/register/register.modal.mjs +0 -55
  114. package/esm2022/src/app/core/register/register.module.mjs +0 -23
  115. package/esm2022/src/app/core/services/account.service.mjs +0 -1403
  116. package/esm2022/src/app/core/services/auth-guard.service.mjs +0 -74
  117. package/esm2022/src/app/core/services/base-entity-service.class.mjs +0 -499
  118. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +0 -224
  119. package/esm2022/src/app/core/services/base58.mjs +0 -83
  120. package/esm2022/src/app/core/services/config/core.config.mjs +0 -293
  121. package/esm2022/src/app/core/services/config.service.mjs +0 -384
  122. package/esm2022/src/app/core/services/crypto.service.mjs +0 -107
  123. package/esm2022/src/app/core/services/errors.mjs +0 -54
  124. package/esm2022/src/app/core/services/local-settings.service.mjs +0 -540
  125. package/esm2022/src/app/core/services/model/account.model.mjs +0 -192
  126. package/esm2022/src/app/core/services/model/config.model.mjs +0 -111
  127. package/esm2022/src/app/core/services/model/department.model.mjs +0 -35
  128. package/esm2022/src/app/core/services/model/entity.decorators.mjs +0 -97
  129. package/esm2022/src/app/core/services/model/entity.model.mjs +0 -347
  130. package/esm2022/src/app/core/services/model/filter.model.mjs +0 -169
  131. package/esm2022/src/app/core/services/model/history.model.mjs +0 -2
  132. package/esm2022/src/app/core/services/model/model.enum.mjs +0 -11
  133. package/esm2022/src/app/core/services/model/node-feature.model.mjs +0 -31
  134. package/esm2022/src/app/core/services/model/peer.model.mjs +0 -114
  135. package/esm2022/src/app/core/services/model/person.model.mjs +0 -118
  136. package/esm2022/src/app/core/services/model/referential.model.mjs +0 -207
  137. package/esm2022/src/app/core/services/model/settings.model.mjs +0 -6
  138. package/esm2022/src/app/core/services/model/token.model.mjs +0 -57
  139. package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +0 -234
  140. package/esm2022/src/app/core/services/network.service.mjs +0 -759
  141. package/esm2022/src/app/core/services/network.types.mjs +0 -2
  142. package/esm2022/src/app/core/services/network.utils.mjs +0 -35
  143. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +0 -38
  144. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +0 -23
  145. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +0 -23
  146. package/esm2022/src/app/core/services/pipes/pipes.module.mjs +0 -58
  147. package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +0 -36
  148. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +0 -37
  149. package/esm2022/src/app/core/services/platform.service.mjs +0 -780
  150. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +0 -427
  151. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +0 -450
  152. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +0 -25
  153. package/esm2022/src/app/core/services/testing/referential.validator.mjs +0 -46
  154. package/esm2022/src/app/core/services/validator/account.validator.mjs +0 -46
  155. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +0 -49
  156. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +0 -57
  157. package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +0 -27
  158. package/esm2022/src/app/core/services/validator/user-token.validator.mjs +0 -55
  159. package/esm2022/src/app/core/settings/settings.module.mjs +0 -23
  160. package/esm2022/src/app/core/settings/settings.page.mjs +0 -406
  161. package/esm2022/src/app/core/table/async-table.class.mjs +0 -1882
  162. package/esm2022/src/app/core/table/column/actions-column.component.mjs +0 -137
  163. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +0 -120
  164. package/esm2022/src/app/core/table/column/row-field.component.mjs +0 -116
  165. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +0 -415
  166. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +0 -407
  167. package/esm2022/src/app/core/table/memory-table.class.mjs +0 -57
  168. package/esm2022/src/app/core/table/table-select-columns.component.mjs +0 -46
  169. package/esm2022/src/app/core/table/table.class.mjs +0 -1918
  170. package/esm2022/src/app/core/table/table.model.mjs +0 -21
  171. package/esm2022/src/app/core/table/table.module.mjs +0 -51
  172. package/esm2022/src/app/core/table/table.pipes.mjs +0 -76
  173. package/esm2022/src/app/core/table/table.utils.mjs +0 -34
  174. package/esm2022/src/app/core/table/testing/nested-table.testing.mjs +0 -326
  175. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +0 -32
  176. package/esm2022/src/app/core/table/testing/table.testing.mjs +0 -342
  177. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +0 -47
  178. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +0 -25
  179. package/esm2022/src/app/core/table/testing/table2.testing.mjs +0 -322
  180. package/esm2022/src/app/shared/alerts.mjs +0 -243
  181. package/esm2022/src/app/shared/audio/audio.mjs +0 -255
  182. package/esm2022/src/app/shared/audio/audio.testing.mjs +0 -32
  183. package/esm2022/src/app/shared/audio/audio.testing.module.mjs +0 -30
  184. package/esm2022/src/app/shared/base64.utils.mjs +0 -59
  185. package/esm2022/src/app/shared/capacitor/keyboard.mjs +0 -42
  186. package/esm2022/src/app/shared/capacitor/plugins.mjs +0 -10
  187. package/esm2022/src/app/shared/constants.mjs +0 -18
  188. package/esm2022/src/app/shared/dates.mjs +0 -212
  189. package/esm2022/src/app/shared/debug/debug-service.class.mjs +0 -3
  190. package/esm2022/src/app/shared/debug/debug.component.mjs +0 -44
  191. package/esm2022/src/app/shared/debug/debug.module.mjs +0 -23
  192. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +0 -91
  193. package/esm2022/src/app/shared/directives/autoresize.directive.mjs +0 -75
  194. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +0 -30
  195. package/esm2022/src/app/shared/directives/autotooltip.directive.mjs +0 -35
  196. package/esm2022/src/app/shared/directives/cell-selection/cell-identifier.directive.mjs +0 -55
  197. package/esm2022/src/app/shared/directives/cell-selection/cell-selection.directive.mjs +0 -206
  198. package/esm2022/src/app/shared/directives/cell-selection/cell-selection.service.mjs +0 -204
  199. package/esm2022/src/app/shared/directives/directives.module.mjs +0 -53
  200. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +0 -52
  201. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +0 -33
  202. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +0 -62
  203. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +0 -96
  204. package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +0 -17
  205. package/esm2022/src/app/shared/directives/throttled-click.directive.mjs +0 -43
  206. package/esm2022/src/app/shared/events.mjs +0 -64
  207. package/esm2022/src/app/shared/file/csv.utils.mjs +0 -97
  208. package/esm2022/src/app/shared/file/file.service.mjs +0 -118
  209. package/esm2022/src/app/shared/file/file.utils.mjs +0 -117
  210. package/esm2022/src/app/shared/file/images.utils.mjs +0 -186
  211. package/esm2022/src/app/shared/file/json.utils.mjs +0 -58
  212. package/esm2022/src/app/shared/file/uri.utils.mjs +0 -29
  213. package/esm2022/src/app/shared/file/url.utils.mjs +0 -213
  214. package/esm2022/src/app/shared/focusable.mjs +0 -6
  215. package/esm2022/src/app/shared/form/field.component.mjs +0 -388
  216. package/esm2022/src/app/shared/form/field.model.mjs +0 -100
  217. package/esm2022/src/app/shared/form/loading-spinner.mjs +0 -35
  218. package/esm2022/src/app/shared/forms.mjs +0 -593
  219. package/esm2022/src/app/shared/functions.mjs +0 -825
  220. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +0 -94
  221. package/esm2022/src/app/shared/gesture/gesture-config.mjs +0 -46
  222. package/esm2022/src/app/shared/gesture/hammer.utils.mjs +0 -2
  223. package/esm2022/src/app/shared/graph/colors.utils.mjs +0 -85
  224. package/esm2022/src/app/shared/graph/graph-colors.mjs +0 -214
  225. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +0 -68
  226. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  227. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +0 -147
  228. package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +0 -24
  229. package/esm2022/src/app/shared/html.utils.mjs +0 -35
  230. package/esm2022/src/app/shared/http/http.utils.mjs +0 -56
  231. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +0 -452
  232. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +0 -62
  233. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -26
  234. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -92
  235. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -37
  236. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +0 -59
  237. package/esm2022/src/app/shared/image/image.model.mjs +0 -2
  238. package/esm2022/src/app/shared/image/image.module.mjs +0 -24
  239. package/esm2022/src/app/shared/image/image.service.mjs +0 -117
  240. package/esm2022/src/app/shared/inputs.mjs +0 -281
  241. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  242. package/esm2022/src/app/shared/logging/log-level.model.mjs +0 -48
  243. package/esm2022/src/app/shared/logging/logger.model.mjs +0 -47
  244. package/esm2022/src/app/shared/logging/logging-service.class.mjs +0 -125
  245. package/esm2022/src/app/shared/logging/logging-service.config.mjs +0 -2
  246. package/esm2022/src/app/shared/logging/logging-service.module.mjs +0 -30
  247. package/esm2022/src/app/shared/markdown/markdown.component.mjs +0 -321
  248. package/esm2022/src/app/shared/markdown/markdown.directive.mjs +0 -34
  249. package/esm2022/src/app/shared/markdown/markdown.modal.mjs +0 -99
  250. package/esm2022/src/app/shared/markdown/markdown.module.mjs +0 -87
  251. package/esm2022/src/app/shared/markdown/markdown.service.mjs +0 -204
  252. package/esm2022/src/app/shared/markdown/markdown.utils.mjs +0 -87
  253. package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +0 -55
  254. package/esm2022/src/app/shared/markdown/testing/markdown.testing.module.mjs +0 -30
  255. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -46
  256. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -1356
  257. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -81
  258. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -18
  259. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -242
  260. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +0 -251
  261. package/esm2022/src/app/shared/material/badge/badge.module.mjs +0 -20
  262. package/esm2022/src/app/shared/material/badge/badge.test.mjs +0 -42
  263. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +0 -70
  264. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +0 -374
  265. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +0 -83
  266. package/esm2022/src/app/shared/material/chips/chips.module.mjs +0 -74
  267. package/esm2022/src/app/shared/material/chips/material.chips.mjs +0 -843
  268. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +0 -151
  269. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +0 -79
  270. package/esm2022/src/app/shared/material/datetime/material.date.mjs +0 -473
  271. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +0 -457
  272. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +0 -850
  273. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -140
  274. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -127
  275. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -118
  276. package/esm2022/src/app/shared/material/duration/duration.module.mjs +0 -61
  277. package/esm2022/src/app/shared/material/duration/duration.utils.mjs +0 -16
  278. package/esm2022/src/app/shared/material/duration/material.duration.mjs +0 -283
  279. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +0 -85
  280. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +0 -319
  281. package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +0 -471
  282. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +0 -231
  283. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +0 -68
  284. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -138
  285. package/esm2022/src/app/shared/material/material.animations.mjs +0 -200
  286. package/esm2022/src/app/shared/material/material.config.mjs +0 -3
  287. package/esm2022/src/app/shared/material/material.module.mjs +0 -224
  288. package/esm2022/src/app/shared/material/material.testing.module.mjs +0 -234
  289. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -51
  290. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -23
  291. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +0 -379
  292. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +0 -52
  293. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -67
  294. package/esm2022/src/app/shared/material/test/test-component.mjs +0 -264
  295. package/esm2022/src/app/shared/material/testing/common.test.mjs +0 -111
  296. package/esm2022/src/app/shared/modules.mjs +0 -12
  297. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -306
  298. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +0 -49
  299. package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +0 -24
  300. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +0 -69
  301. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +0 -74
  302. package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +0 -28
  303. package/esm2022/src/app/shared/observables.mjs +0 -104
  304. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +0 -251
  305. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +0 -25
  306. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +0 -29
  307. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -50
  308. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +0 -72
  309. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +0 -28
  310. package/esm2022/src/app/shared/pipes/date-from.pipe.mjs +0 -29
  311. package/esm2022/src/app/shared/pipes/dates.pipe.mjs +0 -18
  312. package/esm2022/src/app/shared/pipes/display-with.pipe.mjs +0 -23
  313. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +0 -34
  314. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +0 -53
  315. package/esm2022/src/app/shared/pipes/form.pipes.mjs +0 -219
  316. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +0 -50
  317. package/esm2022/src/app/shared/pipes/html.pipes.mjs +0 -102
  318. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +0 -42
  319. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +0 -65
  320. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +0 -67
  321. package/esm2022/src/app/shared/pipes/math.pipes.mjs +0 -77
  322. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +0 -19
  323. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +0 -17
  324. package/esm2022/src/app/shared/pipes/observable.pipes.mjs +0 -63
  325. package/esm2022/src/app/shared/pipes/pipes.module.mjs +0 -304
  326. package/esm2022/src/app/shared/pipes/property.pipes.mjs +0 -148
  327. package/esm2022/src/app/shared/pipes/selection.pipes.mjs +0 -177
  328. package/esm2022/src/app/shared/pipes/string.pipes.mjs +0 -183
  329. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +0 -44
  330. package/esm2022/src/app/shared/pipes/types.pipes.mjs +0 -74
  331. package/esm2022/src/app/shared/pipes/url.pipes.mjs +0 -35
  332. package/esm2022/src/app/shared/platforms.mjs +0 -81
  333. package/esm2022/src/app/shared/print/print.service.mjs +0 -305
  334. package/esm2022/src/app/shared/regexps.mjs +0 -103
  335. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +0 -193
  336. package/esm2022/src/app/shared/rx-state/rx-state.module.mjs +0 -19
  337. package/esm2022/src/app/shared/rx-state/rx-state.types.mjs +0 -2
  338. package/esm2022/src/app/shared/services/entity-service.class.mjs +0 -44
  339. package/esm2022/src/app/shared/services/job.utils.mjs +0 -92
  340. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +0 -362
  341. package/esm2022/src/app/shared/services/progress-bar.service.mjs +0 -31
  342. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +0 -144
  343. package/esm2022/src/app/shared/services/startable-service.class.mjs +0 -118
  344. package/esm2022/src/app/shared/services/translate-context.service.mjs +0 -107
  345. package/esm2022/src/app/shared/services/validator-service.class.mjs +0 -2
  346. package/esm2022/src/app/shared/services.mjs +0 -85
  347. package/esm2022/src/app/shared/shared-routing.module.mjs +0 -72
  348. package/esm2022/src/app/shared/shared.module.mjs +0 -229
  349. package/esm2022/src/app/shared/shared.testing.module.mjs +0 -108
  350. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +0 -281
  351. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +0 -42
  352. package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +0 -27
  353. package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +0 -25
  354. package/esm2022/src/app/shared/storage/storage.service.mjs +0 -134
  355. package/esm2022/src/app/shared/storage/storage.utils.mjs +0 -13
  356. package/esm2022/src/app/shared/testing/maskito.test.mjs +0 -41
  357. package/esm2022/src/app/shared/testing/observable.test.mjs +0 -94
  358. package/esm2022/src/app/shared/testing/tests.page.mjs +0 -37
  359. package/esm2022/src/app/shared/toast/toast.testing.mjs +0 -54
  360. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +0 -31
  361. package/esm2022/src/app/shared/toast/toasts.mjs +0 -134
  362. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +0 -62
  363. package/esm2022/src/app/shared/toolbar/toolbar.mjs +0 -272
  364. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +0 -26
  365. package/esm2022/src/app/shared/types.mjs +0 -2
  366. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -59
  367. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +0 -30
  368. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -108
  369. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +0 -216
  370. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +0 -26
  371. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +0 -122
  372. package/esm2022/src/app/shared/validator/validators.mjs +0 -658
  373. package/esm2022/src/app/shared/version/versions.mjs +0 -81
  374. package/esm2022/src/app/social/config/social.config.mjs +0 -9
  375. package/esm2022/src/app/social/feed/feed.component.mjs +0 -317
  376. package/esm2022/src/app/social/feed/feed.directive.mjs +0 -151
  377. package/esm2022/src/app/social/feed/feed.model.mjs +0 -60
  378. package/esm2022/src/app/social/feed/feed.module.mjs +0 -24
  379. package/esm2022/src/app/social/feed/feed.page.mjs +0 -67
  380. package/esm2022/src/app/social/feed/feed.service.mjs +0 -222
  381. package/esm2022/src/app/social/feed/testing/feed.testing.mjs +0 -66
  382. package/esm2022/src/app/social/feed/testing/feed.testing.module.mjs +0 -23
  383. package/esm2022/src/app/social/job/job.module.mjs +0 -23
  384. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +0 -38
  385. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +0 -241
  386. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +0 -50
  387. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +0 -29
  388. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +0 -91
  389. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +0 -38
  390. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +0 -34
  391. package/esm2022/src/app/social/job/testing/job.testing.module.mjs +0 -22
  392. package/esm2022/src/app/social/message/message.form.mjs +0 -149
  393. package/esm2022/src/app/social/message/message.modal.mjs +0 -116
  394. package/esm2022/src/app/social/message/message.model.mjs +0 -86
  395. package/esm2022/src/app/social/message/message.module.mjs +0 -25
  396. package/esm2022/src/app/social/message/message.service.mjs +0 -198
  397. package/esm2022/src/app/social/social.errors.mjs +0 -11
  398. package/esm2022/src/app/social/social.module.mjs +0 -22
  399. package/esm2022/src/app/social/social.testing.module.mjs +0 -72
  400. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -191
  401. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -280
  402. package/esm2022/src/app/social/user-event/notification/user-event-notification.modal.mjs +0 -84
  403. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +0 -273
  404. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -129
  405. package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +0 -22
  406. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -128
  407. package/esm2022/src/app/social/user-event/user-event.model.mjs +0 -2
  408. package/esm2022/src/app/social/user-event/user-event.module.mjs +0 -24
  409. package/esm2022/src/app/social/user-event/user-event.service.mjs +0 -512
  410. package/esm2022/src/environments/environment.class.mjs +0 -69
  411. package/esm2022/src/environments/environment.loader.mjs +0 -77
  412. package/esm2022/src/environments/environment.mjs +0 -133
  413. package/esm2022/sumaris-net.ngx-components.mjs +0 -5
  414. package/index.d.ts +0 -5
  415. package/public_api.d.ts +0 -364
  416. package/src/app/admin/admin-routing.module.d.ts +0 -9
  417. package/src/app/admin/admin.module.d.ts +0 -10
  418. package/src/app/admin/users/person.filter.d.ts +0 -37
  419. package/src/app/admin/users/person.service.d.ts +0 -61
  420. package/src/app/admin/users/person.validator.d.ts +0 -23
  421. package/src/app/admin/users/users-select.modal.d.ts +0 -73
  422. package/src/app/admin/users/users.d.ts +0 -89
  423. package/src/app/admin/users/users.module.d.ts +0 -15
  424. package/src/app/admin/users/users.utils.d.ts +0 -6
  425. package/src/app/core/about/about.modal.d.ts +0 -44
  426. package/src/app/core/about/about.module.d.ts +0 -11
  427. package/src/app/core/account/account.module.d.ts +0 -18
  428. package/src/app/core/account/account.page.d.ts +0 -93
  429. package/src/app/core/account/new-token.form.d.ts +0 -30
  430. package/src/app/core/account/new-token.modal.d.ts +0 -29
  431. package/src/app/core/account/password/change-password.form.d.ts +0 -19
  432. package/src/app/core/account/password/change-password.module.d.ts +0 -11
  433. package/src/app/core/account/password/change-password.page.d.ts +0 -36
  434. package/src/app/core/account/token.table.d.ts +0 -28
  435. package/src/app/core/auth/auth.form.d.ts +0 -38
  436. package/src/app/core/auth/auth.modal.d.ts +0 -24
  437. package/src/app/core/auth/auth.module.d.ts +0 -13
  438. package/src/app/core/auth/reset-password.modal.d.ts +0 -29
  439. package/src/app/core/core.module.d.ts +0 -28
  440. package/src/app/core/core.testing.module.d.ts +0 -16
  441. package/src/app/core/form/array/form-array.d.ts +0 -147
  442. package/src/app/core/form/array/testing/form-array-test.module.d.ts +0 -12
  443. package/src/app/core/form/array/testing/form-array.test.d.ts +0 -27
  444. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +0 -38
  445. package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +0 -9
  446. package/src/app/core/form/entity/editor.class.d.ts +0 -85
  447. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +0 -126
  448. package/src/app/core/form/entity/entity-editor.class.d.ts +0 -211
  449. package/src/app/core/form/entity/entity-metadata.component.d.ts +0 -13
  450. package/src/app/core/form/entity/entity.module.d.ts +0 -11
  451. package/src/app/core/form/entity/tab-editor.class.d.ts +0 -66
  452. package/src/app/core/form/form-container.class.d.ts +0 -131
  453. package/src/app/core/form/form.class.d.ts +0 -148
  454. package/src/app/core/form/form.module.d.ts +0 -15
  455. package/src/app/core/form/form.utils.d.ts +0 -301
  456. package/src/app/core/form/list/list.form.d.ts +0 -83
  457. package/src/app/core/form/list/list.module.d.ts +0 -9
  458. package/src/app/core/form/properties/properties-file.service.d.ts +0 -26
  459. package/src/app/core/form/properties/properties.form.d.ts +0 -109
  460. package/src/app/core/form/properties/properties.module.d.ts +0 -18
  461. package/src/app/core/form/properties/properties.table.d.ts +0 -73
  462. package/src/app/core/form/properties/properties.utils.d.ts +0 -59
  463. package/src/app/core/form/properties/property.validator.d.ts +0 -27
  464. package/src/app/core/form/properties/testing/properties-form.test.d.ts +0 -22
  465. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +0 -12
  466. package/src/app/core/form/text/testing/text-form.testing.d.ts +0 -19
  467. package/src/app/core/form/text/testing/text-form.testing.module.d.ts +0 -14
  468. package/src/app/core/form/text/text-form.component.d.ts +0 -66
  469. package/src/app/core/form/text/text-form.module.d.ts +0 -9
  470. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +0 -16
  471. package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +0 -11
  472. package/src/app/core/form/text-popover/text-popover.component.d.ts +0 -81
  473. package/src/app/core/form/text-popover/text-popover.module.d.ts +0 -10
  474. package/src/app/core/form/username/username.form.d.ts +0 -19
  475. package/src/app/core/form/username/username.module.d.ts +0 -9
  476. package/src/app/core/graphql/graphql.module.d.ts +0 -7
  477. package/src/app/core/graphql/graphql.service.d.ts +0 -138
  478. package/src/app/core/graphql/graphql.utils.d.ts +0 -47
  479. package/src/app/core/home/home.d.ts +0 -135
  480. package/src/app/core/home/home.module.d.ts +0 -16
  481. package/src/app/core/icon/icon.component.d.ts +0 -13
  482. package/src/app/core/icon/icon.module.d.ts +0 -9
  483. package/src/app/core/install/install-upgrade-card.component.d.ts +0 -63
  484. package/src/app/core/install/install-upgrade-card.module.d.ts +0 -9
  485. package/src/app/core/menu/menu.component.d.ts +0 -69
  486. package/src/app/core/menu/menu.model.d.ts +0 -161
  487. package/src/app/core/menu/menu.module.d.ts +0 -12
  488. package/src/app/core/menu/menu.service.d.ts +0 -93
  489. package/src/app/core/menu/sub-menu-tab.directive.d.ts +0 -29
  490. package/src/app/core/menu/testing/menu-other.testing.d.ts +0 -15
  491. package/src/app/core/menu/testing/menu.testing.d.ts +0 -53
  492. package/src/app/core/menu/testing/menu.testing.module.d.ts +0 -12
  493. package/src/app/core/offline/update-offline-mode-card.component.d.ts +0 -11
  494. package/src/app/core/offline/update-offline-mode-card.module.d.ts +0 -9
  495. package/src/app/core/peer/select-peer.modal.d.ts +0 -108
  496. package/src/app/core/peer/select-peer.module.d.ts +0 -12
  497. package/src/app/core/register/register-confirm.page.d.ts +0 -24
  498. package/src/app/core/register/register.form.d.ts +0 -49
  499. package/src/app/core/register/register.modal.d.ts +0 -14
  500. package/src/app/core/register/register.module.d.ts +0 -12
  501. package/src/app/core/services/account.service.d.ts +0 -236
  502. package/src/app/core/services/auth-guard.service.d.ts +0 -17
  503. package/src/app/core/services/base-entity-service.class.d.ts +0 -134
  504. package/src/app/core/services/base-graphql-service.class.d.ts +0 -77
  505. package/src/app/core/services/base58.d.ts +0 -7
  506. package/src/app/core/services/config/core.config.d.ts +0 -52
  507. package/src/app/core/services/config.service.d.ts +0 -63
  508. package/src/app/core/services/crypto.service.d.ts +0 -44
  509. package/src/app/core/services/errors.d.ts +0 -65
  510. package/src/app/core/services/local-settings.service.d.ts +0 -130
  511. package/src/app/core/services/model/account.model.d.ts +0 -66
  512. package/src/app/core/services/model/config.model.d.ts +0 -37
  513. package/src/app/core/services/model/department.model.d.ts +0 -11
  514. package/src/app/core/services/model/entity.decorators.d.ts +0 -17
  515. package/src/app/core/services/model/entity.model.d.ts +0 -133
  516. package/src/app/core/services/model/filter.model.d.ts +0 -37
  517. package/src/app/core/services/model/history.model.d.ts +0 -20
  518. package/src/app/core/services/model/model.enum.d.ts +0 -7
  519. package/src/app/core/services/model/node-feature.model.d.ts +0 -14
  520. package/src/app/core/services/model/peer.model.d.ts +0 -35
  521. package/src/app/core/services/model/person.model.d.ts +0 -39
  522. package/src/app/core/services/model/referential.model.d.ts +0 -85
  523. package/src/app/core/services/model/settings.model.d.ts +0 -29
  524. package/src/app/core/services/model/token.model.d.ts +0 -22
  525. package/src/app/core/services/model/tree-item-entity.model.d.ts +0 -62
  526. package/src/app/core/services/network.service.d.ts +0 -184
  527. package/src/app/core/services/network.types.d.ts +0 -4
  528. package/src/app/core/services/network.utils.d.ts +0 -39
  529. package/src/app/core/services/pipes/account.pipes.d.ts +0 -15
  530. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +0 -9
  531. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +0 -11
  532. package/src/app/core/services/pipes/pipes.module.d.ts +0 -11
  533. package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +0 -23
  534. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +0 -15
  535. package/src/app/core/services/platform.service.d.ts +0 -126
  536. package/src/app/core/services/storage/entities-storage.service.d.ts +0 -108
  537. package/src/app/core/services/storage/entity-store.class.d.ts +0 -113
  538. package/src/app/core/services/testing/referential-filter.model.d.ts +0 -9
  539. package/src/app/core/services/testing/referential.validator.d.ts +0 -22
  540. package/src/app/core/services/validator/account.validator.d.ts +0 -24
  541. package/src/app/core/services/validator/base.validator.class.d.ts +0 -21
  542. package/src/app/core/services/validator/local-settings.validator.d.ts +0 -18
  543. package/src/app/core/services/validator/user-settings.validator.d.ts +0 -10
  544. package/src/app/core/services/validator/user-token.validator.d.ts +0 -13
  545. package/src/app/core/settings/settings.module.d.ts +0 -12
  546. package/src/app/core/settings/settings.page.d.ts +0 -89
  547. package/src/app/core/table/async-table.class.d.ts +0 -443
  548. package/src/app/core/table/column/actions-column.component.d.ts +0 -65
  549. package/src/app/core/table/column/nav-actions-column.component.d.ts +0 -47
  550. package/src/app/core/table/column/row-field.component.d.ts +0 -41
  551. package/src/app/core/table/entities-async-table-datasource.class.d.ts +0 -103
  552. package/src/app/core/table/entities-table-datasource.class.d.ts +0 -102
  553. package/src/app/core/table/memory-table.class.d.ts +0 -25
  554. package/src/app/core/table/table-select-columns.component.d.ts +0 -22
  555. package/src/app/core/table/table.class.d.ts +0 -427
  556. package/src/app/core/table/table.model.d.ts +0 -31
  557. package/src/app/core/table/table.module.d.ts +0 -14
  558. package/src/app/core/table/table.pipes.d.ts +0 -30
  559. package/src/app/core/table/table.utils.d.ts +0 -13
  560. package/src/app/core/table/testing/nested-table.testing.d.ts +0 -54
  561. package/src/app/core/table/testing/table-validator.service.d.ts +0 -17
  562. package/src/app/core/table/testing/table.testing.d.ts +0 -55
  563. package/src/app/core/table/testing/table.testing.module.d.ts +0 -17
  564. package/src/app/core/table/testing/table2-validator.service.d.ts +0 -15
  565. package/src/app/core/table/testing/table2.testing.d.ts +0 -53
  566. package/src/app/shared/alerts.d.ts +0 -55
  567. package/src/app/shared/audio/audio.d.ts +0 -45
  568. package/src/app/shared/audio/audio.testing.d.ts +0 -13
  569. package/src/app/shared/audio/audio.testing.module.d.ts +0 -11
  570. package/src/app/shared/base64.utils.d.ts +0 -7
  571. package/src/app/shared/capacitor/keyboard.d.ts +0 -16
  572. package/src/app/shared/capacitor/plugins.d.ts +0 -8
  573. package/src/app/shared/constants.d.ts +0 -15
  574. package/src/app/shared/dates.d.ts +0 -85
  575. package/src/app/shared/debug/debug-service.class.d.ts +0 -5
  576. package/src/app/shared/debug/debug.component.d.ts +0 -14
  577. package/src/app/shared/debug/debug.module.d.ts +0 -12
  578. package/src/app/shared/directives/autofocus.directive.d.ts +0 -18
  579. package/src/app/shared/directives/autoresize.directive.d.ts +0 -20
  580. package/src/app/shared/directives/autotitle.directive.d.ts +0 -11
  581. package/src/app/shared/directives/autotooltip.directive.d.ts +0 -14
  582. package/src/app/shared/directives/cell-selection/cell-identifier.directive.d.ts +0 -17
  583. package/src/app/shared/directives/cell-selection/cell-selection.directive.d.ts +0 -29
  584. package/src/app/shared/directives/cell-selection/cell-selection.service.d.ts +0 -67
  585. package/src/app/shared/directives/directives.module.d.ts +0 -15
  586. package/src/app/shared/directives/drag-and-drop.directive.d.ts +0 -17
  587. package/src/app/shared/directives/ng-var.directive.d.ts +0 -12
  588. package/src/app/shared/directives/resizable/resizable.component.d.ts +0 -21
  589. package/src/app/shared/directives/resizable/resizable.directive.d.ts +0 -24
  590. package/src/app/shared/directives/resizable/resizable.module.d.ts +0 -8
  591. package/src/app/shared/directives/throttled-click.directive.d.ts +0 -16
  592. package/src/app/shared/events.d.ts +0 -29
  593. package/src/app/shared/file/csv.utils.d.ts +0 -30
  594. package/src/app/shared/file/file.service.d.ts +0 -23
  595. package/src/app/shared/file/file.utils.d.ts +0 -20
  596. package/src/app/shared/file/images.utils.d.ts +0 -36
  597. package/src/app/shared/file/json.utils.d.ts +0 -19
  598. package/src/app/shared/file/uri.utils.d.ts +0 -8
  599. package/src/app/shared/file/url.utils.d.ts +0 -108
  600. package/src/app/shared/focusable.d.ts +0 -4
  601. package/src/app/shared/form/field.component.d.ts +0 -83
  602. package/src/app/shared/form/field.model.d.ts +0 -88
  603. package/src/app/shared/form/loading-spinner.d.ts +0 -8
  604. package/src/app/shared/forms.d.ts +0 -170
  605. package/src/app/shared/functions.d.ts +0 -296
  606. package/src/app/shared/geolocation/geolocation.utils.d.ts +0 -25
  607. package/src/app/shared/gesture/gesture-config.d.ts +0 -15
  608. package/src/app/shared/gesture/hammer.utils.d.ts +0 -16
  609. package/src/app/shared/graph/colors.utils.d.ts +0 -34
  610. package/src/app/shared/graph/graph-colors.d.ts +0 -63
  611. package/src/app/shared/guard/component-dirty.guard.d.ts +0 -14
  612. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +0 -8
  613. package/src/app/shared/hotkeys/hotkeys.service.d.ts +0 -48
  614. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +0 -11
  615. package/src/app/shared/html.utils.d.ts +0 -17
  616. package/src/app/shared/http/http.utils.d.ts +0 -28
  617. package/src/app/shared/image/gallery/image-gallery.component.d.ts +0 -139
  618. package/src/app/shared/image/gallery/image-gallery.module.d.ts +0 -15
  619. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +0 -12
  620. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +0 -33
  621. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +0 -16
  622. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +0 -13
  623. package/src/app/shared/image/image.model.d.ts +0 -7
  624. package/src/app/shared/image/image.module.d.ts +0 -8
  625. package/src/app/shared/image/image.service.d.ts +0 -37
  626. package/src/app/shared/inputs.d.ts +0 -37
  627. package/src/app/shared/interceptors/progess.interceptor.d.ts +0 -8
  628. package/src/app/shared/logging/log-level.model.d.ts +0 -38
  629. package/src/app/shared/logging/logger.model.d.ts +0 -68
  630. package/src/app/shared/logging/logging-service.class.d.ts +0 -39
  631. package/src/app/shared/logging/logging-service.config.d.ts +0 -25
  632. package/src/app/shared/logging/logging-service.module.d.ts +0 -9
  633. package/src/app/shared/markdown/markdown.component.d.ts +0 -86
  634. package/src/app/shared/markdown/markdown.directive.d.ts +0 -13
  635. package/src/app/shared/markdown/markdown.modal.d.ts +0 -49
  636. package/src/app/shared/markdown/markdown.module.d.ts +0 -17
  637. package/src/app/shared/markdown/markdown.service.d.ts +0 -37
  638. package/src/app/shared/markdown/markdown.utils.d.ts +0 -26
  639. package/src/app/shared/markdown/testing/markdown.test.d.ts +0 -18
  640. package/src/app/shared/markdown/testing/markdown.testing.module.d.ts +0 -12
  641. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +0 -74
  642. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +0 -224
  643. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +0 -23
  644. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +0 -5
  645. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +0 -48
  646. package/src/app/shared/material/badge/badge.directive.d.ts +0 -43
  647. package/src/app/shared/material/badge/badge.module.d.ts +0 -10
  648. package/src/app/shared/material/badge/badge.test.d.ts +0 -21
  649. package/src/app/shared/material/boolean/boolean.module.d.ts +0 -21
  650. package/src/app/shared/material/boolean/material.boolean.d.ts +0 -94
  651. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +0 -31
  652. package/src/app/shared/material/chips/chips.module.d.ts +0 -22
  653. package/src/app/shared/material/chips/material.chips.d.ts +0 -167
  654. package/src/app/shared/material/chips/testing/chips.test.d.ts +0 -32
  655. package/src/app/shared/material/datetime/datetime.module.d.ts +0 -25
  656. package/src/app/shared/material/datetime/material.date.d.ts +0 -90
  657. package/src/app/shared/material/datetime/material.dateshort.d.ts +0 -89
  658. package/src/app/shared/material/datetime/material.datetime.d.ts +0 -136
  659. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +0 -38
  660. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +0 -32
  661. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +0 -31
  662. package/src/app/shared/material/duration/duration.module.d.ts +0 -18
  663. package/src/app/shared/material/duration/duration.utils.d.ts +0 -2
  664. package/src/app/shared/material/duration/material.duration.d.ts +0 -64
  665. package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +0 -23
  666. package/src/app/shared/material/latlong/latlong.utils.d.ts +0 -59
  667. package/src/app/shared/material/latlong/material.latlong-input.d.ts +0 -93
  668. package/src/app/shared/material/latlong/material.latlong.d.ts +0 -90
  669. package/src/app/shared/material/latlong/material.latlong.module.d.ts +0 -21
  670. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +0 -30
  671. package/src/app/shared/material/material.animations.d.ts +0 -8
  672. package/src/app/shared/material/material.config.d.ts +0 -3
  673. package/src/app/shared/material/material.module.d.ts +0 -44
  674. package/src/app/shared/material/material.testing.module.d.ts +0 -31
  675. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +0 -12
  676. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +0 -10
  677. package/src/app/shared/material/swipe/material.swipe.d.ts +0 -89
  678. package/src/app/shared/material/swipe/swipe.module.d.ts +0 -16
  679. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +0 -22
  680. package/src/app/shared/material/test/test-component.d.ts +0 -75
  681. package/src/app/shared/material/testing/common.test.d.ts +0 -25
  682. package/src/app/shared/modules.d.ts +0 -9
  683. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +0 -63
  684. package/src/app/shared/named-filter/named-filter.model.d.ts +0 -32
  685. package/src/app/shared/named-filter/named-filter.module.d.ts +0 -13
  686. package/src/app/shared/named-filter/named-filter.service.d.ts +0 -32
  687. package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +0 -34
  688. package/src/app/shared/named-filter/testing/named-filter.testing.module.d.ts +0 -10
  689. package/src/app/shared/observables.d.ts +0 -32
  690. package/src/app/shared/pipes/arrays.pipe.d.ts +0 -93
  691. package/src/app/shared/pipes/badge.pipes.d.ts +0 -7
  692. package/src/app/shared/pipes/colors.pipe.d.ts +0 -9
  693. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +0 -25
  694. package/src/app/shared/pipes/date-format.pipe.d.ts +0 -35
  695. package/src/app/shared/pipes/date-from-now.pipe.d.ts +0 -14
  696. package/src/app/shared/pipes/date-from.pipe.d.ts +0 -14
  697. package/src/app/shared/pipes/dates.pipe.d.ts +0 -10
  698. package/src/app/shared/pipes/display-with.pipe.d.ts +0 -8
  699. package/src/app/shared/pipes/duration.pipe.d.ts +0 -23
  700. package/src/app/shared/pipes/file-size.pipe.d.ts +0 -30
  701. package/src/app/shared/pipes/form.pipes.d.ts +0 -69
  702. package/src/app/shared/pipes/highlight.pipe.d.ts +0 -11
  703. package/src/app/shared/pipes/html.pipes.d.ts +0 -50
  704. package/src/app/shared/pipes/latlong-format.pipe.d.ts +0 -20
  705. package/src/app/shared/pipes/maps.pipe.d.ts +0 -23
  706. package/src/app/shared/pipes/maskito.pipe.d.ts +0 -14
  707. package/src/app/shared/pipes/math.pipes.d.ts +0 -26
  708. package/src/app/shared/pipes/ng-init.pipe.d.ts +0 -8
  709. package/src/app/shared/pipes/number-format.pipe.d.ts +0 -9
  710. package/src/app/shared/pipes/observable.pipes.d.ts +0 -25
  711. package/src/app/shared/pipes/pipes.module.d.ts +0 -36
  712. package/src/app/shared/pipes/property.pipes.d.ts +0 -46
  713. package/src/app/shared/pipes/selection.pipes.d.ts +0 -62
  714. package/src/app/shared/pipes/string.pipes.d.ts +0 -67
  715. package/src/app/shared/pipes/translate-context.pipe.d.ts +0 -17
  716. package/src/app/shared/pipes/types.pipes.d.ts +0 -30
  717. package/src/app/shared/pipes/url.pipes.d.ts +0 -27
  718. package/src/app/shared/platforms.d.ts +0 -16
  719. package/src/app/shared/print/print.service.d.ts +0 -94
  720. package/src/app/shared/regexps.d.ts +0 -32
  721. package/src/app/shared/rx-state/rx-state.decorators.d.ts +0 -33
  722. package/src/app/shared/rx-state/rx-state.module.d.ts +0 -10
  723. package/src/app/shared/rx-state/rx-state.types.d.ts +0 -5
  724. package/src/app/shared/services/entity-service.class.d.ts +0 -117
  725. package/src/app/shared/services/job.utils.d.ts +0 -20
  726. package/src/app/shared/services/memory-entity-service.class.d.ts +0 -87
  727. package/src/app/shared/services/progress-bar.service.d.ts +0 -20
  728. package/src/app/shared/services/startable-observable-service.class.d.ts +0 -51
  729. package/src/app/shared/services/startable-service.class.d.ts +0 -38
  730. package/src/app/shared/services/translate-context.service.d.ts +0 -29
  731. package/src/app/shared/services/validator-service.class.d.ts +0 -11
  732. package/src/app/shared/services.d.ts +0 -17
  733. package/src/app/shared/shared-routing.module.d.ts +0 -23
  734. package/src/app/shared/shared.module.d.ts +0 -33
  735. package/src/app/shared/shared.testing.module.d.ts +0 -20
  736. package/src/app/shared/storage/storage-explorer.component.d.ts +0 -60
  737. package/src/app/shared/storage/storage-explorer.module.d.ts +0 -13
  738. package/src/app/shared/storage/storage-explorer.testing-routing.module.d.ts +0 -9
  739. package/src/app/shared/storage/storage-explorer.testing.module.d.ts +0 -10
  740. package/src/app/shared/storage/storage.service.d.ts +0 -22
  741. package/src/app/shared/storage/storage.utils.d.ts +0 -19
  742. package/src/app/shared/testing/maskito.test.d.ts +0 -10
  743. package/src/app/shared/testing/observable.test.d.ts +0 -25
  744. package/src/app/shared/testing/tests.page.d.ts +0 -20
  745. package/src/app/shared/toast/toast.testing.d.ts +0 -15
  746. package/src/app/shared/toast/toast.testing.module.d.ts +0 -12
  747. package/src/app/shared/toast/toasts.d.ts +0 -16
  748. package/src/app/shared/toolbar/modal-toolbar.d.ts +0 -21
  749. package/src/app/shared/toolbar/toolbar.d.ts +0 -70
  750. package/src/app/shared/toolbar/toolbar.module.d.ts +0 -16
  751. package/src/app/shared/types.d.ts +0 -45
  752. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +0 -21
  753. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +0 -11
  754. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +0 -41
  755. package/src/app/shared/upload-file/upload-file.component.d.ts +0 -50
  756. package/src/app/shared/upload-file/upload-file.model.d.ts +0 -30
  757. package/src/app/shared/validator/form-error-adapter.class.d.ts +0 -33
  758. package/src/app/shared/validator/validators.d.ts +0 -145
  759. package/src/app/shared/version/versions.d.ts +0 -26
  760. package/src/app/social/config/social.config.d.ts +0 -4
  761. package/src/app/social/feed/feed.component.d.ts +0 -91
  762. package/src/app/social/feed/feed.directive.d.ts +0 -32
  763. package/src/app/social/feed/feed.model.d.ts +0 -69
  764. package/src/app/social/feed/feed.module.d.ts +0 -13
  765. package/src/app/social/feed/feed.page.d.ts +0 -24
  766. package/src/app/social/feed/feed.service.d.ts +0 -85
  767. package/src/app/social/feed/testing/feed.testing.d.ts +0 -23
  768. package/src/app/social/feed/testing/feed.testing.module.d.ts +0 -12
  769. package/src/app/social/job/job.module.d.ts +0 -12
  770. package/src/app/social/job/progression/job-progression.component.d.ts +0 -24
  771. package/src/app/social/job/progression/job-progression.icon.d.ts +0 -63
  772. package/src/app/social/job/progression/job-progression.list.d.ts +0 -20
  773. package/src/app/social/job/progression/job-progression.model.d.ts +0 -10
  774. package/src/app/social/job/progression/job-progression.service.d.ts +0 -33
  775. package/src/app/social/job/testing/job-progression.testing.d.ts +0 -13
  776. package/src/app/social/job/testing/job-progression.testing.service.d.ts +0 -9
  777. package/src/app/social/job/testing/job.testing.module.d.ts +0 -11
  778. package/src/app/social/message/message.form.d.ts +0 -36
  779. package/src/app/social/message/message.modal.d.ts +0 -47
  780. package/src/app/social/message/message.model.d.ts +0 -36
  781. package/src/app/social/message/message.module.d.ts +0 -14
  782. package/src/app/social/message/message.service.d.ts +0 -44
  783. package/src/app/social/social.errors.d.ts +0 -10
  784. package/src/app/social/social.module.d.ts +0 -20
  785. package/src/app/social/social.testing.module.d.ts +0 -14
  786. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +0 -47
  787. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +0 -77
  788. package/src/app/social/user-event/notification/user-event-notification.modal.d.ts +0 -37
  789. package/src/app/social/user-event/testing/user-event.testing.d.ts +0 -44
  790. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +0 -42
  791. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +0 -11
  792. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +0 -41
  793. package/src/app/social/user-event/user-event.model.d.ts +0 -44
  794. package/src/app/social/user-event/user-event.module.d.ts +0 -14
  795. package/src/app/social/user-event/user-event.service.d.ts +0 -124
  796. package/src/environments/environment.class.d.ts +0 -86
  797. package/src/environments/environment.d.ts +0 -2
  798. package/src/environments/environment.loader.d.ts +0 -24
  799. package/src/theme/_globals.scss +0 -5
@@ -1,388 +0,0 @@
1
- import { booleanAttribute, ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, numberAttribute, Optional, Output, ViewChild, } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
3
- import { isBlankString, isNilOrBlank, isNotNil, isNotNilBoolean, isNotNilOrBlank, toBoolean } from '../functions';
4
- import { FormFieldDefinitionUtils } from './field.model';
5
- import { getColorContrast } from '../graph/colors.utils';
6
- import { asInputElement, filterNumberInput, selectInputContentFromEvent } from '../inputs';
7
- import { toDateISOString } from '../dates';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@ngx-translate/core";
10
- import * as i2 from "@angular/forms";
11
- import * as i3 from "@angular/common";
12
- import * as i4 from "@ionic/angular";
13
- import * as i5 from "ngx-color-picker";
14
- import * as i6 from "@angular/material/form-field";
15
- import * as i7 from "@angular/material/input";
16
- import * as i8 from "@angular/material/icon";
17
- import * as i9 from "@angular/material/button";
18
- import * as i10 from "@angular/material/select";
19
- import * as i11 from "@angular/material/core";
20
- import * as i12 from "../material/autocomplete/material.autocomplete";
21
- import * as i13 from "../material/datetime/material.date";
22
- import * as i14 from "../material/datetime/material.datetime";
23
- import * as i15 from "../material/boolean/material.boolean";
24
- import * as i16 from "../material/chips/material.chips";
25
- import * as i17 from "../directives/autofocus.directive";
26
- import * as i18 from "../pipes/string.pipes";
27
- import * as i19 from "../pipes/form.pipes";
28
- import * as i20 from "../pipes/colors.pipe";
29
- import * as i21 from "../pipes/types.pipes";
30
- const noop = () => { };
31
- export class AppFormField {
32
- translate;
33
- cd;
34
- injector;
35
- formGroupDir;
36
- _onChangeCallback = noop;
37
- _onTouchedCallback = noop;
38
- _definition;
39
- _values;
40
- type;
41
- numberInputStep;
42
- set definition(value) {
43
- if (!value || this._definition === value)
44
- return; // Skip is same or nil
45
- this._definition = value;
46
- this._onDefinitionChanged(value);
47
- }
48
- get definition() {
49
- return this._definition;
50
- }
51
- readonly = false;
52
- disabled;
53
- formControl;
54
- formControlName;
55
- placeholder;
56
- compact = false;
57
- required;
58
- hideRequiredMarker = false;
59
- floatLabel = 'auto';
60
- label = null;
61
- appearance;
62
- subscriptSizing;
63
- tabindex;
64
- autofocus;
65
- clearable;
66
- chipColor = null;
67
- // eslint-disable-next-line @angular-eslint/no-input-rename
68
- classList;
69
- debug = false;
70
- panelClass;
71
- panelWidth;
72
- onKeyupEnter = new EventEmitter();
73
- get value() {
74
- return this.formControl.value;
75
- }
76
- matInput;
77
- autocompleteField;
78
- constructor(translate, cd, injector, formGroupDir) {
79
- this.translate = translate;
80
- this.cd = cd;
81
- this.injector = injector;
82
- this.formGroupDir = formGroupDir;
83
- }
84
- ngOnInit() {
85
- this.checkAndResolveFormControl();
86
- if (!this._definition)
87
- throw new Error("Missing mandatory attribute 'definition' in <app-form-field>.");
88
- if (typeof this._definition !== 'object')
89
- throw new Error("Invalid attribute 'definition' in <app-form-field>. Should be an object.");
90
- this._onDefinitionChanged(this._definition, { emitEvent: false });
91
- }
92
- writeValue(obj) {
93
- if ((this.type === 'integer' || this.type === 'double') && Number.isNaN(obj)) {
94
- // DEBUG
95
- //if (this.debug) console.debug("WARN: trying to set NaN value, in an <app-form-field>! Reset to null");
96
- obj = null;
97
- }
98
- else if (this.type === 'boolean' && typeof obj === 'string') {
99
- obj = obj !== 'false';
100
- }
101
- else if (this.type === 'date') {
102
- obj = toDateISOString(obj);
103
- }
104
- else if (this.type === 'enums' && isNotNil(obj)) {
105
- let changes = false;
106
- if (!Array.isArray(obj)) {
107
- // Convert string to array
108
- if (typeof obj === 'string') {
109
- obj = obj.trim().split(/[|,]+/);
110
- changes = true;
111
- }
112
- // Convert object to array
113
- else if (typeof obj === 'object') {
114
- obj = [obj];
115
- changes = true;
116
- }
117
- }
118
- const updatedArray = (obj || [])
119
- .map((item) => {
120
- if (typeof item === 'string') {
121
- changes = true;
122
- return this._values.find((v) => v.key === item.trim());
123
- }
124
- return item;
125
- })
126
- .filter(isNotNil);
127
- if (changes) {
128
- obj = updatedArray;
129
- }
130
- }
131
- else if (this.type === 'entity' && isNilOrBlank(obj)) {
132
- obj = null;
133
- }
134
- else if (this.type === 'entities' && isNotNil(obj)) {
135
- let changes = false;
136
- if (!Array.isArray(obj)) {
137
- // Convert string to array
138
- if (typeof obj === 'string') {
139
- obj = obj.trim();
140
- if (obj.startsWith('[') && obj.endsWith(']')) {
141
- obj = JSON.parse(obj);
142
- }
143
- else {
144
- obj = obj.split(/[|,]+/);
145
- }
146
- changes = true;
147
- }
148
- // Convert object to array
149
- else if (typeof obj === 'object') {
150
- obj = [obj];
151
- changes = true;
152
- }
153
- }
154
- const updatedArray = (obj || [])
155
- .map((item) => {
156
- if (typeof item === 'string' && item.startsWith('{') && item.endsWith('}')) {
157
- item = JSON.parse(item);
158
- changes = true;
159
- return item;
160
- }
161
- return item;
162
- })
163
- .filter(isNotNilOrBlank);
164
- if (changes) {
165
- obj = updatedArray;
166
- }
167
- }
168
- if (obj !== this.formControl.value) {
169
- // DEBUG
170
- //if (this.debug) console.debug("Set <app-form-field> value: ", obj);
171
- this.formControl.patchValue(obj, { emitEvent: false });
172
- this._onChangeCallback(obj);
173
- }
174
- this.cd.markForCheck();
175
- }
176
- registerOnChange(fn) {
177
- this._onChangeCallback = fn;
178
- }
179
- registerOnTouched(fn) {
180
- this._onTouchedCallback = fn;
181
- }
182
- setDisabledState(disabled) {
183
- if (this.disabled === disabled)
184
- return; // Skip if same
185
- this.disabled = disabled;
186
- this.cd.markForCheck();
187
- }
188
- markAsTouched() {
189
- if (this.formControl.touched) {
190
- this.cd.markForCheck();
191
- this._onTouchedCallback();
192
- }
193
- }
194
- filterAlphanumericalInput(event) {
195
- if (event.code === 'Enter' && this.onKeyupEnter.observed) {
196
- this.onKeyupEnter.emit(event);
197
- return;
198
- }
199
- // Add features (e.g. check against a pattern)
200
- }
201
- focus() {
202
- if (this.matInput)
203
- this.matInput.nativeElement.focus();
204
- else if (this.autocompleteField)
205
- this.autocompleteField.focus();
206
- }
207
- filterNumberInput = filterNumberInput;
208
- selectInputContentFromEvent = selectInputContentFromEvent;
209
- getDisplayValueFn = FormFieldDefinitionUtils.getDisplayValueFn;
210
- getColorContrast(color) {
211
- return isNotNilOrBlank(color) ? getColorContrast(color, true) : undefined;
212
- }
213
- /**
214
- * Allow to reload values, if not detected
215
- *
216
- * @param value
217
- */
218
- reloadItems(value) {
219
- if (!this._definition)
220
- return;
221
- this._onDefinitionChanged(this._definition);
222
- if (this.autocompleteField) {
223
- setTimeout(() => this.autocompleteField?.reloadItems(value));
224
- }
225
- }
226
- /* -- protected method -- */
227
- computeNumberInputStep(definition) {
228
- if (definition.maximumNumberDecimals > 0) {
229
- let step = '0.';
230
- if (definition.maximumNumberDecimals > 1) {
231
- for (let i = 0; i < definition.maximumNumberDecimals - 1; i++) {
232
- step += '0';
233
- }
234
- }
235
- step += '1';
236
- return step;
237
- }
238
- else {
239
- return '1';
240
- }
241
- }
242
- checkAndResolveFormControl() {
243
- if (this.formControl)
244
- return; // OK, there is a control
245
- if (this.formGroupDir) {
246
- // Try to find using definition.key, as formControlName
247
- if (!this.formControlName && this._definition.key) {
248
- this.formControlName = this._definition.key;
249
- }
250
- const formControlName = (this.formGroupDir.directives || []).find((d) => this.formControlName && d.name === this.formControlName);
251
- this.formControl = formControlName && formControlName.control;
252
- if (!this.formControl) {
253
- this.formControl = this.formGroupDir.form.get(this.formControlName);
254
- }
255
- }
256
- if (!this.formControl) {
257
- throw new Error("Missing attribute 'formControl' or 'formControlName' in <app-form-field> component.");
258
- }
259
- }
260
- _onDefinitionChanged(definition, opts) {
261
- this.type = definition.type;
262
- if (!this.type)
263
- throw new Error("Invalid attribute 'definition' in <app-form-field>. Missing type !");
264
- this.placeholder = this.placeholder || (this._definition.label && this.translate.instant(this._definition.label));
265
- this.required = isNotNilBoolean(this.required)
266
- ? this.required
267
- : this._definition.required || this.formControl?.validator === Validators.required || isBlankString(this.required);
268
- this.disabled = toBoolean(this.disabled, toBoolean(this._definition.disabled, false));
269
- this.chipColor = this.chipColor ?? definition.chipColor;
270
- // double
271
- if (this.type === 'double') {
272
- this.numberInputStep = this.computeNumberInputStep(definition);
273
- }
274
- else {
275
- this.numberInputStep = null;
276
- }
277
- // enum (or enums)
278
- if (this.type === 'enum' || this.type === 'enums') {
279
- // Resolve enum values
280
- this._values = FormFieldDefinitionUtils.getEnumValues(this.injector, definition.values);
281
- }
282
- else {
283
- this._values = [];
284
- }
285
- // Repaint
286
- if (!opts || opts.emitEvent !== false) {
287
- this.cd.markForCheck();
288
- }
289
- // Recompute tab index, because if type changed, then matInput can have changed
290
- this.updateTabIndex(100);
291
- }
292
- updateTabIndex(timeout) {
293
- if (this.tabindex && this.tabindex !== -1) {
294
- setTimeout(() => {
295
- const element = asInputElement(this.matInput);
296
- if (element) {
297
- element.tabIndex = this.tabindex;
298
- this.cd.markForCheck();
299
- }
300
- else if (this.autocompleteField) {
301
- this.autocompleteField.tabindex = this.tabindex;
302
- }
303
- }, timeout || 0);
304
- }
305
- }
306
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppFormField, deps: [{ token: i1.TranslateService }, { token: i0.ChangeDetectorRef }, { token: i0.Injector }, { token: i2.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
307
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AppFormField, selector: "app-form-field", inputs: { definition: "definition", readonly: ["readonly", "readonly", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], formControl: "formControl", formControlName: "formControlName", placeholder: "placeholder", compact: ["compact", "compact", booleanAttribute], required: ["required", "required", booleanAttribute], hideRequiredMarker: ["hideRequiredMarker", "hideRequiredMarker", booleanAttribute], floatLabel: "floatLabel", label: "label", appearance: "appearance", subscriptSizing: "subscriptSizing", tabindex: ["tabindex", "tabindex", numberAttribute], autofocus: ["autofocus", "autofocus", booleanAttribute], clearable: ["clearable", "clearable", booleanAttribute], chipColor: "chipColor", classList: ["class", "classList"], debug: ["debug", "debug", booleanAttribute], panelClass: "panelClass", panelWidth: "panelWidth" }, outputs: { onKeyupEnter: "keyup.enter" }, providers: [
308
- {
309
- provide: NG_VALUE_ACCESSOR,
310
- useExisting: forwardRef(() => AppFormField),
311
- multi: true,
312
- },
313
- ], viewQueries: [{ propertyName: "matInput", first: true, predicate: ["matInput"], descendants: true }, { propertyName: "autocompleteField", first: true, predicate: ["autocompleteField"], descendants: true }], ngImport: i0, template: "<ng-container [ngSwitch]=\"type\">\n <!-- integer -->\n <mat-form-field\n *ngSwitchCase=\"'integer'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class]=\"classList\"\n >\n @if (placeholder && floatLabel !== 'never') {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input\n matInput\n #matInput\n type=\"number\"\n autocomplete=\"off\"\n [min]=\"definition.minValue\"\n [max]=\"definition.maxValue\"\n pattern=\"-?[0-9]*\"\n step=\"1\"\n [appAutofocus]=\"autofocus\"\n [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n (keypress)=\"filterNumberInput($event, false)\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabIndex]=\"tabindex\"\n (click)=\"selectInputContentFromEvent($event)\"\n />\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{ (compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate: formControl.errors['min'] }}\n </mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{ (compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate: formControl.errors['max'] }}\n </mat-error>\n <mat-error *ngIf=\"formControl.hasError('pattern')\">\n {{ 'ERROR.FIELD_NOT_VALID_INTEGER' | translate }}\n </mat-error>\n <mat-error *ngIf=\"formControl.hasError('integer')\">\n {{ 'ERROR.FIELD_NOT_VALID_INTEGER' | translate }}\n </mat-error>\n\n <button\n matSuffix\n *ngIf=\"clearable\"\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"formControl.reset()\"\n [hidden]=\"formControl.disabled || (formControl | formGetValue | isNilOrBlank)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n\n <!-- double -->\n <mat-form-field\n *ngSwitchCase=\"'double'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class]=\"classList\"\n >\n @if (placeholder && floatLabel !== 'never') {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input\n matInput\n #matInput\n type=\"number\"\n decimal=\"true\"\n autocomplete=\"off\"\n [min]=\"definition.minValue\"\n [max]=\"definition.maxValue\"\n [appAutofocus]=\"autofocus\"\n [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n [step]=\"numberInputStep\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n (keypress)=\"filterNumberInput($event, true)\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabIndex]=\"tabindex\"\n (click)=\"selectInputContentFromEvent($event)\"\n />\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('decimal')\" translate>ERROR.FIELD_NOT_VALID_DECIMAL</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{ (compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate: formControl.errors['min'] }}\n </mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{ (compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate: formControl.errors['max'] }}\n </mat-error>\n <mat-error *ngIf=\"formControl.hasError('maxDecimals')\">\n {{\n (compact ? 'ERROR.FIELD_MAXIMUM_DECIMALS_COMPACT' : 'ERROR.FIELD_MAXIMUM_DECIMALS')\n | translate: { maxDecimals: definition.maximumNumberDecimals }\n }}\n </mat-error>\n\n <button\n matSuffix\n *ngIf=\"clearable\"\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"formControl.reset()\"\n [hidden]=\"formControl.disabled || (formControl | formGetValue | isNilOrBlank)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n\n <!-- boolean -->\n <mat-boolean-field\n *ngSwitchCase=\"'boolean'\"\n #matInput\n [class]=\"classList\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [compact]=\"compact\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabindex]=\"tabindex\"\n >\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-boolean-field>\n\n <!-- date -->\n <mat-date-field\n *ngSwitchCase=\"'date'\"\n #matInput\n [class]=\"classList\"\n [formControl]=\"formControl\"\n [placeholder]=\"compact ? ('COMMON.DATE_PLACEHOLDER' | translate) : placeholder\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [required]=\"required\"\n [clearable]=\"clearable\"\n [readonly]=\"readonly\"\n [compact]=\"compact\"\n [tabindex]=\"tabindex\"\n [autofocus]=\"autofocus\"\n >\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-date-field>\n\n <!-- date time -->\n <mat-date-time-field\n *ngSwitchCase=\"'dateTime'\"\n #matInput\n [class]=\"classList\"\n [formControl]=\"formControl\"\n [placeholder]=\"compact ? ('COMMON.DATE_TIME_PLACEHOLDER' | translate) : placeholder\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [required]=\"required\"\n [clearable]=\"clearable\"\n [readonly]=\"readonly\"\n [compact]=\"compact\"\n [tabindex]=\"tabindex\"\n [autofocus]=\"autofocus\"\n >\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-date-time-field>\n\n <!-- enum -->\n <mat-form-field\n *ngSwitchCase=\"'enum'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class]=\"classList\"\n [class.mat-form-field-disabled]=\"readonly\"\n >\n <ng-content select=\"[matPrefix]\"></ng-content>\n\n @if (placeholder && floatLabel !== 'never') {\n <mat-label>{{ placeholder }}</mat-label>\n }\n @if (readonly) {\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n <ion-text>{{ formControl.value }}</ion-text>\n } @else {\n <mat-select\n [formControl]=\"formControl\"\n [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n >\n <mat-option *ngFor=\"let item of _values\" [value]=\"item.key\">{{ item.value | translate }}</mat-option>\n </mat-select>\n }\n\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n\n <!-- multi enum -->\n <mat-chips-field\n *ngSwitchCase=\"'enums'\"\n [class]=\"classList\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [formControl]=\"formControl\"\n [clearable]=\"clearable\"\n [items]=\"_values\"\n [displayAttributes]=\"definition.autocomplete?.attributes || ['key', 'value']\"\n [config]=\"definition.autocomplete\"\n [showAllOnFocus]=\"true\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [chipColor]=\"chipColor | matColor\"\n >\n <ng-content select=\"[matPrefix]\"></ng-content>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-chips-field>\n\n <!-- color -->\n <mat-form-field\n *ngSwitchCase=\"'color'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class]=\"classList\"\n >\n <ion-icon margin-right name=\"color-fill\" matPrefix></ion-icon>\n\n <input\n matInput\n autocomplete=\"off\"\n [appAutofocus]=\"autofocus\"\n [formControl]=\"formControl\"\n [style.color]=\"getColorContrast(formControl.value)\"\n [style.background]=\"formControl.value\"\n [colorPicker]=\"formControl.value\"\n (colorPickerChange)=\"writeValue($event)\"\n [cpSaveClickOutside]=\"true\"\n cpPosition=\"top\"\n cpOutputFormat=\"hex\"\n [cpOKButton]=\"false\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabIndex]=\"tabindex\"\n />\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n\n <!-- string -->\n <mat-form-field\n *ngSwitchCase=\"'string'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class]=\"classList\"\n >\n @if (placeholder && floatLabel !== 'never') {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input\n matInput\n #matInput\n autocomplete=\"off\"\n [appAutofocus]=\"autofocus\"\n [formControl]=\"formControl\"\n [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabIndex]=\"tabindex\"\n (click)=\"selectInputContentFromEvent($event)\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n (keypress)=\"filterAlphanumericalInput($event)\"\n />\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <button\n matSuffix\n *ngIf=\"clearable\"\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"formControl.reset()\"\n [hidden]=\"formControl.disabled || (formControl | formGetValue | isNilOrBlank)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n\n <!-- auto-complete -->\n <mat-autocomplete-field\n *ngSwitchCase=\"'entity'\"\n #autocompleteField\n [class]=\"classList\"\n [autofocus]=\"autofocus\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [formControl]=\"formControl\"\n [config]=\"definition.autocomplete\"\n [hideRequiredMarker]=\"hideRequiredMarker\"\n [clearable]=\"clearable\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabindex]=\"tabindex\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n [displayWith]=\"getDisplayValueFn(definition)\"\n [panelClass]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n >\n <ng-content select=\"[matPrefix]\"></ng-content>\n <ng-content select=\"[matSuffix]\"></ng-content>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-autocomplete-field>\n\n <!-- multi auto-complete -->\n <mat-chips-field\n *ngSwitchCase=\"'entities'\"\n [class]=\"classList\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [formControl]=\"formControl\"\n [config]=\"definition.autocomplete\"\n [chipColor]=\"chipColor | matColor\"\n [clearable]=\"clearable\"\n [displayWith]=\"getDisplayValueFn(definition)\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabindex]=\"tabindex\"\n [panelClass]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n >\n <ng-content select=\"[matPrefix]\"></ng-content>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-chips-field>\n\n <!-- other -->\n <div *ngSwitchDefault>\n <mat-error *ngIf=\"type\">\n Unknown type {{ type }} for option {{ definition.key }}. Please report this error.\n </mat-error>\n <mat-error *ngIf=\"!type\">Error on option field. Please check console log for details.</mat-error>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </div>\n</ng-container>\n", styles: [":host{display:inline-block;position:relative}button[hidden]{display:none}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i5.ColorPickerDirective, selector: "[colorPicker]", inputs: ["colorPicker", "cpWidth", "cpHeight", "cpToggle", "cpDisabled", "cpIgnoredElements", "cpFallbackColor", "cpColorMode", "cpCmykEnabled", "cpOutputFormat", "cpAlphaChannel", "cpDisableInput", "cpDialogDisplay", "cpSaveClickOutside", "cpCloseClickOutside", "cpUseRootViewContainer", "cpPosition", "cpPositionOffset", "cpPositionRelativeToArrow", "cpOKButton", "cpOKButtonText", "cpOKButtonClass", "cpCancelButton", "cpCancelButtonText", "cpCancelButtonClass", "cpEyeDropper", "cpPresetLabel", "cpPresetColors", "cpPresetColorsClass", "cpMaxPresetColorsLength", "cpPresetEmptyMessage", "cpPresetEmptyMessageClass", "cpAddColorButton", "cpAddColorButtonText", "cpAddColorButtonClass", "cpRemoveColorButtonClass", "cpArrowPosition", "cpExtraTemplate"], outputs: ["cpInputChange", "cpToggleChange", "cpSliderChange", "cpSliderDragEnd", "cpSliderDragStart", "colorPickerOpen", "colorPickerClose", "colorPickerCancel", "colorPickerSelect", "colorPickerChange", "cpCmykColorChange", "cpPresetColorsChange"], exportAs: ["ngxColorPicker"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i12.MatAutocompleteField, selector: "mat-autocomplete-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "label", "appearance", "subscriptSizing", "placeholder", "suggestFn", "required", "hideRequiredMarker", "mobile", "clearable", "debounceTime", "displaySeparator", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "reloadItemsOnFocus", "clearInvalidValueOnBlur", "autofocus", "config", "i18nPrefix", "noResultMessage", "panelClass", "panelWidth", "disableRipple", "matAutocompletePosition", "multiple", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "debug", "showSearchBar", "stickySearchBar", "applyImplicitValue", "dropButtonTitle", "clearButtonTitle", "trimSearchText", "splitSearchText", "selectInputContentOnFocus", "selectInputContentOnFocusDelay", "previewImplicitValue", "showFavorites", "toggleFavoriteTitle", "favoriteItems", "colSizes", "class", "filter", "readonly", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keydown.backspace", "keyup.enter", "arrowUp", "arrowDown", "enter", "selectionChange", "openedChange", "toggleFavorite"] }, { kind: "component", type: i13.MatDate, selector: "mat-date-field", inputs: ["formControl", "formControlName", "placeholder", "floatLabel", "mobile", "compact", "autofocus", "clearable", "required", "startDate", "timezone", "datePickerFilter", "appearance", "subscriptSizing", "readonly", "tabindex"] }, { kind: "component", type: i14.MatDateTime, selector: "mat-date-time-field", inputs: ["logPrefix", "placeholder", "floatLabel", "mobile", "compact", "autofocus", "clearable", "startDate", "datePickerFilter", "allowNoTime", "dottedMinutesInGap", "timeHoursOnly", "debug", "class", "style", "hourMinWidth", "hourMaxWidth", "appearance", "subscriptSizing", "formControl", "formControlName", "required", "readonly", "tabindex"], outputs: ["focus", "blur", "keydown.escape", "keyup.enter"] }, { kind: "component", type: i15.MatBooleanField, selector: "mat-boolean-field", inputs: ["disabled", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "subscriptSizing", "readonly", "required", "compact", "autofocus", "style", "buttonsColCount", "class", "yesLabel", "noLabel", "showButtonIcons", "yesIcon", "noIcon", "clearable", "labelPosition", "tabindex", "showRadio", "value"], outputs: ["keyup.enter", "focus", "blur"] }, { kind: "component", type: i16.MatChipsField, selector: "mat-chips-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "placeholder", "suggestFn", "required", "mobile", "readonly", "clearable", "debounceTime", "displaySeparator", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "autofocus", "config", "i18nPrefix", "noResultMessage", "panelClass", "panelWidth", "disableRipple", "matAutocompletePosition", "itemSize", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "chipColor", "debug", "applyImplicitValue", "dropButtonTitle", "clearButtonTitle", "trimSearchText", "hideRequiredMarker", "colSizes", "separatorKeysCodes", "showChips", "appearance", "subscriptSizing", "class", "filter", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keyup.enter"] }, { kind: "directive", type: i17.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i18.IsNilOrBlankPipe, name: "isNilOrBlank" }, { kind: "pipe", type: i19.FormGetValuePipe, name: "formGetValue" }, { kind: "pipe", type: i20.MatColorPipe, name: "matColor" }, { kind: "pipe", type: i21.AsFloatLabelTypePipe, name: "asFloatLabelType" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
314
- }
315
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppFormField, decorators: [{
316
- type: Component,
317
- args: [{ selector: 'app-form-field', providers: [
318
- {
319
- provide: NG_VALUE_ACCESSOR,
320
- useExisting: forwardRef(() => AppFormField),
321
- multi: true,
322
- },
323
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container [ngSwitch]=\"type\">\n <!-- integer -->\n <mat-form-field\n *ngSwitchCase=\"'integer'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class]=\"classList\"\n >\n @if (placeholder && floatLabel !== 'never') {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input\n matInput\n #matInput\n type=\"number\"\n autocomplete=\"off\"\n [min]=\"definition.minValue\"\n [max]=\"definition.maxValue\"\n pattern=\"-?[0-9]*\"\n step=\"1\"\n [appAutofocus]=\"autofocus\"\n [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n (keypress)=\"filterNumberInput($event, false)\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabIndex]=\"tabindex\"\n (click)=\"selectInputContentFromEvent($event)\"\n />\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{ (compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate: formControl.errors['min'] }}\n </mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{ (compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate: formControl.errors['max'] }}\n </mat-error>\n <mat-error *ngIf=\"formControl.hasError('pattern')\">\n {{ 'ERROR.FIELD_NOT_VALID_INTEGER' | translate }}\n </mat-error>\n <mat-error *ngIf=\"formControl.hasError('integer')\">\n {{ 'ERROR.FIELD_NOT_VALID_INTEGER' | translate }}\n </mat-error>\n\n <button\n matSuffix\n *ngIf=\"clearable\"\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"formControl.reset()\"\n [hidden]=\"formControl.disabled || (formControl | formGetValue | isNilOrBlank)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n\n <!-- double -->\n <mat-form-field\n *ngSwitchCase=\"'double'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class]=\"classList\"\n >\n @if (placeholder && floatLabel !== 'never') {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input\n matInput\n #matInput\n type=\"number\"\n decimal=\"true\"\n autocomplete=\"off\"\n [min]=\"definition.minValue\"\n [max]=\"definition.maxValue\"\n [appAutofocus]=\"autofocus\"\n [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n [step]=\"numberInputStep\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n (keypress)=\"filterNumberInput($event, true)\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabIndex]=\"tabindex\"\n (click)=\"selectInputContentFromEvent($event)\"\n />\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('decimal')\" translate>ERROR.FIELD_NOT_VALID_DECIMAL</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{ (compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate: formControl.errors['min'] }}\n </mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{ (compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate: formControl.errors['max'] }}\n </mat-error>\n <mat-error *ngIf=\"formControl.hasError('maxDecimals')\">\n {{\n (compact ? 'ERROR.FIELD_MAXIMUM_DECIMALS_COMPACT' : 'ERROR.FIELD_MAXIMUM_DECIMALS')\n | translate: { maxDecimals: definition.maximumNumberDecimals }\n }}\n </mat-error>\n\n <button\n matSuffix\n *ngIf=\"clearable\"\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"formControl.reset()\"\n [hidden]=\"formControl.disabled || (formControl | formGetValue | isNilOrBlank)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n\n <!-- boolean -->\n <mat-boolean-field\n *ngSwitchCase=\"'boolean'\"\n #matInput\n [class]=\"classList\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [compact]=\"compact\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabindex]=\"tabindex\"\n >\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-boolean-field>\n\n <!-- date -->\n <mat-date-field\n *ngSwitchCase=\"'date'\"\n #matInput\n [class]=\"classList\"\n [formControl]=\"formControl\"\n [placeholder]=\"compact ? ('COMMON.DATE_PLACEHOLDER' | translate) : placeholder\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [required]=\"required\"\n [clearable]=\"clearable\"\n [readonly]=\"readonly\"\n [compact]=\"compact\"\n [tabindex]=\"tabindex\"\n [autofocus]=\"autofocus\"\n >\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-date-field>\n\n <!-- date time -->\n <mat-date-time-field\n *ngSwitchCase=\"'dateTime'\"\n #matInput\n [class]=\"classList\"\n [formControl]=\"formControl\"\n [placeholder]=\"compact ? ('COMMON.DATE_TIME_PLACEHOLDER' | translate) : placeholder\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [required]=\"required\"\n [clearable]=\"clearable\"\n [readonly]=\"readonly\"\n [compact]=\"compact\"\n [tabindex]=\"tabindex\"\n [autofocus]=\"autofocus\"\n >\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-date-time-field>\n\n <!-- enum -->\n <mat-form-field\n *ngSwitchCase=\"'enum'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class]=\"classList\"\n [class.mat-form-field-disabled]=\"readonly\"\n >\n <ng-content select=\"[matPrefix]\"></ng-content>\n\n @if (placeholder && floatLabel !== 'never') {\n <mat-label>{{ placeholder }}</mat-label>\n }\n @if (readonly) {\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n <ion-text>{{ formControl.value }}</ion-text>\n } @else {\n <mat-select\n [formControl]=\"formControl\"\n [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n >\n <mat-option *ngFor=\"let item of _values\" [value]=\"item.key\">{{ item.value | translate }}</mat-option>\n </mat-select>\n }\n\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n\n <!-- multi enum -->\n <mat-chips-field\n *ngSwitchCase=\"'enums'\"\n [class]=\"classList\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [formControl]=\"formControl\"\n [clearable]=\"clearable\"\n [items]=\"_values\"\n [displayAttributes]=\"definition.autocomplete?.attributes || ['key', 'value']\"\n [config]=\"definition.autocomplete\"\n [showAllOnFocus]=\"true\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [chipColor]=\"chipColor | matColor\"\n >\n <ng-content select=\"[matPrefix]\"></ng-content>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-chips-field>\n\n <!-- color -->\n <mat-form-field\n *ngSwitchCase=\"'color'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class]=\"classList\"\n >\n <ion-icon margin-right name=\"color-fill\" matPrefix></ion-icon>\n\n <input\n matInput\n autocomplete=\"off\"\n [appAutofocus]=\"autofocus\"\n [formControl]=\"formControl\"\n [style.color]=\"getColorContrast(formControl.value)\"\n [style.background]=\"formControl.value\"\n [colorPicker]=\"formControl.value\"\n (colorPickerChange)=\"writeValue($event)\"\n [cpSaveClickOutside]=\"true\"\n cpPosition=\"top\"\n cpOutputFormat=\"hex\"\n [cpOKButton]=\"false\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabIndex]=\"tabindex\"\n />\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n\n <!-- string -->\n <mat-form-field\n *ngSwitchCase=\"'string'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [class]=\"classList\"\n >\n @if (placeholder && floatLabel !== 'never') {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input\n matInput\n #matInput\n autocomplete=\"off\"\n [appAutofocus]=\"autofocus\"\n [formControl]=\"formControl\"\n [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabIndex]=\"tabindex\"\n (click)=\"selectInputContentFromEvent($event)\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n (keypress)=\"filterAlphanumericalInput($event)\"\n />\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <button\n matSuffix\n *ngIf=\"clearable\"\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"formControl.reset()\"\n [hidden]=\"formControl.disabled || (formControl | formGetValue | isNilOrBlank)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-form-field>\n\n <!-- auto-complete -->\n <mat-autocomplete-field\n *ngSwitchCase=\"'entity'\"\n #autocompleteField\n [class]=\"classList\"\n [autofocus]=\"autofocus\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [formControl]=\"formControl\"\n [config]=\"definition.autocomplete\"\n [hideRequiredMarker]=\"hideRequiredMarker\"\n [clearable]=\"clearable\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabindex]=\"tabindex\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n [displayWith]=\"getDisplayValueFn(definition)\"\n [panelClass]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n >\n <ng-content select=\"[matPrefix]\"></ng-content>\n <ng-content select=\"[matSuffix]\"></ng-content>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-autocomplete-field>\n\n <!-- multi auto-complete -->\n <mat-chips-field\n *ngSwitchCase=\"'entities'\"\n [class]=\"classList\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [formControl]=\"formControl\"\n [config]=\"definition.autocomplete\"\n [chipColor]=\"chipColor | matColor\"\n [clearable]=\"clearable\"\n [displayWith]=\"getDisplayValueFn(definition)\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabindex]=\"tabindex\"\n [panelClass]=\"panelClass\"\n [panelWidth]=\"panelWidth\"\n >\n <ng-content select=\"[matPrefix]\"></ng-content>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </mat-chips-field>\n\n <!-- other -->\n <div *ngSwitchDefault>\n <mat-error *ngIf=\"type\">\n Unknown type {{ type }} for option {{ definition.key }}. Please report this error.\n </mat-error>\n <mat-error *ngIf=\"!type\">Error on option field. Please check console log for details.</mat-error>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n <ng-content select=\"mat-error\"></ng-content>\n </div>\n</ng-container>\n", styles: [":host{display:inline-block;position:relative}button[hidden]{display:none}\n"] }]
324
- }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i0.ChangeDetectorRef }, { type: i0.Injector }, { type: i2.FormGroupDirective, decorators: [{
325
- type: Optional
326
- }] }], propDecorators: { definition: [{
327
- type: Input
328
- }], readonly: [{
329
- type: Input,
330
- args: [{ transform: booleanAttribute }]
331
- }], disabled: [{
332
- type: Input,
333
- args: [{ transform: booleanAttribute }]
334
- }], formControl: [{
335
- type: Input
336
- }], formControlName: [{
337
- type: Input
338
- }], placeholder: [{
339
- type: Input
340
- }], compact: [{
341
- type: Input,
342
- args: [{ transform: booleanAttribute }]
343
- }], required: [{
344
- type: Input,
345
- args: [{ transform: booleanAttribute }]
346
- }], hideRequiredMarker: [{
347
- type: Input,
348
- args: [{ transform: booleanAttribute }]
349
- }], floatLabel: [{
350
- type: Input
351
- }], label: [{
352
- type: Input
353
- }], appearance: [{
354
- type: Input
355
- }], subscriptSizing: [{
356
- type: Input
357
- }], tabindex: [{
358
- type: Input,
359
- args: [{ transform: numberAttribute }]
360
- }], autofocus: [{
361
- type: Input,
362
- args: [{ transform: booleanAttribute }]
363
- }], clearable: [{
364
- type: Input,
365
- args: [{ transform: booleanAttribute }]
366
- }], chipColor: [{
367
- type: Input
368
- }], classList: [{
369
- type: Input,
370
- args: ['class']
371
- }], debug: [{
372
- type: Input,
373
- args: [{ transform: booleanAttribute }]
374
- }], panelClass: [{
375
- type: Input
376
- }], panelWidth: [{
377
- type: Input
378
- }], onKeyupEnter: [{
379
- type: Output,
380
- args: ['keyup.enter']
381
- }], matInput: [{
382
- type: ViewChild,
383
- args: ['matInput']
384
- }], autocompleteField: [{
385
- type: ViewChild,
386
- args: ['autocompleteField']
387
- }] } });
388
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZm9ybS9maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9mb3JtL2ZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUVWLEtBQUssRUFDTCxlQUFlLEVBRWYsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUE0QyxpQkFBaUIsRUFBc0IsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xILE9BQU8sRUFBdUIsd0JBQXdCLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRTdGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDM0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFLM0MsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0FBZXRCLE1BQU0sT0FBTyxZQUFZO0lBdURYO0lBQ0E7SUFDQTtJQUNVO0lBekRkLGlCQUFpQixHQUFxQixJQUFJLENBQUM7SUFDM0Msa0JBQWtCLEdBQWUsSUFBSSxDQUFDO0lBQ3RDLFdBQVcsQ0FBc0I7SUFFL0IsT0FBTyxDQUFhO0lBRXBCLElB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Q2tDLE9BQU87c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsUUFBUTtzQkFBL0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxrQkFBa0I7c0JBQXpELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDaUMsUUFBUTtzQkFBOUMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBQ0csU0FBUztzQkFBaEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFRSxTQUFTO3NCQUFoRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUM3QixTQUFTO3NCQUFqQixLQUFLO2dCQUVVLFNBQVM7c0JBQXhCLEtBQUs7dUJBQUMsT0FBTztnQkFDMEIsS0FBSztzQkFBNUMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDN0IsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVpQixZQUFZO3NCQUFsQyxNQUFNO3VCQUFDLGFBQWE7Z0JBTUUsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQUNXLGlCQUFpQjtzQkFBaEQsU0FBUzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIG51bWJlckF0dHJpYnV0ZSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Hcm91cERpcmVjdGl2ZSwgTkdfVkFMVUVfQUNDRVNTT1IsIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGlzQmxhbmtTdHJpbmcsIGlzTmlsT3JCbGFuaywgaXNOb3ROaWwsIGlzTm90TmlsQm9vbGVhbiwgaXNOb3ROaWxPckJsYW5rLCB0b0Jvb2xlYW4gfSBmcm9tICcuLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgRm9ybUZpZWxkRGVmaW5pdGlvbiwgRm9ybUZpZWxkRGVmaW5pdGlvblV0aWxzLCBGb3JtRmllbGRUeXBlIH0gZnJvbSAnLi9maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBnZXRDb2xvckNvbnRyYXN0IH0gZnJvbSAnLi4vZ3JhcGgvY29sb3JzLnV0aWxzJztcbmltcG9ydCB7IGFzSW5wdXRFbGVtZW50LCBmaWx0ZXJOdW1iZXJJbnB1dCwgc2VsZWN0SW5wdXRDb250ZW50RnJvbUV2ZW50IH0gZnJvbSAnLi4vaW5wdXRzJztcbmltcG9ydCB7IHRvRGF0ZUlTT1N0cmluZyB9IGZyb20gJy4uL2RhdGVzJztcbmltcG9ydCB7IEFwcENvbG9ycywgQXBwRmxvYXRMYWJlbFR5cGUsIFByb3BlcnR5IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlRmllbGQgfSBmcm9tICcuLi9tYXRlcmlhbC9hdXRvY29tcGxldGUvbWF0ZXJpYWwuYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UsIFN1YnNjcmlwdFNpemluZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1mb3JtLWZpZWxkJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmllbGQuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpZWxkLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBcHBGb3JtRmllbGQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFwcEZvcm1GaWVsZCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcml2YXRlIF9vbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIF9kZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uO1xuXG4gIHByb3RlY3RlZCBfdmFsdWVzOiBQcm9wZXJ0eVtdO1xuXG4gIHByb3RlY3RlZCB0eXBlOiBGb3JtRmllbGRUeXBlO1xuICBwcm90ZWN0ZWQgbnVtYmVySW5wdXRTdGVwOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgc2V0IGRlZmluaXRpb24odmFsdWU6IEZvcm1GaWVsZERlZmluaXRpb24pIHtcbiAgICBpZiAoIXZhbHVlIHx8IHRoaXMuX2RlZmluaXRpb24gPT09IHZhbHVlKSByZXR1cm47IC8vIFNraXAgaXMgc2FtZSBvciBuaWxcbiAgICB0aGlzLl9kZWZpbml0aW9uID0gdmFsdWU7XG4gICAgdGhpcy5fb25EZWZpbml0aW9uQ2hhbmdlZCh2YWx1ZSk7XG4gIH1cblxuICBnZXQgZGVmaW5pdGlvbigpOiBGb3JtRmllbGREZWZpbml0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmaW5pdGlvbjtcbiAgfVxuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZWFkb25seSA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgQElucHV0KCkgZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjb21wYWN0ID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZXF1aXJlZDogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGhpZGVSZXF1aXJlZE1hcmtlciA9IGZhbHNlO1xuICBASW5wdXQoKSBmbG9hdExhYmVsOiBBcHBGbG9hdExhYmVsVHlwZSA9ICdhdXRvJztcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9IG51bGw7XG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIEBJbnB1dCgpIHN1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSB0YWJpbmRleDogbnVtYmVyO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgYXV0b2ZvY3VzOiBib29sZWFuO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjbGVhcmFibGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNoaXBDb2xvcjogQXBwQ29sb3JzID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCdjbGFzcycpIGNsYXNzTGlzdDogc3RyaW5nO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZGVidWcgPSBmYWxzZTtcbiAgQElucHV0KCkgcGFuZWxDbGFzczogc3RyaW5nO1xuICBASW5wdXQoKSBwYW5lbFdpZHRoOiBzdHJpbmc7XG5cbiAgQE91dHB1dCgna2V5dXAuZW50ZXInKSBvbktleXVwRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ21hdElucHV0JykgbWF0SW5wdXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2F1dG9jb21wbGV0ZUZpZWxkJykgYXV0b2NvbXBsZXRlRmllbGQ6IE1hdEF1dG9jb21wbGV0ZUZpZWxkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZm9ybUdyb3VwRGlyOiBGb3JtR3JvdXBEaXJlY3RpdmVcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY2hlY2tBbmRSZXNvbHZlRm9ybUNvbnRyb2woKTtcblxuICAgIGlmICghdGhpcy5fZGVmaW5pdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBtYW5kYXRvcnkgYXR0cmlidXRlICdkZWZpbml0aW9uJyBpbiA8YXBwLWZvcm0tZmllbGQ+LlwiKTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2RlZmluaXRpb24gIT09ICdvYmplY3QnKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGF0dHJpYnV0ZSAnZGVmaW5pdGlvbicgaW4gPGFwcC1mb3JtLWZpZWxkPi4gU2hvdWxkIGJlIGFuIG9iamVjdC5cIik7XG4gICAgdGhpcy5fb25EZWZpbml0aW9uQ2hhbmdlZCh0aGlzLl9kZWZpbml0aW9uLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIH1cblxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgaWYgKCh0aGlzLnR5cGUgPT09ICdpbnRlZ2VyJyB8fCB0aGlzLnR5cGUgPT09ICdkb3VibGUnKSAmJiBOdW1iZXIuaXNOYU4ob2JqKSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoXCJXQVJOOiB0cnlpbmcgdG8gc2V0IE5hTiB2YWx1ZSwgaW4gYW4gPGFwcC1mb3JtLWZpZWxkPiEgUmVzZXQgdG8gbnVsbFwiKTtcblxuICAgICAgb2JqID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICBvYmogPSBvYmogIT09ICdmYWxzZSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdkYXRlJykge1xuICAgICAgb2JqID0gdG9EYXRlSVNPU3RyaW5nKG9iaik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdlbnVtcycgJiYgaXNOb3ROaWwob2JqKSkge1xuICAgICAgbGV0IGNoYW5nZXMgPSBmYWxzZTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIG9iaiA9IG9iai50cmltKCkuc3BsaXQoL1t8LF0rLyk7XG4gICAgICAgICAgY2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udmVydCBvYmplY3QgdG8gYXJyYXlcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBvYmogPSBbb2JqXTtcbiAgICAgICAgICBjaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZEFycmF5ID0gKG9iaiB8fCBbXSlcbiAgICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNoYW5nZXMgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlcy5maW5kKCh2KSA9PiB2LmtleSA9PT0gaXRlbS50cmltKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcihpc05vdE5pbCk7XG4gICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICBvYmogPSB1cGRhdGVkQXJyYXk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdlbnRpdHknICYmIGlzTmlsT3JCbGFuayhvYmopKSB7XG4gICAgICBvYmogPSBudWxsO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnZW50aXRpZXMnICYmIGlzTm90TmlsKG9iaikpIHtcbiAgICAgIGxldCBjaGFuZ2VzID0gZmFsc2U7XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIG9iaiA9IG9iai50cmltKCk7XG4gICAgICAgICAgaWYgKG9iai5zdGFydHNXaXRoKCdbJykgJiYgb2JqLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2Uob2JqKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqID0gb2JqLnNwbGl0KC9bfCxdKy8pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb252ZXJ0IG9iamVjdCB0byBhcnJheVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIG9iaiA9IFtvYmpdO1xuICAgICAgICAgIGNoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVkQXJyYXkgPSAob2JqIHx8IFtdKVxuICAgICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiBpdGVtLnN0YXJ0c1dpdGgoJ3snKSAmJiBpdGVtLmVuZHNXaXRoKCd9JykpIHtcbiAgICAgICAgICAgIGl0ZW0gPSBKU09OLnBhcnNlKGl0ZW0pO1xuICAgICAgICAgICAgY2hhbmdlcyA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoaXNOb3ROaWxPckJsYW5rKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIG9iaiA9IHVwZGF0ZWRBcnJheTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9iaiAhPT0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoXCJTZXQgPGFwcC1mb3JtLWZpZWxkPiB2YWx1ZTogXCIsIG9iaik7XG5cbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShvYmosIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sob2JqKTtcbiAgICB9XG5cbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgPT09IGRpc2FibGVkKSByZXR1cm47IC8vIFNraXAgaWYgc2FtZVxuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbWFya0FzVG91Y2hlZCgpIHtcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJBbHBoYW51bWVyaWNhbElucHV0KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdFbnRlcicgJiYgdGhpcy5vbktleXVwRW50ZXIub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMub25LZXl1cEVudGVyLmVtaXQoZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBZGQgZmVhdHVyZXMgKGUuZy4gY2hlY2sgYWdhaW5zdCBhIHBhdHRlcm4pXG4gIH1cblxuICBmb2N1cygpIHtcbiAgICBpZiAodGhpcy5tYXRJbnB1dCkgdGhpcy5tYXRJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgZWxzZSBpZiAodGhpcy5hdXRvY29tcGxldGVGaWVsZCkgdGhpcy5hdXRvY29tcGxldGVGaWVsZC5mb2N1cygpO1xuICB9XG5cbiAgZmlsdGVyTnVtYmVySW5wdXQgPSBmaWx0ZXJOdW1iZXJJbnB1dDtcbiAgc2VsZWN0SW5wdXRDb250ZW50RnJvbUV2ZW50ID0gc2VsZWN0SW5wdXRDb250ZW50RnJvbUV2ZW50O1xuICBnZXREaXNwbGF5VmFsdWVGbiA9IEZvcm1GaWVsZERlZmluaXRpb25VdGlscy5nZXREaXNwbGF5VmFsdWVGbjtcblxuICBnZXRDb2xvckNvbnRyYXN0KGNvbG9yOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBpc05vdE5pbE9yQmxhbmsoY29sb3IpID8gZ2V0Q29sb3JDb250cmFzdChjb2xvciwgdHJ1ZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdG8gcmVsb2FkIHZhbHVlcywgaWYgbm90IGRldGVjdGVkXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcmVsb2FkSXRlbXModmFsdWU/OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2RlZmluaXRpb24pIHJldHVybjtcblxuICAgIHRoaXMuX29uRGVmaW5pdGlvbkNoYW5nZWQodGhpcy5fZGVmaW5pdGlvbik7XG5cbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGVGaWVsZCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmF1dG9jb21wbGV0ZUZpZWxkPy5yZWxvYWRJdGVtcyh2YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2QgLS0gKi9cblxuICBwcm90ZWN0ZWQgY29tcHV0ZU51bWJlcklucHV0U3RlcChkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICBpZiAoZGVmaW5pdGlvbi5tYXhpbXVtTnVtYmVyRGVjaW1hbHMgPiAwKSB7XG4gICAgICBsZXQgc3RlcCA9ICcwLic7XG4gICAgICBpZiAoZGVmaW5pdGlvbi5tYXhpbXVtTnVtYmVyRGVjaW1hbHMgPiAxKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVmaW5pdGlvbi5tYXhpbXVtTnVtYmVyRGVjaW1hbHMgLSAxOyBpKyspIHtcbiAgICAgICAgICBzdGVwICs9ICcwJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RlcCArPSAnMSc7XG4gICAgICByZXR1cm4gc3RlcDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcxJztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tBbmRSZXNvbHZlRm9ybUNvbnRyb2woKSB7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wpIHJldHVybjsgLy8gT0ssIHRoZXJlIGlzIGEgY29udHJvbFxuXG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwRGlyKSB7XG4gICAgICAvLyBUcnkgdG8gZmluZCB1c2luZyBkZWZpbml0aW9uLmtleSwgYXMgZm9ybUNvbnRyb2xOYW1lXG4gICAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuX2RlZmluaXRpb24ua2V5KSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2xOYW1lID0gdGhpcy5fZGVmaW5pdGlvbi5rZXk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtQ29udHJvbE5hbWUgPSAodGhpcy5mb3JtR3JvdXBEaXIuZGlyZWN0aXZlcyB8fCBbXSkuZmluZCgoZCkgPT4gdGhpcy5mb3JtQ29udHJvbE5hbWUgJiYgZC5uYW1lID09PSB0aGlzLmZvcm1Db250cm9sTmFtZSk7XG4gICAgICB0aGlzLmZvcm1Db250cm9sID0gZm9ybUNvbnRyb2xOYW1lICYmIGZvcm1Db250cm9sTmFtZS5jb250cm9sO1xuICAgICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cERpci5mb3JtLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSkgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5mb3JtQ29udHJvbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBhdHRyaWJ1dGUgJ2Zvcm1Db250cm9sJyBvciAnZm9ybUNvbnRyb2xOYW1lJyBpbiA8YXBwLWZvcm0tZmllbGQ+IGNvbXBvbmVudC5cIik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9vbkRlZmluaXRpb25DaGFuZ2VkKGRlZmluaXRpb246IEZvcm1GaWVsZERlZmluaXRpb24sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIHRoaXMudHlwZSA9IGRlZmluaXRpb24udHlwZTtcbiAgICBpZiAoIXRoaXMudHlwZSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhdHRyaWJ1dGUgJ2RlZmluaXRpb24nIGluIDxhcHAtZm9ybS1maWVsZD4uIE1pc3NpbmcgdHlwZSAhXCIpO1xuXG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXIgfHwgKHRoaXMuX2RlZmluaXRpb24ubGFiZWwgJiYgdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLl9kZWZpbml0aW9uLmxhYmVsKSk7XG4gICAgdGhpcy5yZXF1aXJlZCA9IGlzTm90TmlsQm9vbGVhbih0aGlzLnJlcXVpcmVkKVxuICAgICAgPyB0aGlzLnJlcXVpcmVkXG4gICAgICA6IHRoaXMuX2RlZmluaXRpb24ucmVxdWlyZWQgfHwgdGhpcy5mb3JtQ29udHJvbD8udmFsaWRhdG9yID09PSBWYWxpZGF0b3JzLnJlcXVpcmVkIHx8IGlzQmxhbmtTdHJpbmcodGhpcy5yZXF1aXJlZCk7XG4gICAgdGhpcy5kaXNhYmxlZCA9IHRvQm9vbGVhbih0aGlzLmRpc2FibGVkLCB0b0Jvb2xlYW4odGhpcy5fZGVmaW5pdGlvbi5kaXNhYmxlZCwgZmFsc2UpKTtcbiAgICB0aGlzLmNoaXBDb2xvciA9IHRoaXMuY2hpcENvbG9yID8/IGRlZmluaXRpb24uY2hpcENvbG9yO1xuXG4gICAgLy8gZG91YmxlXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RvdWJsZScpIHtcbiAgICAgIHRoaXMubnVtYmVySW5wdXRTdGVwID0gdGhpcy5jb21wdXRlTnVtYmVySW5wdXRTdGVwKGRlZmluaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm51bWJlcklucHV0U3RlcCA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gZW51bSAob3IgZW51bXMpXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2VudW0nIHx8IHRoaXMudHlwZSA9PT0gJ2VudW1zJykge1xuICAgICAgLy8gUmVzb2x2ZSBlbnVtIHZhbHVlc1xuICAgICAgdGhpcy5fdmFsdWVzID0gRm9ybUZpZWxkRGVmaW5pdGlvblV0aWxzLmdldEVudW1WYWx1ZXModGhpcy5pbmplY3RvciwgZGVmaW5pdGlvbi52YWx1ZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBSZXBhaW50XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvLyBSZWNvbXB1dGUgdGFiIGluZGV4LCBiZWNhdXNlIGlmIHR5cGUgY2hhbmdlZCwgdGhlbiBtYXRJbnB1dCBjYW4gaGF2ZSBjaGFuZ2VkXG4gICAgdGhpcy51cGRhdGVUYWJJbmRleCgxMDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVRhYkluZGV4KHRpbWVvdXQ/OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy50YWJpbmRleCAmJiB0aGlzLnRhYmluZGV4ICE9PSAtMSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhc0lucHV0RWxlbWVudCh0aGlzLm1hdElucHV0KTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50LnRhYkluZGV4ID0gdGhpcy50YWJpbmRleDtcbiAgICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXV0b2NvbXBsZXRlRmllbGQpIHtcbiAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUZpZWxkLnRhYmluZGV4ID0gdGhpcy50YWJpbmRleDtcbiAgICAgICAgfVxuICAgICAgfSwgdGltZW91dCB8fCAwKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInR5cGVcIj5cbiAgPCEtLSBpbnRlZ2VyIC0tPlxuICA8bWF0LWZvcm0tZmllbGRcbiAgICAqbmdTd2l0Y2hDYXNlPVwiJ2ludGVnZXInXCJcbiAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgIFtjbGFzc109XCJjbGFzc0xpc3RcIlxuICA+XG4gICAgQGlmIChwbGFjZWhvbGRlciAmJiBmbG9hdExhYmVsICE9PSAnbmV2ZXInKSB7XG4gICAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgfVxuXG4gICAgPGlucHV0XG4gICAgICBtYXRJbnB1dFxuICAgICAgI21hdElucHV0XG4gICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICBbbWluXT1cImRlZmluaXRpb24ubWluVmFsdWVcIlxuICAgICAgW21heF09XCJkZWZpbml0aW9uLm1heFZhbHVlXCJcbiAgICAgIHBhdHRlcm49XCItP1swLTldKlwiXG4gICAgICBzdGVwPVwiMVwiXG4gICAgICBbYXBwQXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiZmxvYXRMYWJlbCA9PT0gJ25ldmVyJyA/IHBsYWNlaG9sZGVyIDogbnVsbFwiXG4gICAgICAoa2V5dXAuZW50ZXIpPVwib25LZXl1cEVudGVyLmVtaXQoJGV2ZW50KVwiXG4gICAgICAoa2V5cHJlc3MpPVwiZmlsdGVyTnVtYmVySW5wdXQoJGV2ZW50LCBmYWxzZSlcIlxuICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgW3RhYkluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgIChjbGljayk9XCJzZWxlY3RJbnB1dENvbnRlbnRGcm9tRXZlbnQoJGV2ZW50KVwiXG4gICAgLz5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ21pbicpXCI+XG4gICAgICB7eyAoY29tcGFjdCA/ICdFUlJPUi5GSUVMRF9NSU5fQ09NUEFDVCcgOiAnRVJST1IuRklFTERfTUlOJykgfCB0cmFuc2xhdGU6IGZvcm1Db250cm9sLmVycm9yc1snbWluJ10gfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ21heCcpXCI+XG4gICAgICB7eyAoY29tcGFjdCA/ICdFUlJPUi5GSUVMRF9NQVhfQ09NUEFDVCcgOiAnRVJST1IuRklFTERfTUFYJykgfCB0cmFuc2xhdGU6IGZvcm1Db250cm9sLmVycm9yc1snbWF4J10gfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ3BhdHRlcm4nKVwiPlxuICAgICAge3sgJ0VSUk9SLkZJRUxEX05PVF9WQUxJRF9JTlRFR0VSJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LWVycm9yPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtQ29udHJvbC5oYXNFcnJvcignaW50ZWdlcicpXCI+XG4gICAgICB7eyAnRVJST1IuRklFTERfTk9UX1ZBTElEX0lOVEVHRVInIHwgdHJhbnNsYXRlIH19XG4gICAgPC9tYXQtZXJyb3I+XG5cbiAgICA8YnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgICpuZ0lmPVwiY2xlYXJhYmxlXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJmb3JtQ29udHJvbC5yZXNldCgpXCJcbiAgICAgIFtoaWRkZW5dPVwiZm9ybUNvbnRyb2wuZGlzYWJsZWQgfHwgKGZvcm1Db250cm9sIHwgZm9ybUdldFZhbHVlIHwgaXNOaWxPckJsYW5rKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFN1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWVycm9yXCI+PC9uZy1jb250ZW50PlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDwhLS0gZG91YmxlIC0tPlxuICA8bWF0LWZvcm0tZmllbGRcbiAgICAqbmdTd2l0Y2hDYXNlPVwiJ2RvdWJsZSdcIlxuICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgW2NsYXNzXT1cImNsYXNzTGlzdFwiXG4gID5cbiAgICBAaWYgKHBsYWNlaG9sZGVyICYmIGZsb2F0TGFiZWwgIT09ICduZXZlcicpIHtcbiAgICAgIDxtYXQtbGFiZWw+e3sgcGxhY2Vob2xkZXIgfX08L21hdC1sYWJlbD5cbiAgICB9XG5cbiAgICA8aW5wdXRcbiAgICAgIG1hdElucHV0XG4gICAgICAjbWF0SW5wdXRcbiAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgZGVjaW1hbD1cInRydWVcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIFttaW5dPVwiZGVmaW5pdGlvbi5taW5WYWx1ZVwiXG4gICAgICBbbWF4XT1cImRlZmluaXRpb24ubWF4VmFsdWVcIlxuICAgICAgW2FwcEF1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cImZsb2F0TGFiZWwgPT09ICduZXZlcicgPyBwbGFjZWhvbGRlciA6IG51bGxcIlxuICAgICAgW3N0ZXBdPVwibnVtYmVySW5wdXRTdGVwXCJcbiAgICAgIChrZXl1cC5lbnRlcik9XCJvbktleXVwRW50ZXIuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChrZXlwcmVzcyk9XCJmaWx0ZXJOdW1iZXJJbnB1dCgkZXZlbnQsIHRydWUpXCJcbiAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgIFt0YWJJbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAoY2xpY2spPVwic2VsZWN0SW5wdXRDb250ZW50RnJvbUV2ZW50KCRldmVudClcIlxuICAgIC8+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Db250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Db250cm9sLmhhc0Vycm9yKCdkZWNpbWFsJylcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RFQ0lNQUw8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ21pbicpXCI+XG4gICAgICB7eyAoY29tcGFjdCA/ICdFUlJPUi5GSUVMRF9NSU5fQ09NUEFDVCcgOiAnRVJST1IuRklFTERfTUlOJykgfCB0cmFuc2xhdGU6IGZvcm1Db250cm9sLmVycm9yc1snbWluJ10gfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ21heCcpXCI+XG4gICAgICB7eyAoY29tcGFjdCA/ICdFUlJPUi5GSUVMRF9NQVhfQ09NUEFDVCcgOiAnRVJST1IuRklFTERfTUFYJykgfCB0cmFuc2xhdGU6IGZvcm1Db250cm9sLmVycm9yc1snbWF4J10gfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ21heERlY2ltYWxzJylcIj5cbiAgICAgIHt7XG4gICAgICAgIChjb21wYWN0ID8gJ0VSUk9SLkZJRUxEX01BWElNVU1fREVDSU1BTFNfQ09NUEFDVCcgOiAnRVJST1IuRklFTERfTUFYSU1VTV9ERUNJTUFMUycpXG4gICAgICAgICAgfCB0cmFuc2xhdGU6IHsgbWF4RGVjaW1hbHM6IGRlZmluaXRpb24ubWF4aW11bU51bWJlckRlY2ltYWxzIH1cbiAgICAgIH19XG4gICAgPC9tYXQtZXJyb3I+XG5cbiAgICA8YnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgICpuZ0lmPVwiY2xlYXJhYmxlXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJmb3JtQ29udHJvbC5yZXNldCgpXCJcbiAgICAgIFtoaWRkZW5dPVwiZm9ybUNvbnRyb2wuZGlzYWJsZWQgfHwgKGZvcm1Db250cm9sIHwgZm9ybUdldFZhbHVlIHwgaXNOaWxPckJsYW5rKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1lcnJvclwiPjwvbmctY29udGVudD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8IS0tIGJvb2xlYW4gLS0+XG4gIDxtYXQtYm9vbGVhbi1maWVsZFxuICAgICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIlxuICAgICNtYXRJbnB1dFxuICAgIFtjbGFzc109XCJjbGFzc0xpc3RcIlxuICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsXCJcbiAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgW2NvbXBhY3RdPVwiY29tcGFjdFwiXG4gICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gID5cbiAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1lcnJvclwiPjwvbmctY29udGVudD5cbiAgPC9tYXQtYm9vbGVhbi1maWVsZD5cblxuICA8IS0tIGRhdGUgLS0+XG4gIDxtYXQtZGF0ZS1maWVsZFxuICAgICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIlxuICAgICNtYXRJbnB1dFxuICAgIFtjbGFzc109XCJjbGFzc0xpc3RcIlxuICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgW3BsYWNlaG9sZGVyXT1cImNvbXBhY3QgPyAoJ0NPTU1PTi5EQVRFX1BMQUNFSE9MREVSJyB8IHRyYW5zbGF0ZSkgOiBwbGFjZWhvbGRlclwiXG4gICAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbFwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgW2NsZWFyYWJsZV09XCJjbGVhcmFibGVcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgW2NvbXBhY3RdPVwiY29tcGFjdFwiXG4gICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXG4gID5cbiAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1lcnJvclwiPjwvbmctY29udGVudD5cbiAgPC9tYXQtZGF0ZS1maWVsZD5cblxuICA8IS0tIGRhdGUgdGltZSAtLT5cbiAgPG1hdC1kYXRlLXRpbWUtZmllbGRcbiAgICAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGVUaW1lJ1wiXG4gICAgI21hdElucHV0XG4gICAgW2NsYXNzXT1cImNsYXNzTGlzdFwiXG4gICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwiY29tcGFjdCA/ICgnQ09NTU9OLkRBVEVfVElNRV9QTEFDRUhPTERFUicgfCB0cmFuc2xhdGUpIDogcGxhY2Vob2xkZXJcIlxuICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWxcIlxuICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nXCJcbiAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgIFtjbGVhcmFibGVdPVwiY2xlYXJhYmxlXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgIFtjb21wYWN0XT1cImNvbXBhY3RcIlxuICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgW2F1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxuICA+XG4gICAgPGRpdiBtYXRTdWZmaXg+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0U3VmZml4XVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtZXJyb3JcIj48L25nLWNvbnRlbnQ+XG4gIDwvbWF0LWRhdGUtdGltZS1maWVsZD5cblxuICA8IS0tIGVudW0gLS0+XG4gIDxtYXQtZm9ybS1maWVsZFxuICAgICpuZ1N3aXRjaENhc2U9XCInZW51bSdcIlxuICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgW2NsYXNzXT1cImNsYXNzTGlzdFwiXG4gICAgW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkXT1cInJlYWRvbmx5XCJcbiAgPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuXG4gICAgQGlmIChwbGFjZWhvbGRlciAmJiBmbG9hdExhYmVsICE9PSAnbmV2ZXInKSB7XG4gICAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgfVxuICAgIEBpZiAocmVhZG9ubHkpIHtcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBoaWRkZW4gdHlwZT1cInRleHRcIiByZWFkb25seT1cInRydWVcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIiAvPlxuICAgICAgPGlvbi10ZXh0Pnt7IGZvcm1Db250cm9sLnZhbHVlIH19PC9pb24tdGV4dD5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJmbG9hdExhYmVsID09PSAnbmV2ZXInID8gcGxhY2Vob2xkZXIgOiBudWxsXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cIm9uS2V5dXBFbnRlci5lbWl0KCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBfdmFsdWVzXCIgW3ZhbHVlXT1cIml0ZW0ua2V5XCI+e3sgaXRlbS52YWx1ZSB8IHRyYW5zbGF0ZSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICB9XG5cbiAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Db250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWVycm9yXCI+PC9uZy1jb250ZW50PlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDwhLS0gbXVsdGkgZW51bSAtLT5cbiAgPG1hdC1jaGlwcy1maWVsZFxuICAgICpuZ1N3aXRjaENhc2U9XCInZW51bXMnXCJcbiAgICBbY2xhc3NdPVwiY2xhc3NMaXN0XCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWxcIlxuICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgW2NsZWFyYWJsZV09XCJjbGVhcmFibGVcIlxuICAgIFtpdGVtc109XCJfdmFsdWVzXCJcbiAgICBbZGlzcGxheUF0dHJpYnV0ZXNdPVwiZGVmaW5pdGlvbi5hdXRvY29tcGxldGU/LmF0dHJpYnV0ZXMgfHwgWydrZXknLCAndmFsdWUnXVwiXG4gICAgW2NvbmZpZ109XCJkZWZpbml0aW9uLmF1dG9jb21wbGV0ZVwiXG4gICAgW3Nob3dBbGxPbkZvY3VzXT1cInRydWVcIlxuICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbY2hpcENvbG9yXT1cImNoaXBDb2xvciB8IG1hdENvbG9yXCJcbiAgPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFN1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWVycm9yXCI+PC9uZy1jb250ZW50PlxuICA8L21hdC1jaGlwcy1maWVsZD5cblxuICA8IS0tIGNvbG9yIC0tPlxuICA8bWF0LWZvcm0tZmllbGRcbiAgICAqbmdTd2l0Y2hDYXNlPVwiJ2NvbG9yJ1wiXG4gICAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbCB8IGFzRmxvYXRMYWJlbFR5cGVcIlxuICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nXCJcbiAgICBbY2xhc3NdPVwiY2xhc3NMaXN0XCJcbiAgPlxuICAgIDxpb24taWNvbiBtYXJnaW4tcmlnaHQgbmFtZT1cImNvbG9yLWZpbGxcIiBtYXRQcmVmaXg+PC9pb24taWNvbj5cblxuICAgIDxpbnB1dFxuICAgICAgbWF0SW5wdXRcbiAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICBbYXBwQXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXG4gICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgW3N0eWxlLmNvbG9yXT1cImdldENvbG9yQ29udHJhc3QoZm9ybUNvbnRyb2wudmFsdWUpXCJcbiAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImZvcm1Db250cm9sLnZhbHVlXCJcbiAgICAgIFtjb2xvclBpY2tlcl09XCJmb3JtQ29udHJvbC52YWx1ZVwiXG4gICAgICAoY29sb3JQaWNrZXJDaGFuZ2UpPVwid3JpdGVWYWx1ZSgkZXZlbnQpXCJcbiAgICAgIFtjcFNhdmVDbGlja091dHNpZGVdPVwidHJ1ZVwiXG4gICAgICBjcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgIGNwT3V0cHV0Rm9ybWF0PVwiaGV4XCJcbiAgICAgIFtjcE9LQnV0dG9uXT1cImZhbHNlXCJcbiAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgW3RhYkluZGV4XT1cInRhYmluZGV4XCJcbiAgICAvPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1lcnJvclwiPjwvbmctY29udGVudD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8IS0tIHN0cmluZyAtLT5cbiAgPG1hdC1mb3JtLWZpZWxkXG4gICAgKm5nU3dpdGNoQ2FzZT1cIidzdHJpbmcnXCJcbiAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgIFtjbGFzc109XCJjbGFzc0xpc3RcIlxuICA+XG4gICAgQGlmIChwbGFjZWhvbGRlciAmJiBmbG9hdExhYmVsICE9PSAnbmV2ZXInKSB7XG4gICAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgfVxuICAgIDxpbnB1dFxuICAgICAgbWF0SW5wdXRcbiAgICAgICNtYXRJbnB1dFxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIFthcHBBdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcbiAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiZmxvYXRMYWJlbCA9PT0gJ25ldmVyJyA/IHBsYWNlaG9sZGVyIDogbnVsbFwiXG4gICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgIFt0YWJJbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAoY2xpY2spPVwic2VsZWN0SW5wdXRDb250ZW50RnJvbUV2ZW50KCRldmVudClcIlxuICAgICAgKGtleXVwLmVudGVyKT1cIm9uS2V5dXBFbnRlci5lbWl0KCRldmVudClcIlxuICAgICAgKGtleXByZXNzKT1cImZpbHRlckFscGhhbnVtZXJpY2FsSW5wdXQoJGV2ZW50KVwiXG4gICAgLz5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cblxuICAgIDxidXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgICAgKm5nSWY9XCJjbGVhcmFibGVcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImZvcm1Db250cm9sLnJlc2V0KClcIlxuICAgICAgW2hpZGRlbl09XCJmb3JtQ29udHJvbC5kaXNhYmxlZCB8fCAoZm9ybUNvbnRyb2wgfCBmb3JtR2V0VmFsdWUgfCBpc05pbE9yQmxhbmspXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGRpdiBtYXRTdWZmaXg+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0U3VmZml4XVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtZXJyb3JcIj48L25nLWNvbnRlbnQ+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPCEtLSBhdXRvLWNvbXBsZXRlIC0tPlxuICA8bWF0LWF1dG9jb21wbGV0ZS1maWVsZFxuICAgICpuZ1N3aXRjaENhc2U9XCInZW50aXR5J1wiXG4gICAgI2F1dG9jb21wbGV0ZUZpZWxkXG4gICAgW2NsYXNzXT1cImNsYXNzTGlzdFwiXG4gICAgW2F1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbFwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgW2NvbmZpZ109XCJkZWZpbml0aW9uLmF1dG9jb21wbGV0ZVwiXG4gICAgW2hpZGVSZXF1aXJlZE1hcmtlcl09XCJoaWRlUmVxdWlyZWRNYXJrZXJcIlxuICAgIFtjbGVhcmFibGVdPVwiY2xlYXJhYmxlXCJcbiAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAoa2V5dXAuZW50ZXIpPVwib25LZXl1cEVudGVyLmVtaXQoJGV2ZW50KVwiXG4gICAgW2Rpc3BsYXlXaXRoXT1cImdldERpc3BsYXlWYWx1ZUZuKGRlZmluaXRpb24pXCJcbiAgICBbcGFuZWxDbGFzc109XCJwYW5lbENsYXNzXCJcbiAgICBbcGFuZWxXaWR0aF09XCJwYW5lbFdpZHRoXCJcbiAgPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1lcnJvclwiPjwvbmctY29udGVudD5cbiAgPC9tYXQtYXV0b2NvbXBsZXRlLWZpZWxkPlxuXG4gIDwhLS0gbXVsdGkgYXV0by1jb21wbGV0ZSAtLT5cbiAgPG1hdC1jaGlwcy1maWVsZFxuICAgICpuZ1N3aXRjaENhc2U9XCInZW50aXRpZXMnXCJcbiAgICBbY2xhc3NdPVwiY2xhc3NMaXN0XCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWxcIlxuICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nXCJcbiAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgIFtjb25maWddPVwiZGVmaW5pdGlvbi5hdXRvY29tcGxldGVcIlxuICAgIFtjaGlwQ29sb3JdPVwiY2hpcENvbG9yIHwgbWF0Q29sb3JcIlxuICAgIFtjbGVhcmFibGVdPVwiY2xlYXJhYmxlXCJcbiAgICBbZGlzcGxheVdpdGhdPVwiZ2V0RGlzcGxheVZhbHVlRm4oZGVmaW5pdGlvbilcIlxuICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgIFtwYW5lbENsYXNzXT1cInBhbmVsQ2xhc3NcIlxuICAgIFtwYW5lbFdpZHRoXT1cInBhbmVsV2lkdGhcIlxuICA+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFByZWZpeF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPGRpdiBtYXRTdWZmaXg+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0U3VmZml4XVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtZXJyb3JcIj48L25nLWNvbnRlbnQ+XG4gIDwvbWF0LWNoaXBzLWZpZWxkPlxuXG4gIDwhLS0gb3RoZXIgLS0+XG4gIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwidHlwZVwiPlxuICAgICAgVW5rbm93biB0eXBlIHt7IHR5cGUgfX0gZm9yIG9wdGlvbiB7eyBkZWZpbml0aW9uLmtleSB9fS4gUGxlYXNlIHJlcG9ydCB0aGlzIGVycm9yLlxuICAgIDwvbWF0LWVycm9yPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCIhdHlwZVwiPkVycm9yIG9uIG9wdGlvbiBmaWVsZC4gUGxlYXNlIGNoZWNrIGNvbnNvbGUgbG9nIGZvciBkZXRhaWxzLjwvbWF0LWVycm9yPlxuICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFN1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWVycm9yXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19