@yuuvis/client-framework 0.6.5

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 (392) hide show
  1. package/README.md +62 -0
  2. package/actions/README.md +3 -0
  3. package/actions/index.d.ts +6 -0
  4. package/actions/lib/actions/copy-action/copy-action.d.ts +17 -0
  5. package/actions/lib/actions/cut-action/cut-action.d.ts +17 -0
  6. package/actions/lib/actions/delete-action/delete/delete.component.d.ts +22 -0
  7. package/actions/lib/actions/delete-action/delete-action.d.ts +17 -0
  8. package/actions/lib/actions/download-action/download-action.d.ts +17 -0
  9. package/actions/lib/actions.icon.d.ts +7 -0
  10. package/actions/lib/actions.interface.d.ts +86 -0
  11. package/actions/lib/actions.module.d.ts +8 -0
  12. package/actions/lib/actions.service.d.ts +38 -0
  13. package/actions/lib/components/contextmenu/contextmenu.component.d.ts +11 -0
  14. package/app-bar/README.md +3 -0
  15. package/app-bar/index.d.ts +1 -0
  16. package/app-bar/lib/app-bar.component.d.ts +47 -0
  17. package/clipboard/README.md +3 -0
  18. package/clipboard/index.d.ts +1 -0
  19. package/clipboard/lib/clipboard.component.d.ts +16 -0
  20. package/common/README.md +3 -0
  21. package/common/index.d.ts +5 -0
  22. package/common/lib/components/focus-indicator/focus-indicator.component.d.ts +7 -0
  23. package/common/lib/components/token-input/token-input.component.d.ts +55 -0
  24. package/common/lib/components/token-input/token-input.interface.d.ts +8 -0
  25. package/common/lib/directives/busy-overlay.directive.d.ts +25 -0
  26. package/common/lib/directives/click-double.directive.d.ts +17 -0
  27. package/common/lib/directives/container-size.directive.d.ts +30 -0
  28. package/common/lib/directives/drag-select.directive.d.ts +21 -0
  29. package/common/lib/directives/file-drop-zone/file-drop-zone.directive.d.ts +18 -0
  30. package/common/lib/directives/file-drop-zone/file-drop-zone.interface.d.ts +5 -0
  31. package/common/lib/directives/focus-within.directive.d.ts +36 -0
  32. package/common/lib/directives/index.d.ts +8 -0
  33. package/common/lib/directives/light-dismiss.directive.d.ts +19 -0
  34. package/common/lib/directives/longpress.directive.d.ts +13 -0
  35. package/common/lib/directives/noop-value-accessor.directive.d.ts +10 -0
  36. package/esm2022/actions/index.mjs +7 -0
  37. package/esm2022/actions/lib/actions/copy-action/copy-action.mjs +31 -0
  38. package/esm2022/actions/lib/actions/cut-action/cut-action.mjs +30 -0
  39. package/esm2022/actions/lib/actions/delete-action/delete/delete.component.mjs +67 -0
  40. package/esm2022/actions/lib/actions/delete-action/delete-action.mjs +44 -0
  41. package/esm2022/actions/lib/actions/download-action/download-action.mjs +33 -0
  42. package/esm2022/actions/lib/actions.icon.mjs +8 -0
  43. package/esm2022/actions/lib/actions.interface.mjs +19 -0
  44. package/esm2022/actions/lib/actions.module.mjs +16 -0
  45. package/esm2022/actions/lib/actions.service.mjs +89 -0
  46. package/esm2022/actions/lib/components/contextmenu/contextmenu.component.mjs +27 -0
  47. package/esm2022/actions/yuuvis-client-framework-actions.mjs +5 -0
  48. package/esm2022/app-bar/index.mjs +2 -0
  49. package/esm2022/app-bar/lib/app-bar.component.mjs +89 -0
  50. package/esm2022/app-bar/yuuvis-client-framework-app-bar.mjs +5 -0
  51. package/esm2022/clipboard/index.mjs +2 -0
  52. package/esm2022/clipboard/lib/clipboard.component.mjs +48 -0
  53. package/esm2022/clipboard/yuuvis-client-framework-clipboard.mjs +5 -0
  54. package/esm2022/common/index.mjs +6 -0
  55. package/esm2022/common/lib/components/focus-indicator/focus-indicator.component.mjs +41 -0
  56. package/esm2022/common/lib/components/token-input/token-input.component.mjs +324 -0
  57. package/esm2022/common/lib/components/token-input/token-input.interface.mjs +2 -0
  58. package/esm2022/common/lib/directives/busy-overlay.directive.mjs +88 -0
  59. package/esm2022/common/lib/directives/click-double.directive.mjs +61 -0
  60. package/esm2022/common/lib/directives/container-size.directive.mjs +56 -0
  61. package/esm2022/common/lib/directives/drag-select.directive.mjs +114 -0
  62. package/esm2022/common/lib/directives/file-drop-zone/file-drop-zone.directive.mjs +153 -0
  63. package/esm2022/common/lib/directives/file-drop-zone/file-drop-zone.interface.mjs +2 -0
  64. package/esm2022/common/lib/directives/focus-within.directive.mjs +81 -0
  65. package/esm2022/common/lib/directives/index.mjs +9 -0
  66. package/esm2022/common/lib/directives/light-dismiss.directive.mjs +44 -0
  67. package/esm2022/common/lib/directives/longpress.directive.mjs +36 -0
  68. package/esm2022/common/lib/directives/noop-value-accessor.directive.mjs +42 -0
  69. package/esm2022/common/yuuvis-client-framework-common.mjs +5 -0
  70. package/esm2022/forms/index.mjs +19 -0
  71. package/esm2022/forms/lib/elements/catalog/catalog.component.mjs +118 -0
  72. package/esm2022/forms/lib/elements/datetime/datetime.component.mjs +82 -0
  73. package/esm2022/forms/lib/elements/datetime-range/datetime-range.component.mjs +166 -0
  74. package/esm2022/forms/lib/elements/number/number.component.mjs +195 -0
  75. package/esm2022/forms/lib/elements/number-range/number-range.component.mjs +176 -0
  76. package/esm2022/forms/lib/elements/organization/organization.component.mjs +268 -0
  77. package/esm2022/forms/lib/elements/string/string.component.mjs +254 -0
  78. package/esm2022/forms/lib/form-input/form-input.component.mjs +88 -0
  79. package/esm2022/forms/lib/forms.module.mjs +58 -0
  80. package/esm2022/forms/yuuvis-client-framework-forms.mjs +5 -0
  81. package/esm2022/icons/index.mjs +4 -0
  82. package/esm2022/icons/lib/icon.service.mjs +59 -0
  83. package/esm2022/icons/lib/icons.mjs +31 -0
  84. package/esm2022/icons/lib/object-type-icon/object-type-icon.component.mjs +29 -0
  85. package/esm2022/icons/yuuvis-client-framework-icons.mjs +5 -0
  86. package/esm2022/index.mjs +2 -0
  87. package/esm2022/lib/yuuvis-client-framework.module.mjs +15 -0
  88. package/esm2022/list/index.mjs +3 -0
  89. package/esm2022/list/lib/list-item.directive.mjs +72 -0
  90. package/esm2022/list/lib/list.component.mjs +133 -0
  91. package/esm2022/list/yuuvis-client-framework-list.mjs +5 -0
  92. package/esm2022/metadata-form/index.mjs +4 -0
  93. package/esm2022/metadata-form/lib/metadata-default-templates/metadata-default-templates.component.mjs +31 -0
  94. package/esm2022/metadata-form/lib/metadata-form-element-registry.service.mjs +99 -0
  95. package/esm2022/metadata-form/lib/metadata-form-field/metadata-form-field.component.mjs +126 -0
  96. package/esm2022/metadata-form/lib/object-metadata-element-template.directive.mjs +52 -0
  97. package/esm2022/metadata-form/yuuvis-client-framework-metadata-form.mjs +5 -0
  98. package/esm2022/object-details/index.mjs +7 -0
  99. package/esm2022/object-details/lib/object-audit/object-audit.component.mjs +195 -0
  100. package/esm2022/object-details/lib/object-details-shell/object-details-shell.component.mjs +127 -0
  101. package/esm2022/object-details/lib/object-details.component.mjs +61 -0
  102. package/esm2022/object-details/lib/object-metadata/form-section-group.pipe.mjs +17 -0
  103. package/esm2022/object-details/lib/object-metadata/object-metadata.component.mjs +201 -0
  104. package/esm2022/object-details/lib/object-metadata/object-metadata.interface.mjs +2 -0
  105. package/esm2022/object-details/yuuvis-client-framework-object-details.mjs +5 -0
  106. package/esm2022/object-flavor/index.mjs +6 -0
  107. package/esm2022/object-flavor/lib/abstract-apply-create-flavor/abstract-apply-create-flavor.component.mjs +25 -0
  108. package/esm2022/object-flavor/lib/abstract-apply-object-flavor/abstract-apply-object-flavor.component.mjs +21 -0
  109. package/esm2022/object-flavor/lib/flavor-chip/flavor-chip.component.mjs +35 -0
  110. package/esm2022/object-flavor/lib/object-flavor/object-flavor.component.mjs +93 -0
  111. package/esm2022/object-flavor/lib/object-flavor-picker/object-flavor-picker.component.mjs +43 -0
  112. package/esm2022/object-flavor/yuuvis-client-framework-object-flavor.mjs +5 -0
  113. package/esm2022/object-form/index.mjs +5 -0
  114. package/esm2022/object-form/lib/form-scripting.api.interface.mjs +2 -0
  115. package/esm2022/object-form/lib/form-scripting.service.mjs +160 -0
  116. package/esm2022/object-form/lib/object-form-element/object-form-element.component.mjs +87 -0
  117. package/esm2022/object-form/lib/object-form-extension.interface.mjs +36 -0
  118. package/esm2022/object-form/lib/object-form-group/object-form-group.component.mjs +85 -0
  119. package/esm2022/object-form/lib/object-form-script/form-scripting-element-extension/form-scripting-element-extension.component.mjs +23 -0
  120. package/esm2022/object-form/lib/object-form-script/object-form-script.service.mjs +115 -0
  121. package/esm2022/object-form/lib/object-form-script/object-form-scripting-scope.mjs +251 -0
  122. package/esm2022/object-form/lib/object-form-translate.service.mjs +73 -0
  123. package/esm2022/object-form/lib/object-form.component.mjs +627 -0
  124. package/esm2022/object-form/lib/object-form.interface.mjs +9 -0
  125. package/esm2022/object-form/lib/object-form.model.mjs +20 -0
  126. package/esm2022/object-form/lib/object-form.service.mjs +127 -0
  127. package/esm2022/object-form/lib/object-form.utils.mjs +55 -0
  128. package/esm2022/object-form/lib/object-form.validation.mjs +48 -0
  129. package/esm2022/object-form/yuuvis-client-framework-object-form.mjs +5 -0
  130. package/esm2022/object-preview/index.mjs +3 -0
  131. package/esm2022/object-preview/lib/components/index.mjs +3 -0
  132. package/esm2022/object-preview/lib/components/object-email-preview/object-email-preview.component.mjs +45 -0
  133. package/esm2022/object-preview/lib/components/object-preview/object-preview.component.mjs +78 -0
  134. package/esm2022/object-preview/lib/services/object-preview.service.mjs +92 -0
  135. package/esm2022/object-preview/yuuvis-client-framework-object-preview.mjs +5 -0
  136. package/esm2022/object-summary/index.mjs +5 -0
  137. package/esm2022/object-summary/lib/multi-object-summary/multi-object-summary.component.mjs +33 -0
  138. package/esm2022/object-summary/lib/object-summary/object-summary.component.mjs +273 -0
  139. package/esm2022/object-summary/lib/object-summary-data/object-summary-data.component.mjs +80 -0
  140. package/esm2022/object-summary/lib/object-summary.module.mjs +15 -0
  141. package/esm2022/object-summary/yuuvis-client-framework-object-summary.mjs +5 -0
  142. package/esm2022/pagination/index.mjs +3 -0
  143. package/esm2022/pagination/lib/pagination.component.mjs +48 -0
  144. package/esm2022/pagination/lib/pagination.interface.mjs +2 -0
  145. package/esm2022/pagination/yuuvis-client-framework-pagination.mjs +5 -0
  146. package/esm2022/panel/index.mjs +2 -0
  147. package/esm2022/panel/lib/panel.component.mjs +20 -0
  148. package/esm2022/panel/yuuvis-client-framework-panel.mjs +5 -0
  149. package/esm2022/renderer/index.mjs +11 -0
  150. package/esm2022/renderer/lib/property-renderer/abstract.renderer.mjs +29 -0
  151. package/esm2022/renderer/lib/property-renderer/datetime.renderer.mjs +13 -0
  152. package/esm2022/renderer/lib/property-renderer/decimal.renderer.component.mjs +12 -0
  153. package/esm2022/renderer/lib/property-renderer/filesize.renderer.component.mjs +28 -0
  154. package/esm2022/renderer/lib/property-renderer/icon.renderer.component.mjs +23 -0
  155. package/esm2022/renderer/lib/property-renderer/integer.renderer.component.mjs +12 -0
  156. package/esm2022/renderer/lib/property-renderer/organization.renderer.mjs +19 -0
  157. package/esm2022/renderer/lib/property-renderer/string.renderer.component.mjs +12 -0
  158. package/esm2022/renderer/lib/property-renderer/unknown.renderer.mjs +12 -0
  159. package/esm2022/renderer/lib/renderer.directive.mjs +51 -0
  160. package/esm2022/renderer/lib/services/renderer/renderer.interface.mjs +2 -0
  161. package/esm2022/renderer/lib/services/renderer/renderer.service.mjs +84 -0
  162. package/esm2022/renderer/yuuvis-client-framework-renderer.mjs +5 -0
  163. package/esm2022/sequence-list/index.mjs +6 -0
  164. package/esm2022/sequence-list/lib/due-date-picker/due-date-picker.component.mjs +99 -0
  165. package/esm2022/sequence-list/lib/sequence-list-template-manage/sequence-list-template-manage.component.mjs +183 -0
  166. package/esm2022/sequence-list/lib/sequence-list-templates/sequence-list-templates.component.mjs +114 -0
  167. package/esm2022/sequence-list/lib/sequence-list.component.mjs +146 -0
  168. package/esm2022/sequence-list/lib/sequence-list.interface.mjs +2 -0
  169. package/esm2022/sequence-list/yuuvis-client-framework-sequence-list.mjs +5 -0
  170. package/esm2022/simple-search/index.mjs +3 -0
  171. package/esm2022/simple-search/lib/simple-search/simple-search.component.mjs +111 -0
  172. package/esm2022/simple-search/lib/simple-search/simple-search.interface.mjs +2 -0
  173. package/esm2022/simple-search/yuuvis-client-framework-simple-search.mjs +5 -0
  174. package/esm2022/tile-list/index.mjs +11 -0
  175. package/esm2022/tile-list/lib/tile/tile.component.mjs +53 -0
  176. package/esm2022/tile-list/lib/tile-config/action-select/action-select.component.mjs +22 -0
  177. package/esm2022/tile-list/lib/tile-config/icon-select/icon-select.component.mjs +33 -0
  178. package/esm2022/tile-list/lib/tile-config/property-select/property-select.component.mjs +91 -0
  179. package/esm2022/tile-list/lib/tile-config/tile-config-tile/tile-config-tile.component.mjs +66 -0
  180. package/esm2022/tile-list/lib/tile-config/tile-config-trigger/tile-config-trigger.component.mjs +46 -0
  181. package/esm2022/tile-list/lib/tile-config/tile-config.component.mjs +156 -0
  182. package/esm2022/tile-list/lib/tile-extension/directive/tile-extension.directive.mjs +37 -0
  183. package/esm2022/tile-list/lib/tile-extension/extensions/email.extension.mjs +42 -0
  184. package/esm2022/tile-list/lib/tile-extension/tile-extension.service.mjs +35 -0
  185. package/esm2022/tile-list/lib/tile-list/tile-list.component.mjs +510 -0
  186. package/esm2022/tile-list/lib/tile-list/tile-list.interface.mjs +2 -0
  187. package/esm2022/tile-list/yuuvis-client-framework-tile-list.mjs +5 -0
  188. package/esm2022/token-search/index.mjs +3 -0
  189. package/esm2022/token-search/token-search.component.mjs +78 -0
  190. package/esm2022/token-search/token-search.interface.mjs +2 -0
  191. package/esm2022/token-search/yuuvis-client-framework-token-search.mjs +5 -0
  192. package/esm2022/tree/index.mjs +3 -0
  193. package/esm2022/tree/lib/tree-node/tree-node.component.mjs +65 -0
  194. package/esm2022/tree/lib/tree.component.mjs +148 -0
  195. package/esm2022/tree/lib/tree.interface.mjs +2 -0
  196. package/esm2022/tree/lib/tree.service.mjs +95 -0
  197. package/esm2022/tree/yuuvis-client-framework-tree.mjs +5 -0
  198. package/esm2022/upload-progress/index.mjs +2 -0
  199. package/esm2022/upload-progress/lib/upload-progress/upload-progress-overlay/upload-progress-overlay.component.mjs +49 -0
  200. package/esm2022/upload-progress/lib/upload-progress/upload-progress.component.mjs +37 -0
  201. package/esm2022/upload-progress/yuuvis-client-framework-upload-progress.mjs +5 -0
  202. package/esm2022/user-avatar/index.mjs +3 -0
  203. package/esm2022/user-avatar/lib/user-avatar.component.mjs +69 -0
  204. package/esm2022/user-avatar/lib/user-avatar.module.mjs +24 -0
  205. package/esm2022/user-avatar/yuuvis-client-framework-user-avatar.mjs +5 -0
  206. package/esm2022/yuuvis-client-framework.mjs +5 -0
  207. package/fesm2022/yuuvis-client-framework-actions.mjs +333 -0
  208. package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -0
  209. package/fesm2022/yuuvis-client-framework-app-bar.mjs +96 -0
  210. package/fesm2022/yuuvis-client-framework-app-bar.mjs.map +1 -0
  211. package/fesm2022/yuuvis-client-framework-clipboard.mjs +55 -0
  212. package/fesm2022/yuuvis-client-framework-clipboard.mjs.map +1 -0
  213. package/fesm2022/yuuvis-client-framework-common.mjs +1020 -0
  214. package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -0
  215. package/fesm2022/yuuvis-client-framework-forms.mjs +1355 -0
  216. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -0
  217. package/fesm2022/yuuvis-client-framework-icons.mjs +123 -0
  218. package/fesm2022/yuuvis-client-framework-icons.mjs.map +1 -0
  219. package/fesm2022/yuuvis-client-framework-list.mjs +209 -0
  220. package/fesm2022/yuuvis-client-framework-list.mjs.map +1 -0
  221. package/fesm2022/yuuvis-client-framework-metadata-form.mjs +302 -0
  222. package/fesm2022/yuuvis-client-framework-metadata-form.mjs.map +1 -0
  223. package/fesm2022/yuuvis-client-framework-object-details.mjs +583 -0
  224. package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -0
  225. package/fesm2022/yuuvis-client-framework-object-flavor.mjs +200 -0
  226. package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -0
  227. package/fesm2022/yuuvis-client-framework-object-form.mjs +1664 -0
  228. package/fesm2022/yuuvis-client-framework-object-form.mjs.map +1 -0
  229. package/fesm2022/yuuvis-client-framework-object-preview.mjs +213 -0
  230. package/fesm2022/yuuvis-client-framework-object-preview.mjs.map +1 -0
  231. package/fesm2022/yuuvis-client-framework-object-summary.mjs +397 -0
  232. package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -0
  233. package/fesm2022/yuuvis-client-framework-pagination.mjs +55 -0
  234. package/fesm2022/yuuvis-client-framework-pagination.mjs.map +1 -0
  235. package/fesm2022/yuuvis-client-framework-panel.mjs +27 -0
  236. package/fesm2022/yuuvis-client-framework-panel.mjs.map +1 -0
  237. package/fesm2022/yuuvis-client-framework-renderer.mjs +262 -0
  238. package/fesm2022/yuuvis-client-framework-renderer.mjs.map +1 -0
  239. package/fesm2022/yuuvis-client-framework-sequence-list.mjs +519 -0
  240. package/fesm2022/yuuvis-client-framework-sequence-list.mjs.map +1 -0
  241. package/fesm2022/yuuvis-client-framework-simple-search.mjs +118 -0
  242. package/fesm2022/yuuvis-client-framework-simple-search.mjs.map +1 -0
  243. package/fesm2022/yuuvis-client-framework-tile-list.mjs +1036 -0
  244. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -0
  245. package/fesm2022/yuuvis-client-framework-token-search.mjs +85 -0
  246. package/fesm2022/yuuvis-client-framework-token-search.mjs.map +1 -0
  247. package/fesm2022/yuuvis-client-framework-tree.mjs +307 -0
  248. package/fesm2022/yuuvis-client-framework-tree.mjs.map +1 -0
  249. package/fesm2022/yuuvis-client-framework-upload-progress.mjs +84 -0
  250. package/fesm2022/yuuvis-client-framework-upload-progress.mjs.map +1 -0
  251. package/fesm2022/yuuvis-client-framework-user-avatar.mjs +96 -0
  252. package/fesm2022/yuuvis-client-framework-user-avatar.mjs.map +1 -0
  253. package/fesm2022/yuuvis-client-framework.mjs +22 -0
  254. package/fesm2022/yuuvis-client-framework.mjs.map +1 -0
  255. package/forms/README.md +3 -0
  256. package/forms/index.d.ts +9 -0
  257. package/forms/lib/elements/catalog/catalog.component.d.ts +68 -0
  258. package/forms/lib/elements/datetime/datetime.component.d.ts +32 -0
  259. package/forms/lib/elements/datetime-range/datetime-range.component.d.ts +51 -0
  260. package/forms/lib/elements/number/number.component.d.ts +77 -0
  261. package/forms/lib/elements/number-range/number-range.component.d.ts +66 -0
  262. package/forms/lib/elements/organization/organization.component.d.ts +93 -0
  263. package/forms/lib/elements/string/string.component.d.ts +104 -0
  264. package/forms/lib/form-input/form-input.component.d.ts +48 -0
  265. package/forms/lib/forms.module.d.ts +16 -0
  266. package/icons/README.md +5 -0
  267. package/icons/index.d.ts +3 -0
  268. package/icons/lib/icon.service.d.ts +38 -0
  269. package/icons/lib/icons.d.ts +1 -0
  270. package/icons/lib/object-type-icon/object-type-icon.component.d.ts +11 -0
  271. package/index.d.ts +1 -0
  272. package/lib/yuuvis-client-framework.module.d.ts +7 -0
  273. package/list/README.md +3 -0
  274. package/list/index.d.ts +2 -0
  275. package/list/lib/list-item.directive.d.ts +15 -0
  276. package/list/lib/list.component.d.ts +36 -0
  277. package/metadata-form/README.md +21 -0
  278. package/metadata-form/index.d.ts +3 -0
  279. package/metadata-form/lib/metadata-default-templates/metadata-default-templates.component.d.ts +5 -0
  280. package/metadata-form/lib/metadata-form-element-registry.service.d.ts +47 -0
  281. package/metadata-form/lib/metadata-form-field/metadata-form-field.component.d.ts +31 -0
  282. package/metadata-form/lib/object-metadata-element-template.directive.d.ts +27 -0
  283. package/object-details/README.md +28 -0
  284. package/object-details/index.d.ts +6 -0
  285. package/object-details/lib/object-audit/object-audit.component.d.ts +59 -0
  286. package/object-details/lib/object-details-shell/object-details-shell.component.d.ts +51 -0
  287. package/object-details/lib/object-details.component.d.ts +36 -0
  288. package/object-details/lib/object-metadata/form-section-group.pipe.d.ts +8 -0
  289. package/object-details/lib/object-metadata/object-metadata.component.d.ts +48 -0
  290. package/object-details/lib/object-metadata/object-metadata.interface.d.ts +26 -0
  291. package/object-flavor/README.md +3 -0
  292. package/object-flavor/index.d.ts +5 -0
  293. package/object-flavor/lib/abstract-apply-create-flavor/abstract-apply-create-flavor.component.d.ts +12 -0
  294. package/object-flavor/lib/abstract-apply-object-flavor/abstract-apply-object-flavor.component.d.ts +12 -0
  295. package/object-flavor/lib/flavor-chip/flavor-chip.component.d.ts +17 -0
  296. package/object-flavor/lib/object-flavor/object-flavor.component.d.ts +26 -0
  297. package/object-flavor/lib/object-flavor-picker/object-flavor-picker.component.d.ts +10 -0
  298. package/object-form/README.md +3 -0
  299. package/object-form/index.d.ts +4 -0
  300. package/object-form/lib/form-scripting.api.interface.d.ts +131 -0
  301. package/object-form/lib/form-scripting.service.d.ts +30 -0
  302. package/object-form/lib/object-form-element/object-form-element.component.d.ts +22 -0
  303. package/object-form/lib/object-form-extension.interface.d.ts +22 -0
  304. package/object-form/lib/object-form-group/object-form-group.component.d.ts +22 -0
  305. package/object-form/lib/object-form-script/form-scripting-element-extension/form-scripting-element-extension.component.d.ts +10 -0
  306. package/object-form/lib/object-form-script/object-form-script.service.d.ts +45 -0
  307. package/object-form/lib/object-form-script/object-form-scripting-scope.d.ts +50 -0
  308. package/object-form/lib/object-form-translate.service.d.ts +15 -0
  309. package/object-form/lib/object-form.component.d.ts +60 -0
  310. package/object-form/lib/object-form.interface.d.ts +113 -0
  311. package/object-form/lib/object-form.model.d.ts +18 -0
  312. package/object-form/lib/object-form.service.d.ts +39 -0
  313. package/object-form/lib/object-form.utils.d.ts +20 -0
  314. package/object-form/lib/object-form.validation.d.ts +21 -0
  315. package/object-preview/README.md +3 -0
  316. package/object-preview/index.d.ts +2 -0
  317. package/object-preview/lib/components/index.d.ts +2 -0
  318. package/object-preview/lib/components/object-email-preview/object-email-preview.component.d.ts +16 -0
  319. package/object-preview/lib/components/object-preview/object-preview.component.d.ts +13 -0
  320. package/object-preview/lib/services/object-preview.service.d.ts +37 -0
  321. package/object-summary/README.md +3 -0
  322. package/object-summary/index.d.ts +4 -0
  323. package/object-summary/lib/multi-object-summary/multi-object-summary.component.d.ts +7 -0
  324. package/object-summary/lib/object-summary/object-summary.component.d.ts +73 -0
  325. package/object-summary/lib/object-summary-data/object-summary-data.component.d.ts +11 -0
  326. package/object-summary/lib/object-summary.module.d.ts +7 -0
  327. package/package.json +173 -0
  328. package/pagination/README.md +3 -0
  329. package/pagination/index.d.ts +2 -0
  330. package/pagination/lib/pagination.component.d.ts +18 -0
  331. package/pagination/lib/pagination.interface.d.ts +5 -0
  332. package/panel/README.md +3 -0
  333. package/panel/index.d.ts +1 -0
  334. package/panel/lib/panel.component.d.ts +12 -0
  335. package/renderer/README.md +5 -0
  336. package/renderer/index.d.ts +10 -0
  337. package/renderer/lib/property-renderer/abstract.renderer.d.ts +14 -0
  338. package/renderer/lib/property-renderer/datetime.renderer.d.ts +6 -0
  339. package/renderer/lib/property-renderer/decimal.renderer.component.d.ts +6 -0
  340. package/renderer/lib/property-renderer/filesize.renderer.component.d.ts +7 -0
  341. package/renderer/lib/property-renderer/icon.renderer.component.d.ts +6 -0
  342. package/renderer/lib/property-renderer/integer.renderer.component.d.ts +6 -0
  343. package/renderer/lib/property-renderer/organization.renderer.d.ts +7 -0
  344. package/renderer/lib/property-renderer/string.renderer.component.d.ts +6 -0
  345. package/renderer/lib/property-renderer/unknown.renderer.d.ts +6 -0
  346. package/renderer/lib/renderer.directive.d.ts +17 -0
  347. package/renderer/lib/services/renderer/renderer.interface.d.ts +8 -0
  348. package/renderer/lib/services/renderer/renderer.service.d.ts +35 -0
  349. package/sequence-list/README.md +3 -0
  350. package/sequence-list/index.d.ts +5 -0
  351. package/sequence-list/lib/due-date-picker/due-date-picker.component.d.ts +28 -0
  352. package/sequence-list/lib/sequence-list-template-manage/sequence-list-template-manage.component.d.ts +52 -0
  353. package/sequence-list/lib/sequence-list-templates/sequence-list-templates.component.d.ts +36 -0
  354. package/sequence-list/lib/sequence-list.component.d.ts +43 -0
  355. package/sequence-list/lib/sequence-list.interface.d.ts +16 -0
  356. package/simple-search/README.md +3 -0
  357. package/simple-search/index.d.ts +2 -0
  358. package/simple-search/lib/simple-search/simple-search.component.d.ts +55 -0
  359. package/simple-search/lib/simple-search/simple-search.interface.d.ts +4 -0
  360. package/styles/client-framework.scss +27 -0
  361. package/tile-list/README.md +3 -0
  362. package/tile-list/index.d.ts +10 -0
  363. package/tile-list/lib/tile/tile.component.d.ts +22 -0
  364. package/tile-list/lib/tile-config/action-select/action-select.component.d.ts +13 -0
  365. package/tile-list/lib/tile-config/icon-select/icon-select.component.d.ts +11 -0
  366. package/tile-list/lib/tile-config/property-select/property-select.component.d.ts +25 -0
  367. package/tile-list/lib/tile-config/tile-config-tile/tile-config-tile.component.d.ts +20 -0
  368. package/tile-list/lib/tile-config/tile-config-trigger/tile-config-trigger.component.d.ts +17 -0
  369. package/tile-list/lib/tile-config/tile-config.component.d.ts +47 -0
  370. package/tile-list/lib/tile-extension/directive/tile-extension.directive.d.ts +11 -0
  371. package/tile-list/lib/tile-extension/extensions/email.extension.d.ts +10 -0
  372. package/tile-list/lib/tile-extension/tile-extension.service.d.ts +16 -0
  373. package/tile-list/lib/tile-list/tile-list.component.d.ts +116 -0
  374. package/tile-list/lib/tile-list/tile-list.interface.d.ts +18 -0
  375. package/token-search/README.md +3 -0
  376. package/token-search/index.d.ts +2 -0
  377. package/token-search/token-search.component.d.ts +22 -0
  378. package/token-search/token-search.interface.d.ts +4 -0
  379. package/tree/README.md +3 -0
  380. package/tree/index.d.ts +2 -0
  381. package/tree/lib/tree-node/tree-node.component.d.ts +21 -0
  382. package/tree/lib/tree.component.d.ts +53 -0
  383. package/tree/lib/tree.interface.d.ts +11 -0
  384. package/tree/lib/tree.service.d.ts +35 -0
  385. package/upload-progress/README.md +3 -0
  386. package/upload-progress/index.d.ts +1 -0
  387. package/upload-progress/lib/upload-progress/upload-progress-overlay/upload-progress-overlay.component.d.ts +17 -0
  388. package/upload-progress/lib/upload-progress/upload-progress.component.d.ts +16 -0
  389. package/user-avatar/README.md +3 -0
  390. package/user-avatar/index.d.ts +2 -0
  391. package/user-avatar/lib/user-avatar.component.d.ts +44 -0
  392. package/user-avatar/lib/user-avatar.module.d.ts +8 -0
@@ -0,0 +1,268 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, forwardRef, HostBinding, HostListener, inject, input, Input, Output, ViewChild } from '@angular/core';
3
+ import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { Classification, SystemService, TranslateModule, UserService, YuvUser } from '@yuuvis/client-core';
5
+ import { YUV_ICONS } from '@yuuvis/client-framework/icons';
6
+ import { AutoComplete, YvcAutocompleteModule } from '@yuuvis/components/autocomplete';
7
+ import { YvcIconModule } from '@yuuvis/components/icon';
8
+ import { forkJoin, of } from 'rxjs';
9
+ import { catchError } from 'rxjs/operators';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/forms";
12
+ import * as i2 from "@yuuvis/components/autocomplete";
13
+ import * as i3 from "@yuuvis/components/icon";
14
+ import * as i4 from "@yuuvis/client-core";
15
+ /**
16
+ * Creates form input for organisation values.
17
+ * Implements `ControlValueAccessor` so it can be used within Angular forms.
18
+ *
19
+ * [Screenshot](../assets/images/yuv-organization.gif)
20
+ *
21
+ * @example
22
+ * <yuv-organization [multiselect]="true"></yuv-organization>
23
+ */
24
+ export class OrganizationComponent {
25
+ constructor() {
26
+ this.system = inject(SystemService);
27
+ this.userService = inject(UserService);
28
+ this.minLength = 2;
29
+ this.icons = {
30
+ organizationMulti: YUV_ICONS['group'],
31
+ organization: YUV_ICONS['user']
32
+ };
33
+ this.isValidInput = true;
34
+ this.value = null;
35
+ this._innerValue = [];
36
+ this.autocompleteRes = [];
37
+ this.filterRoles = [];
38
+ /**
39
+ * Indicator that multiple strings could be inserted, they will be rendered as chips (default: false).
40
+ */
41
+ this.multiselect = false;
42
+ /**
43
+ * Will prevent the input from being changed (default: false)
44
+ */
45
+ this.readonly = false;
46
+ /**
47
+ * Set this to true and the component will try to gain focus once it has been rendered.
48
+ * Notice that this is not reliable. If there are any other components that are rendered
49
+ * later and also try to be focused, they will 'win', because there can only be one focus.
50
+ */
51
+ this.autofocus = false;
52
+ /**
53
+ * Will attch the overlay to this HTMLelement
54
+ */
55
+ this.appendTo = null;
56
+ /**
57
+ * Whether or not to exclude the current user from autocomplete result
58
+ */
59
+ this.excludeMe = false;
60
+ /**
61
+ * Whether or not the emitted value should be an object containing id and title
62
+ * or, if set to false only the ID
63
+ */
64
+ this.withMetadata = input(false);
65
+ this.userSelect = new EventEmitter();
66
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
67
+ this.propagateChange = (_) => { };
68
+ }
69
+ set innerValue(iv) {
70
+ this._innerValue = iv || [];
71
+ this.userSelect.emit(this._innerValue);
72
+ }
73
+ get innerValue() {
74
+ return this._innerValue;
75
+ }
76
+ // prevent ENTER from being propagated, because the component could be located
77
+ // inside some other component that also relys on ENTER
78
+ onKeydownHandler(event) {
79
+ event.stopPropagation();
80
+ }
81
+ get _inputDisabled() {
82
+ return !this.multiselect && this.innerValue?.length === 1;
83
+ }
84
+ set classifications(c) {
85
+ this._classifications = c;
86
+ if (c?.length) {
87
+ const classifications = this.system.getClassifications(c);
88
+ if (classifications.has(Classification.STRING_ORGANIZATION)) {
89
+ const options = classifications.get(Classification.STRING_ORGANIZATION).options;
90
+ this.filterRoles = options;
91
+ }
92
+ }
93
+ else {
94
+ this.filterRoles = [];
95
+ }
96
+ }
97
+ get classifications() {
98
+ return this._classifications;
99
+ }
100
+ writeValue(value) {
101
+ if (value) {
102
+ this.value = value;
103
+ this.resolveFn(value);
104
+ }
105
+ else {
106
+ this.value = null;
107
+ this.innerValue = [];
108
+ }
109
+ }
110
+ registerOnChange(fn) {
111
+ this.propagateChange = fn;
112
+ }
113
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
114
+ registerOnTouched(fn) { }
115
+ propagate() {
116
+ this.propagateChange(this.#getPropagateValue());
117
+ }
118
+ #getPropagateValue() {
119
+ return this.multiselect
120
+ ? this.withMetadata()
121
+ ? this.value
122
+ ? this._innerValue.map((v) => ({
123
+ id: v.id,
124
+ title: v.title
125
+ }))
126
+ : this.value
127
+ : this.value
128
+ : this.withMetadata()
129
+ ? this.value
130
+ ? {
131
+ id: this._innerValue[0].id,
132
+ title: this._innerValue[0].title
133
+ }
134
+ : this.value
135
+ : this.value;
136
+ }
137
+ focusInput() {
138
+ this.autoCompleteInput.focusInput();
139
+ }
140
+ resolveFn(value) {
141
+ const map = (value instanceof Array ? value : [value]).map((v) => {
142
+ const match = this.innerValue.find((iv) => iv.id === v);
143
+ return match
144
+ ? of(match)
145
+ : this.userService.getUserById(v).pipe(catchError(() => of(new YuvUser({
146
+ id: v,
147
+ title: v,
148
+ image: null
149
+ }, undefined))));
150
+ });
151
+ return forkJoin(map).subscribe((data) => {
152
+ this.innerValue = data;
153
+ // setTimeout(() => this.autoCompleteInput.cd.markForCheck());
154
+ });
155
+ }
156
+ autocompleteFn(query) {
157
+ if (query.length >= this.minLength) {
158
+ this.userService.queryUser(query, this.excludeMe, this.filterRoles).subscribe({
159
+ next: (users) => {
160
+ this.autocompleteRes = users.filter((user) => !this.innerValue.some((value) => value.id === user.id));
161
+ this.propagateValidity(this.autocompleteRes.length > 0);
162
+ },
163
+ error: () => {
164
+ this.autocompleteRes = [];
165
+ this.propagateValidity(this.autocompleteRes.length > 0);
166
+ }
167
+ });
168
+ }
169
+ else {
170
+ this.autocompleteRes = [];
171
+ }
172
+ }
173
+ // returns null when valid else the validation object
174
+ validate() {
175
+ return this.isValidInput ? null : { empty: { valid: false } };
176
+ }
177
+ propagateValidity(valid = true) {
178
+ if (this.isValidInput !== valid) {
179
+ this.isValidInput = valid;
180
+ this.propagate();
181
+ }
182
+ }
183
+ // handle selection changes to the model
184
+ onSelect() {
185
+ if (this.multiselect) {
186
+ this.value = this.innerValue.map((v) => v.id);
187
+ }
188
+ else {
189
+ // internal autocomplete control is always set to multiselect
190
+ // so the resolved value is always an array
191
+ this.innerValue = this.innerValue.slice(-1);
192
+ this.value = this.innerValue[0].id;
193
+ }
194
+ this.propagate();
195
+ }
196
+ // handle selection changes to the model
197
+ onUnselect(value) {
198
+ this.innerValue = this.innerValue.filter((v) => v.id !== value.id);
199
+ const _value = this.innerValue.map((v) => v.id);
200
+ this.value = this.multiselect ? _value : null;
201
+ if (!this.multiselect) {
202
+ this.clearInnerInput();
203
+ }
204
+ this.propagate();
205
+ }
206
+ onAutoCompleteBlur() {
207
+ this.clearInnerInput();
208
+ }
209
+ clearInnerInput() {
210
+ this.autoCompleteInput.clearInput();
211
+ }
212
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OrganizationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
213
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: OrganizationComponent, isStandalone: true, selector: "yuv-organization", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, situation: { classPropertyName: "situation", publicName: "situation", isSignal: false, isRequired: false, transformFunction: null }, multiselect: { classPropertyName: "multiselect", publicName: "multiselect", isSignal: false, isRequired: false, transformFunction: null }, classifications: { classPropertyName: "classifications", publicName: "classifications", isSignal: false, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: false, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: false, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: false, isRequired: false, transformFunction: null }, excludeMe: { classPropertyName: "excludeMe", publicName: "excludeMe", isSignal: false, isRequired: false, transformFunction: null }, withMetadata: { classPropertyName: "withMetadata", publicName: "withMetadata", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { userSelect: "userSelect" }, host: { listeners: { "keydown.enter": "onKeydownHandler($event)" }, properties: { "class.inputDisabled": "this._inputDisabled" } }, providers: [
214
+ {
215
+ provide: NG_VALUE_ACCESSOR,
216
+ useExisting: forwardRef(() => OrganizationComponent),
217
+ multi: true
218
+ },
219
+ {
220
+ provide: NG_VALIDATORS,
221
+ useExisting: forwardRef(() => OrganizationComponent),
222
+ multi: true
223
+ }
224
+ ], viewQueries: [{ propertyName: "autoCompleteInput", first: true, predicate: ["autocomplete"], descendants: true }], ngImport: i0, template: "<yvc-autocomplete\n [(ngModel)]=\"innerValue\"\n #autocomplete\n (suggestionSelect)=\"onSelect()\"\n [placeholder]=\"placeholder\"\n (suggestionUnselect)=\"onUnselect($event)\"\n (blur)=\"onAutoCompleteBlur()\"\n [disabled]=\"readonly\"\n [autocompleteValues]=\"autocompleteRes\"\n field=\"id\"\n [forceSelection]=\"true\"\n (autocompleteFnc)=\"autocompleteFn($event)\"\n [multiple]=\"true\"\n>\n <!-- template for item inside the dropdown -->\n <ng-template #autocompleteOptionTemplate let-item>\n <span class=\"chip\">{{ item.title }}</span>\n </ng-template>\n \n <!-- template for chip -->\n <ng-template #chipTemplate let-item>\n <span class=\"chip\">{{ item.title }}</span>\n </ng-template>\n</yvc-autocomplete>\n\n<yvc-icon\n class=\"classify\"\n [title]=\"'yuv.form.element.organization.classify.icon.title' | translate\"\n [svg]=\"multiselect ? icons.organizationMulti : icons.organization\"\n (click)=\"focusInput()\"\n></yvc-icon>\n", styles: [":host{display:flex;align-items:center}:host ::ng-deep .chip{--yvc-form-element-border-color: var(--text-color-hint)}:host yvc-autocomplete{flex:1;--yvc-form-element-focus-border-color: transparent;--yvc-form-element-focus-outline-color: transparent}:host yvc-icon.classify{width:18px;height:18px;padding:calc(var(--app-pane-padding) / 8);color:var(--text-color-hint)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: YvcAutocompleteModule }, { kind: "component", type: i2.AutoComplete, selector: "yvc-autocomplete", inputs: ["field", "placeholder", "minLength", "multiple", "typeahead", "distinctValues", "forceSelection", "autocompleteValues", "disabled"], outputs: ["autocompleteFnc", "blur", "focus", "suggestionUnselect", "suggestionSelect"] }, { kind: "ngmodule", type: YvcIconModule }, { kind: "component", type: i3.Icon, selector: "yvc-icon", inputs: ["label", "svg", "svgSrc"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] }); }
225
+ }
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OrganizationComponent, decorators: [{
227
+ type: Component,
228
+ args: [{ selector: 'yuv-organization', standalone: true, imports: [CommonModule, FormsModule, YvcAutocompleteModule, YvcIconModule, TranslateModule], providers: [
229
+ {
230
+ provide: NG_VALUE_ACCESSOR,
231
+ useExisting: forwardRef(() => OrganizationComponent),
232
+ multi: true
233
+ },
234
+ {
235
+ provide: NG_VALIDATORS,
236
+ useExisting: forwardRef(() => OrganizationComponent),
237
+ multi: true
238
+ }
239
+ ], template: "<yvc-autocomplete\n [(ngModel)]=\"innerValue\"\n #autocomplete\n (suggestionSelect)=\"onSelect()\"\n [placeholder]=\"placeholder\"\n (suggestionUnselect)=\"onUnselect($event)\"\n (blur)=\"onAutoCompleteBlur()\"\n [disabled]=\"readonly\"\n [autocompleteValues]=\"autocompleteRes\"\n field=\"id\"\n [forceSelection]=\"true\"\n (autocompleteFnc)=\"autocompleteFn($event)\"\n [multiple]=\"true\"\n>\n <!-- template for item inside the dropdown -->\n <ng-template #autocompleteOptionTemplate let-item>\n <span class=\"chip\">{{ item.title }}</span>\n </ng-template>\n \n <!-- template for chip -->\n <ng-template #chipTemplate let-item>\n <span class=\"chip\">{{ item.title }}</span>\n </ng-template>\n</yvc-autocomplete>\n\n<yvc-icon\n class=\"classify\"\n [title]=\"'yuv.form.element.organization.classify.icon.title' | translate\"\n [svg]=\"multiselect ? icons.organizationMulti : icons.organization\"\n (click)=\"focusInput()\"\n></yvc-icon>\n", styles: [":host{display:flex;align-items:center}:host ::ng-deep .chip{--yvc-form-element-border-color: var(--text-color-hint)}:host yvc-autocomplete{flex:1;--yvc-form-element-focus-border-color: transparent;--yvc-form-element-focus-outline-color: transparent}:host yvc-icon.classify{width:18px;height:18px;padding:calc(var(--app-pane-padding) / 8);color:var(--text-color-hint)}\n"] }]
240
+ }], propDecorators: { autoCompleteInput: [{
241
+ type: ViewChild,
242
+ args: ['autocomplete']
243
+ }], onKeydownHandler: [{
244
+ type: HostListener,
245
+ args: ['keydown.enter', ['$event']]
246
+ }], _inputDisabled: [{
247
+ type: HostBinding,
248
+ args: ['class.inputDisabled']
249
+ }], placeholder: [{
250
+ type: Input
251
+ }], situation: [{
252
+ type: Input
253
+ }], multiselect: [{
254
+ type: Input
255
+ }], classifications: [{
256
+ type: Input
257
+ }], readonly: [{
258
+ type: Input
259
+ }], autofocus: [{
260
+ type: Input
261
+ }], appendTo: [{
262
+ type: Input
263
+ }], excludeMe: [{
264
+ type: Input
265
+ }], userSelect: [{
266
+ type: Output
267
+ }] } });
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvZm9ybXMvc3JjL2xpYi9lbGVtZW50cy9vcmdhbml6YXRpb24vb3JnYW5pemF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvZm9ybXMvc3JjL2xpYi9lbGVtZW50cy9vcmdhbml6YXRpb24vb3JnYW5pemF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hJLE9BQU8sRUFBd0IsV0FBVyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hILE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0csT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7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S0FBSztnQkFJRyxXQUFXO3NCQUFuQixLQUFLO2dCQUtPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBbUJHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsU0FBUztzQkFBakIsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBUUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgaW5qZWN0LCBpbnB1dCwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDbGFzc2lmaWNhdGlvbiwgU3lzdGVtU2VydmljZSwgVHJhbnNsYXRlTW9kdWxlLCBVc2VyU2VydmljZSwgWXV2VXNlciB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgWVVWX0lDT05TIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtZnJhbWV3b3JrL2ljb25zJztcbmltcG9ydCB7IEF1dG9Db21wbGV0ZSwgWXZjQXV0b2NvbXBsZXRlTW9kdWxlIH0gZnJvbSAnQHl1dXZpcy9jb21wb25lbnRzL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBZdmNJY29uTW9kdWxlIH0gZnJvbSAnQHl1dXZpcy9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHsgZm9ya0pvaW4sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIENyZWF0ZXMgZm9ybSBpbnB1dCBmb3Igb3JnYW5pc2F0aW9uIHZhbHVlcy5cbiAqIEltcGxlbWVudHMgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoaW4gQW5ndWxhciBmb3Jtcy5cbiAqXG4gKiBbU2NyZWVuc2hvdF0oLi4vYXNzZXRzL2ltYWdlcy95dXYtb3JnYW5pemF0aW9uLmdpZilcbiAqXG4gKiBAZXhhbXBsZVxuICogPHl1di1vcmdhbml6YXRpb24gW211bHRpc2VsZWN0XT1cInRydWVcIj48L3l1di1vcmdhbml6YXRpb24+XG4gKi9cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXV2LW9yZ2FuaXphdGlvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBZdmNBdXRvY29tcGxldGVNb2R1bGUsIFl2Y0ljb25Nb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9vcmdhbml6YXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vcmdhbml6YXRpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcmdhbml6YXRpb25Db21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcmdhbml6YXRpb25Db21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciB7XG4gIHByaXZhdGUgc3lzdGVtID0gaW5qZWN0KFN5c3RlbVNlcnZpY2UpO1xuICBwcml2YXRlIHVzZXJTZXJ2aWNlID0gaW5qZWN0KFVzZXJTZXJ2aWNlKTtcblxuICBAVmlld0NoaWxkKCdhdXRvY29tcGxldGUnKSBhdXRvQ29tcGxldGVJbnB1dCE6IEF1dG9Db21wbGV0ZTtcbiAgbWluTGVuZ3RoID0gMjtcblxuICBpY29ucyA9IHtcbiAgICBvcmdhbml6YXRpb25NdWx0aTogWVVWX0lDT05TWydncm91cCddLFxuICAgIG9yZ2FuaXphdGlvbjogWVVWX0lDT05TWyd1c2VyJ11cbiAgfTtcblxuICBwcml2YXRlIGlzVmFsaWRJbnB1dCA9IHRydWU7XG4gIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuICBfaW5uZXJWYWx1ZTogWXV2VXNlcltdID0gW107XG4gIHNldCBpbm5lclZhbHVlKGl2OiBZdXZVc2VyW10pIHtcbiAgICB0aGlzLl9pbm5lclZhbHVlID0gaXYgfHwgW107XG4gICAgdGhpcy51c2VyU2VsZWN0LmVtaXQodGhpcy5faW5uZXJWYWx1ZSk7XG4gIH1cbiAgZ2V0IGlubmVyVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lubmVyVmFsdWU7XG4gIH1cbiAgYXV0b2NvbXBsZXRlUmVzOiBZdXZVc2VyW10gPSBbXTtcbiAgcHJpdmF0ZSBmaWx0ZXJSb2xlczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBwcmV2ZW50IEVOVEVSIGZyb20gYmVpbmcgcHJvcGFnYXRlZCwgYmVjYXVzZSB0aGUgY29tcG9uZW50IGNvdWxkIGJlIGxvY2F0ZWRcbiAgLy8gaW5zaWRlIHNvbWUgb3RoZXIgY29tcG9uZW50IHRoYXQgYWxzbyByZWx5cyBvbiBFTlRFUlxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcbiAgb25LZXlkb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pbnB1dERpc2FibGVkJykgZ2V0IF9pbnB1dERpc2FibGVkKCkge1xuICAgIHJldHVybiAhdGhpcy5tdWx0aXNlbGVjdCAmJiB0aGlzLmlubmVyVmFsdWU/Lmxlbmd0aCA9PT0gMTtcbiAgfVxuICAvLyBASG9zdEJpbmRpbmcoJ2NsYXNzLmlucHV0RGlydHknKSBnZXQgX2lucHV0RGlydHkoKSB7XG4gIC8vICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlSW5wdXQ/Lm11bHRpSW5wdXRFTD8ubmF0aXZlRWxlbWVudD8udmFsdWU7XG4gIC8vIH1cblxuICBASW5wdXQoKSBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFBvc3NpYmxlcyB2YWx1ZXMgYXJlIGBFRElUYCAoZGVmYXVsdCksYFNFQVJDSGAsYENSRUFURWAuIEluIHNlYXJjaCBzaXR1YXRpb24gdmFsaWRhdGlvbiBvZiB0aGUgZm9ybSBlbGVtZW50IHdpbGwgYmUgdHVybmVkIG9mZiwgc28geW91IGFyZSBhYmxlIHRvIGVudGVyIHNlYXJjaCB0ZXJtcyB0aGF0IGRvIG5vdCBtZWV0IHRoZSBlbGVtZW50cyB2YWxpZGF0b3JzLlxuICAgKi9cbiAgQElucHV0KCkgc2l0dWF0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogSW5kaWNhdG9yIHRoYXQgbXVsdGlwbGUgc3RyaW5ncyBjb3VsZCBiZSBpbnNlcnRlZCwgdGhleSB3aWxsIGJlIHJlbmRlcmVkIGFzIGNoaXBzIChkZWZhdWx0OiBmYWxzZSkuXG4gICAqL1xuICBASW5wdXQoKSBtdWx0aXNlbGVjdCA9IGZhbHNlO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBzZW1hbnRpY3MgZm9yIHRoZSBmb3JtIGVsZW1lbnQuXG4gICAqL1xuICBwcml2YXRlIF9jbGFzc2lmaWNhdGlvbnM/OiBzdHJpbmdbXTtcbiAgQElucHV0KCkgc2V0IGNsYXNzaWZpY2F0aW9ucyhjOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NsYXNzaWZpY2F0aW9ucyA9IGM7XG4gICAgaWYgKGM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgY2xhc3NpZmljYXRpb25zID0gdGhpcy5zeXN0ZW0uZ2V0Q2xhc3NpZmljYXRpb25zKGMpO1xuICAgICAgaWYgKGNsYXNzaWZpY2F0aW9ucy5oYXMoQ2xhc3NpZmljYXRpb24uU1RSSU5HX09SR0FOSVpBVElPTikpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGNsYXNzaWZpY2F0aW9ucy5nZXQoQ2xhc3NpZmljYXRpb24uU1RSSU5HX09SR0FOSVpBVElPTikhLm9wdGlvbnM7XG4gICAgICAgIHRoaXMuZmlsdGVyUm9sZXMgPSBvcHRpb25zO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbHRlclJvbGVzID0gW107XG4gICAgfVxuICB9XG4gIGdldCBjbGFzc2lmaWNhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzaWZpY2F0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaWxsIHByZXZlbnQgdGhlIGlucHV0IGZyb20gYmVpbmcgY2hhbmdlZCAoZGVmYXVsdDogZmFsc2UpXG4gICAqL1xuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRoaXMgdG8gdHJ1ZSBhbmQgdGhlIGNvbXBvbmVudCB3aWxsIHRyeSB0byBnYWluIGZvY3VzIG9uY2UgaXQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqIE5vdGljZSB0aGF0IHRoaXMgaXMgbm90IHJlbGlhYmxlLiBJZiB0aGVyZSBhcmUgYW55IG90aGVyIGNvbXBvbmVudHMgdGhhdCBhcmUgcmVuZGVyZWRcbiAgICogbGF0ZXIgYW5kIGFsc28gdHJ5IHRvIGJlIGZvY3VzZWQsIHRoZXkgd2lsbCAnd2luJywgYmVjYXVzZSB0aGVyZSBjYW4gb25seSBiZSBvbmUgZm9jdXMuXG4gICAqL1xuICBASW5wdXQoKSBhdXRvZm9jdXMgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2lsbCBhdHRjaCB0aGUgb3ZlcmxheSB0byB0aGlzIEhUTUxlbGVtZW50XG4gICAqL1xuICBASW5wdXQoKSBhcHBlbmRUbyA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGV4Y2x1ZGUgdGhlIGN1cnJlbnQgdXNlciBmcm9tIGF1dG9jb21wbGV0ZSByZXN1bHRcbiAgICovXG4gIEBJbnB1dCgpIGV4Y2x1ZGVNZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZW1pdHRlZCB2YWx1ZSBzaG91bGQgYmUgYW4gb2JqZWN0IGNvbnRhaW5pbmcgaWQgYW5kIHRpdGxlXG4gICAqIG9yLCBpZiBzZXQgdG8gZmFsc2Ugb25seSB0aGUgSURcbiAgICovXG4gIHdpdGhNZXRhZGF0YSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBAT3V0cHV0KCkgdXNlclNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8WXV2VXNlcltdPigpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLnJlc29sdmVGbih2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgdGhpcy5pbm5lclZhbHVlID0gW107XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge31cblxuICBwcml2YXRlIHByb3BhZ2F0ZSgpIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLiNnZXRQcm9wYWdhdGVWYWx1ZSgpKTtcbiAgfVxuXG4gICNnZXRQcm9wYWdhdGVWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aXNlbGVjdFxuICAgICAgPyB0aGlzLndpdGhNZXRhZGF0YSgpXG4gICAgICAgID8gdGhpcy52YWx1ZVxuICAgICAgICAgID8gdGhpcy5faW5uZXJWYWx1ZS5tYXAoKHYpID0+ICh7XG4gICAgICAgICAgICAgIGlkOiB2LmlkLFxuICAgICAgICAgICAgICB0aXRsZTogdi50aXRsZVxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgOiB0aGlzLnZhbHVlXG4gICAgICAgIDogdGhpcy52YWx1ZVxuICAgICAgOiB0aGlzLndpdGhNZXRhZGF0YSgpXG4gICAgICAgID8gdGhpcy52YWx1ZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBpZDogdGhpcy5faW5uZXJWYWx1ZVswXS5pZCxcbiAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuX2lubmVyVmFsdWVbMF0udGl0bGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHRoaXMudmFsdWVcbiAgICAgICAgOiB0aGlzLnZhbHVlO1xuICB9XG5cbiAgZm9jdXNJbnB1dCgpIHtcbiAgICB0aGlzLmF1dG9Db21wbGV0ZUlucHV0LmZvY3VzSW5wdXQoKTtcbiAgfVxuXG4gIHJlc29sdmVGbih2YWx1ZTogYW55KSB7XG4gICAgY29uc3QgbWFwID0gKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkgPyB2YWx1ZSA6IFt2YWx1ZV0pLm1hcCgodikgPT4ge1xuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmlubmVyVmFsdWUuZmluZCgoaXYpID0+IGl2LmlkID09PSB2KTtcbiAgICAgIHJldHVybiBtYXRjaFxuICAgICAgICA/IG9mKG1hdGNoKVxuICAgICAgICA6IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlckJ5SWQodikucGlwZShcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT5cbiAgICAgICAgICAgICAgb2YoXG4gICAgICAgICAgICAgICAgbmV3IFl1dlVzZXIoXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB2LFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdixcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IG51bGxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgIH0pO1xuICAgIHJldHVybiBmb3JrSm9pbihtYXApLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5pbm5lclZhbHVlID0gZGF0YTtcbiAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hdXRvQ29tcGxldGVJbnB1dC5jZC5tYXJrRm9yQ2hlY2soKSk7XG4gICAgfSk7XG4gIH1cblxuICBhdXRvY29tcGxldGVGbihxdWVyeTogc3RyaW5nKSB7XG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+PSB0aGlzLm1pbkxlbmd0aCkge1xuICAgICAgdGhpcy51c2VyU2VydmljZS5xdWVyeVVzZXIocXVlcnksIHRoaXMuZXhjbHVkZU1lLCB0aGlzLmZpbHRlclJvbGVzKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAodXNlcnM6IFl1dlVzZXJbXSkgPT4ge1xuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlUmVzID0gdXNlcnMuZmlsdGVyKCh1c2VyKSA9PiAhdGhpcy5pbm5lclZhbHVlLnNvbWUoKHZhbHVlKSA9PiB2YWx1ZS5pZCA9PT0gdXNlci5pZCkpO1xuICAgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsaWRpdHkodGhpcy5hdXRvY29tcGxldGVSZXMubGVuZ3RoID4gMCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVSZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbGlkaXR5KHRoaXMuYXV0b2NvbXBsZXRlUmVzLmxlbmd0aCA+IDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVSZXMgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvLyByZXR1cm5zIG51bGwgd2hlbiB2YWxpZCBlbHNlIHRoZSB2YWxpZGF0aW9uIG9iamVjdFxuICBwdWJsaWMgdmFsaWRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZElucHV0ID8gbnVsbCA6IHsgZW1wdHk6IHsgdmFsaWQ6IGZhbHNlIH0gfTtcbiAgfVxuXG4gIHByb3BhZ2F0ZVZhbGlkaXR5KHZhbGlkID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLmlzVmFsaWRJbnB1dCAhPT0gdmFsaWQpIHtcbiAgICAgIHRoaXMuaXNWYWxpZElucHV0ID0gdmFsaWQ7XG4gICAgICB0aGlzLnByb3BhZ2F0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGhhbmRsZSBzZWxlY3Rpb24gY2hhbmdlcyB0byB0aGUgbW9kZWxcbiAgb25TZWxlY3QoKSB7XG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmlubmVyVmFsdWUubWFwKCh2KSA9PiB2LmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW50ZXJuYWwgYXV0b2NvbXBsZXRlIGNvbnRyb2wgaXMgYWx3YXlzIHNldCB0byBtdWx0aXNlbGVjdFxuICAgICAgLy8gc28gdGhlIHJlc29sdmVkIHZhbHVlIGlzIGFsd2F5cyBhbiBhcnJheVxuICAgICAgdGhpcy5pbm5lclZhbHVlID0gdGhpcy5pbm5lclZhbHVlLnNsaWNlKC0xKTtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmlubmVyVmFsdWVbMF0uaWQ7XG4gICAgfVxuICAgIHRoaXMucHJvcGFnYXRlKCk7XG4gIH1cblxuICAvLyBoYW5kbGUgc2VsZWN0aW9uIGNoYW5nZXMgdG8gdGhlIG1vZGVsXG4gIG9uVW5zZWxlY3QodmFsdWU6IGFueSkge1xuICAgIHRoaXMuaW5uZXJWYWx1ZSA9IHRoaXMuaW5uZXJWYWx1ZS5maWx0ZXIoKHYpID0+IHYuaWQgIT09IHZhbHVlLmlkKTtcbiAgICBjb25zdCBfdmFsdWUgPSB0aGlzLmlubmVyVmFsdWUubWFwKCh2KSA9PiB2LmlkKTtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5tdWx0aXNlbGVjdCA/IF92YWx1ZSA6IG51bGw7XG4gICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICB0aGlzLmNsZWFySW5uZXJJbnB1dCgpO1xuICAgIH1cbiAgICB0aGlzLnByb3BhZ2F0ZSgpO1xuICB9XG5cbiAgb25BdXRvQ29tcGxldGVCbHVyKCkge1xuICAgIHRoaXMuY2xlYXJJbm5lcklucHV0KCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFySW5uZXJJbnB1dCgpIHtcbiAgICB0aGlzLmF1dG9Db21wbGV0ZUlucHV0LmNsZWFySW5wdXQoKTtcbiAgfVxufVxuIiwiPHl2Yy1hdXRvY29tcGxldGVcbiAgWyhuZ01vZGVsKV09XCJpbm5lclZhbHVlXCJcbiAgI2F1dG9jb21wbGV0ZVxuICAoc3VnZ2VzdGlvblNlbGVjdCk9XCJvblNlbGVjdCgpXCJcbiAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgKHN1Z2dlc3Rpb25VbnNlbGVjdCk9XCJvblVuc2VsZWN0KCRldmVudClcIlxuICAoYmx1cik9XCJvbkF1dG9Db21wbGV0ZUJsdXIoKVwiXG4gIFtkaXNhYmxlZF09XCJyZWFkb25seVwiXG4gIFthdXRvY29tcGxldGVWYWx1ZXNdPVwiYXV0b2NvbXBsZXRlUmVzXCJcbiAgZmllbGQ9XCJpZFwiXG4gIFtmb3JjZVNlbGVjdGlvbl09XCJ0cnVlXCJcbiAgKGF1dG9jb21wbGV0ZUZuYyk9XCJhdXRvY29tcGxldGVGbigkZXZlbnQpXCJcbiAgW211bHRpcGxlXT1cInRydWVcIlxuPlxuICA8IS0tIHRlbXBsYXRlIGZvciBpdGVtIGluc2lkZSB0aGUgZHJvcGRvd24gLS0+XG4gIDxuZy10ZW1wbGF0ZSAjYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGUgbGV0LWl0ZW0+XG4gICAgPHNwYW4gY2xhc3M9XCJjaGlwXCI+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgXG4gIDwhLS0gdGVtcGxhdGUgZm9yIGNoaXAgLS0+XG4gIDxuZy10ZW1wbGF0ZSAjY2hpcFRlbXBsYXRlIGxldC1pdGVtPlxuICAgIDxzcGFuIGNsYXNzPVwiY2hpcFwiPnt7IGl0ZW0udGl0bGUgfX08L3NwYW4+XG4gIDwvbmctdGVtcGxhdGU+XG48L3l2Yy1hdXRvY29tcGxldGU+XG5cbjx5dmMtaWNvblxuICBjbGFzcz1cImNsYXNzaWZ5XCJcbiAgW3RpdGxlXT1cIid5dXYuZm9ybS5lbGVtZW50Lm9yZ2FuaXphdGlvbi5jbGFzc2lmeS5pY29uLnRpdGxlJyB8IHRyYW5zbGF0ZVwiXG4gIFtzdmddPVwibXVsdGlzZWxlY3QgPyBpY29ucy5vcmdhbml6YXRpb25NdWx0aSA6IGljb25zLm9yZ2FuaXphdGlvblwiXG4gIChjbGljayk9XCJmb2N1c0lucHV0KClcIlxuPjwveXZjLWljb24+XG4iXX0=
@@ -0,0 +1,254 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, ElementRef, forwardRef, HostBinding, inject, Input } from '@angular/core';
3
+ import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { Classification, ClassificationPrefix, Situation, Utils } from '@yuuvis/client-core';
5
+ import { IconService } from '@yuuvis/client-framework/icons';
6
+ import { YvcChipsModule } from '@yuuvis/components/chips';
7
+ import { YvcIconModule } from '@yuuvis/components/icon';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ import * as i2 from "@yuuvis/components/chips";
11
+ import * as i3 from "@yuuvis/components/icon";
12
+ import * as i4 from "@angular/forms";
13
+ /**
14
+ * Creates form input for strings. Based on the input values different kinds of inputs will be generated.
15
+ *
16
+ * Implements `ControlValueAccessor` so it can be used within Angular forms.
17
+ *
18
+ * @example
19
+ * <!-- string input validating input to be between 5 and 10 characters -->
20
+ * <yuv-string [minLength]="5" [maxLength]="10"></yuv-string>
21
+ *
22
+ * <!-- string input that only allow digits -->
23
+ * <yuv-string [regex]="[0-9]*"></yuv-string>
24
+ *
25
+ * <!-- string input rendering a large textarea -->
26
+ * <yuv-string [rows]="10"></yuv-string>
27
+ *
28
+ */
29
+ export class StringComponent {
30
+ constructor() {
31
+ this.iconsService = inject(IconService);
32
+ this.elementRef = inject(ElementRef);
33
+ this.classifiytionIcons = {
34
+ email: this.iconsService.getIcon(ClassificationPrefix.EMAIL_ICON) || '',
35
+ url: this.iconsService.getIcon(ClassificationPrefix.URL_ICON) || '',
36
+ phone: this.iconsService.getIcon(ClassificationPrefix.PHONE_ICON) || ''
37
+ };
38
+ // provides all css variables defined by |yuuvis/comonents
39
+ this.fe = true;
40
+ /**
41
+ * Indicator that multiple strings could be inserted, they will be rendered as chips (default: false).
42
+ */
43
+ this.multiselect = false;
44
+ /**
45
+ * Will prevent the input from being changed (default: false)
46
+ */
47
+ this.readonly = false;
48
+ /**
49
+ * Enable autofucus for the input (default: false)
50
+ */
51
+ this.autofocus = false;
52
+ this.valid = false;
53
+ this.validationErrors = [];
54
+ this._classifications = [];
55
+ this.propagateChange = (_) => { };
56
+ }
57
+ /**
58
+ * Additional semantics for the form element. Possible values are
59
+ * `email` (validates and creates a link to send an email once there
60
+ * is a valid email address) and `url` (validates and creates a link
61
+ * to an URL typed into the form element).
62
+ */
63
+ set classifications(c) {
64
+ this._classifications = c;
65
+ if (c && c.length) {
66
+ if (c.includes(Classification.STRING_EMAIL)) {
67
+ this.classify = {
68
+ hrefPrefix: ClassificationPrefix.EMAIL,
69
+ icon: this.classifiytionIcons.email
70
+ };
71
+ }
72
+ else if (c.includes(Classification.STRING_URL)) {
73
+ this.classify = {
74
+ hrefPrefix: ClassificationPrefix.URL,
75
+ icon: this.classifiytionIcons.url
76
+ };
77
+ }
78
+ else if (c.includes(Classification.STRING_PHONE)) {
79
+ this.classify = {
80
+ hrefPrefix: ClassificationPrefix.PHONE,
81
+ icon: this.classifiytionIcons.phone
82
+ };
83
+ }
84
+ }
85
+ }
86
+ get classifications() {
87
+ return this._classifications;
88
+ }
89
+ propagate() {
90
+ this.propagateChange(this.value);
91
+ }
92
+ writeValue(value) {
93
+ this.formatedValue = Utils.formatMailTo(value, this.classify?.hrefPrefix === ClassificationPrefix.EMAIL);
94
+ this.value = value || null;
95
+ }
96
+ registerOnChange(fn) {
97
+ this.propagateChange = fn;
98
+ }
99
+ registerOnTouched() { }
100
+ onValueChange(val) {
101
+ this.maxEntryCountIfInvalid = undefined;
102
+ this.validationErrors = [];
103
+ if (Utils.isEmpty(val)) {
104
+ this.value = null;
105
+ this.propagate();
106
+ return;
107
+ }
108
+ const multiCheck = (check) => !!(this.multiselect ? val : [val]).find((v) => check(v));
109
+ // validate regular expression
110
+ if (this.regex && multiCheck((v) => !RegExp(this.regex).test(v))) {
111
+ this.validationErrors.push({ key: 'regex' });
112
+ }
113
+ // validate classification settings
114
+ if (this.classifications && this.classifications.length) {
115
+ this.classifications.forEach((c) => {
116
+ if (multiCheck((v) => !this.validateClassification(v, c))) {
117
+ this.validationErrors.push({ key: 'classification' + c });
118
+ }
119
+ });
120
+ }
121
+ // validate min length
122
+ if (!Utils.isEmpty(this.minLength) && multiCheck((v) => v.length < this.minLength)) {
123
+ this.validationErrors.push({ key: 'minlength', params: { minLength: this.minLength } });
124
+ }
125
+ // validate max length
126
+ if (!Utils.isEmpty(this.maxLength) && multiCheck((v) => v.length > this.maxLength)) {
127
+ this.validationErrors.push({ key: 'maxlength', params: { maxLength: this.maxLength } });
128
+ }
129
+ // validate invalid if only whitespaces
130
+ if (multiCheck((v) => v.length > 0 && !v.trim().length)) {
131
+ this.validationErrors.push({ key: 'onlyWhitespaces' });
132
+ }
133
+ if (this.validationErrors.length && this.multiselect && this.value) {
134
+ // Setting maxEntryCountIfInvalid to the actual length of the value array to prevent the user to add more entries.
135
+ this.maxEntryCountIfInvalid = this.value.length;
136
+ }
137
+ this.formatedValue = Utils.formatMailTo(val, this.classify?.hrefPrefix === ClassificationPrefix.EMAIL);
138
+ this.propagate();
139
+ }
140
+ onBlur() {
141
+ if (this.trimValue()) {
142
+ this.propagate();
143
+ }
144
+ }
145
+ /**
146
+ * Trims the current value and returns wether or not it has been trimmed
147
+ */
148
+ trimValue() {
149
+ if (this.value) {
150
+ if (this.multiselect) {
151
+ const lengthBefore = this.value.join('').length;
152
+ this.value = this.value.map((v) => v.trim());
153
+ return this.value.join('').length !== lengthBefore;
154
+ }
155
+ else {
156
+ const lengthBefore = this.value.length;
157
+ this.value = this.value.trim();
158
+ return this.value.length !== lengthBefore;
159
+ }
160
+ }
161
+ return false;
162
+ }
163
+ validateClassification(string, classification) {
164
+ if (this.situation === Situation.SEARCH) {
165
+ return true;
166
+ }
167
+ else {
168
+ let pattern;
169
+ if (classification === Classification.STRING_EMAIL) {
170
+ pattern =
171
+ /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
172
+ }
173
+ else if (classification === Classification.STRING_URL) {
174
+ pattern = /(http|ftp|https):\/\/[\w-]+(\.[\w-]+)?([\w.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?/;
175
+ }
176
+ else if (classification === Classification.STRING_PHONE) {
177
+ pattern = /^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-x\s\./0-9]*$/g;
178
+ }
179
+ return pattern ? pattern.test(string) : true;
180
+ }
181
+ }
182
+ /**
183
+ * returns null when valid else the validation object
184
+ */
185
+ validate() {
186
+ if (this.validationErrors.length) {
187
+ this.valid = false;
188
+ return Utils.arrayToObject(this.validationErrors, 'key', (err) => ({ valid: false, ...err }));
189
+ }
190
+ else {
191
+ this.valid = true;
192
+ return null;
193
+ }
194
+ }
195
+ ngAfterViewInit() {
196
+ if (this.autofocus) {
197
+ if (!this.multiselect) {
198
+ const el = this.elementRef.nativeElement.querySelector(this.rows && this.rows > 1 ? 'textarea' : 'input');
199
+ if (el)
200
+ el.focus();
201
+ }
202
+ }
203
+ }
204
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StringComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
205
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: StringComponent, isStandalone: true, selector: "yuv-string", inputs: { multiselect: "multiselect", rows: "rows", readonly: "readonly", autofocus: "autofocus", classifications: "classifications", situation: "situation", regex: "regex", minLength: "minLength", maxLength: "maxLength" }, host: { properties: { "class.yvc-form-element": "this.fe" } }, providers: [
206
+ {
207
+ provide: NG_VALUE_ACCESSOR,
208
+ useExisting: forwardRef(() => StringComponent),
209
+ multi: true
210
+ },
211
+ {
212
+ provide: NG_VALIDATORS,
213
+ useExisting: forwardRef(() => StringComponent),
214
+ multi: true
215
+ }
216
+ ], ngImport: i0, template: "@if ((!rows || rows <= 1) && !multiselect) {\n <input type=\"text\" (blur)=\"onBlur()\" [readonly]=\"readonly\" [(ngModel)]=\"value\" (ngModelChange)=\"onValueChange($event)\" />\n}\n@else if ((!rows || rows <= 1) && multiselect) {\n <!-- single line input with multiselect-->\n <yvc-chips\n [(ngModel)]=\"value\"\n [disabled]=\"readonly\"\n [max]=\"maxEntryCountIfInvalid\"\n (onBlur)=\"onBlur()\"\n (ngModelChange)=\"onValueChange($event)\"\n [ngClass]=\"{ invalid: validationErrors.length }\"\n >\n <ng-template let-item #chipTemplate>\n <span class=\"p-autocomplete-token-label\">\n @if (classify && !validationErrors.length) {\n <div class=\"classify inchip\">\n <a href=\"{{ classify.hrefPrefix + item }}\">\n <yvc-icon [svg]=\"classify.icon!\"></yvc-icon>\n </a>\n </div>\n }\n <div class=\"label\">\n {{ item }}\n </div>\n </span>\n </ng-template>\n </yvc-chips>\n} @else if (rows && rows > 1) {\n <!-- multi line text inputs -->\n <textarea\n class=\"input-textarea\"\n pInputTextarea\n (blur)=\"onBlur()\"\n [(ngModel)]=\"value\"\n [rows]=\"rows\"\n [readonly]=\"readonly\"\n (ngModelChange)=\"onValueChange($event)\"\n ></textarea>\n}\n\n@if (classify) {\n <div class=\"classify\">\n @if (value && !validationErrors.length && (classify.hrefPrefix !== '' || !multiselect || value.length <= 1)) {\n <a href=\"{{ classify.hrefPrefix + formatedValue }}\">\n <yvc-icon [svg]=\"classify.icon!\"></yvc-icon>\n </a>\n } @else {\n <yvc-icon [svg]=\"classify.icon!\"></yvc-icon>\n }\n </div>\n}\n", styles: [":host{font-family:Roboto;display:flex;flex-flow:row nowrap;align-items:center}:host .p-autocomplete-token-label{display:flex;align-items:center;-webkit-user-select:text;user-select:text}:host .p-autocomplete-token-label .label{padding:0 calc(var(--app-pane-padding) / 4);word-break:break-word}:host .classify{color:var(--text-color-hint)}:host .classify a{color:var(--text-color-hint);display:block;border-radius:2px}:host .classify a:hover,:host .classify a:focus{background-color:var(--color-accent);color:#fff}:host .classify yvc-icon{width:18px;height:18px;padding:calc(var(--app-pane-padding) / 8)}:host textarea.input-textarea{width:100%;resize:vertical;background-color:transparent;color:var(--text-color-body);border:1px solid var(--yvc-form-element-border-color)}:host yvc-chips{width:100%}:host input{color:var(--text-color-body);padding:0;border:1px solid var(--yvc-form-element-border-color);display:flex;flex-wrap:wrap;align-items:center;width:100%;background:transparent}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: YvcChipsModule }, { kind: "component", type: i2.Chips, selector: "yvc-chips", inputs: ["field", "placeholder", "max", "disabled"] }, { kind: "ngmodule", type: YvcIconModule }, { kind: "component", type: i3.Icon, selector: "yvc-icon", inputs: ["label", "svg", "svgSrc"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
217
+ }
218
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StringComponent, decorators: [{
219
+ type: Component,
220
+ args: [{ selector: 'yuv-string', standalone: true, imports: [CommonModule, YvcChipsModule, YvcIconModule, FormsModule], providers: [
221
+ {
222
+ provide: NG_VALUE_ACCESSOR,
223
+ useExisting: forwardRef(() => StringComponent),
224
+ multi: true
225
+ },
226
+ {
227
+ provide: NG_VALIDATORS,
228
+ useExisting: forwardRef(() => StringComponent),
229
+ multi: true
230
+ }
231
+ ], template: "@if ((!rows || rows <= 1) && !multiselect) {\n <input type=\"text\" (blur)=\"onBlur()\" [readonly]=\"readonly\" [(ngModel)]=\"value\" (ngModelChange)=\"onValueChange($event)\" />\n}\n@else if ((!rows || rows <= 1) && multiselect) {\n <!-- single line input with multiselect-->\n <yvc-chips\n [(ngModel)]=\"value\"\n [disabled]=\"readonly\"\n [max]=\"maxEntryCountIfInvalid\"\n (onBlur)=\"onBlur()\"\n (ngModelChange)=\"onValueChange($event)\"\n [ngClass]=\"{ invalid: validationErrors.length }\"\n >\n <ng-template let-item #chipTemplate>\n <span class=\"p-autocomplete-token-label\">\n @if (classify && !validationErrors.length) {\n <div class=\"classify inchip\">\n <a href=\"{{ classify.hrefPrefix + item }}\">\n <yvc-icon [svg]=\"classify.icon!\"></yvc-icon>\n </a>\n </div>\n }\n <div class=\"label\">\n {{ item }}\n </div>\n </span>\n </ng-template>\n </yvc-chips>\n} @else if (rows && rows > 1) {\n <!-- multi line text inputs -->\n <textarea\n class=\"input-textarea\"\n pInputTextarea\n (blur)=\"onBlur()\"\n [(ngModel)]=\"value\"\n [rows]=\"rows\"\n [readonly]=\"readonly\"\n (ngModelChange)=\"onValueChange($event)\"\n ></textarea>\n}\n\n@if (classify) {\n <div class=\"classify\">\n @if (value && !validationErrors.length && (classify.hrefPrefix !== '' || !multiselect || value.length <= 1)) {\n <a href=\"{{ classify.hrefPrefix + formatedValue }}\">\n <yvc-icon [svg]=\"classify.icon!\"></yvc-icon>\n </a>\n } @else {\n <yvc-icon [svg]=\"classify.icon!\"></yvc-icon>\n }\n </div>\n}\n", styles: [":host{font-family:Roboto;display:flex;flex-flow:row nowrap;align-items:center}:host .p-autocomplete-token-label{display:flex;align-items:center;-webkit-user-select:text;user-select:text}:host .p-autocomplete-token-label .label{padding:0 calc(var(--app-pane-padding) / 4);word-break:break-word}:host .classify{color:var(--text-color-hint)}:host .classify a{color:var(--text-color-hint);display:block;border-radius:2px}:host .classify a:hover,:host .classify a:focus{background-color:var(--color-accent);color:#fff}:host .classify yvc-icon{width:18px;height:18px;padding:calc(var(--app-pane-padding) / 8)}:host textarea.input-textarea{width:100%;resize:vertical;background-color:transparent;color:var(--text-color-body);border:1px solid var(--yvc-form-element-border-color)}:host yvc-chips{width:100%}:host input{color:var(--text-color-body);padding:0;border:1px solid var(--yvc-form-element-border-color);display:flex;flex-wrap:wrap;align-items:center;width:100%;background:transparent}\n"] }]
232
+ }], propDecorators: { fe: [{
233
+ type: HostBinding,
234
+ args: ['class.yvc-form-element']
235
+ }], multiselect: [{
236
+ type: Input
237
+ }], rows: [{
238
+ type: Input
239
+ }], readonly: [{
240
+ type: Input
241
+ }], autofocus: [{
242
+ type: Input
243
+ }], classifications: [{
244
+ type: Input
245
+ }], situation: [{
246
+ type: Input
247
+ }], regex: [{
248
+ type: Input
249
+ }], minLength: [{
250
+ type: Input
251
+ }], maxLength: [{
252
+ type: Input
253
+ }] } });
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvZm9ybXMvc3JjL2xpYi9lbGVtZW50cy9zdHJpbmcvc3RyaW5nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvZm9ybXMvc3JjL2xpYi9lbGVtZW50cy9zdHJpbmcvc3RyaW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWlCLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFBd0IsV0FBVyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBbUQsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0SixPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFtQixTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7OztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFvQkgsTUFBTSxPQUFPLGVBQWU7SUFuQjVCO1FBb0JVLGlCQUFZLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25DLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFeEMsdUJBQWtCLEdBQUc7WUFDbkIsS0FBSyxFQUFFLElBQUksQ0FB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QUFJO3lCQUNaO3FCQUNGOzhCQWNzQyxFQUFFO3NCQUF4QyxXQUFXO3VCQUFDLHdCQUF3QjtnQkFLNUIsV0FBVztzQkFBbkIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxTQUFTO3NCQUFqQixLQUFLO2dCQVFGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBNkJHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLCBpbmplY3QsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENsYXNzaWZpY2F0aW9uLCBDbGFzc2lmaWNhdGlvblByZWZpeCwgRm9ybWF0dGVkTWFpbFRvLCBTaXR1YXRpb24sIFV0aWxzIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBJY29uU2VydmljZSB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWZyYW1ld29yay9pY29ucyc7XG5pbXBvcnQgeyBZdmNDaGlwc01vZHVsZSB9IGZyb20gJ0B5dXV2aXMvY29tcG9uZW50cy9jaGlwcyc7XG5pbXBvcnQgeyBZdmNJY29uTW9kdWxlIH0gZnJvbSAnQHl1dXZpcy9jb21wb25lbnRzL2ljb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgZm9ybSBpbnB1dCBmb3Igc3RyaW5ncy4gQmFzZWQgb24gdGhlIGlucHV0IHZhbHVlcyBkaWZmZXJlbnQga2luZHMgb2YgaW5wdXRzIHdpbGwgYmUgZ2VuZXJhdGVkLlxuICpcbiAqIEltcGxlbWVudHMgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoaW4gQW5ndWxhciBmb3Jtcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogPCEtLSBzdHJpbmcgaW5wdXQgdmFsaWRhdGluZyBpbnB1dCB0byBiZSBiZXR3ZWVuIDUgYW5kIDEwIGNoYXJhY3RlcnMgLS0+XG4gKiA8eXV2LXN0cmluZyBbbWluTGVuZ3RoXT1cIjVcIiBbbWF4TGVuZ3RoXT1cIjEwXCI+PC95dXYtc3RyaW5nPlxuICpcbiAqIDwhLS0gc3RyaW5nIGlucHV0IHRoYXQgb25seSBhbGxvdyBkaWdpdHMgLS0+XG4gKiA8eXV2LXN0cmluZyAgW3JlZ2V4XT1cIlswLTldKlwiPjwveXV2LXN0cmluZz5cbiAqXG4gKiA8IS0tIHN0cmluZyBpbnB1dCByZW5kZXJpbmcgYSBsYXJnZSB0ZXh0YXJlYSAtLT5cbiAqIDx5dXYtc3RyaW5nIFtyb3dzXT1cIjEwXCI+PC95dXYtc3RyaW5nPlxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXV2LXN0cmluZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFl2Y0NoaXBzTW9kdWxlLCBZdmNJY29uTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zdHJpbmcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdHJpbmcuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTdHJpbmdDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTdHJpbmdDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU3RyaW5nQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHByaXZhdGUgaWNvbnNTZXJ2aWNlID0gaW5qZWN0KEljb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG4gIGNsYXNzaWZpeXRpb25JY29ucyA9IHtcbiAgICBlbWFpbDogdGhpcy5pY29uc1NlcnZpY2UuZ2V0SWNvbihDbGFzc2lmaWNhdGlvblByZWZpeC5FTUFJTF9JQ09OKSB8fCAnJyxcbiAgICB1cmw6IHRoaXMuaWNvbnNTZXJ2aWNlLmdldEljb24oQ2xhc3NpZmljYXRpb25QcmVmaXguVVJMX0lDT04pIHx8ICcnLFxuICAgIHBob25lOiB0aGlzLmljb25zU2VydmljZS5nZXRJY29uKENsYXNzaWZpY2F0aW9uUHJlZml4LlBIT05FX0lDT04pIHx8ICcnXG4gIH07XG4gIG1heEVudHJ5Q291bnRJZkludmFsaWQ/OiBudW1iZXI7XG5cbiAgLy8gcHJvdmlkZXMgYWxsIGNzcyB2YXJpYWJsZXMgZGVmaW5lZCBieSB8eXV1dmlzL2NvbW9uZW50c1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnl2Yy1mb3JtLWVsZW1lbnQnKSBmZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEluZGljYXRvciB0aGF0IG11bHRpcGxlIHN0cmluZ3MgY291bGQgYmUgaW5zZXJ0ZWQsIHRoZXkgd2lsbCBiZSByZW5kZXJlZCBhcyBjaGlwcyAoZGVmYXVsdDogZmFsc2UpLlxuICAgKi9cbiAgQElucHV0KCkgbXVsdGlzZWxlY3QgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldHRpbmcgcm93cyB0byBtb3JlIHRoYW4gMSB3aWxsIGdlbmVyYXRlIGEgdGV4dGFyZWEgaW5zdGVhZCBvZiBhbiBpbnB1dCB0YWdcbiAgICogYW5kIGFwcGx5IHRoZSByb3dzIHByb3BlcnR5IHRvIGl0XG4gICAqL1xuICBASW5wdXQoKSByb3dzPzogbnVtYmVyO1xuICAvKipcbiAgICogV2lsbCBwcmV2ZW50IHRoZSBpbnB1dCBmcm9tIGJlaW5nIGNoYW5nZWQgKGRlZmF1bHQ6IGZhbHNlKVxuICAgKi9cbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEVuYWJsZSBhdXRvZnVjdXMgZm9yIHRoZSBpbnB1dCAoZGVmYXVsdDogZmFsc2UpXG4gICAqL1xuICBASW5wdXQoKSBhdXRvZm9jdXMgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgc2VtYW50aWNzIGZvciB0aGUgZm9ybSBlbGVtZW50LiBQb3NzaWJsZSB2YWx1ZXMgYXJlXG4gICAqIGBlbWFpbGAgKHZhbGlkYXRlcyBhbmQgY3JlYXRlcyBhIGxpbmsgdG8gc2VuZCBhbiBlbWFpbCBvbmNlIHRoZXJlXG4gICAqIGlzIGEgdmFsaWQgZW1haWwgYWRkcmVzcykgYW5kIGB1cmxgICh2YWxpZGF0ZXMgYW5kIGNyZWF0ZXMgYSBsaW5rXG4gICAqIHRvIGFuIFVSTCB0eXBlZCBpbnRvIHRoZSBmb3JtIGVsZW1lbnQpLlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGNsYXNzaWZpY2F0aW9ucyhjOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2NsYXNzaWZpY2F0aW9ucyA9IGM7XG4gICAgaWYgKGMgJiYgYy5sZW5ndGgpIHtcbiAgICAgIGlmIChjLmluY2x1ZGVzKENsYXNzaWZpY2F0aW9uLlNUUklOR19FTUFJTCkpIHtcbiAgICAgICAgdGhpcy5jbGFzc2lmeSA9IHtcbiAgICAgICAgICBocmVmUHJlZml4OiBDbGFzc2lmaWNhdGlvblByZWZpeC5FTUFJTCxcbiAgICAgICAgICBpY29uOiB0aGlzLmNsYXNzaWZpeXRpb25JY29ucy5lbWFpbFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChjLmluY2x1ZGVzKENsYXNzaWZpY2F0aW9uLlNUUklOR19VUkwpKSB7XG4gICAgICAgIHRoaXMuY2xhc3NpZnkgPSB7XG4gICAgICAgICAgaHJlZlByZWZpeDogQ2xhc3NpZmljYXRpb25QcmVmaXguVVJMLFxuICAgICAgICAgIGljb246IHRoaXMuY2xhc3NpZml5dGlvbkljb25zLnVybFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChjLmluY2x1ZGVzKENsYXNzaWZpY2F0aW9uLlNUUklOR19QSE9ORSkpIHtcbiAgICAgICAgdGhpcy5jbGFzc2lmeSA9IHtcbiAgICAgICAgICBocmVmUHJlZml4OiBDbGFzc2lmaWNhdGlvblByZWZpeC5QSE9ORSxcbiAgICAgICAgICBpY29uOiB0aGlzLmNsYXNzaWZpeXRpb25JY29ucy5waG9uZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBjbGFzc2lmaWNhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzaWZpY2F0aW9ucztcbiAgfVxuICAvKipcbiAgICogUG9zc2libGVzIHZhbHVlcyBhcmUgYEVESVRgIChkZWZhdWx0KSxgU0VBUkNIYCxgQ1JFQVRFYC4gSW4gc2VhcmNoIHNpdHVhdGlvbiB2YWxpZGF0aW9uIG9mIHRoZSBmb3JtIGVsZW1lbnQgd2lsbCBiZSB0dXJuZWQgb2ZmLCBzbyB5b3UgYXJlIGFibGUgdG8gZW50ZXIgc2VhcmNoIHRlcm1zIHRoYXQgZG8gbm90IG1lZXQgdGhlIGVsZW1lbnRzIHZhbGlkYXRvcnMuXG4gICAqL1xuICBASW5wdXQoKSBzaXR1YXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byB2YWxpZGF0ZSB0aGUgaW5wdXQgdmFsdWUgYWdhaW5zdFxuICAgKi9cbiAgQElucHV0KCkgcmVnZXg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNaW5pbWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzXG4gICAqL1xuICBASW5wdXQoKSBtaW5MZW5ndGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzXG4gICAqL1xuICBASW5wdXQoKSBtYXhMZW5ndGg/OiBudW1iZXI7XG5cbiAgLy8gbW9kZWwgdmFsdWVcbiAgdmFsdWU6IGFueTtcbiAgZm9ybWF0ZWRWYWx1ZT86IEZvcm1hdHRlZE1haWxUbztcbiAgdmFsaWQgPSBmYWxzZTtcbiAgdmFsaWRhdGlvbkVycm9yczogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdID0gW107XG4gIGNsYXNzaWZ5PzogeyBocmVmUHJlZml4OiBzdHJpbmc7IGljb246IHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuICBwcml2YXRlIF9jbGFzc2lmaWNhdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG5cbiAgcHJpdmF0ZSBwcm9wYWdhdGUoKSB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy52YWx1ZSk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1hdGVkVmFsdWUgPSBVdGlscy5mb3JtYXRNYWlsVG8odmFsdWUsIHRoaXMuY2xhc3NpZnk/LmhyZWZQcmVmaXggPT09IENsYXNzaWZpY2F0aW9uUHJlZml4LkVNQUlMKTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWUgfHwgbnVsbDtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZCgpOiB2b2lkIHt9XG5cbiAgb25WYWx1ZUNoYW5nZSh2YWw6IGFueSkge1xuICAgIHRoaXMubWF4RW50cnlDb3VudElmSW52YWxpZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMgPSBbXTtcblxuICAgIGlmIChVdGlscy5pc0VtcHR5KHZhbCkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgdGhpcy5wcm9wYWdhdGUoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG11bHRpQ2hlY2sgPSAoY2hlY2s6IChzOiBzdHJpbmcpID0+IGJvb2xlYW4pID0+ICEhKHRoaXMubXVsdGlzZWxlY3QgPyB2YWwgOiBbdmFsXSkuZmluZCgodjogc3RyaW5nKSA9PiBjaGVjayh2KSk7XG5cbiAgICAvLyB2YWxpZGF0ZSByZWd1bGFyIGV4cHJlc3Npb25cbiAgICBpZiAodGhpcy5yZWdleCAmJiBtdWx0aUNoZWNrKCh2OiBzdHJpbmcpID0+ICFSZWdFeHAodGhpcy5yZWdleCEpLnRlc3QodikpKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucHVzaCh7IGtleTogJ3JlZ2V4JyB9KTtcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSBjbGFzc2lmaWNhdGlvbiBzZXR0aW5nc1xuICAgIGlmICh0aGlzLmNsYXNzaWZpY2F0aW9ucyAmJiB0aGlzLmNsYXNzaWZpY2F0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2xhc3NpZmljYXRpb25zLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgaWYgKG11bHRpQ2hlY2soKHYpID0+ICF0aGlzLnZhbGlkYXRlQ2xhc3NpZmljYXRpb24odiwgYykpKSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnB1c2goeyBrZXk6ICdjbGFzc2lmaWNhdGlvbicgKyBjIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gdmFsaWRhdGUgbWluIGxlbmd0aFxuICAgIGlmICghVXRpbHMuaXNFbXB0eSh0aGlzLm1pbkxlbmd0aCkgJiYgbXVsdGlDaGVjaygodikgPT4gdi5sZW5ndGggPCB0aGlzLm1pbkxlbmd0aCEpKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucHVzaCh7IGtleTogJ21pbmxlbmd0aCcsIHBhcmFtczogeyBtaW5MZW5ndGg6IHRoaXMubWluTGVuZ3RoIH0gfSk7XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgbWF4IGxlbmd0aFxuICAgIGlmICghVXRpbHMuaXNFbXB0eSh0aGlzLm1heExlbmd0aCkgJiYgbXVsdGlDaGVjaygodikgPT4gdi5sZW5ndGggPiB0aGlzLm1heExlbmd0aCEpKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucHVzaCh7IGtleTogJ21heGxlbmd0aCcsIHBhcmFtczogeyBtYXhMZW5ndGg6IHRoaXMubWF4TGVuZ3RoIH0gfSk7XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgaW52YWxpZCBpZiBvbmx5IHdoaXRlc3BhY2VzXG4gICAgaWYgKG11bHRpQ2hlY2soKHYpID0+IHYubGVuZ3RoID4gMCAmJiAhdi50cmltKCkubGVuZ3RoKSkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnB1c2goeyBrZXk6ICdvbmx5V2hpdGVzcGFjZXMnIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvcnMubGVuZ3RoICYmIHRoaXMubXVsdGlzZWxlY3QgJiYgdGhpcy52YWx1ZSkge1xuICAgICAgLy8gU2V0dGluZyBtYXhFbnRyeUNvdW50SWZJbnZhbGlkIHRvIHRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSB2YWx1ZSBhcnJheSB0byBwcmV2ZW50IHRoZSB1c2VyIHRvIGFkZCBtb3JlIGVudHJpZXMuXG4gICAgICB0aGlzLm1heEVudHJ5Q291bnRJZkludmFsaWQgPSB0aGlzLnZhbHVlLmxlbmd0aDtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1hdGVkVmFsdWUgPSBVdGlscy5mb3JtYXRNYWlsVG8odmFsLCB0aGlzLmNsYXNzaWZ5Py5ocmVmUHJlZml4ID09PSBDbGFzc2lmaWNhdGlvblByZWZpeC5FTUFJTCk7XG4gICAgdGhpcy5wcm9wYWdhdGUoKTtcbiAgfVxuXG4gIG9uQmx1cigpIHtcbiAgICBpZiAodGhpcy50cmltVmFsdWUoKSkge1xuICAgICAgdGhpcy5wcm9wYWdhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpbXMgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHJldHVybnMgd2V0aGVyIG9yIG5vdCBpdCBoYXMgYmVlbiB0cmltbWVkXG4gICAqL1xuICBwcml2YXRlIHRyaW1WYWx1ZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoQmVmb3JlID0gdGhpcy52YWx1ZS5qb2luKCcnKS5sZW5ndGg7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLm1hcCgodjogc3RyaW5nKSA9PiB2LnRyaW0oKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmpvaW4oJycpLmxlbmd0aCAhPT0gbGVuZ3RoQmVmb3JlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoQmVmb3JlID0gdGhpcy52YWx1ZS5sZW5ndGg7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUubGVuZ3RoICE9PSBsZW5ndGhCZWZvcmU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVDbGFzc2lmaWNhdGlvbihzdHJpbmc6IHN0cmluZywgY2xhc3NpZmljYXRpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNpdHVhdGlvbiA9PT0gU2l0dWF0aW9uLlNFQVJDSCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwYXR0ZXJuO1xuICAgICAgaWYgKGNsYXNzaWZpY2F0aW9uID09PSBDbGFzc2lmaWNhdGlvbi5TVFJJTkdfRU1BSUwpIHtcbiAgICAgICAgcGF0dGVybiA9XG4gICAgICAgICAgL14oKFtePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSsoXFwuW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XSl8KChbYS16QS1aXFwtMC05XStcXC4pK1thLXpBLVpdezIsfSkpJC87XG4gICAgICB9IGVsc2UgaWYgKGNsYXNzaWZpY2F0aW9uID09PSBDbGFzc2lmaWNhdGlvbi5TVFJJTkdfVVJMKSB7XG4gICAgICAgIHBhdHRlcm4gPSAvKGh0dHB8ZnRwfGh0dHBzKTpcXC9cXC9bXFx3LV0rKFxcLltcXHctXSspPyhbXFx3LixAP149JSZhbXA7OlxcL34rIy1dKltcXHdAP149JSZhbXA7XFwvfisjLV0pPy87XG4gICAgICB9IGVsc2UgaWYgKGNsYXNzaWZpY2F0aW9uID09PSBDbGFzc2lmaWNhdGlvbi5TVFJJTkdfUEhPTkUpIHtcbiAgICAgICAgcGF0dGVybiA9IC9eWytdKlsoXXswLDF9WzAtOV17MSw0fVspXXswLDF9Wy14XFxzXFwuLzAtOV0qJC9nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdHRlcm4gPyBwYXR0ZXJuLnRlc3Qoc3RyaW5nKSA6IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybnMgbnVsbCB3aGVuIHZhbGlkIGVsc2UgdGhlIHZhbGlkYXRpb24gb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGUoKSB7XG4gICAgaWYgKHRoaXMudmFsaWRhdGlvbkVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICAgIHJldHVybiBVdGlscy5hcnJheVRvT2JqZWN0KHRoaXMudmFsaWRhdGlvbkVycm9ycywgJ2tleScsIChlcnIpID0+ICh7IHZhbGlkOiBmYWxzZSwgLi4uZXJyIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZCA9IHRydWU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b2ZvY3VzKSB7XG4gICAgICBpZiAoIXRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHRoaXMucm93cyAmJiB0aGlzLnJvd3MgPiAxID8gJ3RleHRhcmVhJyA6ICdpbnB1dCcpO1xuICAgICAgICBpZiAoZWwpIGVsLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJAaWYgKCghcm93cyB8fCByb3dzIDw9IDEpICYmICFtdWx0aXNlbGVjdCkge1xuICA8aW5wdXQgdHlwZT1cInRleHRcIiAoYmx1cik9XCJvbkJsdXIoKVwiIFtyZWFkb25seV09XCJyZWFkb25seVwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAobmdNb2RlbENoYW5nZSk9XCJvblZhbHVlQ2hhbmdlKCRldmVudClcIiAvPlxufVxuQGVsc2UgaWYgKCghcm93cyB8fCByb3dzIDw9IDEpICYmIG11bHRpc2VsZWN0KSB7XG4gIDwhLS0gc2luZ2xlIGxpbmUgaW5wdXQgd2l0aCBtdWx0aXNlbGVjdC0tPlxuICA8eXZjLWNoaXBzXG4gICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXG4gICAgW2Rpc2FibGVkXT1cInJlYWRvbmx5XCJcbiAgICBbbWF4XT1cIm1heEVudHJ5Q291bnRJZkludmFsaWRcIlxuICAgIChvbkJsdXIpPVwib25CbHVyKClcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgW25nQ2xhc3NdPVwieyBpbnZhbGlkOiB2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCB9XCJcbiAgPlxuICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSAjY2hpcFRlbXBsYXRlPlxuICAgICAgPHNwYW4gY2xhc3M9XCJwLWF1dG9jb21wbGV0ZS10b2tlbi1sYWJlbFwiPlxuICAgICAgICBAaWYgKGNsYXNzaWZ5ICYmICF2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGFzc2lmeSBpbmNoaXBcIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCJ7eyBjbGFzc2lmeS5ocmVmUHJlZml4ICsgaXRlbSB9fVwiPlxuICAgICAgICAgICAgICA8eXZjLWljb24gW3N2Z109XCJjbGFzc2lmeS5pY29uIVwiPjwveXZjLWljb24+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+XG4gICAgICAgICAge3sgaXRlbSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3l2Yy1jaGlwcz5cbn0gQGVsc2UgaWYgKHJvd3MgJiYgcm93cyA+IDEpIHtcbiAgPCEtLSBtdWx0aSBsaW5lIHRleHQgaW5wdXRzIC0tPlxuICA8dGV4dGFyZWFcbiAgICBjbGFzcz1cImlucHV0LXRleHRhcmVhXCJcbiAgICBwSW5wdXRUZXh0YXJlYVxuICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcbiAgICBbcm93c109XCJyb3dzXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gID48L3RleHRhcmVhPlxufVxuXG5AaWYgKGNsYXNzaWZ5KSB7XG4gIDxkaXYgY2xhc3M9XCJjbGFzc2lmeVwiPlxuICAgIEBpZiAodmFsdWUgJiYgIXZhbGlkYXRpb25FcnJvcnMubGVuZ3RoICYmIChjbGFzc2lmeS5ocmVmUHJlZml4ICE9PSAnJyB8fCAhbXVsdGlzZWxlY3QgfHwgdmFsdWUubGVuZ3RoIDw9IDEpKSB7XG4gICAgICA8YSBocmVmPVwie3sgY2xhc3NpZnkuaHJlZlByZWZpeCArIGZvcm1hdGVkVmFsdWUgfX1cIj5cbiAgICAgICAgPHl2Yy1pY29uIFtzdmddPVwiY2xhc3NpZnkuaWNvbiFcIj48L3l2Yy1pY29uPlxuICAgICAgPC9hPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPHl2Yy1pY29uIFtzdmddPVwiY2xhc3NpZnkuaWNvbiFcIj48L3l2Yy1pY29uPlxuICAgIH1cbiAgPC9kaXY+XG59XG4iXX0=