@messaia/cdk 18.2.3 → 19.0.0-rc02

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 (669) hide show
  1. package/fesm2022/messaia-cdk.mjs +1592 -1239
  2. package/fesm2022/messaia-cdk.mjs.map +1 -1
  3. package/lib/base/base.module.d.ts +14 -13
  4. package/lib/base/components/base.component.d.ts +1 -1
  5. package/lib/base/components/generic-embedded-list.component.d.ts +1 -1
  6. package/lib/base/components/generic-form-base.component.d.ts +3 -2
  7. package/lib/base/components/generic-form.component.d.ts +1 -1
  8. package/lib/base/components/generic-list.component.d.ts +23 -3
  9. package/lib/base/components/generic-reactive-form.component.d.ts +1 -1
  10. package/lib/base/constants/common.d.ts +2 -0
  11. package/lib/base/helpers/auth-helper.d.ts +1 -1
  12. package/lib/chips/components/chips.component.d.ts +5 -16
  13. package/lib/common/functions/utils.d.ts +1 -1
  14. package/lib/common/helpers/app-storage.d.ts +1 -1
  15. package/lib/common/styles/_layout.scss +1 -1
  16. package/lib/common/styles/_variables.scss +4 -25
  17. package/lib/common/styles/colors/_colors-dark.scss +2 -0
  18. package/lib/common/styles/colors/_colors.scss +34 -4
  19. package/lib/common/styles/core/_button.scss +7 -21
  20. package/lib/common/styles/core/_card.scss +19 -88
  21. package/lib/common/styles/core/_core.scss +10 -21
  22. package/lib/common/styles/core/_overrides.scss +45 -0
  23. package/lib/common/styles/core/_sidenav.scss +9 -7
  24. package/lib/common/styles/core/_structure.scss +4 -11
  25. package/lib/common/styles/font/_font.scss +5 -13
  26. package/lib/common/styles/m2/_common-theme.scss +10 -10
  27. package/lib/common/styles/m2/platform.scss +13 -0
  28. package/lib/common/styles/m3/_common-theme.scss +27 -10
  29. package/lib/common/styles/m3/platform.scss +13 -0
  30. package/lib/common/styles/utilities/_general.scss +522 -492
  31. package/lib/common/styles/utilities/_pull.scss +23 -30
  32. package/lib/common/styles/utilities/_push.scss +23 -30
  33. package/lib/common/styles/utilities/_size.scss +3 -3
  34. package/lib/common/styles/utilities/_utilities.scss +14 -14
  35. package/lib/common/theming/_m2-all-theme.scss +4 -11
  36. package/lib/form-validators/directives/base-directive.d.ts +1 -1
  37. package/lib/form-validators/directives/template-validations/base-validator.directive.d.ts +1 -1
  38. package/lib/form-validators/directives/template-validations/control-expression-process.d.ts +1 -1
  39. package/lib/form-validators/services/rx-form-array.d.ts +2 -2
  40. package/lib/form-validators/util/reset-form.d.ts +3 -3
  41. package/lib/forms/directives/mat-form-field-editor.directive.d.ts +31 -28
  42. package/lib/forms/forms.module.d.ts +4 -3
  43. package/lib/forms/helpers/abstract-mat-form-field.d.ts +147 -91
  44. package/lib/forms/helpers/abstract-select-form-field.component.d.ts +144 -67
  45. package/lib/forms/helpers/value-accessor-base.d.ts +1 -1
  46. package/lib/layout/_m2-layout-theme.scss +14 -50
  47. package/lib/layout/layout-nav/layout-nav.component.d.ts +7 -1
  48. package/lib/layout/layout-toggle.class.d.ts +1 -1
  49. package/lib/list/components/list.component.d.ts +3 -15
  50. package/lib/menu/components/menu.component.d.ts +16 -1
  51. package/lib/menu/menu.module.d.ts +3 -2
  52. package/lib/select/components/select.component.d.ts +3 -16
  53. package/lib/table/components/dynamic-table/dynamic-table.component.d.ts +5 -1
  54. package/lib/table/components/filter-select/filter-select.component.d.ts +2 -3
  55. package/lib/table/models/table-definition.d.ts +69 -20
  56. package/package.json +3 -5
  57. package/esm2022/lib/base/base.module.mjs +0 -114
  58. package/esm2022/lib/base/components/base.component.mjs +0 -904
  59. package/esm2022/lib/base/components/dynamic-table-config-dialog/dynamic-table-config-dialog.comnponent.mjs +0 -123
  60. package/esm2022/lib/base/components/generic-embedded-list.component.mjs +0 -197
  61. package/esm2022/lib/base/components/generic-form-base.component.mjs +0 -891
  62. package/esm2022/lib/base/components/generic-form.component.mjs +0 -44
  63. package/esm2022/lib/base/components/generic-list.component.mjs +0 -966
  64. package/esm2022/lib/base/components/generic-reactive-form.component.mjs +0 -101
  65. package/esm2022/lib/base/components/task-dialog/task-dialog.component.mjs +0 -147
  66. package/esm2022/lib/base/constants/common.mjs +0 -92
  67. package/esm2022/lib/base/constants/global-roles.mjs +0 -9
  68. package/esm2022/lib/base/enums/message-type.mjs +0 -7
  69. package/esm2022/lib/base/helpers/auth-helper.mjs +0 -53
  70. package/esm2022/lib/base/interceptors/base.interceptor.mjs +0 -168
  71. package/esm2022/lib/base/interceptors/caching-interceptor.mjs +0 -67
  72. package/esm2022/lib/base/interceptors/loading.interceptor.mjs +0 -64
  73. package/esm2022/lib/base/interfaces/ibase-component.mjs +0 -2
  74. package/esm2022/lib/base/interfaces/igeneric-form-base.mjs +0 -2
  75. package/esm2022/lib/base/interfaces/igeneric-list-component.mjs +0 -2
  76. package/esm2022/lib/base/interfaces/igeneric-reactive-form-base.mjs +0 -2
  77. package/esm2022/lib/base/models/auth-user.mjs +0 -18
  78. package/esm2022/lib/base/models/task-dialog-data.mjs +0 -85
  79. package/esm2022/lib/base/public_api.mjs +0 -2
  80. package/esm2022/lib/base/services/file.service.mjs +0 -18
  81. package/esm2022/lib/base/services/loading-screen.service.mjs +0 -45
  82. package/esm2022/lib/base/services/print.service.mjs +0 -41
  83. package/esm2022/lib/chips/chips.module.mjs +0 -77
  84. package/esm2022/lib/chips/components/chips.component.mjs +0 -702
  85. package/esm2022/lib/chips/directives/autocomplete-option.directive.mjs +0 -18
  86. package/esm2022/lib/chips/directives/chip.directive.mjs +0 -18
  87. package/esm2022/lib/chips/public_api.mjs +0 -3
  88. package/esm2022/lib/common/animations/collapse/collapse.animation.mjs +0 -33
  89. package/esm2022/lib/common/animations/common/interfaces.mjs +0 -2
  90. package/esm2022/lib/common/behaviors/constructor.mjs +0 -2
  91. package/esm2022/lib/common/behaviors/control-value-accesor.mixin.mjs +0 -41
  92. package/esm2022/lib/common/behaviors/disabled.mixin.mjs +0 -24
  93. package/esm2022/lib/common/common.module.mjs +0 -176
  94. package/esm2022/lib/common/constants/constants.mjs +0 -3
  95. package/esm2022/lib/common/directives/autofocus.directive.mjs +0 -62
  96. package/esm2022/lib/common/directives/delayed-hover.directive.mjs +0 -133
  97. package/esm2022/lib/common/directives/disable-control.directive.mjs +0 -35
  98. package/esm2022/lib/common/enums/app-event-type.mjs +0 -6
  99. package/esm2022/lib/common/enums/filter-glue.mjs +0 -16
  100. package/esm2022/lib/common/enums/filter-operator.mjs +0 -15
  101. package/esm2022/lib/common/enums/salutation.mjs +0 -7
  102. package/esm2022/lib/common/functions/decorators.mjs +0 -22
  103. package/esm2022/lib/common/functions/functions.mjs +0 -22
  104. package/esm2022/lib/common/functions/utils.mjs +0 -271
  105. package/esm2022/lib/common/helpers/app-storage.mjs +0 -77
  106. package/esm2022/lib/common/helpers/delegate.mjs +0 -2
  107. package/esm2022/lib/common/helpers/dynamic-builder.mjs +0 -52
  108. package/esm2022/lib/common/helpers/dynamic-component-compiler.mjs +0 -11
  109. package/esm2022/lib/common/models/action-item.mjs +0 -77
  110. package/esm2022/lib/common/models/app-event.mjs +0 -21
  111. package/esm2022/lib/common/models/app-setting.mjs +0 -92
  112. package/esm2022/lib/common/models/audit-entity.mjs +0 -53
  113. package/esm2022/lib/common/models/audit-user.mjs +0 -24
  114. package/esm2022/lib/common/models/base-entity.mjs +0 -40
  115. package/esm2022/lib/common/models/common-error.mjs +0 -29
  116. package/esm2022/lib/common/models/common-handler-context.mjs +0 -45
  117. package/esm2022/lib/common/models/displayname-number-projection.mjs +0 -56
  118. package/esm2022/lib/common/models/displayname-projection.mjs +0 -38
  119. package/esm2022/lib/common/models/entity.mjs +0 -2
  120. package/esm2022/lib/common/models/enum-item.mjs +0 -2
  121. package/esm2022/lib/common/models/enum-metadata.mjs +0 -44
  122. package/esm2022/lib/common/models/filter-field.mjs +0 -2
  123. package/esm2022/lib/common/models/filter.mjs +0 -2
  124. package/esm2022/lib/common/models/icommon-handler-context.mjs +0 -2
  125. package/esm2022/lib/common/models/icon.mjs +0 -42
  126. package/esm2022/lib/common/models/key-value.mjs +0 -11
  127. package/esm2022/lib/common/models/modifiable-entity.mjs +0 -22
  128. package/esm2022/lib/common/models/name-number-projection.mjs +0 -35
  129. package/esm2022/lib/common/models/name-projection.mjs +0 -25
  130. package/esm2022/lib/common/models/permission.mjs +0 -29
  131. package/esm2022/lib/common/models/save-action.mjs +0 -7
  132. package/esm2022/lib/common/models/suffix-button.mjs +0 -15
  133. package/esm2022/lib/common/models/title-projection.mjs +0 -25
  134. package/esm2022/lib/common/pipes/bind.mjs +0 -31
  135. package/esm2022/lib/common/pipes/data-source.pipe.mjs +0 -15
  136. package/esm2022/lib/common/pipes/enum.pipe.mjs +0 -41
  137. package/esm2022/lib/common/pipes/file-size.pipe.mjs +0 -35
  138. package/esm2022/lib/common/pipes/filter.pipe.mjs +0 -54
  139. package/esm2022/lib/common/pipes/first-letter.mjs +0 -24
  140. package/esm2022/lib/common/pipes/form-array.pipe.mjs +0 -14
  141. package/esm2022/lib/common/pipes/form-control.pipe.mjs +0 -14
  142. package/esm2022/lib/common/pipes/form-group.pipe.mjs +0 -14
  143. package/esm2022/lib/common/pipes/func.pipe.mjs +0 -14
  144. package/esm2022/lib/common/pipes/join.pipe.mjs +0 -26
  145. package/esm2022/lib/common/pipes/keys.mjs +0 -18
  146. package/esm2022/lib/common/pipes/map.pipe.mjs +0 -48
  147. package/esm2022/lib/common/pipes/month-name.pipe.mjs +0 -25
  148. package/esm2022/lib/common/pipes/nested-property.mjs +0 -29
  149. package/esm2022/lib/common/pipes/only-number.mjs +0 -58
  150. package/esm2022/lib/common/pipes/order.pipe.mjs +0 -269
  151. package/esm2022/lib/common/pipes/placeholder.pipe.mjs +0 -26
  152. package/esm2022/lib/common/pipes/property-join.pipe.mjs +0 -27
  153. package/esm2022/lib/common/pipes/safe-html.pipe.mjs +0 -32
  154. package/esm2022/lib/common/pipes/split.pipe.mjs +0 -25
  155. package/esm2022/lib/common/pipes/time.pipe.mjs +0 -21
  156. package/esm2022/lib/common/pipes/titlecase.pipe.mjs +0 -14
  157. package/esm2022/lib/common/pipes/truncate.pipe.mjs +0 -15
  158. package/esm2022/lib/common/pipes/values.mjs +0 -14
  159. package/esm2022/lib/common/public_api.mjs +0 -41
  160. package/esm2022/lib/common/services/base.service.mjs +0 -19
  161. package/esm2022/lib/common/services/context-helper.mjs +0 -17
  162. package/esm2022/lib/common/services/enum.service.mjs +0 -81
  163. package/esm2022/lib/common/services/event-queue.service.mjs +0 -31
  164. package/esm2022/lib/common/services/service-locator.mjs +0 -25
  165. package/esm2022/lib/common/templates/templates.mjs +0 -87
  166. package/esm2022/lib/dialogs/alert-dialog/alert-dialog.component.mjs +0 -46
  167. package/esm2022/lib/dialogs/confirm-dialog/confirm-dialog.component.mjs +0 -60
  168. package/esm2022/lib/dialogs/dialog.component.mjs +0 -59
  169. package/esm2022/lib/dialogs/dialogs.module.mjs +0 -72
  170. package/esm2022/lib/dialogs/prompt-dialog/prompt-dialog.component.mjs +0 -44
  171. package/esm2022/lib/dialogs/public_api.mjs +0 -2
  172. package/esm2022/lib/dialogs/services/dialog.service.mjs +0 -154
  173. package/esm2022/lib/file/file-input.component.mjs +0 -334
  174. package/esm2022/lib/file/file.module.mjs +0 -37
  175. package/esm2022/lib/file/public_api.mjs +0 -2
  176. package/esm2022/lib/form-validators/abstract/typed-form.mjs +0 -13
  177. package/esm2022/lib/form-validators/algorithm/luhn-algorithm.mjs +0 -33
  178. package/esm2022/lib/form-validators/const/app-validators.const.mjs +0 -68
  179. package/esm2022/lib/form-validators/const/app.const.mjs +0 -65
  180. package/esm2022/lib/form-validators/const/config-names.const.mjs +0 -33
  181. package/esm2022/lib/form-validators/const/config-required-fields.const.mjs +0 -35
  182. package/esm2022/lib/form-validators/const/decorators.const.mjs +0 -23
  183. package/esm2022/lib/form-validators/const/events.const.mjs +0 -53
  184. package/esm2022/lib/form-validators/const/html-elements.const.mjs +0 -25
  185. package/esm2022/lib/form-validators/const/iban-country-wise-regex.const.mjs +0 -80
  186. package/esm2022/lib/form-validators/const/index.mjs +0 -6
  187. package/esm2022/lib/form-validators/const/operators.const.mjs +0 -7
  188. package/esm2022/lib/form-validators/const/validation-alphabet-locale.const.mjs +0 -9
  189. package/esm2022/lib/form-validators/const/validator.const.mjs +0 -29
  190. package/esm2022/lib/form-validators/core/annotation-types.mjs +0 -75
  191. package/esm2022/lib/form-validators/core/default-container.mjs +0 -500
  192. package/esm2022/lib/form-validators/decorators/allOf.decorator.mjs +0 -10
  193. package/esm2022/lib/form-validators/decorators/alpha.decorator.mjs +0 -10
  194. package/esm2022/lib/form-validators/decorators/alphaNumeric.decorator.mjs +0 -10
  195. package/esm2022/lib/form-validators/decorators/and.decorator.mjs +0 -6
  196. package/esm2022/lib/form-validators/decorators/ascii.decorator.mjs +0 -6
  197. package/esm2022/lib/form-validators/decorators/async.decorator.mjs +0 -6
  198. package/esm2022/lib/form-validators/decorators/base-decorator.function.mjs +0 -7
  199. package/esm2022/lib/form-validators/decorators/choice.decorator.mjs +0 -10
  200. package/esm2022/lib/form-validators/decorators/compare.decorator.mjs +0 -6
  201. package/esm2022/lib/form-validators/decorators/compose.decorator.mjs +0 -6
  202. package/esm2022/lib/form-validators/decorators/contains.decorator.mjs +0 -10
  203. package/esm2022/lib/form-validators/decorators/credit-card.decorator.mjs +0 -10
  204. package/esm2022/lib/form-validators/decorators/cusip.decorator.mjs +0 -6
  205. package/esm2022/lib/form-validators/decorators/custom.decorator.mjs +0 -10
  206. package/esm2022/lib/form-validators/decorators/dataUri.decorator.mjs +0 -6
  207. package/esm2022/lib/form-validators/decorators/date.decorator.mjs +0 -10
  208. package/esm2022/lib/form-validators/decorators/different.decorator.mjs +0 -6
  209. package/esm2022/lib/form-validators/decorators/digit.decorator.mjs +0 -6
  210. package/esm2022/lib/form-validators/decorators/email.decorator.mjs +0 -6
  211. package/esm2022/lib/form-validators/decorators/endsWith.decorator.mjs +0 -10
  212. package/esm2022/lib/form-validators/decorators/even.decorator.mjs +0 -6
  213. package/esm2022/lib/form-validators/decorators/extension.decorator.mjs +0 -10
  214. package/esm2022/lib/form-validators/decorators/factor.decorator.mjs +0 -10
  215. package/esm2022/lib/form-validators/decorators/file.decorator.mjs +0 -10
  216. package/esm2022/lib/form-validators/decorators/fileSize.decorator.mjs +0 -10
  217. package/esm2022/lib/form-validators/decorators/greater-than-equal-to.decorator.mjs +0 -10
  218. package/esm2022/lib/form-validators/decorators/greater-than.decorator.mjs +0 -10
  219. package/esm2022/lib/form-validators/decorators/grid.decorator.mjs +0 -6
  220. package/esm2022/lib/form-validators/decorators/hexColor.decorator.mjs +0 -6
  221. package/esm2022/lib/form-validators/decorators/image.decorator.mjs +0 -10
  222. package/esm2022/lib/form-validators/decorators/index.mjs +0 -93
  223. package/esm2022/lib/form-validators/decorators/json.decorator.mjs +0 -6
  224. package/esm2022/lib/form-validators/decorators/latLong.decorator.mjs +0 -6
  225. package/esm2022/lib/form-validators/decorators/latitude.decorator.mjs +0 -6
  226. package/esm2022/lib/form-validators/decorators/leapYear.decorator.mjs +0 -6
  227. package/esm2022/lib/form-validators/decorators/less-than-equal-to.decorator.mjs +0 -10
  228. package/esm2022/lib/form-validators/decorators/less-than.decorator.mjs +0 -10
  229. package/esm2022/lib/form-validators/decorators/longitude.decorator.mjs +0 -6
  230. package/esm2022/lib/form-validators/decorators/lowercase.decorator.mjs +0 -6
  231. package/esm2022/lib/form-validators/decorators/mac.decorator.mjs +0 -6
  232. package/esm2022/lib/form-validators/decorators/mask.decorator.mjs +0 -6
  233. package/esm2022/lib/form-validators/decorators/maxDate.decorator.mjs +0 -10
  234. package/esm2022/lib/form-validators/decorators/maxLength.decorator.mjs +0 -10
  235. package/esm2022/lib/form-validators/decorators/maxNumber.decorator.mjs +0 -10
  236. package/esm2022/lib/form-validators/decorators/maxTime.decorator.mjs +0 -10
  237. package/esm2022/lib/form-validators/decorators/minDate.decorator.mjs +0 -10
  238. package/esm2022/lib/form-validators/decorators/minLength.decorator.mjs +0 -10
  239. package/esm2022/lib/form-validators/decorators/minNumber.decorator.mjs +0 -10
  240. package/esm2022/lib/form-validators/decorators/minTime.decorator.mjs +0 -10
  241. package/esm2022/lib/form-validators/decorators/model.decorator.mjs +0 -7
  242. package/esm2022/lib/form-validators/decorators/non-validation-decorators/disable.decorator.mjs +0 -8
  243. package/esm2022/lib/form-validators/decorators/non-validation-decorators/elementClass.decorator.mjs +0 -8
  244. package/esm2022/lib/form-validators/decorators/non-validation-decorators/error.decorator.mjs +0 -8
  245. package/esm2022/lib/form-validators/decorators/non-validation-decorators/update-on.decorator.mjs +0 -6
  246. package/esm2022/lib/form-validators/decorators/noneOf.decorator.mjs +0 -10
  247. package/esm2022/lib/form-validators/decorators/not.decorator.mjs +0 -6
  248. package/esm2022/lib/form-validators/decorators/notEmpty.decorator.mjs +0 -6
  249. package/esm2022/lib/form-validators/decorators/numeric.decorator.mjs +0 -10
  250. package/esm2022/lib/form-validators/decorators/odd.decorator.mjs +0 -6
  251. package/esm2022/lib/form-validators/decorators/oneOf.decorator.mjs +0 -10
  252. package/esm2022/lib/form-validators/decorators/or.decorator.mjs +0 -6
  253. package/esm2022/lib/form-validators/decorators/password.decorator.mjs +0 -10
  254. package/esm2022/lib/form-validators/decorators/pattern.decorator.mjs +0 -10
  255. package/esm2022/lib/form-validators/decorators/port.decorator.mjs +0 -6
  256. package/esm2022/lib/form-validators/decorators/primeNumber.decorator.mjs +0 -6
  257. package/esm2022/lib/form-validators/decorators/prop-array.decorator.mjs +0 -18
  258. package/esm2022/lib/form-validators/decorators/prop-object.decorator.mjs +0 -8
  259. package/esm2022/lib/form-validators/decorators/prop.decorator.mjs +0 -18
  260. package/esm2022/lib/form-validators/decorators/range.decorator.mjs +0 -10
  261. package/esm2022/lib/form-validators/decorators/required.decorator.mjs +0 -6
  262. package/esm2022/lib/form-validators/decorators/requiredTrue.decorator.mjs +0 -6
  263. package/esm2022/lib/form-validators/decorators/rule.decorator.mjs +0 -6
  264. package/esm2022/lib/form-validators/decorators/sanitize/blacklist.decorator.mjs +0 -8
  265. package/esm2022/lib/form-validators/decorators/sanitize/escape.decorator.mjs +0 -8
  266. package/esm2022/lib/form-validators/decorators/sanitize/ltrim.decorator.mjs +0 -8
  267. package/esm2022/lib/form-validators/decorators/sanitize/prefix.decorator.mjs +0 -8
  268. package/esm2022/lib/form-validators/decorators/sanitize/rtrim.decorator.mjs +0 -8
  269. package/esm2022/lib/form-validators/decorators/sanitize/sanitize.decorator.mjs +0 -8
  270. package/esm2022/lib/form-validators/decorators/sanitize/stripLow.decorator.mjs +0 -8
  271. package/esm2022/lib/form-validators/decorators/sanitize/suffix.decorator.mjs +0 -8
  272. package/esm2022/lib/form-validators/decorators/sanitize/toBoolean.decorator.mjs +0 -8
  273. package/esm2022/lib/form-validators/decorators/sanitize/toDate.decorator.mjs +0 -8
  274. package/esm2022/lib/form-validators/decorators/sanitize/toDouble.decorator.mjs +0 -8
  275. package/esm2022/lib/form-validators/decorators/sanitize/toFloat.decorator.mjs +0 -8
  276. package/esm2022/lib/form-validators/decorators/sanitize/toInt.decorator.mjs +0 -8
  277. package/esm2022/lib/form-validators/decorators/sanitize/toString.decorator.mjs +0 -8
  278. package/esm2022/lib/form-validators/decorators/sanitize/trim.decorator.mjs +0 -8
  279. package/esm2022/lib/form-validators/decorators/sanitize/whitelist.decorator.mjs +0 -8
  280. package/esm2022/lib/form-validators/decorators/startsWith.decorator.mjs +0 -10
  281. package/esm2022/lib/form-validators/decorators/time.decorator.mjs +0 -10
  282. package/esm2022/lib/form-validators/decorators/unique.decorator.mjs +0 -6
  283. package/esm2022/lib/form-validators/decorators/uppercase.decorator.mjs +0 -6
  284. package/esm2022/lib/form-validators/decorators/url.decorator.mjs +0 -10
  285. package/esm2022/lib/form-validators/directives/base-directive.mjs +0 -75
  286. package/esm2022/lib/form-validators/directives/control-host.directive.mjs +0 -55
  287. package/esm2022/lib/form-validators/directives/html-control-template.directive.mjs +0 -36
  288. package/esm2022/lib/form-validators/directives/rx-form.directive.mjs +0 -234
  289. package/esm2022/lib/form-validators/directives/template-validations/async-validation.directive.mjs +0 -40
  290. package/esm2022/lib/form-validators/directives/template-validations/base-validator.directive.mjs +0 -76
  291. package/esm2022/lib/form-validators/directives/template-validations/control-expression-process.mjs +0 -60
  292. package/esm2022/lib/form-validators/directives/template-validations/file-control.directive.mjs +0 -122
  293. package/esm2022/lib/form-validators/directives/template-validations/image-file-control.directive.mjs +0 -74
  294. package/esm2022/lib/form-validators/directives/template-validations/rxformcontrol.directive.mjs +0 -394
  295. package/esm2022/lib/form-validators/domain/disable-provider.mjs +0 -198
  296. package/esm2022/lib/form-validators/domain/element-processor/decimal.provider.mjs +0 -134
  297. package/esm2022/lib/form-validators/domain/element-processor/mask.provider.mjs +0 -453
  298. package/esm2022/lib/form-validators/domain/form-data.mjs +0 -93
  299. package/esm2022/lib/form-validators/enums/error-message-binding-strategy.mjs +0 -11
  300. package/esm2022/lib/form-validators/enums/index.mjs +0 -5
  301. package/esm2022/lib/form-validators/enums/ip-version.mjs +0 -7
  302. package/esm2022/lib/form-validators/enums/numeric-value-type.mjs +0 -7
  303. package/esm2022/lib/form-validators/enums/reset-type.mjs +0 -10
  304. package/esm2022/lib/form-validators/enums/url-validation-type.mjs +0 -7
  305. package/esm2022/lib/form-validators/models/config/alpha-config.mjs +0 -2
  306. package/esm2022/lib/form-validators/models/config/array-config.mjs +0 -2
  307. package/esm2022/lib/form-validators/models/config/base-config-fn.mjs +0 -2
  308. package/esm2022/lib/form-validators/models/config/base-config.mjs +0 -2
  309. package/esm2022/lib/form-validators/models/config/base-date-config.mjs +0 -2
  310. package/esm2022/lib/form-validators/models/config/choice-config.mjs +0 -2
  311. package/esm2022/lib/form-validators/models/config/compare-config.mjs +0 -2
  312. package/esm2022/lib/form-validators/models/config/component-config.mjs +0 -2
  313. package/esm2022/lib/form-validators/models/config/compose-config.mjs +0 -2
  314. package/esm2022/lib/form-validators/models/config/contains-config.mjs +0 -2
  315. package/esm2022/lib/form-validators/models/config/credit-card-config.mjs +0 -2
  316. package/esm2022/lib/form-validators/models/config/custom-config.mjs +0 -2
  317. package/esm2022/lib/form-validators/models/config/date-config.mjs +0 -2
  318. package/esm2022/lib/form-validators/models/config/default-config.mjs +0 -2
  319. package/esm2022/lib/form-validators/models/config/digit-config.mjs +0 -2
  320. package/esm2022/lib/form-validators/models/config/disable-config.mjs +0 -2
  321. package/esm2022/lib/form-validators/models/config/element-class-config.mjs +0 -2
  322. package/esm2022/lib/form-validators/models/config/email-config.mjs +0 -2
  323. package/esm2022/lib/form-validators/models/config/error-config.mjs +0 -2
  324. package/esm2022/lib/form-validators/models/config/extension-config.mjs +0 -2
  325. package/esm2022/lib/form-validators/models/config/factor-config.mjs +0 -2
  326. package/esm2022/lib/form-validators/models/config/field-config.mjs +0 -2
  327. package/esm2022/lib/form-validators/models/config/file-config.mjs +0 -2
  328. package/esm2022/lib/form-validators/models/config/hex-color-config.mjs +0 -2
  329. package/esm2022/lib/form-validators/models/config/iban-config.mjs +0 -2
  330. package/esm2022/lib/form-validators/models/config/image-config.mjs +0 -2
  331. package/esm2022/lib/form-validators/models/config/index.mjs +0 -35
  332. package/esm2022/lib/form-validators/models/config/ip-config.mjs +0 -2
  333. package/esm2022/lib/form-validators/models/config/logical-operator-config.mjs +0 -2
  334. package/esm2022/lib/form-validators/models/config/mask-config.mjs +0 -2
  335. package/esm2022/lib/form-validators/models/config/max-date-config.mjs +0 -2
  336. package/esm2022/lib/form-validators/models/config/message-config.mjs +0 -2
  337. package/esm2022/lib/form-validators/models/config/min-date-config.mjs +0 -2
  338. package/esm2022/lib/form-validators/models/config/model-config.mjs +0 -2
  339. package/esm2022/lib/form-validators/models/config/number-config.mjs +0 -2
  340. package/esm2022/lib/form-validators/models/config/numeric-config.mjs +0 -2
  341. package/esm2022/lib/form-validators/models/config/password-config.mjs +0 -2
  342. package/esm2022/lib/form-validators/models/config/pattern-config.mjs +0 -2
  343. package/esm2022/lib/form-validators/models/config/prop-config.mjs +0 -2
  344. package/esm2022/lib/form-validators/models/config/props-config.mjs +0 -2
  345. package/esm2022/lib/form-validators/models/config/range-config.mjs +0 -2
  346. package/esm2022/lib/form-validators/models/config/relational-operator-config.mjs +0 -2
  347. package/esm2022/lib/form-validators/models/config/required-config.mjs +0 -2
  348. package/esm2022/lib/form-validators/models/config/rule-config.mjs +0 -2
  349. package/esm2022/lib/form-validators/models/config/sanitize-config.mjs +0 -2
  350. package/esm2022/lib/form-validators/models/config/size-config.mjs +0 -2
  351. package/esm2022/lib/form-validators/models/config/string-comparison-config.mjs +0 -2
  352. package/esm2022/lib/form-validators/models/config/string-value-config.mjs +0 -2
  353. package/esm2022/lib/form-validators/models/config/time-config.mjs +0 -2
  354. package/esm2022/lib/form-validators/models/config/todate-config.mjs +0 -2
  355. package/esm2022/lib/form-validators/models/config/unique-config.mjs +0 -2
  356. package/esm2022/lib/form-validators/models/config/update-on-config.mjs +0 -2
  357. package/esm2022/lib/form-validators/models/config/url-config.mjs +0 -2
  358. package/esm2022/lib/form-validators/models/control-info.mjs +0 -2
  359. package/esm2022/lib/form-validators/models/data-sanitizer.mjs +0 -2
  360. package/esm2022/lib/form-validators/models/decorator-configuration.mjs +0 -2
  361. package/esm2022/lib/form-validators/models/form-builder-configuration.mjs +0 -58
  362. package/esm2022/lib/form-validators/models/index.mjs +0 -3
  363. package/esm2022/lib/form-validators/models/instance-container.mjs +0 -2
  364. package/esm2022/lib/form-validators/models/interface/array-prop-instance-config.interface.mjs +0 -2
  365. package/esm2022/lib/form-validators/models/interface/auto-instance-config.interface.mjs +0 -2
  366. package/esm2022/lib/form-validators/models/interface/form-data-config.mjs +0 -2
  367. package/esm2022/lib/form-validators/models/interface/i-abstract-control.mjs +0 -30
  368. package/esm2022/lib/form-validators/models/interface/i-form-group.mjs +0 -2
  369. package/esm2022/lib/form-validators/models/interface/instance-argument.interface.mjs +0 -2
  370. package/esm2022/lib/form-validators/models/interface/object-prop-instance-config.interface.mjs +0 -2
  371. package/esm2022/lib/form-validators/models/interface/options.mjs +0 -2
  372. package/esm2022/lib/form-validators/models/password-validation.model.mjs +0 -2
  373. package/esm2022/lib/form-validators/models/prop-validation-config.mjs +0 -2
  374. package/esm2022/lib/form-validators/models/property-info.mjs +0 -2
  375. package/esm2022/lib/form-validators/public_api.mjs +0 -26
  376. package/esm2022/lib/form-validators/reactive-form-validators/allOf.validator.mjs +0 -33
  377. package/esm2022/lib/form-validators/reactive-form-validators/alpha.validator.mjs +0 -15
  378. package/esm2022/lib/form-validators/reactive-form-validators/alphaNumeric.validator.mjs +0 -15
  379. package/esm2022/lib/form-validators/reactive-form-validators/and.validator.mjs +0 -38
  380. package/esm2022/lib/form-validators/reactive-form-validators/ascii.validator.mjs +0 -15
  381. package/esm2022/lib/form-validators/reactive-form-validators/async/base.async.validator.mjs +0 -45
  382. package/esm2022/lib/form-validators/reactive-form-validators/choice.validator.mjs +0 -31
  383. package/esm2022/lib/form-validators/reactive-form-validators/compare.validator.mjs +0 -32
  384. package/esm2022/lib/form-validators/reactive-form-validators/compose.validator.mjs +0 -34
  385. package/esm2022/lib/form-validators/reactive-form-validators/conditional-change.validator.mjs +0 -63
  386. package/esm2022/lib/form-validators/reactive-form-validators/contains.validator.mjs +0 -22
  387. package/esm2022/lib/form-validators/reactive-form-validators/credit-card.validator.mjs +0 -48
  388. package/esm2022/lib/form-validators/reactive-form-validators/cusip.validator.mjs +0 -38
  389. package/esm2022/lib/form-validators/reactive-form-validators/custom.validator.mjs +0 -25
  390. package/esm2022/lib/form-validators/reactive-form-validators/dataUri.validator.mjs +0 -9
  391. package/esm2022/lib/form-validators/reactive-form-validators/date.validator.mjs +0 -8
  392. package/esm2022/lib/form-validators/reactive-form-validators/different.validator.mjs +0 -19
  393. package/esm2022/lib/form-validators/reactive-form-validators/digit.validator.mjs +0 -9
  394. package/esm2022/lib/form-validators/reactive-form-validators/email.validator.mjs +0 -9
  395. package/esm2022/lib/form-validators/reactive-form-validators/endsWith.validator.mjs +0 -23
  396. package/esm2022/lib/form-validators/reactive-form-validators/even.validator.mjs +0 -15
  397. package/esm2022/lib/form-validators/reactive-form-validators/extension.validator.mjs +0 -40
  398. package/esm2022/lib/form-validators/reactive-form-validators/factor.validator.mjs +0 -37
  399. package/esm2022/lib/form-validators/reactive-form-validators/file.validator.mjs +0 -26
  400. package/esm2022/lib/form-validators/reactive-form-validators/fileSize.validator.mjs +0 -34
  401. package/esm2022/lib/form-validators/reactive-form-validators/greater-than-equal-to.validator.mjs +0 -8
  402. package/esm2022/lib/form-validators/reactive-form-validators/greater-than.validator.mjs +0 -8
  403. package/esm2022/lib/form-validators/reactive-form-validators/grid.validator.mjs +0 -31
  404. package/esm2022/lib/form-validators/reactive-form-validators/hexcolor.validator.mjs +0 -9
  405. package/esm2022/lib/form-validators/reactive-form-validators/iban.validator.mjs +0 -28
  406. package/esm2022/lib/form-validators/reactive-form-validators/image.validator.mjs +0 -52
  407. package/esm2022/lib/form-validators/reactive-form-validators/index.mjs +0 -66
  408. package/esm2022/lib/form-validators/reactive-form-validators/ip.validator.mjs +0 -28
  409. package/esm2022/lib/form-validators/reactive-form-validators/json.validator.mjs +0 -26
  410. package/esm2022/lib/form-validators/reactive-form-validators/latLong.validator.mjs +0 -18
  411. package/esm2022/lib/form-validators/reactive-form-validators/latitude.validator.mjs +0 -9
  412. package/esm2022/lib/form-validators/reactive-form-validators/leapYear.validator.mjs +0 -16
  413. package/esm2022/lib/form-validators/reactive-form-validators/less-than-equal-to.validator.mjs +0 -8
  414. package/esm2022/lib/form-validators/reactive-form-validators/less-than.validator.mjs +0 -8
  415. package/esm2022/lib/form-validators/reactive-form-validators/longitude.validator.mjs +0 -9
  416. package/esm2022/lib/form-validators/reactive-form-validators/lowercase.validator.mjs +0 -15
  417. package/esm2022/lib/form-validators/reactive-form-validators/mac.validator.mjs +0 -9
  418. package/esm2022/lib/form-validators/reactive-form-validators/mask.validator.mjs +0 -14
  419. package/esm2022/lib/form-validators/reactive-form-validators/maxDate.validator.mjs +0 -8
  420. package/esm2022/lib/form-validators/reactive-form-validators/maxLength.validator.mjs +0 -17
  421. package/esm2022/lib/form-validators/reactive-form-validators/maxNumber.validator.mjs +0 -17
  422. package/esm2022/lib/form-validators/reactive-form-validators/maxTime.validator.mjs +0 -8
  423. package/esm2022/lib/form-validators/reactive-form-validators/minDate.validator.mjs +0 -8
  424. package/esm2022/lib/form-validators/reactive-form-validators/minLength.validator.mjs +0 -16
  425. package/esm2022/lib/form-validators/reactive-form-validators/minNumber.validator.mjs +0 -16
  426. package/esm2022/lib/form-validators/reactive-form-validators/minTime.validator.mjs +0 -8
  427. package/esm2022/lib/form-validators/reactive-form-validators/noneOf.validator.mjs +0 -24
  428. package/esm2022/lib/form-validators/reactive-form-validators/not.validator.mjs +0 -25
  429. package/esm2022/lib/form-validators/reactive-form-validators/notEmpty.validator.mjs +0 -17
  430. package/esm2022/lib/form-validators/reactive-form-validators/numeric.validator.mjs +0 -22
  431. package/esm2022/lib/form-validators/reactive-form-validators/odd.validator.mjs +0 -17
  432. package/esm2022/lib/form-validators/reactive-form-validators/oneOf.validator.mjs +0 -26
  433. package/esm2022/lib/form-validators/reactive-form-validators/or.validator.mjs +0 -25
  434. package/esm2022/lib/form-validators/reactive-form-validators/password.validator.mjs +0 -35
  435. package/esm2022/lib/form-validators/reactive-form-validators/pattern.validator.mjs +0 -19
  436. package/esm2022/lib/form-validators/reactive-form-validators/port.validator.mjs +0 -19
  437. package/esm2022/lib/form-validators/reactive-form-validators/primeNumber.validator.mjs +0 -27
  438. package/esm2022/lib/form-validators/reactive-form-validators/range.validator.mjs +0 -17
  439. package/esm2022/lib/form-validators/reactive-form-validators/required.validator.mjs +0 -17
  440. package/esm2022/lib/form-validators/reactive-form-validators/requiredTrue.validator.mjs +0 -16
  441. package/esm2022/lib/form-validators/reactive-form-validators/rule.validator.mjs +0 -22
  442. package/esm2022/lib/form-validators/reactive-form-validators/startsWith.validator.mjs +0 -25
  443. package/esm2022/lib/form-validators/reactive-form-validators/time.validator.mjs +0 -19
  444. package/esm2022/lib/form-validators/reactive-form-validators/unique.validator.mjs +0 -77
  445. package/esm2022/lib/form-validators/reactive-form-validators/uppercase.validator.mjs +0 -16
  446. package/esm2022/lib/form-validators/reactive-form-validators/url.validator.mjs +0 -28
  447. package/esm2022/lib/form-validators/services/base-form-builder.mjs +0 -220
  448. package/esm2022/lib/form-validators/services/entity.service.mjs +0 -76
  449. package/esm2022/lib/form-validators/services/form-control.mjs +0 -370
  450. package/esm2022/lib/form-validators/services/form-group.mjs +0 -2
  451. package/esm2022/lib/form-validators/services/reactive-form.module.mjs +0 -52
  452. package/esm2022/lib/form-validators/services/rx-form-array.mjs +0 -114
  453. package/esm2022/lib/form-validators/services/rx-form-builder.mjs +0 -1035
  454. package/esm2022/lib/form-validators/services/rx-form-group.mjs +0 -451
  455. package/esm2022/lib/form-validators/services/typed-form-builder.mjs +0 -25
  456. package/esm2022/lib/form-validators/util/alphabet-regex.locale.mjs +0 -29
  457. package/esm2022/lib/form-validators/util/app-util.mjs +0 -161
  458. package/esm2022/lib/form-validators/util/check-length.mjs +0 -11
  459. package/esm2022/lib/form-validators/util/config-provider.mjs +0 -37
  460. package/esm2022/lib/form-validators/util/date-checker.function.mjs +0 -52
  461. package/esm2022/lib/form-validators/util/date-provider.mjs +0 -108
  462. package/esm2022/lib/form-validators/util/form-const.mjs +0 -3
  463. package/esm2022/lib/form-validators/util/form-provider.mjs +0 -87
  464. package/esm2022/lib/form-validators/util/index.mjs +0 -7
  465. package/esm2022/lib/form-validators/util/instance-provider.function.mjs +0 -63
  466. package/esm2022/lib/form-validators/util/ip-checker.mjs +0 -19
  467. package/esm2022/lib/form-validators/util/linq.mjs +0 -157
  468. package/esm2022/lib/form-validators/util/object-maker.mjs +0 -68
  469. package/esm2022/lib/form-validators/util/reactive-form-config.mjs +0 -25
  470. package/esm2022/lib/form-validators/util/regex-rules.mjs +0 -37
  471. package/esm2022/lib/form-validators/util/regex-validator.mjs +0 -74
  472. package/esm2022/lib/form-validators/util/relational-checker.function.mjs +0 -92
  473. package/esm2022/lib/form-validators/util/reset-form.mjs +0 -57
  474. package/esm2022/lib/form-validators/util/sanitizers.mjs +0 -140
  475. package/esm2022/lib/form-validators/util/time-checker.function.mjs +0 -50
  476. package/esm2022/lib/form-validators/util/type.mjs +0 -2
  477. package/esm2022/lib/form-validators/util/validator-value-checker.mjs +0 -21
  478. package/esm2022/lib/form-validators/validators-extension/allOf-validator.extension.mjs +0 -11
  479. package/esm2022/lib/form-validators/validators-extension/alpha-validator.extension.mjs +0 -11
  480. package/esm2022/lib/form-validators/validators-extension/alphaNumeric-validator.extension.mjs +0 -11
  481. package/esm2022/lib/form-validators/validators-extension/and-validator.extension.mjs +0 -7
  482. package/esm2022/lib/form-validators/validators-extension/ascii-validator.extension.mjs +0 -7
  483. package/esm2022/lib/form-validators/validators-extension/base-validator.function.mjs +0 -34
  484. package/esm2022/lib/form-validators/validators-extension/choice-validator.extension.mjs +0 -11
  485. package/esm2022/lib/form-validators/validators-extension/compare-validator.extension.mjs +0 -7
  486. package/esm2022/lib/form-validators/validators-extension/compose-validator.extension.mjs +0 -7
  487. package/esm2022/lib/form-validators/validators-extension/contains-validator.extension.mjs +0 -11
  488. package/esm2022/lib/form-validators/validators-extension/credit-card-validator.extension.mjs +0 -11
  489. package/esm2022/lib/form-validators/validators-extension/cusip-validator.extension.mjs +0 -7
  490. package/esm2022/lib/form-validators/validators-extension/custom-validator.extension.mjs +0 -11
  491. package/esm2022/lib/form-validators/validators-extension/dataUri-validator.extension.mjs +0 -7
  492. package/esm2022/lib/form-validators/validators-extension/date-validator.extension.mjs +0 -11
  493. package/esm2022/lib/form-validators/validators-extension/different-validator.extension.mjs +0 -7
  494. package/esm2022/lib/form-validators/validators-extension/digit-validator.extension.mjs +0 -7
  495. package/esm2022/lib/form-validators/validators-extension/email-validator.extension.mjs +0 -7
  496. package/esm2022/lib/form-validators/validators-extension/endsWith-validator.extension.mjs +0 -11
  497. package/esm2022/lib/form-validators/validators-extension/even-validator.extension.mjs +0 -7
  498. package/esm2022/lib/form-validators/validators-extension/extension-validator.extension.mjs +0 -10
  499. package/esm2022/lib/form-validators/validators-extension/factor-validator.extension.mjs +0 -11
  500. package/esm2022/lib/form-validators/validators-extension/file-validator.extension.mjs +0 -10
  501. package/esm2022/lib/form-validators/validators-extension/fileSize-validator.extension.mjs +0 -10
  502. package/esm2022/lib/form-validators/validators-extension/greater-than-equal-to-validator.extension.mjs +0 -11
  503. package/esm2022/lib/form-validators/validators-extension/greater-than-validator.extension.mjs +0 -11
  504. package/esm2022/lib/form-validators/validators-extension/grid-validator.extension.mjs +0 -7
  505. package/esm2022/lib/form-validators/validators-extension/hexcolor-validator.extension.mjs +0 -7
  506. package/esm2022/lib/form-validators/validators-extension/iban-validator.extension.mjs +0 -11
  507. package/esm2022/lib/form-validators/validators-extension/image-validator.extension.mjs +0 -10
  508. package/esm2022/lib/form-validators/validators-extension/index.mjs +0 -68
  509. package/esm2022/lib/form-validators/validators-extension/ip-validator.extension.mjs +0 -11
  510. package/esm2022/lib/form-validators/validators-extension/json-validator.extension.mjs +0 -7
  511. package/esm2022/lib/form-validators/validators-extension/latLong-validator.extension.mjs +0 -7
  512. package/esm2022/lib/form-validators/validators-extension/latitude-validator.extension.mjs +0 -7
  513. package/esm2022/lib/form-validators/validators-extension/leapYear-validator.extension.mjs +0 -7
  514. package/esm2022/lib/form-validators/validators-extension/less-than-equal-to-validator.extension.mjs +0 -11
  515. package/esm2022/lib/form-validators/validators-extension/less-than-validator.extension.mjs +0 -11
  516. package/esm2022/lib/form-validators/validators-extension/longitude-validator.extension.mjs +0 -7
  517. package/esm2022/lib/form-validators/validators-extension/lowercase-validator.extension.mjs +0 -7
  518. package/esm2022/lib/form-validators/validators-extension/mac-validator.extension.mjs +0 -7
  519. package/esm2022/lib/form-validators/validators-extension/mask-validator.extension.mjs +0 -7
  520. package/esm2022/lib/form-validators/validators-extension/maxDate-validator.extension.mjs +0 -11
  521. package/esm2022/lib/form-validators/validators-extension/maxLength-validator.extension.mjs +0 -11
  522. package/esm2022/lib/form-validators/validators-extension/maxNumber-validator.extension.mjs +0 -11
  523. package/esm2022/lib/form-validators/validators-extension/maxTime-validator.extension.mjs +0 -11
  524. package/esm2022/lib/form-validators/validators-extension/minDate-validator.extension.mjs +0 -11
  525. package/esm2022/lib/form-validators/validators-extension/minLength-validator.extension.mjs +0 -11
  526. package/esm2022/lib/form-validators/validators-extension/minNumber-validator.extension.mjs +0 -11
  527. package/esm2022/lib/form-validators/validators-extension/minTime-validator.extension.mjs +0 -11
  528. package/esm2022/lib/form-validators/validators-extension/noneOf-validator.extension.mjs +0 -11
  529. package/esm2022/lib/form-validators/validators-extension/not-validator.extension.mjs +0 -7
  530. package/esm2022/lib/form-validators/validators-extension/notEmpty-validator.extension.mjs +0 -7
  531. package/esm2022/lib/form-validators/validators-extension/numeric-validator.extension.mjs +0 -11
  532. package/esm2022/lib/form-validators/validators-extension/odd-validator.extension.mjs +0 -7
  533. package/esm2022/lib/form-validators/validators-extension/oneOf-validator.extension.mjs +0 -11
  534. package/esm2022/lib/form-validators/validators-extension/or-validator.extension.mjs +0 -7
  535. package/esm2022/lib/form-validators/validators-extension/password-validator.extension.mjs +0 -11
  536. package/esm2022/lib/form-validators/validators-extension/pattern-validator.extension.mjs +0 -11
  537. package/esm2022/lib/form-validators/validators-extension/port-validator.extension.mjs +0 -7
  538. package/esm2022/lib/form-validators/validators-extension/primeNumber-validator.extension.mjs +0 -7
  539. package/esm2022/lib/form-validators/validators-extension/range-validator.extension.mjs +0 -11
  540. package/esm2022/lib/form-validators/validators-extension/required-validator.extension.mjs +0 -7
  541. package/esm2022/lib/form-validators/validators-extension/requiredTrue-validator.extension.mjs +0 -7
  542. package/esm2022/lib/form-validators/validators-extension/rxweb-validators.mjs +0 -108
  543. package/esm2022/lib/form-validators/validators-extension/startsWith-validator.extension.mjs +0 -11
  544. package/esm2022/lib/form-validators/validators-extension/time-validator.extension.mjs +0 -11
  545. package/esm2022/lib/form-validators/validators-extension/unique-validator.extension.mjs +0 -7
  546. package/esm2022/lib/form-validators/validators-extension/uppercase-validator.extension.mjs +0 -7
  547. package/esm2022/lib/form-validators/validators-extension/url-validator.extension.mjs +0 -11
  548. package/esm2022/lib/form-validators/validators-function/alpha-validation.function.mjs +0 -71
  549. package/esm2022/lib/form-validators/validators-function/regex-validation.function.mjs +0 -33
  550. package/esm2022/lib/forms/components/datepicker/datepicker-header.component.mjs +0 -84
  551. package/esm2022/lib/forms/components/generic-form/generic-form.component.mjs +0 -602
  552. package/esm2022/lib/forms/constants/constants.mjs +0 -4
  553. package/esm2022/lib/forms/directives/mat-form-field-editor.directive.mjs +0 -197
  554. package/esm2022/lib/forms/directives/mat-form-field-readonly.directive.mjs +0 -34
  555. package/esm2022/lib/forms/directives/parse-decimal-directive.mjs +0 -87
  556. package/esm2022/lib/forms/directives/vd-generic-form-custom-field.directive.mjs +0 -35
  557. package/esm2022/lib/forms/enums/form-field-type.mjs +0 -23
  558. package/esm2022/lib/forms/forms.module.mjs +0 -168
  559. package/esm2022/lib/forms/functions/decorators.mjs +0 -136
  560. package/esm2022/lib/forms/functions/functions.mjs +0 -72
  561. package/esm2022/lib/forms/helpers/abstract-mat-form-field.mjs +0 -308
  562. package/esm2022/lib/forms/helpers/abstract-select-form-field.component.mjs +0 -492
  563. package/esm2022/lib/forms/helpers/value-accessor-base.mjs +0 -146
  564. package/esm2022/lib/forms/models/form-definition.mjs +0 -63
  565. package/esm2022/lib/forms/models/form-field-definition.mjs +0 -468
  566. package/esm2022/lib/forms/models/form-field-group-definition.mjs +0 -55
  567. package/esm2022/lib/forms/pipes/field-func.pipe.mjs +0 -23
  568. package/esm2022/lib/forms/pipes/group-filter.pipe.mjs +0 -34
  569. package/esm2022/lib/forms/public_api.mjs +0 -5
  570. package/esm2022/lib/forms/validators/empty-string-reset.directive.mjs +0 -25
  571. package/esm2022/lib/forms/validators/equal-validator.directive.mjs +0 -69
  572. package/esm2022/lib/forms/validators/native-element-injector.directive.mjs +0 -41
  573. package/esm2022/lib/forms/validators/unique-validator-directive.mjs +0 -88
  574. package/esm2022/lib/http/http.module.mjs +0 -15
  575. package/esm2022/lib/http/models/response.mjs +0 -24
  576. package/esm2022/lib/http/public_api.mjs +0 -2
  577. package/esm2022/lib/http/services/generic.service.mjs +0 -331
  578. package/esm2022/lib/layout/dynamic-menu/dynamic-menu.component.mjs +0 -103
  579. package/esm2022/lib/layout/layout-card-over/layout-card-over.component.mjs +0 -49
  580. package/esm2022/lib/layout/layout-compact/layout-compact.component.mjs +0 -193
  581. package/esm2022/lib/layout/layout-footer/layout-footer.component.mjs +0 -37
  582. package/esm2022/lib/layout/layout-manage-list/layout-manage-list.component.mjs +0 -150
  583. package/esm2022/lib/layout/layout-manage-list/layout-manage-list.directives.mjs +0 -108
  584. package/esm2022/lib/layout/layout-nav/layout-nav.component.mjs +0 -146
  585. package/esm2022/lib/layout/layout-nav-list/layout-nav-list.component.mjs +0 -141
  586. package/esm2022/lib/layout/layout-nav-list/layout-nav-list.directives.mjs +0 -105
  587. package/esm2022/lib/layout/layout-toggle.class.mjs +0 -89
  588. package/esm2022/lib/layout/layout.component.mjs +0 -230
  589. package/esm2022/lib/layout/layout.directives.mjs +0 -81
  590. package/esm2022/lib/layout/layout.module.mjs +0 -144
  591. package/esm2022/lib/layout/list-toolbar/list-toolbar.component.mjs +0 -47
  592. package/esm2022/lib/layout/navigation-drawer/navigation-drawer.component.mjs +0 -275
  593. package/esm2022/lib/layout/public_api.mjs +0 -2
  594. package/esm2022/lib/list/components/list.component.mjs +0 -78
  595. package/esm2022/lib/list/directives/vd-list-option.directive.mjs +0 -23
  596. package/esm2022/lib/list/list.module.mjs +0 -36
  597. package/esm2022/lib/list/public_api.mjs +0 -3
  598. package/esm2022/lib/media/directives/media-toggle.directive.mjs +0 -154
  599. package/esm2022/lib/media/media.module.mjs +0 -35
  600. package/esm2022/lib/media/public_api.mjs +0 -2
  601. package/esm2022/lib/media/services/media.service.mjs +0 -110
  602. package/esm2022/lib/menu/components/menu.component.mjs +0 -95
  603. package/esm2022/lib/menu/enums/menu-scope.mjs +0 -6
  604. package/esm2022/lib/menu/menu.module.mjs +0 -64
  605. package/esm2022/lib/menu/models/menu-client.mjs +0 -39
  606. package/esm2022/lib/menu/models/menu-department.mjs +0 -39
  607. package/esm2022/lib/menu/models/menu-item-client.mjs +0 -39
  608. package/esm2022/lib/menu/models/menu-item-department.mjs +0 -39
  609. package/esm2022/lib/menu/models/menu-item.mjs +0 -351
  610. package/esm2022/lib/menu/models/menu-settings.mjs +0 -13
  611. package/esm2022/lib/menu/models/menu.mjs +0 -224
  612. package/esm2022/lib/menu/public_api.mjs +0 -3
  613. package/esm2022/lib/menu/resolvers/menu-form-includes.resolve.mjs +0 -50
  614. package/esm2022/lib/menu/resolvers/menu-item-form-includes.resolve.mjs +0 -50
  615. package/esm2022/lib/menu/resolvers/menu-list-projection.resolve.mjs +0 -51
  616. package/esm2022/lib/menu/resolvers/menu-settings.resolve.mjs +0 -24
  617. package/esm2022/lib/menu/services/menu-items.service.mjs +0 -19
  618. package/esm2022/lib/menu/services/menu.resolve.mjs +0 -68
  619. package/esm2022/lib/menu/services/menu.service.mjs +0 -19
  620. package/esm2022/lib/search/public_api.mjs +0 -2
  621. package/esm2022/lib/search/search.module.mjs +0 -33
  622. package/esm2022/lib/select/components/select.component.mjs +0 -215
  623. package/esm2022/lib/select/directives/vd-select-option.directive.mjs +0 -23
  624. package/esm2022/lib/select/directives/vd-select-trigger.directive.mjs +0 -23
  625. package/esm2022/lib/select/public_api.mjs +0 -4
  626. package/esm2022/lib/select/select.module.mjs +0 -48
  627. package/esm2022/lib/table/components/dynamic-table/dynamic-table.component.mjs +0 -810
  628. package/esm2022/lib/table/components/filter-clear/filter-clear.component.mjs +0 -36
  629. package/esm2022/lib/table/components/filter-date/filter-date.component.mjs +0 -146
  630. package/esm2022/lib/table/components/filter-input/filter-input.component.mjs +0 -198
  631. package/esm2022/lib/table/components/filter-select/filter-select.component.mjs +0 -375
  632. package/esm2022/lib/table/constants/constants.mjs +0 -3
  633. package/esm2022/lib/table/directives/data-source-filter.directive.mjs +0 -49
  634. package/esm2022/lib/table/directives/vd-table-field.directive.mjs +0 -35
  635. package/esm2022/lib/table/enums/grid.mjs +0 -12
  636. package/esm2022/lib/table/enums/table-column-type.mjs +0 -17
  637. package/esm2022/lib/table/functions/decorators.mjs +0 -163
  638. package/esm2022/lib/table/functions/functions.mjs +0 -28
  639. package/esm2022/lib/table/models/facet-value.mjs +0 -47
  640. package/esm2022/lib/table/models/facet.mjs +0 -48
  641. package/esm2022/lib/table/models/pagination.mjs +0 -27
  642. package/esm2022/lib/table/models/table-column-config.mjs +0 -128
  643. package/esm2022/lib/table/models/table-column.mjs +0 -270
  644. package/esm2022/lib/table/models/table-config.mjs +0 -41
  645. package/esm2022/lib/table/models/table-definition.mjs +0 -110
  646. package/esm2022/lib/table/models/table-query-config.mjs +0 -26
  647. package/esm2022/lib/table/paginator-intl.mjs +0 -41
  648. package/esm2022/lib/table/public_api.mjs +0 -2
  649. package/esm2022/lib/table/table.data-source.mjs +0 -326
  650. package/esm2022/lib/table/table.module.mjs +0 -165
  651. package/esm2022/lib/table/table.static-data-source.mjs +0 -198
  652. package/esm2022/messaia-cdk.mjs +0 -5
  653. package/esm2022/public_api.mjs +0 -19
  654. package/lib/common/styles/_elevation.scss +0 -147
  655. package/lib/common/styles/_rtl.scss +0 -28
  656. package/lib/common/styles/_styles.scss +0 -12
  657. package/lib/common/styles/_theme-functions.scss +0 -4
  658. package/lib/common/styles/_typography.scss +0 -76
  659. package/lib/common/styles/core/_content.scss +0 -42
  660. package/lib/common/styles/core/_divider.scss +0 -14
  661. package/lib/common/styles/core/_icons.scss +0 -27
  662. package/lib/common/styles/core/_list.scss +0 -8
  663. package/lib/common/styles/core/_toolbar.scss +0 -31
  664. package/lib/common/styles/core/_whiteframe.scss +0 -111
  665. package/lib/common/styles/m2/_theme-functions.scss +0 -21
  666. package/lib/common/styles/m3/_theme-functions.scss +0 -21
  667. package/lib/common/styles/platform.scss +0 -11
  668. package/lib/common/theming/_all-theme.scss +0 -27
  669. package/lib/common/typography/_all-typography.scss +0 -33
@@ -1,810 +0,0 @@
1
- import { animate, AUTO_STYLE, state, style, transition, trigger } from '@angular/animations';
2
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
3
- import { ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, Input, Output, QueryList, TemplateRef, ViewChild, ViewChildren, ViewContainerRef } from '@angular/core';
4
- import { MatMenuTrigger } from '@angular/material/menu';
5
- import { MatPaginator } from '@angular/material/paginator';
6
- import { MatSort } from '@angular/material/sort';
7
- import { MatTable } from '@angular/material/table';
8
- import { BehaviorSubject, of } from 'rxjs';
9
- import { Utils } from '../../../common/functions/utils';
10
- import { DynamicBuilder } from '../../../common/helpers/dynamic-builder';
11
- import { ActionItem } from '../../../common/models/action-item';
12
- import { Grid } from '../../enums/grid';
13
- import { TableColumnType } from '../../enums/table-column-type';
14
- import { getTableDefinition } from '../../functions/functions';
15
- import { TableColumn } from '../../models/table-column';
16
- import { TableStaticDataSource } from '../../table.static-data-source';
17
- import * as i0 from "@angular/core";
18
- import * as i1 from "../../../common/helpers/dynamic-builder";
19
- import * as i2 from "@angular/common";
20
- import * as i3 from "../../../layout/dynamic-menu/dynamic-menu.component";
21
- import * as i4 from "../../../common/directives/disable-control.directive";
22
- import * as i5 from "../../../common/pipes/only-number";
23
- import * as i6 from "../../../select/components/select.component";
24
- import * as i7 from "@angular/forms";
25
- import * as i8 from "@angular/material/button";
26
- import * as i9 from "@angular/material/form-field";
27
- import * as i10 from "@angular/material/icon";
28
- import * as i11 from "@angular/material/input";
29
- import * as i12 from "@angular/material/table";
30
- import * as i13 from "@angular/material/sort";
31
- import * as i14 from "@angular/cdk/table";
32
- import * as i15 from "@angular/material/progress-bar";
33
- import * as i16 from "@angular/material/checkbox";
34
- import * as i17 from "@angular/material/menu";
35
- import * as i18 from "@angular/material/slide-toggle";
36
- import * as i19 from "@angular/material/paginator";
37
- import * as i20 from "@angular/material/tooltip";
38
- import * as i21 from "@angular/material/chips";
39
- import * as i22 from "../filter-input/filter-input.component";
40
- import * as i23 from "../filter-select/filter-select.component";
41
- import * as i24 from "../filter-clear/filter-clear.component";
42
- import * as i25 from "../filter-date/filter-date.component";
43
- import * as i26 from "../../directives/data-source-filter.directive";
44
- import * as i27 from "../../../common/pipes/enum.pipe";
45
- import * as i28 from "../../../common/pipes/form-group.pipe";
46
- import * as i29 from "../../../common/pipes/func.pipe";
47
- import * as i30 from "../../../common/pipes/nested-property";
48
- import * as i31 from "../../../common/pipes/join.pipe";
49
- import * as i32 from "../../../common/pipes/map.pipe";
50
- export class VdDynamicTableComponent {
51
- dynamicBuilder;
52
- changeDetector;
53
- /**
54
- * Reference to the table component, used for accessing MatTable functionalities.
55
- */
56
- table;
57
- /**
58
- * References to the container elements for detail templates, with ViewContainerRef
59
- * allowing dynamic insertion of views.
60
- */
61
- detailsTemplateRef;
62
- /**
63
- * Reference to a content child template (details template) of type TemplateRef,
64
- * used for rendering custom templates in the table.
65
- */
66
- templateRef;
67
- /**
68
- * Data source for the table, which can either be a custom TableDataSource
69
- * implementation or a dynamic object.
70
- */
71
- dataSource;
72
- /**
73
- * Input data for the table, which is set as a static data source.
74
- * This method also initializes sorting and pagination for the table.
75
- */
76
- set data(data) {
77
- this.dataSource = new TableStaticDataSource(data);
78
- this.dataSource.sort = this.matSort;
79
- this.dataSource.paginator = this._paginator;
80
- this.paginable = true;
81
- this.static = true;
82
- }
83
- /**
84
- * Reactive FormArray representing the form data, which is used to track
85
- * form controls and synchronize table data with form changes.
86
- */
87
- _formArray;
88
- /**
89
- * Input FormArray for managing form controls associated with the table.
90
- * It sets the table data and subscribes to changes in the form values to
91
- * update the table dynamically.
92
- */
93
- get formArray() { return this._formArray; }
94
- set formArray(formArray) {
95
- this._formArray = formArray;
96
- this.data = this._formArray?.value;
97
- /* Update the table data when the form array values change */
98
- this._formArray?.valueChanges?.subscribe(x => {
99
- if (x.length !== this.dataSource?.data?.length) {
100
- this.dataSource.data = this._formArray?.value;
101
- }
102
- });
103
- }
104
- /**
105
- * Getter for retrieving the raw value of the form, without applying any transformations.
106
- */
107
- get formValue() { return this.formArray?.getRawValue(); }
108
- /**
109
- * Flag to enable or disable debug mode for logging and additional information.
110
- */
111
- debugValue = false;
112
- /**
113
- * Input representing the class type used in this component,
114
- * typically defining the structure or model of the data.
115
- */
116
- classType;
117
- /**
118
- * Input for the current context or environment in which the table is being used.
119
- * This allows passing additional metadata or settings.
120
- */
121
- context;
122
- /**
123
- * Input for applying filters to the data source. It defines criteria or conditions
124
- * that will be used to filter the table data.
125
- */
126
- dataSourceFilter = {};
127
- /**
128
- * Flag indicating whether the table uses a static data source.
129
- * When true, the table does not rely on dynamic data changes.
130
- */
131
- static = false;
132
- /**
133
- * Flag to indicate whether the table data is filterable by the user.
134
- * If true, filtering options are provided.
135
- */
136
- filterable = true;
137
- /**
138
- * Flag to indicate whether the table headers or columns should stick
139
- * to the viewport during scrolling.
140
- */
141
- sticky = false;
142
- /**
143
- * Defines the overall width of the table.
144
- */
145
- tableWidth;
146
- /**
147
- * Determines whether the filter operator is used in table filtering.
148
- * If true, filtering logic will apply operators such as equals, contains, etc.
149
- */
150
- useFilterOperator = true;
151
- /**
152
- * Determines whether the table supports pagination.
153
- * If true, pagination controls will be available for navigating through the data.
154
- */
155
- paginable = false;
156
- /**
157
- * Determines whether the 'Checkbox' column is shown for row selection.
158
- * If true, a checkbox column will be displayed allowing users to select rows.
159
- */
160
- selectable = false;
161
- /**
162
- * Specifies the active column used for sorting the table data.
163
- * This input determines which column the sorting is applied to.
164
- */
165
- sortActive;
166
- /**
167
- * Specifies the direction of sorting (ascending or descending).
168
- * Default is 'asc' (ascending).
169
- */
170
- sortDirection = 'asc';
171
- /**
172
- * Determines whether the table header should remain sticky (fixed) at the top of the viewport
173
- * when the table scrolls.
174
- */
175
- stickyHeader = true;
176
- /**
177
- * Determines whether the filter section of the table should remain sticky (fixed)
178
- * at the top of the viewport when scrolling.
179
- */
180
- stickyFilter = true;
181
- /**
182
- * Private backing field for the columnSets input property.
183
- * This field stores the sets of columns to be displayed in the table,
184
- * enabling control over how the value is accessed or modified through
185
- * the public getter and setter.
186
- * @private
187
- */
188
- _columnSets;
189
- /**
190
- * Used to display specific columns in the table.
191
- * This array defines sets of columns that can be shown
192
- * based on the active configuration, allowing for dynamic table
193
- * column customization.
194
- * @property
195
- */
196
- get columnSets() { return this._columnSets; }
197
- set columnSets(value) { this._columnSets = value; }
198
- /**
199
- * Event emitter for row click events. It emits the clicked row's data whenever a row is clicked.
200
- */
201
- rowClick = new EventEmitter();
202
- /**
203
- * Function used to dynamically assign CSS classes to table rows based on custom logic.
204
- */
205
- rowNgClass;
206
- /**
207
- * Template for rendering additional details below each row.
208
- * It accepts a string representing the template key or identifier.
209
- */
210
- detailsTemplate;
211
- /**
212
- * Flag to indicate whether the table is in a readonly state.
213
- * If true, no changes can be made to the table data.
214
- */
215
- _readonly = false;
216
- /**
217
- * Input property to determine if the table is readonly.
218
- * Uses `coerceBooleanProperty` to ensure the value is treated as a boolean.
219
- */
220
- get readonly() { return this._readonly; }
221
- set readonly(readonly) {
222
- this._readonly = coerceBooleanProperty(readonly);
223
- }
224
- /**
225
- * Function to filter items when selecting all rows.
226
- * It takes value, index, and array as arguments and returns a boolean or unknown type.
227
- */
228
- selectAllFilter;
229
- /**
230
- * Reference to the MatSort directive used for applying sorting on the table.
231
- */
232
- matSort;
233
- /**
234
- * Private reference to the MatPaginator used to paginate the table data.
235
- */
236
- _paginator;
237
- /**
238
- * Input setter for the MatPaginator. When the paginator is set, it assigns it
239
- * to the data source for pagination control.
240
- */
241
- set paginator(paginator) {
242
- if (paginator) {
243
- this.dataSource.paginator = paginator;
244
- }
245
- }
246
- /**
247
- * Private array storing the columns to be displayed in the table.
248
- */
249
- _columns = [];
250
- /**
251
- * Input getter and setter for the table columns.
252
- * It allows the columns to be customized and updated dynamically.
253
- */
254
- get columns() { return this._columns; }
255
- set columns(columns) { this._columns = columns; }
256
- /**
257
- * BehaviorSubject to manage and emit changes to the columns dynamically.
258
- */
259
- columnsSubject = new BehaviorSubject([]);
260
- /**
261
- * Observable that tracks and emits changes to the columns.
262
- */
263
- columns$ = this.columnsSubject.asObservable();
264
- /**
265
- * Observable tracking the columns currently displayed in the table.
266
- */
267
- displayedColumns$;
268
- /**
269
- * Observable tracking the filterable columns displayed in the table.
270
- */
271
- displayedFilterColumns$;
272
- /**
273
- * Input property for row-specific action menu items.
274
- * Defines actions available in the context menu for each row.
275
- */
276
- rowMenuItems = [];
277
- /**
278
- * Input for a single row action to be applied when interacting with a row.
279
- * @property {ActionItem} rowAction
280
- */
281
- rowAction;
282
- /**
283
- * Input for specifying which columns should be excluded from display in the table.
284
- * @property {string[]} excludedColumns
285
- */
286
- excludedColumns = [];
287
- /**
288
- * QueryList to reference all MatMenuTriggers associated with row context menus.
289
- * Used for handling the context menu interactions on table rows.
290
- * @property {QueryList<MatMenuTrigger>} rowContextMenuTriggers
291
- */
292
- rowContextMenuTriggers;
293
- /**
294
- * Column type enum reference, mapping table columns to their types for rendering.
295
- * @property {typeof TableColumnType} ColumnType
296
- */
297
- ColumnType = TableColumnType;
298
- /**
299
- * Grid enum reference, representing the type of grid used in the table.
300
- * @property {typeof Grid} Grid
301
- */
302
- Grid = Grid;
303
- /**
304
- * Reference to the currently expanded row, used for handling row expansion logic.
305
- * @property {any} expandedRow
306
- */
307
- expandedRow;
308
- /**
309
- * Input for setting the default page size for pagination.
310
- * Default value is 15.
311
- */
312
- pageSize = 15;
313
- /**
314
- * Input for setting available page size options in the paginator.
315
- * Default options include [5, 10, 15, 20, 30, 50, 100, 200].
316
- */
317
- pageSizeOptions = [5, 10, 15, 20, 30, 50, 100, 200];
318
- /*
319
- * This decorator binds the scrollable container element by its template reference.
320
- * The `scrollContainer` will reference the element inside the template with `#scrollContainer`.
321
- * It will allow access to the native DOM element for managing scroll operations.
322
- */
323
- scrollContainer;
324
- /*
325
- * Indicates whether the right mouse button is actively dragging the scroll container.
326
- * This flag ensures that scrolling only occurs when a drag operation is in progress,
327
- * providing a smoother and more controlled user experience during interactions.
328
- */
329
- startDragging = false;
330
- /*
331
- * Flag to indicate whether the right mouse button is actively dragging the scroll container.
332
- * It ensures that scrolling occurs only during active dragging.
333
- */
334
- isDragging = false;
335
- /*
336
- * Stores the initial X coordinate when the user presses the right mouse button.
337
- * This is used to calculate the distance moved during dragging, enabling smooth scrolling.
338
- */
339
- startX = 0;
340
- /*
341
- * Keeps track of the container’s scroll position before the drag begins.
342
- * This allows updating the scroll position in real-time as the user moves the mouse.
343
- */
344
- scrollLeft = 0;
345
- /**
346
- * Constructor for the component, injecting services needed for form building,
347
- * dynamic content handling, and change detection.
348
- *
349
- * @param formBuilder Service for creating form controls and managing form logic.
350
- * @param dynamicBuilder Service for dynamically constructing table components.
351
- * @param changeDetector Service for detecting and triggering UI changes.
352
- */
353
- constructor(dynamicBuilder, changeDetector) {
354
- this.dynamicBuilder = dynamicBuilder;
355
- this.changeDetector = changeDetector;
356
- }
357
- /**
358
- * A callback method that is invoked immediately after the
359
- * default change detector has checked the directive's
360
- * data-bound properties for the first time,
361
- * and before any of the view or content children have been checked.
362
- * It is invoked only once when the directive is instantiated.
363
- */
364
- ngOnInit() {
365
- if (this.classType) {
366
- /* Get the table definition using the class type */
367
- var tableDefinition = getTableDefinition(this.classType);
368
- if (tableDefinition) {
369
- this.columns = [...tableDefinition.columns ?? []];
370
- if (this.rowMenuItems?.length > 0) {
371
- /* Check if the action column already exists */
372
- var actionColmun = this._columns?.find(x => x.name == 'action');
373
- /* If so, just add the menu items to it */
374
- if (actionColmun != null) {
375
- actionColmun.menu ||= { icon: 'more_vert' };
376
- this.rowMenuItems.forEach(y => actionColmun.menu.items?.unshift(y));
377
- }
378
- /* Otherwise add a new one */
379
- else {
380
- this._columns.push(new TableColumn({
381
- index: 2000,
382
- name: 'action',
383
- columnSets: ['action', 'common'],
384
- type: TableColumnType.Action,
385
- disabled: true,
386
- menu: { icon: 'more_vert', items: this.rowMenuItems },
387
- configurable: false,
388
- stickyEnd: true
389
- }));
390
- }
391
- }
392
- else if (this.rowAction) {
393
- this._columns.push(new TableColumn({
394
- index: 2000,
395
- name: 'action',
396
- columnSets: ['action', 'common'],
397
- type: TableColumnType.Action,
398
- disabled: true,
399
- menu: this.rowAction,
400
- configurable: false,
401
- stickyEnd: true
402
- }));
403
- }
404
- /* Add checkbox column */
405
- if (this.selectable) {
406
- this.columns.unshift(new TableColumn({
407
- name: 'select',
408
- columnSets: ['select', 'common'],
409
- type: TableColumnType.Checkbox,
410
- configurable: false,
411
- sticky: true
412
- }));
413
- }
414
- }
415
- }
416
- /* Build displayed columns & filter */
417
- this.columns$?.subscribe(x => {
418
- /* Filter the columns based on the individual column's columnSets property and the global columnSets */
419
- const selectedColumns = (this.columnSets?.length ?? 0) > 0
420
- ? this.columns?.filter(c => this.columnSets?.some(set => c.columnSets?.includes(set)))
421
- : this.columns;
422
- /* Build the displayed columns by filtering out the excluded columns and mapping to their names */
423
- this.displayedColumns$ = of(selectedColumns
424
- /* Exclude columns that are in the excludedColumns list */
425
- ?.filter(x => !this.excludedColumns?.includes(x.name))
426
- /* Map the remaining columns to their name property */
427
- ?.map(c => c.name));
428
- /* Build the displayed filter columns by filtering out the excluded columns and prefixing with 'filter.' */
429
- this.displayedFilterColumns$ = of(selectedColumns
430
- /* Exclude columns that are in the excludedColumns list */
431
- ?.filter(x => !this.excludedColumns?.includes(x.name))
432
- /* Map the remaining columns to a filter-friendly string with 'filter.' prefix */
433
- ?.map(c => `filter.${(c.filter || c.name)}`));
434
- });
435
- /* Set the table columns */
436
- this.updateColumns();
437
- const container = this.scrollContainer?.nativeElement;
438
- if (container) {
439
- /*
440
- * Disable the context menu on right-click to allow smooth scrolling
441
- * without interference from the default context menu behavior.
442
- */
443
- container.addEventListener('contextmenu', (e) => e.preventDefault());
444
- /*
445
- * Start dragging when the right mouse button is pressed (button === 2).
446
- * This saves the initial position and scroll state for later use during movement.
447
- */
448
- container.addEventListener('mousedown', (e) => {
449
- if (e.button === 2 && this.scrollContainer) {
450
- /* Prevents any default behavior associated with right-click */
451
- e.preventDefault();
452
- /* Activate the dragging mode, allowing horizontal scrolling */
453
- this.startDragging = true;
454
- /* Store the initial X position */
455
- this.startX = e.pageX - container.offsetLeft;
456
- /* Save the current scroll position */
457
- this.scrollLeft = container.scrollLeft;
458
- }
459
- });
460
- /*
461
- * Stop dragging when the mouse leaves the container.
462
- * This ensures the scrolling stops even if the user moves the cursor outside the boundaries.
463
- */
464
- container.addEventListener('mouseleave', (e) => this.stopDragging(e));
465
- /*
466
- * Stop dragging when the mouse button is released (on mouse up).
467
- * This prevents further scroll movements after the user releases the mouse.
468
- */
469
- container.addEventListener('mouseup', (e) => this.stopDragging(e));
470
- /*
471
- * Handle the actual dragging (scrolling) when the mouse is moved.
472
- * This calculates the movement and updates the scroll position accordingly.
473
- */
474
- container.addEventListener('mousemove', (e) => {
475
- /* If dragging is not active or scroll container is undefined, exit */
476
- if (!this.startDragging || !this.scrollContainer) {
477
- return;
478
- }
479
- /* Activate the dragging mode, allowing horizontal scrolling */
480
- this.isDragging = true;
481
- /* Prevent default action to ensure smooth behavior */
482
- e.preventDefault();
483
- /* Calculate the current mouse X position */
484
- const x = e.pageX - container.offsetLeft;
485
- /* Calculate the distance moved (amplified for speed) */
486
- const walk = (x - this.startX) * 2;
487
- /* Update the scroll position based on movement */
488
- container.scrollLeft = this.scrollLeft - walk;
489
- });
490
- }
491
- }
492
- /**
493
- * Updates the table columns
494
- */
495
- updateColumns() {
496
- /* Sort the columns by index */
497
- Utils.sortArray(this.columns || [], 'index');
498
- /* Trigger changes */
499
- this.columnsSubject.next(this.columns);
500
- }
501
- /**
502
- * Counts visible action menus
503
- * @param row
504
- * @param column
505
- * @returns
506
- */
507
- hasVisibleRowMenuItems(row, column) {
508
- return (column?.rowMenuItems?.filter(x => !x.hide || !x.hide(row))?.length ?? -1) > 0;
509
- }
510
- /**
511
- * A function to to compute the identity of items in an iterable.
512
- * @param index
513
- * @param item
514
- */
515
- trackBy(index, item) {
516
- return `${item.id}`;
517
- }
518
- /**
519
- * A function to to compute the identity of items in an iterable.
520
- * @param index
521
- * @param item
522
- */
523
- columnsTrackBy(index, item) {
524
- return item.name;
525
- }
526
- /**
527
- * Handles row click event
528
- * @param index
529
- * @param row
530
- */
531
- handleRowClick(index, row) {
532
- if (this.templateRef) {
533
- this.expandedRow = this.expandedRow === row ? null : row;
534
- }
535
- else if (this.detailsTemplate) {
536
- this.expandedRow = this.expandedRow === row ? null : row;
537
- if (this.detailsTemplateRef) {
538
- this.dynamicBuilder.compileHtml(this.detailsTemplateRef.get(index), this.detailsTemplate, row);
539
- }
540
- }
541
- else {
542
- this.rowClick.emit(row);
543
- }
544
- }
545
- /**
546
- * Method called when the user click with the right button
547
- * @param event MouseEvent, it contains the coordinates
548
- * @param item Our data contained in the row of the table
549
- */
550
- handleRowRightClick(event, item) {
551
- if (this.isDragging) {
552
- return;
553
- }
554
- this.rowContextMenuTriggers?.toArray()?.forEach(x => x.closeMenu());
555
- var menuTrigger = this.rowContextMenuTriggers?.toArray()?.filter(x => x['_element']?.nativeElement?.getAttribute('id') == `menu-${item.id}`)[0];
556
- if (menuTrigger != null) {
557
- /* Avoids to show the visualization of the right-click menu of the browser */
558
- event.preventDefault();
559
- /* Set the position of the menu */
560
- menuTrigger['_element']?.nativeElement?.setAttribute('style', `position: fixed; left: ${event.clientX}px; top: ${event.clientY}px`);
561
- /* Pass to the menu the current object */
562
- menuTrigger.menuData = { item: item };
563
- /* Open the menu */
564
- menuTrigger.openMenu();
565
- /* Handle clicks on the menu overlay */
566
- document.getElementsByClassName('cdk-overlay-container')[0]?.addEventListener('contextmenu', (offEvent) => {
567
- offEvent.preventDefault();
568
- menuTrigger.closeMenu();
569
- }, { once: true });
570
- }
571
- }
572
- /**
573
- * Handles model changes
574
- * @param column
575
- * @param row
576
- */
577
- handleModelChange(column, row, formGroup) {
578
- if (typeof column?.event === 'function') {
579
- column.event(row, formGroup, column.eventArgs ?? this.context);
580
- }
581
- }
582
- /**
583
- * Handles keydown enter of <input> and <vd-select>
584
- * @param $event
585
- */
586
- handleKeydownEnter($event) {
587
- $event?.target?.blur();
588
- return false;
589
- }
590
- /**
591
- * Patches an entity
592
- * @param row
593
- * @param fieldName
594
- * @param path
595
- */
596
- patch(row, fields, value, includes) {
597
- /* Get entity by ID */
598
- let entity = this.dataSource.items?.filter((x) => x.id === row.id)[0];
599
- if (entity) {
600
- /* Build patch methods */
601
- let patches = fields.map(x => { return { op: 'replace', path: `/${x}`, value: value != undefined ? value : entity[x] }; });
602
- /* Send request */
603
- this.dataSource.service
604
- .patch(row.id, patches, null, { headers: { 'Show-Message': 'Yes' }, params: includes ? Utils.toHttpParams({ includes: includes }) : null })
605
- .subscribe((_) => this.dataSource.reload());
606
- }
607
- }
608
- /**
609
- * Renders rows based on the table's latest set of data, which was either provided directly as an
610
- * input or retrieved through an Observable stream (directly or from a DataSource).
611
- * Checks for differences in the data since the last diff to perform only the necessary
612
- * changes (add/remove/move rows).
613
- */
614
- renderRows() {
615
- this.table?.renderRows();
616
- }
617
- /**
618
- * Handles a string function expression.
619
- *
620
- * This method processes an input expression that can either be a string or a function.
621
- * If it's a function, it will be invoked with the provided item and context.
622
- * If it's a string, it will be returned as-is.
623
- *
624
- * @param expression - The expression to handle, which can be a string or a function.
625
- * @param item - The item to pass to the function if the expression is a function.
626
- * @returns - The result of invoking the function with the item and context, or the string expression itself.
627
- */
628
- handleExpression(expression, item) {
629
- /* Check if the expression is falsy (e.g., null, undefined, or empty) */
630
- if (!expression) {
631
- return undefined;
632
- }
633
- /* If the expression is a function, call it with the item and context */
634
- if (typeof expression === 'function') {
635
- return expression(item, this.context);
636
- }
637
- /* If the expression is not a function, assume it's a string and return it */
638
- return expression;
639
- }
640
- /**
641
- * Sets a nested property value in an object based on a dot-separated path.
642
- * @param row - The object in which the property is being set.
643
- * @param propertyPath - A dot-separated string representing the path to the nested property.
644
- * @param value - The value to set at the specified nested property.
645
- */
646
- setNestedProperty(row, propertyPath, value) {
647
- /* Split the propertyPath into an array of keys */
648
- const keys = propertyPath.split('.');
649
- /* Use slice to get all keys except the last one and reduce to traverse to the second-to-last level */
650
- keys.slice(0, -1).reduce((acc, key) => acc && acc[key], row)[keys[keys.length - 1]] = value;
651
- }
652
- /**
653
- * Gets row classes
654
- * @param column
655
- * @param row
656
- * @returns
657
- */
658
- getRowClasses(column, row) {
659
- return Object.assign({
660
- 'gt-xs': column.display == Grid.Xs,
661
- 'gt-sm': column.display == Grid.Sm,
662
- 'gt-md': column.display == Grid.Md,
663
- 'gt-lg': column.display == Grid.Lg,
664
- 'gt-xl': column.display == Grid.Xl,
665
- 'gt-xxl': column.display == Grid.Xxl,
666
- 'hidden': column.display == Grid.None,
667
- 'text-right': column.arrowBefore
668
- }, column.cellNgClass ? column.cellNgClass(row, this.context) : {});
669
- }
670
- /**
671
- * Log to console
672
- * @param message
673
- * @param optionalParams
674
- */
675
- log(message, ...optionalParams) {
676
- console.log(message, optionalParams);
677
- }
678
- /*
679
- * Terminates the dragging action by resetting the `isDragging` flag after a brief delay.
680
- * If the `scrollContainer` is defined, it also removes the 'grabbing' class
681
- * from the container element, which reverts the cursor back to its default state.
682
- * This ensures that the visual feedback (grabbing cursor) is only active during
683
- * the drag operation and is properly removed when the user stops interacting.
684
- */
685
- stopDragging(event) {
686
- /* Reset dragging state to stop the scroll interaction */
687
- this.startDragging = false;
688
- /*
689
- * Introduce a slight delay before resetting the dragging state.
690
- * This allows for smoother transitions and ensures that any final scroll adjustments
691
- * are applied before marking the dragging operation as complete.
692
- */
693
- setTimeout(() => {
694
- /* Reset dragging state to stop the scroll interaction */
695
- this.isDragging = false;
696
- /* Restore the default cursor */
697
- if (this.scrollContainer) {
698
- this.scrollContainer.nativeElement.classList.remove('grabbing');
699
- }
700
- }, 200);
701
- }
702
- /**
703
- * A callback method that is invoked immediately after the
704
- * default change detector has completed one change-check cycle
705
- * for a component's view.
706
- */
707
- ngAfterViewChecked() {
708
- this.changeDetector.detectChanges();
709
- }
710
- /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: VdDynamicTableComponent, deps: [{ token: i1.DynamicBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
711
- /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: VdDynamicTableComponent, selector: "vd-dynamic-table", inputs: { dataSource: "dataSource", data: "data", formArray: "formArray", debugValue: "debugValue", classType: "classType", context: "context", dataSourceFilter: "dataSourceFilter", static: "static", filterable: "filterable", sticky: "sticky", tableWidth: "tableWidth", useFilterOperator: "useFilterOperator", paginable: "paginable", selectable: "selectable", sortActive: "sortActive", sortDirection: "sortDirection", stickyHeader: "stickyHeader", stickyFilter: "stickyFilter", columnSets: "columnSets", rowNgClass: "rowNgClass", detailsTemplate: "detailsTemplate", readonly: "readonly", selectAllFilter: "selectAllFilter", columns: "columns", rowMenuItems: "rowMenuItems", rowAction: "rowAction", excludedColumns: "excludedColumns", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions" }, outputs: { rowClick: "rowClick" }, queries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true }, { propertyName: "matSort", first: true, predicate: MatSort, descendants: true, static: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, static: true }, { propertyName: "detailsTemplateRef", predicate: ["detailsTemplate"], descendants: true, read: ViewContainerRef }, { propertyName: "rowContextMenuTriggers", predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<div class=\"loading-progress\" *ngIf=\"!static\">\r\n\t<mat-progress-bar mode=\"indeterminate\" *ngIf=\"dataSource?.isLoading\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- #region Data table -->\r\n<div class=\"mat-table-container scrollbar-secondary\" [ngClass]=\"{'mat-table-sticky': sticky}\" #scrollContainer>\r\n\t<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !sticky && !detailsTemplate && !templateRef, 'table-stick': sticky}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async; trackBy:columnsTrackBy\">\r\n\t\t\t<!-- #region Column def -->\r\n\t\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t\t<ng-template #header [ngTemplateOutlet]=\"header\" let-headerText=\"headerText\" [ngTemplateOutletContext]=\"{headerText: column.header | func:context}\">\r\n\t\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [mat-sort-header]=\"column.sortBy || column.name\" [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [disabled]=\"column.type == ColumnType.Checkbox || column.disabled\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\t\t\t\t\t\t<mat-checkbox *ngIf=\"column.type == ColumnType.Checkbox\" (change)=\"$event ? dataSource.toggleSelect($event, selectAllFilter) : null\" [disabled]=\"!dataSource.paginator?.length\" [checked]=\"dataSource.selectionModel.hasValue() && dataSource.isAllSelected()\" [indeterminate]=\"dataSource.selectionModel.hasValue() && !dataSource.isAllSelected()\"></mat-checkbox>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type != ColumnType.Checkbox\" [matTooltip]=\"headerText\">{{headerText}}</span>\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</ng-template>\r\n\t\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = dataIndex\" [matTooltip]=\"column.tooltip?column.tooltip(row, undefined, context):null\" [matTooltipClass]=\"column.tooltipClass??''\" [hidden]=\"column.hidden\" [ngClass]=\"getRowClasses(column, row)\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\">\r\n\t\t\t\t\t<ng-template #rowVal [ngTemplateOutlet]=\"rowVal\" let-rowValue [ngTemplateOutletContext]=\"{$implicit: column?.content && column?.content(row, undefined, context)}\">\r\n\t\t\t\t\t\t<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t\t\t<!-- #region Checkbox column -->\r\n\t\t\t\t\t\t\t<mat-checkbox *ngSwitchCase=\"ColumnType.Checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"$event ? dataSource.selectionModel.toggle(row) : null\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.enumMetadata; else noEnumMetadata\">\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t\t<ng-container *ngFor=\"let item of rowValue; let i = index\">\r\n\t\t\t\t\t\t\t\t\t\t\t<ng-template [ngIf]=\"i < 2\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<ng-template let-displayValue=\"displayValue\" [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ displayValue: column.enumMetadata[item].display }\"></ng-template>\r\n\t\t\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i === 1 && rowValue?.length > 2\" [matTooltip]=\"(rowValue | slice:2 | map:column.enumMetadata | map:'display') | join:'\\n'\" matTooltipClass=\"mat-tooltip-multiline\">...</small>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t\t<ng-template #template let-displayValue=\"displayValue\">\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-chip-row disableRipple=\"true\" selectable=\"false\" [matTooltip]=\"displayValue\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ displayValue }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</mat-chip-row>\r\n\t\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" class=\"na\" [innerHtml]=\"(column.enumMetadata[rowValue]||{}).display\"></span>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #noEnumMetadata>\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\" i18n=\"@@selection\">{item | enum:column.enumType:column.enumPrefix, select, type {type} other {{{item | enum:column.enumType:column.enumPrefix}}}}</small><small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" i18n=\"@@selection\">{rowValue | enum:column.enumType:column.enumPrefix, select, type {type} other {{{rowValue | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<ng-template #recursiveContainer let-columnNameSegments=\"segments\" let-formGroup=\"formGroup\" let-parentFormGroup=\"parentFormGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formGroup\" [formGroup]=\"formGroup\">\r\n\t\t\t\t\t\t\t\t\t<!-- If the columnNameSegments array is empty, we're at the leaf node -->\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!columnNameSegments.length; else notLastSegment\">\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-slide-toggle [formControl]=\"formGroup\" (click)=\"$event.stopPropagation();\" (change)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):handleModelChange(column, parentFormGroup.value, parentFormGroup)\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.TextInput\" appearance=\"outline\" subscriptSizing=\"dynamic\" dense-3 layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input matInput [formControl]=\"formGroup\" type=\"{{column.inputType}}\" autocomplete=\"none\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" [min]=\"column.inputMin?column.inputMin(parentFormGroup.value, parentFormGroup, context):null\" [max]=\"column.inputMax?column.inputMax(parentFormGroup.value, parentFormGroup, context):null\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.Select\" appearance=\"outline\" subscriptSizing=\"dynamic\" dense-3 layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t\t<vd-select [formControl]=\"formGroup\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:parentFormGroup.value:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" (selectionChange)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):patch(parentFormGroup.value, [column.name], rowValue, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #notLastSegment>\r\n\t\t\t\t\t\t\t\t\t\t<!-- If not the last segment, create a nested form group -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container [formGroupName]=\"columnNameSegments[0]\">\r\n\t\t\t\t\t\t\t\t\t\t\t<!-- Recursive call to handle nested segments -->\r\n\t\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: columnNameSegments.slice(1), parentFormGroup:formGroup, formGroup: formGroup.get(columnNameSegments[0])}\"></ng-container>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\r\n\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!formArray\">\r\n\t\t\t\t\t\t\t\t\t<mat-slide-toggle [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);handleModelChange(column, row, undefined);\" (click)=\"$event.stopPropagation();\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{rowValue | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.TextInput\">\r\n\t\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" subscriptSizing=\"dynamic\" dense-3 (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t<input matInput *ngIf=\"!formArray\" type=\"{{column.inputType}}\" autocomplete=\"none\" name=\"{{column.name}}{{rowIndex}}\" [ngModel]=\"row | property:column.name\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [min]=\"column.inputMin?column.inputMin(row, undefined, context):null\" [max]=\"column.inputMax?column.inputMax(row, undefined, context):null\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);(column.change?column.change(row, undefined, context):patch(row, [column.name], $event, column.patchIncludes));\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Select\">\r\n\t\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" subscriptSizing=\"dynamic\" dense-3 (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t<vd-select *ngIf=\"!formArray\" name=\"{{column.name}}{{rowIndex}}\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column?.enumFilter | func:row:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" (change)=\"column.change?column.change(row, undefined, context):patch(row, [column.name], $event.value, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t\t<div id=\"menu-{{row.id}}\" style=\"visibility: hidden; position: fixed;\" #contextMenuTrigger=\"matMenuTrigger\" [matMenuTriggerFor]=\"menu.matMenu!\" *ngIf=\"menu?.matMenu && !row.locked && hasVisibleRowMenuItems(row, column)\"></div>\r\n\t\t\t\t\t\t\t\t\t<vd-dynamic-menu [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region icon -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Icon\" layout=\"row\" layout-align=\"start center\">\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.matIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\">{{handleExpression(column.icon?.matIcon!, row)}}</mat-icon>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.svgIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [svgIcon]=\"handleExpression(column.icon?.svgIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.fontIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [fontIcon]=\"handleExpression(column.icon?.fontIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region icon button -->\r\n\t\t\t\t\t\t\t<a mat-icon-button *ngSwitchCase=\"ColumnType.IconButton\" (click)=\"$event.stopPropagation();column.iconButton?.event?column.iconButton?.event(row, context):null\">\r\n\t\t\t\t\t\t\t\t<mat-icon fontSet=\"{{column.iconButton?.iconFontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.iconButton?.iconClass??'', row)\">{{handleExpression(column.iconButton?.icon??'radio_button_checked', row) || 'radio_button_checked'}}</mat-icon>\r\n\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"rowValue??''\"></span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</td>\r\n\t\t\t</ng-container>\r\n\t\t\t<!-- #endregion -->\r\n\t\t</ng-container>\r\n\r\n\t\t<!-- #region Filter row -->\r\n\t\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\">\r\n\t\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t\t<span *ngIf=\"(column.endpoint || column.enumType || column.options) else notSelectFilter\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:{}:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t\t<ng-template #notSelectFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"notSelectFilter && (column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number) else notInputFilter\" filter-input [onlyNumber]=\"column.filterInputNumber??false\" [operator]=\"!useFilterOperator ? undefined : column.filterOperator\"></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t\t<ng-template #notInputFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date else notDateFilter\" filter-date></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t\t<ng-template #notDateFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</ng-container>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Details column -->\r\n\t\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t\t<td mat-cell *matCellDef=\"let row; let index = index\" [attr.colspan]=\"(displayedColumns$ | async)?.length\">\r\n\t\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate>\r\n\t\t\t\t\t<ng-container *ngIf=\"templateRef && row === expandedRow\">\r\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRef; context:{row: row, index: index, context: context}\"></ng-container>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</div>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Filter header -->\r\n\t\t<ng-container *ngIf=\"filterable\">\r\n\t\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: displayedColumns$ | async; let index = dataIndex\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\" [class.expanded-row]=\"expandedRow === row\" (click)=\"handleRowClick(index, row)\" (contextmenu)=\"handleRowRightClick($event, row)\"></tr>\r\n\r\n\t\t<!-- #region Detrails row -->\r\n\t\t<ng-container *ngIf=\"detailsTemplate || templateRef\">\r\n\t\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</table>\r\n</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Row shown when there is no matching data.-->\r\n<div class=\"mat-cell pad table-empty txt-italic\" *ngIf=\"!dataSource?.filteredData?.length && !dataSource?.total\" i18n=\"@@noResultsFound\">No results were found.</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Debug value -->\r\n<code *ngIf=\"debugValue\">\r\n\t<pre>{{formValue | json}}</pre>\r\n</code>\r\n<!-- #endregion -->\r\n\r\n<div class=\"table-footer\" layout=\"row\">\r\n\t<ng-content select=\"[table-footer]\"></ng-content>\r\n\t<span flex></span>\r\n\t<mat-paginator *ngIf=\"paginable\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons=\"true\"></mat-paginator>\r\n</div>", styles: ["::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-form-field .mat-form-field-wrapper{width:100%}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip{height:24px;margin-top:2px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip .mdc-evolution-chip__action--primary{padding-left:9px;padding-right:9px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip:last-child{margin-bottom:2px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip *{font-size:.8rem}@media (max-width: 389px){::ng-deep .mat-mdc-table [gt-xs],::ng-deep .mat-mdc-table .gt-xs{display:none}::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}.mat-table-container{width:100%;max-width:100%;overflow:auto}.mat-table-container .mat-mdc-header-cell,.mat-table-container .mat-mdc-footer-cell,.mat-table-container .mat-mdc-cell{min-width:80px;box-sizing:border-box}.mat-table-container .mat-mdc-header-row,.mat-table-container .mat-mdc-footer-row,.mat-table-container .mat-mdc-row{min-width:1920px}.mat-table-container.mat-table-sticky .mat-mdc-table-sticky-border-elem-right{box-shadow:-3px 0 5px #0000001a}.mat-table-container.mat-table-sticky .mat-mdc-table-sticky-border-elem-left{box-shadow:3px 0 5px #0000001a}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i3.VdDynamicMenuComponent, selector: "vd-dynamic-menu", inputs: ["items", "data", "index", "context", "contextMenu"] }, { kind: "directive", type: i4.DisableControlDirective, selector: "[disableControl]", inputs: ["disableControl"] }, { kind: "directive", type: i5.OnlyNumberDirective, selector: "[onlyNumber]", inputs: ["onlyNumber"] }, { kind: "component", type: i6.VdSelectComponent, selector: "vd-select", inputs: ["triggerCssClass", "triggerMode"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: i8.MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11.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: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i12.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i13.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i13.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i14.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i14.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i14.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i14.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i14.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i15.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i16.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i17.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i18.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i19.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: i20.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i21.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: i22.FilterInputComponent, selector: "mat-header-cell[filter-input], [mat-header-cell][filter-input], [filter-input]", inputs: ["field", "operator", "onlyNumber", "debounce", "placeholder"] }, { kind: "component", type: i23.FilterSelectComponent, selector: "mat-header-cell[filter-select], [mat-header-cell][filter-select], [filter-select]", inputs: ["endpoint", "params", "projection", "sortBy", "sorted", "enumFilter", "enum", "enumMetadata", "key", "text", "prefix", "multiple", "options", "filteredOptions", "filterable", "field", "placeholder", "cache"] }, { kind: "component", type: i24.FilterClearComponent, selector: "mat-header-cell[filter-clear], [mat-header-cell][filter-clear], [filter-clear]" }, { kind: "component", type: i25.FilterDateComponent, selector: "mat-header-cell[filter-date], [mat-header-cell][filter-date], [filter-date]", inputs: ["field", "debounce", "placeholder"] }, { kind: "directive", type: i26.DataSourceFilterDirective, selector: "[dataSourceFilter]", inputs: ["dataSource", "dataSourceFilter"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.JsonPipe, name: "json" }, { kind: "pipe", type: i2.SlicePipe, name: "slice" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i27.EnumPipe, name: "enum" }, { kind: "pipe", type: i28.FormGroupPipe, name: "formGroup" }, { kind: "pipe", type: i29.FuncPipe, name: "func" }, { kind: "pipe", type: i30.PropertyPipe, name: "property" }, { kind: "pipe", type: i31.JoinPipe, name: "join" }, { kind: "pipe", type: i32.MapPipe, name: "map" }], animations: [
712
- trigger('detailExpand', [
713
- state('collapsed', style({ height: '0px', minHeight: '0' })),
714
- state('expanded', style({ height: AUTO_STYLE })),
715
- transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
716
- ]),
717
- ] });
718
- }
719
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: VdDynamicTableComponent, decorators: [{
720
- type: Component,
721
- args: [{ selector: 'vd-dynamic-table', animations: [
722
- trigger('detailExpand', [
723
- state('collapsed', style({ height: '0px', minHeight: '0' })),
724
- state('expanded', style({ height: AUTO_STYLE })),
725
- transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
726
- ]),
727
- ], template: "<div class=\"loading-progress\" *ngIf=\"!static\">\r\n\t<mat-progress-bar mode=\"indeterminate\" *ngIf=\"dataSource?.isLoading\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- #region Data table -->\r\n<div class=\"mat-table-container scrollbar-secondary\" [ngClass]=\"{'mat-table-sticky': sticky}\" #scrollContainer>\r\n\t<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !sticky && !detailsTemplate && !templateRef, 'table-stick': sticky}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async; trackBy:columnsTrackBy\">\r\n\t\t\t<!-- #region Column def -->\r\n\t\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t\t<ng-template #header [ngTemplateOutlet]=\"header\" let-headerText=\"headerText\" [ngTemplateOutletContext]=\"{headerText: column.header | func:context}\">\r\n\t\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [mat-sort-header]=\"column.sortBy || column.name\" [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [disabled]=\"column.type == ColumnType.Checkbox || column.disabled\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\t\t\t\t\t\t<mat-checkbox *ngIf=\"column.type == ColumnType.Checkbox\" (change)=\"$event ? dataSource.toggleSelect($event, selectAllFilter) : null\" [disabled]=\"!dataSource.paginator?.length\" [checked]=\"dataSource.selectionModel.hasValue() && dataSource.isAllSelected()\" [indeterminate]=\"dataSource.selectionModel.hasValue() && !dataSource.isAllSelected()\"></mat-checkbox>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type != ColumnType.Checkbox\" [matTooltip]=\"headerText\">{{headerText}}</span>\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</ng-template>\r\n\t\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = dataIndex\" [matTooltip]=\"column.tooltip?column.tooltip(row, undefined, context):null\" [matTooltipClass]=\"column.tooltipClass??''\" [hidden]=\"column.hidden\" [ngClass]=\"getRowClasses(column, row)\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\">\r\n\t\t\t\t\t<ng-template #rowVal [ngTemplateOutlet]=\"rowVal\" let-rowValue [ngTemplateOutletContext]=\"{$implicit: column?.content && column?.content(row, undefined, context)}\">\r\n\t\t\t\t\t\t<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t\t\t<!-- #region Checkbox column -->\r\n\t\t\t\t\t\t\t<mat-checkbox *ngSwitchCase=\"ColumnType.Checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"$event ? dataSource.selectionModel.toggle(row) : null\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.enumMetadata; else noEnumMetadata\">\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t\t<ng-container *ngFor=\"let item of rowValue; let i = index\">\r\n\t\t\t\t\t\t\t\t\t\t\t<ng-template [ngIf]=\"i < 2\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<ng-template let-displayValue=\"displayValue\" [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ displayValue: column.enumMetadata[item].display }\"></ng-template>\r\n\t\t\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i === 1 && rowValue?.length > 2\" [matTooltip]=\"(rowValue | slice:2 | map:column.enumMetadata | map:'display') | join:'\\n'\" matTooltipClass=\"mat-tooltip-multiline\">...</small>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t\t<ng-template #template let-displayValue=\"displayValue\">\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-chip-row disableRipple=\"true\" selectable=\"false\" [matTooltip]=\"displayValue\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ displayValue }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</mat-chip-row>\r\n\t\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" class=\"na\" [innerHtml]=\"(column.enumMetadata[rowValue]||{}).display\"></span>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #noEnumMetadata>\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\" i18n=\"@@selection\">{item | enum:column.enumType:column.enumPrefix, select, type {type} other {{{item | enum:column.enumType:column.enumPrefix}}}}</small><small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" i18n=\"@@selection\">{rowValue | enum:column.enumType:column.enumPrefix, select, type {type} other {{{rowValue | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<ng-template #recursiveContainer let-columnNameSegments=\"segments\" let-formGroup=\"formGroup\" let-parentFormGroup=\"parentFormGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formGroup\" [formGroup]=\"formGroup\">\r\n\t\t\t\t\t\t\t\t\t<!-- If the columnNameSegments array is empty, we're at the leaf node -->\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!columnNameSegments.length; else notLastSegment\">\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-slide-toggle [formControl]=\"formGroup\" (click)=\"$event.stopPropagation();\" (change)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):handleModelChange(column, parentFormGroup.value, parentFormGroup)\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.TextInput\" appearance=\"outline\" subscriptSizing=\"dynamic\" dense-3 layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input matInput [formControl]=\"formGroup\" type=\"{{column.inputType}}\" autocomplete=\"none\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" [min]=\"column.inputMin?column.inputMin(parentFormGroup.value, parentFormGroup, context):null\" [max]=\"column.inputMax?column.inputMax(parentFormGroup.value, parentFormGroup, context):null\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.Select\" appearance=\"outline\" subscriptSizing=\"dynamic\" dense-3 layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t\t<vd-select [formControl]=\"formGroup\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:parentFormGroup.value:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" (selectionChange)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):patch(parentFormGroup.value, [column.name], rowValue, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #notLastSegment>\r\n\t\t\t\t\t\t\t\t\t\t<!-- If not the last segment, create a nested form group -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container [formGroupName]=\"columnNameSegments[0]\">\r\n\t\t\t\t\t\t\t\t\t\t\t<!-- Recursive call to handle nested segments -->\r\n\t\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: columnNameSegments.slice(1), parentFormGroup:formGroup, formGroup: formGroup.get(columnNameSegments[0])}\"></ng-container>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\r\n\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!formArray\">\r\n\t\t\t\t\t\t\t\t\t<mat-slide-toggle [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);handleModelChange(column, row, undefined);\" (click)=\"$event.stopPropagation();\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{rowValue | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.TextInput\">\r\n\t\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" subscriptSizing=\"dynamic\" dense-3 (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t<input matInput *ngIf=\"!formArray\" type=\"{{column.inputType}}\" autocomplete=\"none\" name=\"{{column.name}}{{rowIndex}}\" [ngModel]=\"row | property:column.name\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [min]=\"column.inputMin?column.inputMin(row, undefined, context):null\" [max]=\"column.inputMax?column.inputMax(row, undefined, context):null\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);(column.change?column.change(row, undefined, context):patch(row, [column.name], $event, column.patchIncludes));\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Select\">\r\n\t\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" subscriptSizing=\"dynamic\" dense-3 (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t<vd-select *ngIf=\"!formArray\" name=\"{{column.name}}{{rowIndex}}\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column?.enumFilter | func:row:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" (change)=\"column.change?column.change(row, undefined, context):patch(row, [column.name], $event.value, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t\t<div id=\"menu-{{row.id}}\" style=\"visibility: hidden; position: fixed;\" #contextMenuTrigger=\"matMenuTrigger\" [matMenuTriggerFor]=\"menu.matMenu!\" *ngIf=\"menu?.matMenu && !row.locked && hasVisibleRowMenuItems(row, column)\"></div>\r\n\t\t\t\t\t\t\t\t\t<vd-dynamic-menu [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region icon -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Icon\" layout=\"row\" layout-align=\"start center\">\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.matIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\">{{handleExpression(column.icon?.matIcon!, row)}}</mat-icon>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.svgIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [svgIcon]=\"handleExpression(column.icon?.svgIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.fontIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [fontIcon]=\"handleExpression(column.icon?.fontIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region icon button -->\r\n\t\t\t\t\t\t\t<a mat-icon-button *ngSwitchCase=\"ColumnType.IconButton\" (click)=\"$event.stopPropagation();column.iconButton?.event?column.iconButton?.event(row, context):null\">\r\n\t\t\t\t\t\t\t\t<mat-icon fontSet=\"{{column.iconButton?.iconFontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.iconButton?.iconClass??'', row)\">{{handleExpression(column.iconButton?.icon??'radio_button_checked', row) || 'radio_button_checked'}}</mat-icon>\r\n\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"rowValue??''\"></span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</td>\r\n\t\t\t</ng-container>\r\n\t\t\t<!-- #endregion -->\r\n\t\t</ng-container>\r\n\r\n\t\t<!-- #region Filter row -->\r\n\t\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\">\r\n\t\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t\t<span *ngIf=\"(column.endpoint || column.enumType || column.options) else notSelectFilter\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:{}:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t\t<ng-template #notSelectFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"notSelectFilter && (column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number) else notInputFilter\" filter-input [onlyNumber]=\"column.filterInputNumber??false\" [operator]=\"!useFilterOperator ? undefined : column.filterOperator\"></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t\t<ng-template #notInputFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date else notDateFilter\" filter-date></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t\t<ng-template #notDateFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</ng-container>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Details column -->\r\n\t\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t\t<td mat-cell *matCellDef=\"let row; let index = index\" [attr.colspan]=\"(displayedColumns$ | async)?.length\">\r\n\t\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate>\r\n\t\t\t\t\t<ng-container *ngIf=\"templateRef && row === expandedRow\">\r\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRef; context:{row: row, index: index, context: context}\"></ng-container>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</div>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Filter header -->\r\n\t\t<ng-container *ngIf=\"filterable\">\r\n\t\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: displayedColumns$ | async; let index = dataIndex\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\" [class.expanded-row]=\"expandedRow === row\" (click)=\"handleRowClick(index, row)\" (contextmenu)=\"handleRowRightClick($event, row)\"></tr>\r\n\r\n\t\t<!-- #region Detrails row -->\r\n\t\t<ng-container *ngIf=\"detailsTemplate || templateRef\">\r\n\t\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</table>\r\n</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Row shown when there is no matching data.-->\r\n<div class=\"mat-cell pad table-empty txt-italic\" *ngIf=\"!dataSource?.filteredData?.length && !dataSource?.total\" i18n=\"@@noResultsFound\">No results were found.</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Debug value -->\r\n<code *ngIf=\"debugValue\">\r\n\t<pre>{{formValue | json}}</pre>\r\n</code>\r\n<!-- #endregion -->\r\n\r\n<div class=\"table-footer\" layout=\"row\">\r\n\t<ng-content select=\"[table-footer]\"></ng-content>\r\n\t<span flex></span>\r\n\t<mat-paginator *ngIf=\"paginable\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons=\"true\"></mat-paginator>\r\n</div>", styles: ["::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-form-field .mat-form-field-wrapper{width:100%}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip{height:24px;margin-top:2px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip .mdc-evolution-chip__action--primary{padding-left:9px;padding-right:9px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip:last-child{margin-bottom:2px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip *{font-size:.8rem}@media (max-width: 389px){::ng-deep .mat-mdc-table [gt-xs],::ng-deep .mat-mdc-table .gt-xs{display:none}::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}.mat-table-container{width:100%;max-width:100%;overflow:auto}.mat-table-container .mat-mdc-header-cell,.mat-table-container .mat-mdc-footer-cell,.mat-table-container .mat-mdc-cell{min-width:80px;box-sizing:border-box}.mat-table-container .mat-mdc-header-row,.mat-table-container .mat-mdc-footer-row,.mat-table-container .mat-mdc-row{min-width:1920px}.mat-table-container.mat-table-sticky .mat-mdc-table-sticky-border-elem-right{box-shadow:-3px 0 5px #0000001a}.mat-table-container.mat-table-sticky .mat-mdc-table-sticky-border-elem-left{box-shadow:3px 0 5px #0000001a}\n"] }]
728
- }], ctorParameters: () => [{ type: i1.DynamicBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { table: [{
729
- type: ViewChild,
730
- args: ['table']
731
- }], detailsTemplateRef: [{
732
- type: ViewChildren,
733
- args: ['detailsTemplate', { read: ViewContainerRef }]
734
- }], templateRef: [{
735
- type: ContentChild,
736
- args: [TemplateRef]
737
- }], dataSource: [{
738
- type: Input
739
- }], data: [{
740
- type: Input
741
- }], formArray: [{
742
- type: Input
743
- }], debugValue: [{
744
- type: Input
745
- }], classType: [{
746
- type: Input
747
- }], context: [{
748
- type: Input
749
- }], dataSourceFilter: [{
750
- type: Input
751
- }], static: [{
752
- type: Input
753
- }], filterable: [{
754
- type: Input
755
- }], sticky: [{
756
- type: Input
757
- }], tableWidth: [{
758
- type: Input
759
- }], useFilterOperator: [{
760
- type: Input
761
- }], paginable: [{
762
- type: Input
763
- }], selectable: [{
764
- type: Input
765
- }], sortActive: [{
766
- type: Input
767
- }], sortDirection: [{
768
- type: Input
769
- }], stickyHeader: [{
770
- type: Input
771
- }], stickyFilter: [{
772
- type: Input
773
- }], columnSets: [{
774
- type: Input
775
- }], rowClick: [{
776
- type: Output
777
- }], rowNgClass: [{
778
- type: Input
779
- }], detailsTemplate: [{
780
- type: Input
781
- }], readonly: [{
782
- type: Input
783
- }], selectAllFilter: [{
784
- type: Input
785
- }], matSort: [{
786
- type: ViewChild,
787
- args: [MatSort, { static: true }]
788
- }], paginator: [{
789
- type: ViewChild,
790
- args: [MatPaginator]
791
- }], columns: [{
792
- type: Input
793
- }], rowMenuItems: [{
794
- type: Input
795
- }], rowAction: [{
796
- type: Input
797
- }], excludedColumns: [{
798
- type: Input
799
- }], rowContextMenuTriggers: [{
800
- type: ViewChildren,
801
- args: [MatMenuTrigger]
802
- }], pageSize: [{
803
- type: Input
804
- }], pageSizeOptions: [{
805
- type: Input
806
- }], scrollContainer: [{
807
- type: ViewChild,
808
- args: ['scrollContainer', { static: true }]
809
- }] } });
810
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQW9CLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqTixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQWlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUNB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LEtBQUs7Z0JBU0MsZUFBZTtzQkFEckIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBBVVRPX1NUWUxFLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3Q2hlY2tlZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdE1lbnVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNvcnQsIFNvcnREaXJlY3Rpb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcclxuaW1wb3J0IHsgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZnVuY3Rpb25zL3V0aWxzJztcclxuaW1wb3J0IHsgRHluYW1pY0J1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vaGVscGVycy9keW5hbWljLWJ1aWxkZXInO1xyXG5pbXBvcnQgeyBBY3Rpb25JdGVtIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL21vZGVscy9hY3Rpb24taXRlbSc7XHJcbmltcG9ydCB7IEdyaWQgfSBmcm9tICcuLi8uLi9lbnVtcy9ncmlkJztcclxuaW1wb3J0IHsgVGFibGVDb2x1bW5UeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvdGFibGUtY29sdW1uLXR5cGUnO1xyXG5pbXBvcnQgeyBnZXRUYWJsZURlZmluaXRpb24gfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tICcuLi8uLi9tb2RlbHMvdGFibGUtY29sdW1uJztcclxuaW1wb3J0IHsgVGFibGVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vdGFibGUuZGF0YS1zb3VyY2UnO1xyXG5pbXBvcnQgeyBUYWJsZVN0YXRpY0RhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi90YWJsZS5zdGF0aWMtZGF0YS1zb3VyY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICd2ZC1keW5hbWljLXRhYmxlJyxcclxuXHR0ZW1wbGF0ZVVybDogJ2R5bmFtaWMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWydkeW5hbWljLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcblx0YW5pbWF0aW9uczogW1xyXG5cdFx0dHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xyXG5cdFx0XHRzdGF0ZSgnY29sbGFwc2VkJywgc3R5bGUoeyBoZWlnaHQ6ICcwcHgnLCBtaW5IZWlnaHQ6ICcwJyB9KSksXHJcblx0XHRcdHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgaGVpZ2h0OiBBVVRPX1NUWUxFIH0pKSxcclxuXHRcdFx0dHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcclxuXHRcdF0pLFxyXG5cdF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWZER5bmFtaWNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSB0YWJsZSBjb21wb25lbnQsIHVzZWQgZm9yIGFjY2Vzc2luZyBNYXRUYWJsZSBmdW5jdGlvbmFsaXRpZXMuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZCgndGFibGUnKVxyXG5cdHB1YmxpYyB0YWJsZT86IE1hdFRhYmxlPGFueT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZXMgdG8gdGhlIGNvbnRhaW5lciBlbGVtZW50cyBmb3IgZGV0YWlsIHRlbXBsYXRlcywgd2l0aCBWaWV3Q29udGFpbmVyUmVmIFxyXG5cdCAqIGFsbG93aW5nIGR5bmFtaWMgaW5zZXJ0aW9uIG9mIHZpZXdzLlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGRyZW4oJ2RldGFpbHNUZW1wbGF0ZScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxyXG5cdHB1YmxpYyBkZXRhaWxzVGVtcGxhdGVSZWY/OiBRdWVyeUxpc3Q8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIGEgY29udGVudCBjaGlsZCB0ZW1wbGF0ZSAoZGV0YWlscyB0ZW1wbGF0ZSkgb2YgdHlwZSBUZW1wbGF0ZVJlZiwgXHJcblx0ICogdXNlZCBmb3IgcmVuZGVyaW5nIGN1c3RvbSB0ZW1wbGF0ZXMgaW4gdGhlIHRhYmxlLlxyXG5cdCAqL1xyXG5cdEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpXHJcblx0cHVibGljIHRlbXBsYXRlUmVmPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogRGF0YSBzb3VyY2UgZm9yIHRoZSB0YWJsZSwgd2hpY2ggY2FuIGVpdGhlciBiZSBhIGN1c3RvbSBUYWJsZURhdGFTb3VyY2UgXHJcblx0ICogaW1wbGVtZW50YXRpb24gb3IgYSBkeW5hbWljIG9iamVjdC5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkYXRhU291cmNlOiBUYWJsZURhdGFTb3VyY2U8YW55LCBhbnk+IHwgYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBJbnB1dCBkYXRhIGZvciB0aGUgdGFibGUsIHdoaWNoIGlzIHNldCBhcyBhIHN0YXRpYyBkYXRhIHNvdXJjZS5cclxuXHQgKiBUaGlzIG1ldGhvZCBhbHNvIGluaXRpYWxpemVzIHNvcnRpbmcgYW5kIHBhZ2luYXRpb24gZm9yIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzZXQgZGF0YShkYXRhOiBhbnkpIHtcclxuXHRcdHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBUYWJsZVN0YXRpY0RhdGFTb3VyY2UoZGF0YSk7XHJcblx0XHR0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMubWF0U29ydDtcclxuXHRcdHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLl9wYWdpbmF0b3I7XHJcblx0XHR0aGlzLnBhZ2luYWJsZSA9IHRydWU7XHJcblx0XHR0aGlzLnN0YXRpYyA9IHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWFjdGl2ZSBGb3JtQXJyYXkgcmVwcmVzZW50aW5nIHRoZSBmb3JtIGRhdGEsIHdoaWNoIGlzIHVzZWQgdG8gdHJhY2sgXHJcblx0ICogZm9ybSBjb250cm9scyBhbmQgc3luY2hyb25pemUgdGFibGUgZGF0YSB3aXRoIGZvcm0gY2hhbmdlcy5cclxuXHQgKi9cclxuXHRwdWJsaWMgX2Zvcm1BcnJheT86IEZvcm1BcnJheTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgRm9ybUFycmF5IGZvciBtYW5hZ2luZyBmb3JtIGNvbnRyb2xzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFibGUuIFxyXG5cdCAqIEl0IHNldHMgdGhlIHRhYmxlIGRhdGEgYW5kIHN1YnNjcmliZXMgdG8gY2hhbmdlcyBpbiB0aGUgZm9ybSB2YWx1ZXMgdG8gXHJcblx0ICogdXBkYXRlIHRoZSB0YWJsZSBkeW5hbWljYWxseS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBnZXQgZm9ybUFycmF5KCk6IEZvcm1BcnJheSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9mb3JtQXJyYXk7IH1cclxuXHRwdWJsaWMgc2V0IGZvcm1BcnJheShmb3JtQXJyYXk6IEZvcm1BcnJheSkge1xyXG5cdFx0dGhpcy5fZm9ybUFycmF5ID0gZm9ybUFycmF5O1xyXG5cdFx0dGhpcy5kYXRhID0gdGhpcy5fZm9ybUFycmF5Py52YWx1ZTtcclxuXHJcblx0XHQvKiBVcGRhdGUgdGhlIHRhYmxlIGRhdGEgd2hlbiB0aGUgZm9ybSBhcnJheSB2YWx1ZXMgY2hhbmdlICovXHJcblx0XHR0aGlzLl9mb3JtQXJyYXk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKHggPT4ge1xyXG5cdFx0XHRpZiAoeC5sZW5ndGggIT09IHRoaXMuZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoKSB7XHJcblx0XHRcdFx0dGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLl9mb3JtQXJyYXk/LnZhbHVlO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHRlciBmb3IgcmV0cmlldmluZyB0aGUgcmF3IHZhbHVlIG9mIHRoZSBmb3JtLCB3aXRob3V0IGFwcGx5aW5nIGFueSB0cmFuc2Zvcm1hdGlvbnMuXHJcblx0ICovXHJcblx0cHVibGljIGdldCBmb3JtVmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuZm9ybUFycmF5Py5nZXRSYXdWYWx1ZSgpOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgZGVidWcgbW9kZSBmb3IgbG9nZ2luZyBhbmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkZWJ1Z1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IHJlcHJlc2VudGluZyB0aGUgY2xhc3MgdHlwZSB1c2VkIGluIHRoaXMgY29tcG9uZW50LCBcclxuXHQgKiB0eXBpY2FsbHkgZGVmaW5pbmcgdGhlIHN0cnVjdHVyZSBvciBtb2RlbCBvZiB0aGUgZGF0YS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBjbGFzc1R5cGU6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQgb3IgZW52aXJvbm1lbnQgaW4gd2hpY2ggdGhlIHRhYmxlIGlzIGJlaW5nIHVzZWQuXHJcblx0ICogVGhpcyBhbGxvd3MgcGFzc2luZyBhZGRpdGlvbmFsIG1ldGFkYXRhIG9yIHNldHRpbmdzLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNvbnRleHQ6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIGFwcGx5aW5nIGZpbHRlcnMgdG8gdGhlIGRhdGEgc291cmNlLiBJdCBkZWZpbmVzIGNyaXRlcmlhIG9yIGNvbmRpdGlvbnMgXHJcblx0ICogdGhhdCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSB0YWJsZSBkYXRhLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGRhdGFTb3VyY2VGaWx0ZXI6IGFueSA9IHt9O1xyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGFibGUgdXNlcyBhIHN0YXRpYyBkYXRhIHNvdXJjZS4gXHJcblx0ICogV2hlbiB0cnVlLCB0aGUgdGFibGUgZG9lcyBub3QgcmVseSBvbiBkeW5hbWljIGRhdGEgY2hhbmdlcy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdGF0aWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB0YWJsZSBkYXRhIGlzIGZpbHRlcmFibGUgYnkgdGhlIHVzZXIuXHJcblx0ICogSWYgdHJ1ZSwgZmlsdGVyaW5nIG9wdGlvbnMgYXJlIHByb3ZpZGVkLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGZpbHRlcmFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHRhYmxlIGhlYWRlcnMgb3IgY29sdW1ucyBzaG91bGQgc3RpY2sgXHJcblx0ICogdG8gdGhlIHZpZXdwb3J0IGR1cmluZyBzY3JvbGxpbmcuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3RpY2t5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIG92ZXJhbGwgd2lkdGggb2YgdGhlIHRhYmxlLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHRhYmxlV2lkdGg/OiBudW1iZXI7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgZmlsdGVyIG9wZXJhdG9yIGlzIHVzZWQgaW4gdGFibGUgZmlsdGVyaW5nLlxyXG5cdCAqIElmIHRydWUsIGZpbHRlcmluZyBsb2dpYyB3aWxsIGFwcGx5IG9wZXJhdG9ycyBzdWNoIGFzIGVxdWFscywgY29udGFpbnMsIGV0Yy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyB1c2VGaWx0ZXJPcGVyYXRvcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgdGFibGUgc3VwcG9ydHMgcGFnaW5hdGlvbi5cclxuXHQgKiBJZiB0cnVlLCBwYWdpbmF0aW9uIGNvbnRyb2xzIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBuYXZpZ2F0aW5nIHRocm91Z2ggdGhlIGRhdGEuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcGFnaW5hYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgJ0NoZWNrYm94JyBjb2x1bW4gaXMgc2hvd24gZm9yIHJvdyBzZWxlY3Rpb24uXHJcblx0ICogSWYgdHJ1ZSwgYSBjaGVja2JveCBjb2x1bW4gd2lsbCBiZSBkaXNwbGF5ZWQgYWxsb3dpbmcgdXNlcnMgdG8gc2VsZWN0IHJvd3MuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2VsZWN0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBjb2x1bW4gdXNlZCBmb3Igc29ydGluZyB0aGUgdGFibGUgZGF0YS5cclxuXHQgKiBUaGlzIGlucHV0IGRldGVybWluZXMgd2hpY2ggY29sdW1uIHRoZSBzb3J0aW5nIGlzIGFwcGxpZWQgdG8uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc29ydEFjdGl2ZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHRoZSBkaXJlY3Rpb24gb2Ygc29ydGluZyAoYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcpLlxyXG5cdCAqIERlZmF1bHQgaXMgJ2FzYycgKGFzY2VuZGluZykuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbiA9ICdhc2MnO1xyXG5cclxuXHQvKipcclxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRhYmxlIGhlYWRlciBzaG91bGQgcmVtYWluIHN0aWNreSAoZml4ZWQpIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0IFxyXG5cdCAqIHdoZW4gdGhlIHRhYmxlIHNjcm9sbHMuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3RpY2t5SGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblx0LyoqXHJcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmaWx0ZXIgc2VjdGlvbiBvZiB0aGUgdGFibGUgc2hvdWxkIHJlbWFpbiBzdGlja3kgKGZpeGVkKSBcclxuXHQgKiBhdCB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydCB3aGVuIHNjcm9sbGluZy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdGlja3lGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBQcml2YXRlIGJhY2tpbmcgZmllbGQgZm9yIHRoZSBjb2x1bW5TZXRzIGlucHV0IHByb3BlcnR5LlxyXG5cdCAqIFRoaXMgZmllbGQgc3RvcmVzIHRoZSBzZXRzIG9mIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZSxcclxuXHQgKiBlbmFibGluZyBjb250cm9sIG92ZXIgaG93IHRoZSB2YWx1ZSBpcyBhY2Nlc3NlZCBvciBtb2RpZmllZCB0aHJvdWdoXHJcblx0ICogdGhlIHB1YmxpYyBnZXR0ZXIgYW5kIHNldHRlci5cclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX2NvbHVtblNldHM/OiBzdHJpbmdbXTtcclxuXHJcblx0LyoqXHJcblx0ICogVXNlZCB0byBkaXNwbGF5IHNwZWNpZmljIGNvbHVtbnMgaW4gdGhlIHRhYmxlLlxyXG5cdCAqIFRoaXMgYXJyYXkgZGVmaW5lcyBzZXRzIG9mIGNvbHVtbnMgdGhhdCBjYW4gYmUgc2hvd25cclxuXHQgKiBiYXNlZCBvbiB0aGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24sIGFsbG93aW5nIGZvciBkeW5hbWljIHRhYmxlXHJcblx0ICogY29sdW1uIGN1c3RvbWl6YXRpb24uXHJcblx0ICogQHByb3BlcnR5XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGNvbHVtblNldHMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fY29sdW1uU2V0czsgfVxyXG5cdHB1YmxpYyBzZXQgY29sdW1uU2V0cyh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHsgdGhpcy5fY29sdW1uU2V0cyA9IHZhbHVlOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZXIgZm9yIHJvdyBjbGljayBldmVudHMuIEl0IGVtaXRzIHRoZSBjbGlja2VkIHJvdydzIGRhdGEgd2hlbmV2ZXIgYSByb3cgaXMgY2xpY2tlZC5cclxuXHQgKi9cclxuXHRAT3V0cHV0KClcclxuXHRwdWJsaWMgcm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZ1bmN0aW9uIHVzZWQgdG8gZHluYW1pY2FsbHkgYXNzaWduIENTUyBjbGFzc2VzIHRvIHRhYmxlIHJvd3MgYmFzZWQgb24gY3VzdG9tIGxvZ2ljLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHJvd05nQ2xhc3M/OiBGdW5jdGlvbjtcclxuXHJcblx0LyoqXHJcblx0ICogVGVtcGxhdGUgZm9yIHJlbmRlcmluZyBhZGRpdGlvbmFsIGRldGFpbHMgYmVsb3cgZWFjaCByb3cuIFxyXG5cdCAqIEl0IGFjY2VwdHMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZSBrZXkgb3IgaWRlbnRpZmllci5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkZXRhaWxzVGVtcGxhdGU/OiBzdHJpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgdGFibGUgaXMgaW4gYSByZWFkb25seSBzdGF0ZS5cclxuXHQgKiBJZiB0cnVlLCBubyBjaGFuZ2VzIGNhbiBiZSBtYWRlIHRvIHRoZSB0YWJsZSBkYXRhLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBfcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcbiAqIElucHV0IHByb3BlcnR5IHRvIGRldGVybWluZSBpZiB0aGUgdGFibGUgaXMgcmVhZG9ubHkuIFxyXG4gKiBVc2VzIGBjb2VyY2VCb29sZWFuUHJvcGVydHlgIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgdHJlYXRlZCBhcyBhIGJvb2xlYW4uXHJcbiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGdldCByZWFkb25seSgpIHsgcmV0dXJuIHRoaXMuX3JlYWRvbmx5OyB9XHJcblx0cHVibGljIHNldCByZWFkb25seShyZWFkb25seTogYW55KSB7XHJcblx0XHR0aGlzLl9yZWFkb25seSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShyZWFkb25seSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGdW5jdGlvbiB0byBmaWx0ZXIgaXRlbXMgd2hlbiBzZWxlY3RpbmcgYWxsIHJvd3MuIFxyXG5cdCAqIEl0IHRha2VzIHZhbHVlLCBpbmRleCwgYW5kIGFycmF5IGFzIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIGJvb2xlYW4gb3IgdW5rbm93biB0eXBlLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNlbGVjdEFsbEZpbHRlcj86ICh2YWx1ZTogYW55LCBpbmRleDogbnVtYmVyLCBhcnJheTogYW55W10pID0+IHVua25vd247XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgTWF0U29ydCBkaXJlY3RpdmUgdXNlZCBmb3IgYXBwbHlpbmcgc29ydGluZyBvbiB0aGUgdGFibGUuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRTb3J0LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG5cdHB1YmxpYyBtYXRTb3J0PzogTWF0U29ydDtcclxuXHJcblx0LyoqXHJcblx0ICogUHJpdmF0ZSByZWZlcmVuY2UgdG8gdGhlIE1hdFBhZ2luYXRvciB1c2VkIHRvIHBhZ2luYXRlIHRoZSB0YWJsZSBkYXRhLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX3BhZ2luYXRvcj86IE1hdFBhZ2luYXRvcjtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgc2V0dGVyIGZvciB0aGUgTWF0UGFnaW5hdG9yLiBXaGVuIHRoZSBwYWdpbmF0b3IgaXMgc2V0LCBpdCBhc3NpZ25zIGl0IFxyXG5cdCAqIHRvIHRoZSBkYXRhIHNvdXJjZSBmb3IgcGFnaW5hdGlvbiBjb250cm9sLlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKVxyXG5cdHB1YmxpYyBzZXQgcGFnaW5hdG9yKHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yKSB7XHJcblx0XHRpZiAocGFnaW5hdG9yKSB7XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSBwYWdpbmF0b3I7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcml2YXRlIGFycmF5IHN0b3JpbmcgdGhlIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRwcml2YXRlIF9jb2x1bW5zOiBUYWJsZUNvbHVtbltdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IGdldHRlciBhbmQgc2V0dGVyIGZvciB0aGUgdGFibGUgY29sdW1ucy4gXHJcblx0ICogSXQgYWxsb3dzIHRoZSBjb2x1bW5zIHRvIGJlIGN1c3RvbWl6ZWQgYW5kIHVwZGF0ZWQgZHluYW1pY2FsbHkuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGNvbHVtbnMoKTogVGFibGVDb2x1bW5bXSB7IHJldHVybiB0aGlzLl9jb2x1bW5zOyB9XHJcblx0cHVibGljIHNldCBjb2x1bW5zKGNvbHVtbnM6IFRhYmxlQ29sdW1uW10pIHsgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnM7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQmVoYXZpb3JTdWJqZWN0IHRvIG1hbmFnZSBhbmQgZW1pdCBjaGFuZ2VzIHRvIHRoZSBjb2x1bW5zIGR5bmFtaWNhbGx5LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb2x1bW5zU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFRhYmxlQ29sdW1uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZUNvbHVtbltdPihbXSk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIE9ic2VydmFibGUgdGhhdCB0cmFja3MgYW5kIGVtaXRzIGNoYW5nZXMgdG8gdGhlIGNvbHVtbnMuXHJcblx0ICovXHJcblx0cHVibGljIGNvbHVtbnMkOiBPYnNlcnZhYmxlPFRhYmxlQ29sdW1uW10+ID0gdGhpcy5jb2x1bW5zU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcblx0LyoqXHJcblx0ICogT2JzZXJ2YWJsZSB0cmFja2luZyB0aGUgY29sdW1ucyBjdXJyZW50bHkgZGlzcGxheWVkIGluIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRwdWJsaWMgZGlzcGxheWVkQ29sdW1ucyQ/OiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcclxuXHJcblx0LyoqXHJcblx0ICogT2JzZXJ2YWJsZSB0cmFja2luZyB0aGUgZmlsdGVyYWJsZSBjb2x1bW5zIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuXHJcblx0ICovXHJcblx0cHVibGljIGRpc3BsYXllZEZpbHRlckNvbHVtbnMkPzogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IHByb3BlcnR5IGZvciByb3ctc3BlY2lmaWMgYWN0aW9uIG1lbnUgaXRlbXMuIFxyXG5cdCAqIERlZmluZXMgYWN0aW9ucyBhdmFpbGFibGUgaW4gdGhlIGNvbnRleHQgbWVudSBmb3IgZWFjaCByb3cuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcm93TWVudUl0ZW1zOiBBY3Rpb25JdGVtW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIGEgc2luZ2xlIHJvdyBhY3Rpb24gdG8gYmUgYXBwbGllZCB3aGVuIGludGVyYWN0aW5nIHdpdGggYSByb3cuXHJcblx0ICogQHByb3BlcnR5IHtBY3Rpb25JdGVtfSByb3dBY3Rpb25cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyByb3dBY3Rpb24/OiBBY3Rpb25JdGVtO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbnB1dCBmb3Igc3BlY2lmeWluZyB3aGljaCBjb2x1bW5zIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIGRpc3BsYXkgaW4gdGhlIHRhYmxlLlxyXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGV4Y2x1ZGVkQ29sdW1uc1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGV4Y2x1ZGVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogUXVlcnlMaXN0IHRvIHJlZmVyZW5jZSBhbGwgTWF0TWVudVRyaWdnZXJzIGFzc29jaWF0ZWQgd2l0aCByb3cgY29udGV4dCBtZW51cy5cclxuXHQgKiBVc2VkIGZvciBoYW5kbGluZyB0aGUgY29udGV4dCBtZW51IGludGVyYWN0aW9ucyBvbiB0YWJsZSByb3dzLlxyXG5cdCAqIEBwcm9wZXJ0eSB7UXVlcnlMaXN0PE1hdE1lbnVUcmlnZ2VyPn0gcm93Q29udGV4dE1lbnVUcmlnZ2Vyc1xyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGRyZW4oTWF0TWVudVRyaWdnZXIpXHJcblx0cHVibGljIHJvd0NvbnRleHRNZW51VHJpZ2dlcnM/OiBRdWVyeUxpc3Q8TWF0TWVudVRyaWdnZXI+O1xyXG5cclxuXHQvKipcclxuXHQgKiBDb2x1bW4gdHlwZSBlbnVtIHJlZmVyZW5jZSwgbWFwcGluZyB0YWJsZSBjb2x1bW5zIHRvIHRoZWlyIHR5cGVzIGZvciByZW5kZXJpbmcuXHJcblx0ICogQHByb3BlcnR5IHt0eXBlb2YgVGFibGVDb2x1bW5UeXBlfSBDb2x1bW5UeXBlXHJcblx0ICovXHJcblx0cHVibGljIENvbHVtblR5cGU6IHR5cGVvZiBUYWJsZUNvbHVtblR5cGUgPSBUYWJsZUNvbHVtblR5cGU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdyaWQgZW51bSByZWZlcmVuY2UsIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBncmlkIHVzZWQgaW4gdGhlIHRhYmxlLlxyXG5cdCAqIEBwcm9wZXJ0eSB7dHlwZW9mIEdyaWR9IEdyaWRcclxuXHQgKi9cclxuXHRwdWJsaWMgR3JpZDogdHlwZW9mIEdyaWQgPSBHcmlkO1xyXG5cclxuXHQvKipcclxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnRseSBleHBhbmRlZCByb3csIHVzZWQgZm9yIGhhbmRsaW5nIHJvdyBleHBhbnNpb24gbG9naWMuXHJcblx0ICogQHByb3BlcnR5IHthbnl9IGV4cGFuZGVkUm93XHJcblx0ICovXHJcblx0cHVibGljIGV4cGFuZGVkUm93OiBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IGZvciBzZXR0aW5nIHRoZSBkZWZhdWx0IHBhZ2Ugc2l6ZSBmb3IgcGFnaW5hdGlvbi4gXHJcblx0ICogRGVmYXVsdCB2YWx1ZSBpcyAxNS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBwYWdlU2l6ZTogbnVtYmVyID0gMTU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IGZvciBzZXR0aW5nIGF2YWlsYWJsZSBwYWdlIHNpemUgb3B0aW9ucyBpbiB0aGUgcGFnaW5hdG9yLlxyXG5cdCAqIERlZmF1bHQgb3B0aW9ucyBpbmNsdWRlIFs1LCAxMCwgMTUsIDIwLCAzMCwgNTAsIDEwMCwgMjAwXS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBwYWdlU2l6ZU9wdGlvbnM6IEFycmF5PG51bWJlcj4gPSBbNSwgMTAsIDE1LCAyMCwgMzAsIDUwLCAxMDAsIDIwMF07XHJcblxyXG5cdC8qIFxyXG5cdCAqIFRoaXMgZGVjb3JhdG9yIGJpbmRzIHRoZSBzY3JvbGxhYmxlIGNvbnRhaW5lciBlbGVtZW50IGJ5IGl0cyB0ZW1wbGF0ZSByZWZlcmVuY2UuXHJcblx0ICogVGhlIGBzY3JvbGxDb250YWluZXJgIHdpbGwgcmVmZXJlbmNlIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgdGVtcGxhdGUgd2l0aCBgI3Njcm9sbENvbnRhaW5lcmAuXHJcblx0ICogSXQgd2lsbCBhbGxvdyBhY2Nlc3MgdG8gdGhlIG5hdGl2ZSBET00gZWxlbWVudCBmb3IgbWFuYWdpbmcgc2Nyb2xsIG9wZXJhdGlvbnMuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuXHRwdWJsaWMgc2Nyb2xsQ29udGFpbmVyPzogRWxlbWVudFJlZjtcclxuXHJcblx0LyogXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiBpcyBhY3RpdmVseSBkcmFnZ2luZyB0aGUgc2Nyb2xsIGNvbnRhaW5lci5cclxuXHQgKiBUaGlzIGZsYWcgZW5zdXJlcyB0aGF0IHNjcm9sbGluZyBvbmx5IG9jY3VycyB3aGVuIGEgZHJhZyBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MsXHJcblx0ICogcHJvdmlkaW5nIGEgc21vb3RoZXIgYW5kIG1vcmUgY29udHJvbGxlZCB1c2VyIGV4cGVyaWVuY2UgZHVyaW5nIGludGVyYWN0aW9ucy5cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXJ0RHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcblx0LyogXHJcblx0ICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSByaWdodCBtb3VzZSBidXR0b24gaXMgYWN0aXZlbHkgZHJhZ2dpbmcgdGhlIHNjcm9sbCBjb250YWluZXIuXHJcblx0ICogSXQgZW5zdXJlcyB0aGF0IHNjcm9sbGluZyBvY2N1cnMgb25seSBkdXJpbmcgYWN0aXZlIGRyYWdnaW5nLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuXHQvKiBcclxuXHQgKiBTdG9yZXMgdGhlIGluaXRpYWwgWCBjb29yZGluYXRlIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmlnaHQgbW91c2UgYnV0dG9uLlxyXG5cdCAqIFRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG1vdmVkIGR1cmluZyBkcmFnZ2luZywgZW5hYmxpbmcgc21vb3RoIHNjcm9sbGluZy5cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXJ0WDogbnVtYmVyID0gMDtcclxuXHJcblx0LyogXHJcblx0ICogS2VlcHMgdHJhY2sgb2YgdGhlIGNvbnRhaW5lcuKAmXMgc2Nyb2xsIHBvc2l0aW9uIGJlZm9yZSB0aGUgZHJhZyBiZWdpbnMuXHJcblx0ICogVGhpcyBhbGxvd3MgdXBkYXRpbmcgdGhlIHNjcm9sbCBwb3NpdGlvbiBpbiByZWFsLXRpbWUgYXMgdGhlIHVzZXIgbW92ZXMgdGhlIG1vdXNlLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2Nyb2xsTGVmdDogbnVtYmVyID0gMDtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3IgZm9yIHRoZSBjb21wb25lbnQsIGluamVjdGluZyBzZXJ2aWNlcyBuZWVkZWQgZm9yIGZvcm0gYnVpbGRpbmcsXHJcblx0ICogZHluYW1pYyBjb250ZW50IGhhbmRsaW5nLCBhbmQgY2hhbmdlIGRldGVjdGlvbi5cclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gZm9ybUJ1aWxkZXIgU2VydmljZSBmb3IgY3JlYXRpbmcgZm9ybSBjb250cm9scyBhbmQgbWFuYWdpbmcgZm9ybSBsb2dpYy5cclxuXHQgKiBAcGFyYW0gZHluYW1pY0J1aWxkZXIgU2VydmljZSBmb3IgZHluYW1pY2FsbHkgY29uc3RydWN0aW5nIHRhYmxlIGNvbXBvbmVudHMuXHJcblx0ICogQHBhcmFtIGNoYW5nZURldGVjdG9yIFNlcnZpY2UgZm9yIGRldGVjdGluZyBhbmQgdHJpZ2dlcmluZyBVSSBjaGFuZ2VzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBkeW5hbWljQnVpbGRlcjogRHluYW1pY0J1aWxkZXIsXHJcblx0XHRwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG5cdCkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuXHQgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY2hlY2tlZCB0aGUgZGlyZWN0aXZlJ3NcclxuXHQgKiBkYXRhLWJvdW5kIHByb3BlcnRpZXMgZm9yIHRoZSBmaXJzdCB0aW1lLFxyXG5cdCAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSB2aWV3IG9yIGNvbnRlbnQgY2hpbGRyZW4gaGF2ZSBiZWVuIGNoZWNrZWQuXHJcblx0ICogSXQgaXMgaW52b2tlZCBvbmx5IG9uY2Ugd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGluc3RhbnRpYXRlZC5cclxuXHQgKi9cclxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmNsYXNzVHlwZSkge1xyXG5cdFx0XHQvKiBHZXQgdGhlIHRhYmxlIGRlZmluaXRpb24gdXNpbmcgdGhlIGNsYXNzIHR5cGUgKi9cclxuXHRcdFx0dmFyIHRhYmxlRGVmaW5pdGlvbiA9IGdldFRhYmxlRGVmaW5pdGlvbih0aGlzLmNsYXNzVHlwZSk7XHJcblx0XHRcdGlmICh0YWJsZURlZmluaXRpb24pIHtcclxuXHRcdFx0XHR0aGlzLmNvbHVtbnMgPSBbLi4udGFibGVEZWZpbml0aW9uIS5jb2x1bW5zID8/IFtdXTtcclxuXHRcdFx0XHRpZiAodGhpcy5yb3dNZW51SXRlbXM/Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdC8qIENoZWNrIGlmIHRoZSBhY3Rpb24gY29sdW1uIGFscmVhZHkgZXhpc3RzICovXHJcblx0XHRcdFx0XHR2YXIgYWN0aW9uQ29sbXVuID0gdGhpcy5fY29sdW1ucz8uZmluZCh4ID0+IHgubmFtZSA9PSAnYWN0aW9uJyk7XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgc28sIGp1c3QgYWRkIHRoZSBtZW51IGl0ZW1zIHRvIGl0ICovXHJcblx0XHRcdFx0XHRpZiAoYWN0aW9uQ29sbXVuICE9IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0YWN0aW9uQ29sbXVuLm1lbnUgfHw9IHsgaWNvbjogJ21vcmVfdmVydCcgfTtcclxuXHRcdFx0XHRcdFx0dGhpcy5yb3dNZW51SXRlbXMuZm9yRWFjaCh5ID0+IGFjdGlvbkNvbG11biEubWVudSEuaXRlbXM/LnVuc2hpZnQoeSkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIE90aGVyd2lzZSBhZGQgYSBuZXcgb25lICovXHJcblx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5fY29sdW1ucy5wdXNoKG5ldyBUYWJsZUNvbHVtbih7XHJcblx0XHRcdFx0XHRcdFx0aW5kZXg6IDIwMDAsXHJcblx0XHRcdFx0XHRcdFx0bmFtZTogJ2FjdGlvbicsXHJcblx0XHRcdFx0XHRcdFx0Y29sdW1uU2V0czogWydhY3Rpb24nLCAnY29tbW9uJ10sXHJcblx0XHRcdFx0XHRcdFx0dHlwZTogVGFibGVDb2x1bW5UeXBlLkFjdGlvbixcclxuXHRcdFx0XHRcdFx0XHRkaXNhYmxlZDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRtZW51OiB7IGljb246ICdtb3JlX3ZlcnQnLCBpdGVtczogdGhpcy5yb3dNZW51SXRlbXMgfSxcclxuXHRcdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdHN0aWNreUVuZDogdHJ1ZVxyXG5cdFx0XHRcdFx0XHR9KSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnJvd0FjdGlvbikge1xyXG5cdFx0XHRcdFx0dGhpcy5fY29sdW1ucy5wdXNoKG5ldyBUYWJsZUNvbHVtbih7XHJcblx0XHRcdFx0XHRcdGluZGV4OiAyMDAwLFxyXG5cdFx0XHRcdFx0XHRuYW1lOiAnYWN0aW9uJyxcclxuXHRcdFx0XHRcdFx0Y29sdW1uU2V0czogWydhY3Rpb24nLCAnY29tbW9uJ10sXHJcblx0XHRcdFx0XHRcdHR5cGU6IFRhYmxlQ29sdW1uVHlwZS5BY3Rpb24sXHJcblx0XHRcdFx0XHRcdGRpc2FibGVkOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRtZW51OiB0aGlzLnJvd0FjdGlvbixcclxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0c3RpY2t5RW5kOiB0cnVlXHJcblx0XHRcdFx0XHR9KSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKiBBZGQgY2hlY2tib3ggY29sdW1uICovXHJcblx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0YWJsZSkge1xyXG5cdFx0XHRcdFx0dGhpcy5jb2x1bW5zLnVuc2hpZnQobmV3IFRhYmxlQ29sdW1uKHtcclxuXHRcdFx0XHRcdFx0bmFtZTogJ3NlbGVjdCcsXHJcblx0XHRcdFx0XHRcdGNvbHVtblNldHM6IFsnc2VsZWN0JywgJ2NvbW1vbiddLFxyXG5cdFx0XHRcdFx0XHR0eXBlOiBUYWJsZUNvbHVtblR5cGUuQ2hlY2tib3gsXHJcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcblx0XHRcdFx0XHRcdHN0aWNreTogdHJ1ZVxyXG5cdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qIEJ1aWxkIGRpc3BsYXllZCBjb2x1bW5zICYgZmlsdGVyICovXHJcblx0XHR0aGlzLmNvbHVtbnMkPy5zdWJzY3JpYmUoeCA9PiB7XHJcblx0XHRcdC8qIEZpbHRlciB0aGUgY29sdW1ucyBiYXNlZCBvbiB0aGUgaW5kaXZpZHVhbCBjb2x1bW4ncyBjb2x1bW5TZXRzIHByb3BlcnR5IGFuZCB0aGUgZ2xvYmFsIGNvbHVtblNldHMgKi9cclxuXHRcdFx0Y29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gKHRoaXMuY29sdW1uU2V0cz8ubGVuZ3RoID8/IDApID4gMFxyXG5cdFx0XHRcdD8gdGhpcy5jb2x1bW5zPy5maWx0ZXIoYyA9PiB0aGlzLmNvbHVtblNldHM/LnNvbWUoc2V0ID0+IGMuY29sdW1uU2V0cz8uaW5jbHVkZXMoc2V0KSkpXHJcblx0XHRcdFx0OiB0aGlzLmNvbHVtbnM7XHJcblxyXG5cdFx0XHQvKiBCdWlsZCB0aGUgZGlzcGxheWVkIGNvbHVtbnMgYnkgZmlsdGVyaW5nIG91dCB0aGUgZXhjbHVkZWQgY29sdW1ucyBhbmQgbWFwcGluZyB0byB0aGVpciBuYW1lcyAqL1xyXG5cdFx0XHR0aGlzLmRpc3BsYXllZENvbHVtbnMkID0gb2Yoc2VsZWN0ZWRDb2x1bW5zXHJcblx0XHRcdFx0LyogRXhjbHVkZSBjb2x1bW5zIHRoYXQgYXJlIGluIHRoZSBleGNsdWRlZENvbHVtbnMgbGlzdCAqL1xyXG5cdFx0XHRcdD8uZmlsdGVyKHggPT4gIXRoaXMuZXhjbHVkZWRDb2x1bW5zPy5pbmNsdWRlcyh4Lm5hbWUpKVxyXG5cdFx0XHRcdC8qIE1hcCB0aGUgcmVtYWluaW5nIGNvbHVtbnMgdG8gdGhlaXIgbmFtZSBwcm9wZXJ0eSAqL1xyXG5cdFx0XHRcdD8ubWFwKGMgPT4gYy5uYW1lKVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0LyogQnVpbGQgdGhlIGRpc3BsYXllZCBmaWx0ZXIgY29sdW1ucyBieSBmaWx0ZXJpbmcgb3V0IHRoZSBleGNsdWRlZCBjb2x1bW5zIGFuZCBwcmVmaXhpbmcgd2l0aCAnZmlsdGVyLicgKi9cclxuXHRcdFx0dGhpcy5kaXNwbGF5ZWRGaWx0ZXJDb2x1bW5zJCA9IG9mKHNlbGVjdGVkQ29sdW1uc1xyXG5cdFx0XHRcdC8qIEV4Y2x1ZGUgY29sdW1ucyB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZWRDb2x1bW5zIGxpc3QgKi9cclxuXHRcdFx0XHQ/LmZpbHRlcih4ID0+ICF0aGlzLmV4Y2x1ZGVkQ29sdW1ucz8uaW5jbHVkZXMoeC5uYW1lKSlcclxuXHRcdFx0XHQvKiBNYXAgdGhlIHJlbWFpbmluZyBjb2x1bW5zIHRvIGEgZmlsdGVyLWZyaWVuZGx5IHN0cmluZyB3aXRoICdmaWx0ZXIuJyBwcmVmaXggKi9cclxuXHRcdFx0XHQ/Lm1hcChjID0+IGBmaWx0ZXIuJHsoYy5maWx0ZXIgfHwgYy5uYW1lKX1gKVxyXG5cdFx0XHQpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyogU2V0IHRoZSB0YWJsZSBjb2x1bW5zICovXHJcblx0XHR0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcclxuXHJcblx0XHRjb25zdCBjb250YWluZXIgPSB0aGlzLnNjcm9sbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcclxuXHRcdGlmIChjb250YWluZXIpIHtcclxuXHRcdFx0LyogXHJcblx0XHRcdCAqIERpc2FibGUgdGhlIGNvbnRleHQgbWVudSBvbiByaWdodC1jbGljayB0byBhbGxvdyBzbW9vdGggc2Nyb2xsaW5nIFxyXG5cdFx0XHQgKiB3aXRob3V0IGludGVyZmVyZW5jZSBmcm9tIHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudSBiZWhhdmlvci5cclxuXHRcdFx0ICovXHJcblx0XHRcdGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChlOiBNb3VzZUV2ZW50KSA9PiBlLnByZXZlbnREZWZhdWx0KCkpO1xyXG5cclxuXHRcdFx0LyogXHJcblx0XHRcdCAqIFN0YXJ0IGRyYWdnaW5nIHdoZW4gdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIChidXR0b24gPT09IDIpLlxyXG5cdFx0XHQgKiBUaGlzIHNhdmVzIHRoZSBpbml0aWFsIHBvc2l0aW9uIGFuZCBzY3JvbGwgc3RhdGUgZm9yIGxhdGVyIHVzZSBkdXJpbmcgbW92ZW1lbnQuXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGU6IE1vdXNlRXZlbnQpID0+IHtcclxuXHRcdFx0XHRpZiAoZS5idXR0b24gPT09IDIgJiYgdGhpcy5zY3JvbGxDb250YWluZXIpIHtcclxuXHRcdFx0XHRcdC8qIFByZXZlbnRzIGFueSBkZWZhdWx0IGJlaGF2aW9yIGFzc29jaWF0ZWQgd2l0aCByaWdodC1jbGljayAqL1xyXG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRcdC8qIEFjdGl2YXRlIHRoZSBkcmFnZ2luZyBtb2RlLCBhbGxvd2luZyBob3Jpem9udGFsIHNjcm9sbGluZyAqL1xyXG5cdFx0XHRcdFx0dGhpcy5zdGFydERyYWdnaW5nID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHQvKiBTdG9yZSB0aGUgaW5pdGlhbCBYIHBvc2l0aW9uICovXHJcblx0XHRcdFx0XHR0aGlzLnN0YXJ0WCA9IGUucGFnZVggLSBjb250YWluZXIub2Zmc2V0TGVmdDtcclxuXHJcblx0XHRcdFx0XHQvKiBTYXZlIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiAqL1xyXG5cdFx0XHRcdFx0dGhpcy5zY3JvbGxMZWZ0ID0gY29udGFpbmVyLnNjcm9sbExlZnQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8qIFxyXG5cdFx0XHQgKiBTdG9wIGRyYWdnaW5nIHdoZW4gdGhlIG1vdXNlIGxlYXZlcyB0aGUgY29udGFpbmVyLlxyXG5cdFx0XHQgKiBUaGlzIGVuc3VyZXMgdGhlIHNjcm9sbGluZyBzdG9wcyBldmVuIGlmIHRoZSB1c2VyIG1vdmVzIHRoZSBjdXJzb3Igb3V0c2lkZSB0aGUgYm91bmRhcmllcy5cclxuXHRcdFx0ICovXHJcblx0XHRcdGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKGU6IE1vdXNlRXZlbnQpID0+IHRoaXMuc3RvcERyYWdnaW5nKGUpKTtcclxuXHJcblx0XHRcdC8qIFxyXG5cdFx0XHQgKiBTdG9wIGRyYWdnaW5nIHdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZCAob24gbW91c2UgdXApLlxyXG5cdFx0XHQgKiBUaGlzIHByZXZlbnRzIGZ1cnRoZXIgc2Nyb2xsIG1vdmVtZW50cyBhZnRlciB0aGUgdXNlciByZWxlYXNlcyB0aGUgbW91c2UuXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIChlOiBNb3VzZUV2ZW50KSA9PiB0aGlzLnN0b3BEcmFnZ2luZyhlKSk7XHJcblxyXG5cdFx0XHQvKiBcclxuXHRcdFx0ICogSGFuZGxlIHRoZSBhY3R1YWwgZHJhZ2dpbmcgKHNjcm9sbGluZykgd2hlbiB0aGUgbW91c2UgaXMgbW92ZWQuXHJcblx0XHRcdCAqIFRoaXMgY2FsY3VsYXRlcyB0aGUgbW92ZW1lbnQgYW5kIHVwZGF0ZXMgdGhlIHNjcm9sbCBwb3NpdGlvbiBhY2NvcmRpbmdseS5cclxuXHRcdFx0ICovXHJcblx0XHRcdGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZTogTW91c2VFdmVudCkgPT4ge1xyXG5cdFx0XHRcdC8qIElmIGRyYWdnaW5nIGlzIG5vdCBhY3RpdmUgb3Igc2Nyb2xsIGNvbnRhaW5lciBpcyB1bmRlZmluZWQsIGV4aXQgKi9cclxuXHRcdFx0XHRpZiAoIXRoaXMuc3RhcnREcmFnZ2luZyB8fCAhdGhpcy5zY3JvbGxDb250YWluZXIpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIEFjdGl2YXRlIHRoZSBkcmFnZ2luZyBtb2RlLCBhbGxvd2luZyBob3Jpem9udGFsIHNjcm9sbGluZyAqL1xyXG5cdFx0XHRcdHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdC8qIFByZXZlbnQgZGVmYXVsdCBhY3Rpb24gdG8gZW5zdXJlIHNtb290aCBiZWhhdmlvciAqL1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0LyogQ2FsY3VsYXRlIHRoZSBjdXJyZW50IG1vdXNlIFggcG9zaXRpb24gKi9cclxuXHRcdFx0XHRjb25zdCB4ID0gZS5wYWdlWCAtIGNvbnRhaW5lci5vZmZzZXRMZWZ0O1xyXG5cclxuXHRcdFx0XHQvKiBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG1vdmVkIChhbXBsaWZpZWQgZm9yIHNwZWVkKSAqL1xyXG5cdFx0XHRcdGNvbnN0IHdhbGsgPSAoeCAtIHRoaXMuc3RhcnRYKSAqIDI7XHJcblxyXG5cdFx0XHRcdC8qIFVwZGF0ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uIGJhc2VkIG9uIG1vdmVtZW50ICovXHJcblx0XHRcdFx0Y29udGFpbmVyLnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQgLSB3YWxrO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHRhYmxlIGNvbHVtbnNcclxuXHQgKi9cclxuXHRwdWJsaWMgdXBkYXRlQ29sdW1ucygpOiB2b2lkIHtcclxuXHRcdC8qIFNvcnQgdGhlIGNvbHVtbnMgYnkgaW5kZXggKi9cclxuXHRcdFV0aWxzLnNvcnRBcnJheSh0aGlzLmNvbHVtbnMgfHwgW10sICdpbmRleCcpO1xyXG5cclxuXHRcdC8qIFRyaWdnZXIgY2hhbmdlcyAqL1xyXG5cdFx0dGhpcy5jb2x1bW5zU3ViamVjdC5uZXh0KHRoaXMuY29sdW1ucyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3VudHMgdmlzaWJsZSBhY3Rpb24gbWVudXNcclxuXHQgKiBAcGFyYW0gcm93IFxyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHVibGljIGhhc1Zpc2libGVSb3dNZW51SXRlbXMocm93OiBhbnksIGNvbHVtbjogVGFibGVDb2x1bW4pOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoY29sdW1uPy5yb3dNZW51SXRlbXM/LmZpbHRlcih4ID0+ICF4LmhpZGUgfHwgIXguaGlkZShyb3cpKT8ubGVuZ3RoID8/IC0xKSA+IDA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGZ1bmN0aW9uIHRvIHRvIGNvbXB1dGUgdGhlIGlkZW50aXR5IG9mIGl0ZW1zIGluIGFuIGl0ZXJhYmxlLlxyXG5cdCAqIEBwYXJhbSBpbmRleCBcclxuXHQgKiBAcGFyYW0gaXRlbSBcclxuXHQgKi9cclxuXHRwdWJsaWMgdHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGAke2l0ZW0uaWR9YDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgZnVuY3Rpb24gdG8gdG8gY29tcHV0ZSB0aGUgaWRlbnRpdHkgb2YgaXRlbXMgaW4gYW4gaXRlcmFibGUuXHJcblx0ICogQHBhcmFtIGluZGV4IFxyXG5cdCAqIEBwYXJhbSBpdGVtIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb2x1bW5zVHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGl0ZW0ubmFtZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhhbmRsZXMgcm93IGNsaWNrIGV2ZW50XHJcblx0ICogQHBhcmFtIGluZGV4IFxyXG5cdCAqIEBwYXJhbSByb3cgXHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZVJvd0NsaWNrKGluZGV4OiBhbnksIHJvdzogYW55KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy50ZW1wbGF0ZVJlZikge1xyXG5cdFx0XHR0aGlzLmV4cGFuZGVkUm93ID0gdGhpcy5leHBhbmRlZFJvdyA9PT0gcm93ID8gbnVsbCA6IHJvdztcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYgKHRoaXMuZGV0YWlsc1RlbXBsYXRlKSB7XHJcblx0XHRcdHRoaXMuZXhwYW5kZWRSb3cgPSB0aGlzLmV4cGFuZGVkUm93ID09PSByb3cgPyBudWxsIDogcm93O1xyXG5cdFx0XHRpZiAodGhpcy5kZXRhaWxzVGVtcGxhdGVSZWYpIHtcclxuXHRcdFx0XHR0aGlzLmR5bmFtaWNCdWlsZGVyLmNvbXBpbGVIdG1sKHRoaXMuZGV0YWlsc1RlbXBsYXRlUmVmLmdldChpbmRleCksIHRoaXMuZGV0YWlsc1RlbXBsYXRlLCByb3cpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0dGhpcy5yb3dDbGljay5lbWl0KHJvdyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2sgd2l0aCB0aGUgcmlnaHQgYnV0dG9uXHJcblx0ICogQHBhcmFtIGV2ZW50IE1vdXNlRXZlbnQsIGl0IGNvbnRhaW5zIHRoZSBjb29yZGluYXRlc1xyXG5cdCAqIEBwYXJhbSBpdGVtIE91ciBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgcm93IG9mIHRoZSB0YWJsZVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYW5kbGVSb3dSaWdodENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBpdGVtOiBhbnkpIHtcclxuXHRcdGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucm93Q29udGV4dE1lbnVUcmlnZ2Vycz8udG9BcnJheSgpPy5mb3JFYWNoKHggPT4geC5jbG9zZU1lbnUoKSk7XHJcblx0XHR2YXIgbWVudVRyaWdnZXIgPSB0aGlzLnJvd0NvbnRleHRNZW51VHJpZ2dlcnM/LnRvQXJyYXkoKT8uZmlsdGVyKHggPT4geFsnX2VsZW1lbnQnXT8ubmF0aXZlRWxlbWVudD8uZ2V0QXR0cmlidXRlKCdpZCcpID09IGBtZW51LSR7aXRlbS5pZH1gKVswXTtcclxuXHRcdGlmIChtZW51VHJpZ2dlciAhPSBudWxsKSB7XHJcblx0XHRcdC8qIEF2b2lkcyB0byBzaG93IHRoZSB2aXN1YWxpemF0aW9uIG9mIHRoZSByaWdodC1jbGljayBtZW51IG9mIHRoZSBicm93c2VyICovXHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHQvKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtZW51ICovXHJcblx0XHRcdG1lbnVUcmlnZ2VyWydfZWxlbWVudCddPy5uYXRpdmVFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYHBvc2l0aW9uOiBmaXhlZDsgbGVmdDogJHtldmVudC5jbGllbnRYfXB4OyB0b3A6ICR7ZXZlbnQuY2xpZW50WX1weGApO1xyXG5cclxuXHRcdFx0LyogUGFzcyB0byB0aGUgbWVudSB0aGUgY3VycmVudCBvYmplY3QgKi9cclxuXHRcdFx0bWVudVRyaWdnZXIubWVudURhdGEgPSB7IGl0ZW06IGl0ZW0gfVxyXG5cclxuXHRcdFx0LyogT3BlbiB0aGUgbWVudSAqL1xyXG5cdFx0XHRtZW51VHJpZ2dlci5vcGVuTWVudSgpO1xyXG5cclxuXHRcdFx0LyogSGFuZGxlIGNsaWNrcyBvbiB0aGUgbWVudSBvdmVybGF5ICovXHJcblx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Nkay1vdmVybGF5LWNvbnRhaW5lcicpWzBdPy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChvZmZFdmVudDogYW55KSA9PiB7XHJcblx0XHRcdFx0b2ZmRXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRtZW51VHJpZ2dlciEuY2xvc2VNZW51KCk7XHJcblx0XHRcdH0sIHsgb25jZTogdHJ1ZSB9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhhbmRsZXMgbW9kZWwgY2hhbmdlc1xyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlTW9kZWxDaGFuZ2UoY29sdW1uOiBUYWJsZUNvbHVtbiwgcm93OiBhbnksIGZvcm1Hcm91cD86IEZvcm1Hcm91cCk6IHZvaWQge1xyXG5cdFx0aWYgKHR5cGVvZiBjb2x1bW4/LmV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdGNvbHVtbi5ldmVudChyb3csIGZvcm1Hcm91cCwgY29sdW1uLmV2ZW50QXJncyA/PyB0aGlzLmNvbnRleHQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyBrZXlkb3duIGVudGVyIG9mIDxpbnB1dD4gYW5kIDx2ZC1zZWxlY3Q+XHJcblx0ICogQHBhcmFtICRldmVudCBcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlS2V5ZG93bkVudGVyKCRldmVudDogRXZlbnQpOiBib29sZWFuIHtcclxuXHRcdCgkZXZlbnQ/LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8uYmx1cigpO1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGF0Y2hlcyBhbiBlbnRpdHlcclxuXHQgKiBAcGFyYW0gcm93IFxyXG5cdCAqIEBwYXJhbSBmaWVsZE5hbWUgXHJcblx0ICogQHBhcmFtIHBhdGggXHJcblx0ICovXHJcblx0cHVibGljIHBhdGNoKHJvdzogYW55LCBmaWVsZHM6IEFycmF5PHN0cmluZz4sIHZhbHVlOiBhbnksIGluY2x1ZGVzOiBhbnkpOiB2b2lkIHtcclxuXHRcdC8qIEdldCBlbnRpdHkgYnkgSUQgKi9cclxuXHRcdGxldCBlbnRpdHkgPSB0aGlzLmRhdGFTb3VyY2UuaXRlbXM/LmZpbHRlcigoeDogYW55KSA9PiAoPGFueT54KS5pZCA9PT0gcm93LmlkKVswXTtcclxuXHRcdGlmIChlbnRpdHkpIHtcclxuXHRcdFx0LyogQnVpbGQgcGF0Y2ggbWV0aG9kcyAqL1xyXG5cdFx0XHRsZXQgcGF0Y2hlcyA9IGZpZWxkcy5tYXAoeCA9PiB7IHJldHVybiB7IG9wOiAncmVwbGFjZScsIHBhdGg6IGAvJHt4fWAsIHZhbHVlOiB2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IGVudGl0eVt4XSB9OyB9KTtcclxuXHJcblx0XHRcdC8qIFNlbmQgcmVxdWVzdCAqL1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2Uuc2VydmljZVxyXG5cdFx0XHRcdC5wYXRjaChyb3cuaWQsIHBhdGNoZXMsIG51bGwsIHsgaGVhZGVyczogeyAnU2hvdy1NZXNzYWdlJzogJ1llcycgfSwgcGFyYW1zOiBpbmNsdWRlcyA/IFV0aWxzLnRvSHR0cFBhcmFtcyh7IGluY2x1ZGVzOiBpbmNsdWRlcyB9KSA6IG51bGwgfSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKChfOiBhbnkpID0+IHRoaXMuZGF0YVNvdXJjZS5yZWxvYWQoKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHJvd3MgYmFzZWQgb24gdGhlIHRhYmxlJ3MgbGF0ZXN0IHNldCBvZiBkYXRhLCB3aGljaCB3YXMgZWl0aGVyIHByb3ZpZGVkIGRpcmVjdGx5IGFzIGFuXHJcblx0ICogaW5wdXQgb3IgcmV0cmlldmVkIHRocm91Z2ggYW4gT2JzZXJ2YWJsZSBzdHJlYW0gKGRpcmVjdGx5IG9yIGZyb20gYSBEYXRhU291cmNlKS5cclxuXHQgKiBDaGVja3MgZm9yIGRpZmZlcmVuY2VzIGluIHRoZSBkYXRhIHNpbmNlIHRoZSBsYXN0IGRpZmYgdG8gcGVyZm9ybSBvbmx5IHRoZSBuZWNlc3NhcnlcclxuXHQgKiBjaGFuZ2VzIChhZGQvcmVtb3ZlL21vdmUgcm93cykuXHJcblx0ICovXHJcblx0cHVibGljIHJlbmRlclJvd3MoKTogdm9pZCB7XHJcblx0XHR0aGlzLnRhYmxlPy5yZW5kZXJSb3dzKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIGEgc3RyaW5nIGZ1bmN0aW9uIGV4cHJlc3Npb24uXHJcblx0ICogXHJcblx0ICogVGhpcyBtZXRob2QgcHJvY2Vzc2VzIGFuIGlucHV0IGV4cHJlc3Npb24gdGhhdCBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24uIFxyXG5cdCAqIElmIGl0J3MgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIHByb3ZpZGVkIGl0ZW0gYW5kIGNvbnRleHQuIFxyXG5cdCAqIElmIGl0J3MgYSBzdHJpbmcsIGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMtaXMuXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgZXhwcmVzc2lvbiB0byBoYW5kbGUsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLlxyXG5cdCAqIEBwYXJhbSBpdGVtIC0gVGhlIGl0ZW0gdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gaWYgdGhlIGV4cHJlc3Npb24gaXMgYSBmdW5jdGlvbi5cclxuXHQgKiBAcmV0dXJucyAtIFRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZW0gYW5kIGNvbnRleHQsIG9yIHRoZSBzdHJpbmcgZXhwcmVzc2lvbiBpdHNlbGYuXHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nIHwgRnVuY3Rpb24sIGl0ZW06IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcblx0XHQvKiBDaGVjayBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzeSAoZS5nLiwgbnVsbCwgdW5kZWZpbmVkLCBvciBlbXB0eSkgKi9cclxuXHRcdGlmICghZXhwcmVzc2lvbikge1xyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIElmIHRoZSBleHByZXNzaW9uIGlzIGEgZnVuY3Rpb24sIGNhbGwgaXQgd2l0aCB0aGUgaXRlbSBhbmQgY29udGV4dCAqL1xyXG5cdFx0aWYgKHR5cGVvZiBleHByZXNzaW9uID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdHJldHVybiBleHByZXNzaW9uKGl0ZW0sIHRoaXMuY29udGV4dCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogSWYgdGhlIGV4cHJlc3Npb24gaXMgbm90IGEgZnVuY3Rpb24sIGFzc3VtZSBpdCdzIGEgc3RyaW5nIGFuZCByZXR1cm4gaXQgKi9cclxuXHRcdHJldHVybiBleHByZXNzaW9uO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBpbiBhbiBvYmplY3QgYmFzZWQgb24gYSBkb3Qtc2VwYXJhdGVkIHBhdGguXHJcblx0ICogQHBhcmFtIHJvdyAtIFRoZSBvYmplY3QgaW4gd2hpY2ggdGhlIHByb3BlcnR5IGlzIGJlaW5nIHNldC5cclxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIC0gQSBkb3Qtc2VwYXJhdGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIG5lc3RlZCBwcm9wZXJ0eS5cclxuXHQgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgbmVzdGVkIHByb3BlcnR5LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZXROZXN0ZWRQcm9wZXJ0eShyb3c6IGFueSwgcHJvcGVydHlQYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuXHRcdC8qIFNwbGl0IHRoZSBwcm9wZXJ0eVBhdGggaW50byBhbiBhcnJheSBvZiBrZXlzICovXHJcblx0XHRjb25zdCBrZXlzID0gcHJvcGVydHlQYXRoLnNwbGl0KCcuJyk7XHJcblxyXG5cdFx0LyogVXNlIHNsaWNlIHRvIGdldCBhbGwga2V5cyBleGNlcHQgdGhlIGxhc3Qgb25lIGFuZCByZWR1Y2UgdG8gdHJhdmVyc2UgdG8gdGhlIHNlY29uZC10by1sYXN0IGxldmVsICovXHJcblx0XHRrZXlzLnNsaWNlKDAsIC0xKS5yZWR1Y2UoKGFjYywga2V5KSA9PiBhY2MgJiYgYWNjW2tleV0sIHJvdylba2V5c1trZXlzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyByb3cgY2xhc3Nlc1xyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0Um93Q2xhc3Nlcyhjb2x1bW46IFRhYmxlQ29sdW1uLCByb3c6IGFueSk6IGFueSB7XHJcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdCdndC14cyc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWHMsXHJcblx0XHRcdCdndC1zbSc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuU20sXHJcblx0XHRcdCdndC1tZCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTWQsXHJcblx0XHRcdCdndC1sZyc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTGcsXHJcblx0XHRcdCdndC14bCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWGwsXHJcblx0XHRcdCdndC14eGwnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlh4bCxcclxuXHRcdFx0J2hpZGRlbic6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTm9uZSxcclxuXHRcdFx0J3RleHQtcmlnaHQnOiBjb2x1bW4uYXJyb3dCZWZvcmVcclxuXHRcdH0sIGNvbHVtbi5jZWxsTmdDbGFzcyA/IGNvbHVtbi5jZWxsTmdDbGFzcyhyb3csIHRoaXMuY29udGV4dCkgOiB7fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMb2cgdG8gY29uc29sZVxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlIFxyXG5cdCAqIEBwYXJhbSBvcHRpb25hbFBhcmFtcyBcclxuXHQgKi9cclxuXHRwdWJsaWMgbG9nKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSB7XHJcblx0XHRjb25zb2xlLmxvZyhtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XHJcblx0fVxyXG5cclxuXHQvKiBcclxuXHQgKiBUZXJtaW5hdGVzIHRoZSBkcmFnZ2luZyBhY3Rpb24gYnkgcmVzZXR0aW5nIHRoZSBgaXNEcmFnZ2luZ2AgZmxhZyBhZnRlciBhIGJyaWVmIGRlbGF5LlxyXG5cdCAqIElmIHRoZSBgc2Nyb2xsQ29udGFpbmVyYCBpcyBkZWZpbmVkLCBpdCBhbHNvIHJlbW92ZXMgdGhlICdncmFiYmluZycgY2xhc3MgXHJcblx0ICogZnJvbSB0aGUgY29udGFpbmVyIGVsZW1lbnQsIHdoaWNoIHJldmVydHMgdGhlIGN1cnNvciBiYWNrIHRvIGl0cyBkZWZhdWx0IHN0YXRlLlxyXG5cdCAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2aXN1YWwgZmVlZGJhY2sgKGdyYWJiaW5nIGN1cnNvcikgaXMgb25seSBhY3RpdmUgZHVyaW5nIFxyXG5cdCAqIHRoZSBkcmFnIG9wZXJhdGlvbiBhbmQgaXMgcHJvcGVybHkgcmVtb3ZlZCB3aGVuIHRoZSB1c2VyIHN0b3BzIGludGVyYWN0aW5nLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RvcERyYWdnaW5nKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblx0XHQvKiBSZXNldCBkcmFnZ2luZyBzdGF0ZSB0byBzdG9wIHRoZSBzY3JvbGwgaW50ZXJhY3Rpb24gKi9cclxuXHRcdHRoaXMuc3RhcnREcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qIFxyXG5cdFx0ICogSW50cm9kdWNlIGEgc2xpZ2h0IGRlbGF5IGJlZm9yZSByZXNldHRpbmcgdGhlIGRyYWdnaW5nIHN0YXRlLlxyXG5cdFx0ICogVGhpcyBhbGxvd3MgZm9yIHNtb290aGVyIHRyYW5zaXRpb25zIGFuZCBlbnN1cmVzIHRoYXQgYW55IGZpbmFsIHNjcm9sbCBhZGp1c3RtZW50c1xyXG5cdFx0ICogYXJlIGFwcGxpZWQgYmVmb3JlIG1hcmtpbmcgdGhlIGRyYWdnaW5nIG9wZXJhdGlvbiBhcyBjb21wbGV0ZS5cclxuXHRcdCAqL1xyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdC8qIFJlc2V0IGRyYWdnaW5nIHN0YXRlIHRvIHN0b3AgdGhlIHNjcm9sbCBpbnRlcmFjdGlvbiAqL1xyXG5cdFx0XHR0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRcdC8qIFJlc3RvcmUgdGhlIGRlZmF1bHQgY3Vyc29yICovXHJcblx0XHRcdGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcikge1xyXG5cdFx0XHRcdHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZ3JhYmJpbmcnKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgMjAwKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuXHQgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY29tcGxldGVkIG9uZSBjaGFuZ2UtY2hlY2sgY3ljbGVcclxuXHQgKiBmb3IgYSBjb21wb25lbnQncyB2aWV3LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcblx0XHR0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuXHR9XHJcbn0iLCI8ZGl2IGNsYXNzPVwibG9hZGluZy1wcm9ncmVzc1wiICpuZ0lmPVwiIXN0YXRpY1wiPlxyXG5cdDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgKm5nSWY9XCJkYXRhU291cmNlPy5pc0xvYWRpbmdcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSAjcmVnaW9uIERhdGEgdGFibGUgLS0+XHJcbjxkaXYgY2xhc3M9XCJtYXQtdGFibGUtY29udGFpbmVyIHNjcm9sbGJhci1zZWNvbmRhcnlcIiBbbmdDbGFzc109XCJ7J21hdC10YWJsZS1zdGlja3knOiBzdGlja3l9XCIgI3Njcm9sbENvbnRhaW5lcj5cclxuXHQ8dGFibGUgbWF0LXRhYmxlICN0YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW2RhdGFTb3VyY2VGaWx0ZXJdPVwiZGF0YVNvdXJjZUZpbHRlclwiIFtuZ0NsYXNzXT1cInsndGFibGUtZml4ZWQnOiAhc3RpY2t5ICYmICFkZXRhaWxzVGVtcGxhdGUgJiYgIXRlbXBsYXRlUmVmLCAndGFibGUtc3RpY2snOiBzdGlja3l9XCIgW3RyYWNrQnldPVwidHJhY2tCeVwiIG1hdFNvcnQgbWF0U29ydERpc2FibGVDbGVhciBbbWF0U29ydEFjdGl2ZV09XCJzb3J0QWN0aXZlfHwnaWQnXCIgW21hdFNvcnREaXJlY3Rpb25dPVwic29ydERpcmVjdGlvblwiIG11bHRpVGVtcGxhdGVEYXRhUm93cz5cclxuXHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jOyB0cmFja0J5OmNvbHVtbnNUcmFja0J5XCI+XHJcblx0XHRcdDwhLS0gI3JlZ2lvbiBDb2x1bW4gZGVmIC0tPlxyXG5cdFx0XHQ8bmctY29udGFpbmVyIFtjZGtDb2x1bW5EZWZdPVwiY29sdW1uLm5hbWVcIiBbc3RpY2t5XT1cImNvbHVtbi5zdGlja3lcIiBbc3RpY2t5RW5kXT1cImNvbHVtbi5zdGlja3lFbmRcIj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgI2hlYWRlciBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJcIiBsZXQtaGVhZGVyVGV4dD1cImhlYWRlclRleHRcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2hlYWRlclRleHQ6IGNvbHVtbi5oZWFkZXIgfCBmdW5jOmNvbnRleHR9XCI+XHJcblx0XHRcdFx0XHQ8dGggbWF0LWhlYWRlci1jZWxsICpjZGtIZWFkZXJDZWxsRGVmIFttYXQtc29ydC1oZWFkZXJdPVwiY29sdW1uLnNvcnRCeSB8fCBjb2x1bW4ubmFtZVwiIFtoaWRkZW5dPVwiY29sdW1uLmhpZGRlblwiIFtuZ1N0eWxlXT1cInttYXhXaWR0aDpjb2x1bW4ubWF4V2lkdGg/KGNvbHVtbi5tYXhXaWR0aCsoY29sdW1uLm1heFdpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCxtaW5XaWR0aDpjb2x1bW4ubWluV2lkdGg/KGNvbHVtbi5taW5XaWR0aCsoY29sdW1uLm1pbldpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCx3aWR0aDpjb2x1bW4ud2lkdGg/KGNvbHVtbi53aWR0aCsoY29sdW1uLndpZHRoVW5pdCB8fCAncHgnKSk6bnVsbH1cIiBbZGlzYWJsZWRdPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5DaGVja2JveCB8fCBjb2x1bW4uZGlzYWJsZWRcIiBbbmdDbGFzc109XCJ7J2d0LXhzJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YcywgJ2d0LXNtJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5TbSwgJ2d0LW1kJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5NZCwgJ2d0LWxnJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5MZywgJ2d0LXhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YbCwgJ2d0LXh4bCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWHhsLCAnaGlkZGVuJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5Ob25lfVwiIFthcnJvd1Bvc2l0aW9uXT1cImNvbHVtbi5hcnJvd0JlZm9yZT8nYmVmb3JlJzonYWZ0ZXInXCI+XHJcblx0XHRcdFx0XHRcdDxtYXQtY2hlY2tib3ggKm5nSWY9XCJjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLkNoZWNrYm94XCIgKGNoYW5nZSk9XCIkZXZlbnQgPyBkYXRhU291cmNlLnRvZ2dsZVNlbGVjdCgkZXZlbnQsIHNlbGVjdEFsbEZpbHRlcikgOiBudWxsXCIgW2Rpc2FibGVkXT1cIiFkYXRhU291cmNlLnBhZ2luYXRvcj8ubGVuZ3RoXCIgW2NoZWNrZWRdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5oYXNWYWx1ZSgpICYmIGRhdGFTb3VyY2UuaXNBbGxTZWxlY3RlZCgpXCIgW2luZGV0ZXJtaW5hdGVdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5oYXNWYWx1ZSgpICYmICFkYXRhU291cmNlLmlzQWxsU2VsZWN0ZWQoKVwiPjwvbWF0LWNoZWNrYm94PlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlICE9IENvbHVtblR5cGUuQ2hlY2tib3hcIiBbbWF0VG9vbHRpcF09XCJoZWFkZXJUZXh0XCI+e3toZWFkZXJUZXh0fX08L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3RoPlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PHRkIG1hdC1jZWxsICpjZGtDZWxsRGVmPVwibGV0IHJvdzsgbGV0IHJvd0luZGV4ID0gZGF0YUluZGV4XCIgW21hdFRvb2x0aXBdPVwiY29sdW1uLnRvb2x0aXA/Y29sdW1uLnRvb2x0aXAocm93LCB1bmRlZmluZWQsIGNvbnRleHQpOm51bGxcIiBbbWF0VG9vbHRpcENsYXNzXT1cImNvbHVtbi50b29sdGlwQ2xhc3M/PycnXCIgW2hpZGRlbl09XCJjb2x1bW4uaGlkZGVuXCIgW25nQ2xhc3NdPVwiZ2V0Um93Q2xhc3Nlcyhjb2x1bW4sIHJvdylcIiBbbmdTdHlsZV09XCJ7bWF4V2lkdGg6Y29sdW1uLm1heFdpZHRoPyhjb2x1bW4ubWF4V2lkdGgrKGNvbHVtbi5tYXhXaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsbWluV2lkdGg6Y29sdW1uLm1pbldpZHRoPyhjb2x1bW4ubWluV2lkdGgrKGNvbHVtbi5taW5XaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsd2lkdGg6Y29sdW1uLndpZHRoPyhjb2x1bW4ud2lkdGgrKGNvbHVtbi53aWR0aFVuaXQgfHwgJ3B4JykpOm51bGx9XCI+XHJcblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI3Jvd1ZhbCBbbmdUZW1wbGF0ZU91dGxldF09XCJyb3dWYWxcIiBsZXQtcm93VmFsdWUgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNvbHVtbj8uY29udGVudCAmJiBjb2x1bW4/LmNvbnRlbnQocm93LCB1bmRlZmluZWQsIGNvbnRleHQpfVwiPlxyXG5cdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4udHlwZVwiPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBDaGVja2JveCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1jaGVja2JveCAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5DaGVja2JveFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIiRldmVudCA/IGRhdGFTb3VyY2Uuc2VsZWN0aW9uTW9kZWwudG9nZ2xlKHJvdykgOiBudWxsXCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KSkpXCIgW2NoZWNrZWRdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvdylcIj48L21hdC1jaGVja2JveD5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBFbnVtIGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5FbnVtXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmVudW1NZXRhZGF0YTsgZWxzZSBub0VudW1NZXRhZGF0YVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm11bHRpcGxlOyBlbHNlIGVsc2VUZW1wbGF0ZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93VmFsdWU7IGxldCBpID0gaW5kZXhcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpIDwgMlwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgbGV0LWRpc3BsYXlWYWx1ZT1cImRpc3BsYXlWYWx1ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZGlzcGxheVZhbHVlOiBjb2x1bW4uZW51bU1ldGFkYXRhW2l0ZW1dLmRpc3BsYXkgfVwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNtYWxsICpuZ0lmPVwiaSA9PT0gMSAmJiByb3dWYWx1ZT8ubGVuZ3RoID4gMlwiIFttYXRUb29sdGlwXT1cIihyb3dWYWx1ZSB8IHNsaWNlOjIgfCBtYXA6Y29sdW1uLmVudW1NZXRhZGF0YSB8IG1hcDonZGlzcGxheScpIHwgam9pbjonXFxuJ1wiIG1hdFRvb2x0aXBDbGFzcz1cIm1hdC10b29sdGlwLW11bHRpbGluZVwiPi4uLjwvc21hbGw+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBsZXQtZGlzcGxheVZhbHVlPVwiZGlzcGxheVZhbHVlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bWF0LWNoaXAtcm93IGRpc2FibGVSaXBwbGU9XCJ0cnVlXCIgc2VsZWN0YWJsZT1cImZhbHNlXCIgW21hdFRvb2x0aXBdPVwiZGlzcGxheVZhbHVlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPnt7IGRpc3BsYXlWYWx1ZSB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvbWF0LWNoaXAtcm93PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI2Vsc2VUZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cInJvd1ZhbHVlID49IDBcIiBjbGFzcz1cIm5hXCIgW2lubmVySHRtbF09XCIoY29sdW1uLmVudW1NZXRhZGF0YVtyb3dWYWx1ZV18fHt9KS5kaXNwbGF5XCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI25vRW51bU1ldGFkYXRhPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm11bHRpcGxlOyBlbHNlIGVsc2VUZW1wbGF0ZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93VmFsdWU7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNtYWxsICpuZ0lmPVwiaTwyXCIgaTE4bj1cIkBAc2VsZWN0aW9uXCI+e2l0ZW0gfCBlbnVtOmNvbHVtbi5lbnVtVHlwZTpjb2x1bW4uZW51bVByZWZpeCwgc2VsZWN0LCB0eXBlIHt0eXBlfSBvdGhlciB7e3tpdGVtIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXh9fX19PC9zbWFsbD48c21hbGwgKm5nSWY9XCJpPT0xICYmIHJvd1ZhbHVlPy5sZW5ndGggPiAyXCI+LCAuLi48L3NtYWxsPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNlbHNlVGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJyb3dWYWx1ZSA+PSAwXCIgaTE4bj1cIkBAc2VsZWN0aW9uXCI+e3Jvd1ZhbHVlIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXgsIHNlbGVjdCwgdHlwZSB7dHlwZX0gb3RoZXIge3t7cm93VmFsdWUgfCBlbnVtOmNvbHVtbi5lbnVtVHlwZTpjb2x1bW4uZW51bVByZWZpeH19fX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjcmVjdXJzaXZlQ29udGFpbmVyIGxldC1jb2x1bW5OYW1lU2VnbWVudHM9XCJzZWdtZW50c1wiIGxldC1mb3JtR3JvdXA9XCJmb3JtR3JvdXBcIiBsZXQtcGFyZW50Rm9ybUdyb3VwPVwicGFyZW50Rm9ybUdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUdyb3VwXCIgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBJZiB0aGUgY29sdW1uTmFtZVNlZ21lbnRzIGFycmF5IGlzIGVtcHR5LCB3ZSdyZSBhdCB0aGUgbGVhZiBub2RlIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbk5hbWVTZWdtZW50cy5sZW5ndGg7IGVsc2Ugbm90TGFzdFNlZ21lbnRcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVG9nZ2xlIGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLlRvZ2dsZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG1hdC1zbGlkZS10b2dnbGUgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCIgKGNoYW5nZSk9XCJjb2x1bW4uY2hhbmdlP2NvbHVtbi5jaGFuZ2UocGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBwYXJlbnRGb3JtR3JvdXAsIGNvbnRleHQpOmhhbmRsZU1vZGVsQ2hhbmdlKGNvbHVtbiwgcGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBwYXJlbnRGb3JtR3JvdXApXCIgW2Rpc2FibGVDb250cm9sXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KSkpXCIgY29sb3I9XCJhY2NlbnRcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVGV4dCBJbnB1dCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLlRleHRJbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiIGRlbnNlLTMgbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwiY2VudGVyIHN0YXJ0XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwXCIgdHlwZT1cInt7Y29sdW1uLmlucHV0VHlwZX19XCIgYXV0b2NvbXBsZXRlPVwibm9uZVwiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCkpKVwiIFttaW5dPVwiY29sdW1uLmlucHV0TWluP2NvbHVtbi5pbnB1dE1pbihwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCk6bnVsbFwiIFttYXhdPVwiY29sdW1uLmlucHV0TWF4P2NvbHVtbi5pbnB1dE1heChwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCk6bnVsbFwiIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQpXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBWRC1TZWxlY3QgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5TZWxlY3RcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBkZW5zZS0zIGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cImNlbnRlciBzdGFydFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8dmQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXBcIiBbZW51bV09XCJjb2x1bW4uZW51bVR5cGVcIiBbZW51bU1ldGFkYXRhXT1cImNvbHVtbi5lbnVtTWV0YWRhdGFcIiBbZW51bUZpbHRlcl09XCJjb2x1bW4uZW51bUZpbHRlciB8IGZ1bmM6cGFyZW50Rm9ybUdyb3VwLnZhbHVlOmNvbnRleHRcIiBbcHJlZml4XT1cImNvbHVtbi5lbnVtUHJlZml4XCIgW29wdGlvbnNdPVwiY29sdW1uLm9wdGlvbnNcIiBbZGVmYXVsdE9wdGlvbl09XCJjb2x1bW4uZGVmYXVsdE9wdGlvbj8/dHJ1ZVwiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCkpKVwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiY29sdW1uLmNoYW5nZT9jb2x1bW4uY2hhbmdlKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KTpwYXRjaChwYXJlbnRGb3JtR3JvdXAudmFsdWUsIFtjb2x1bW4ubmFtZV0sIHJvd1ZhbHVlLCBjb2x1bW4ucGF0Y2hJbmNsdWRlcylcIiAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVLZXlkb3duRW50ZXIoJGV2ZW50KVwiPjwvdmQtc2VsZWN0PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub3RMYXN0U2VnbWVudD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIElmIG5vdCB0aGUgbGFzdCBzZWdtZW50LCBjcmVhdGUgYSBuZXN0ZWQgZm9ybSBncm91cCAtLT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtmb3JtR3JvdXBOYW1lXT1cImNvbHVtbk5hbWVTZWdtZW50c1swXVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBSZWN1cnNpdmUgY2FsbCB0byBoYW5kbGUgbmVzdGVkIHNlZ21lbnRzIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZWN1cnNpdmVDb250YWluZXJcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3NlZ21lbnRzOiBjb2x1bW5OYW1lU2VnbWVudHMuc2xpY2UoMSksIHBhcmVudEZvcm1Hcm91cDpmb3JtR3JvdXAsIGZvcm1Hcm91cDogZm9ybUdyb3VwLmdldChjb2x1bW5OYW1lU2VnbWVudHNbMF0pfVwiPjwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRvZ2dsZSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5Ub2dnbGVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9ybUFycmF5XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxtYXQtc2xpZGUtdG9nZ2xlIFtuZ01vZGVsXT1cInJvdyB8IHByb3BlcnR5OmNvbHVtbi5uYW1lXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2V0TmVzdGVkUHJvcGVydHkocm93LCBjb2x1bW4ubmFtZSwgJGV2ZW50KTtoYW5kbGVNb2RlbENoYW5nZShjb2x1bW4sIHJvdywgdW5kZWZpbmVkKTtcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiIFtkaXNhYmxlZF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCkpKVwiIGNvbG9yPVwiYWNjZW50XCI+PC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUFycmF5XCIgW2Zvcm1Hcm91cF09XCIkYW55KGZvcm1BcnJheS5jb250cm9scylbcm93SW5kZXhdIHwgZm9ybUdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicmVjdXJzaXZlQ29udGFpbmVyXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzZWdtZW50czogY29sdW1uLm5hbWUuc3BsaXQoJy4nKSwgZm9ybUdyb3VwOiBmb3JtQXJyYXkuY29udHJvbHNbcm93SW5kZXhdfVwiPjwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gRGF0ZSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuRGF0ZVwiPnt7cm93VmFsdWUgfCBkYXRlOmNvbHVtbi5zaG9ydERhdGU/J2RkLk1NLnl5eXknOidkZC5NTS55eXl5IEhIOm1tOnNzJ319PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRleHQgSW5wdXQgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuVGV4dElucHV0XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhZm9ybUFycmF5XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJjZW50ZXIgc3RhcnRcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCIgZGVuc2UtMyAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgbWF0SW5wdXQgKm5nSWY9XCIhZm9ybUFycmF5XCIgdHlwZT1cInt7Y29sdW1uLmlucHV0VHlwZX19XCIgYXV0b2NvbXBsZXRlPVwibm9uZVwiIG5hbWU9XCJ7e2NvbHVtbi5uYW1lfX17e3Jvd0luZGV4fX1cIiBbbmdNb2RlbF09XCJyb3cgfCBwcm9wZXJ0eTpjb2x1bW4ubmFtZVwiIFtkaXNhYmxlZF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCkpKVwiIFttaW5dPVwiY29sdW1uLmlucHV0TWluP2NvbHVtbi5pbnB1dE1pbihyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6bnVsbFwiIFttYXhdPVwiY29sdW1uLmlucHV0TWF4P2NvbHVtbi5pbnB1dE1heChyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6bnVsbFwiIChuZ01vZGVsQ2hhbmdlKT1cInNldE5lc3RlZFByb3BlcnR5KHJvdywgY29sdW1uLm5hbWUsICRldmVudCk7KGNvbHVtbi5jaGFuZ2U/Y29sdW1uLmNoYW5nZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6cGF0Y2gocm93LCBbY29sdW1uLm5hbWVdLCAkZXZlbnQsIGNvbHVtbi5wYXRjaEluY2x1ZGVzKSk7XCIgW25nTW9kZWxPcHRpb25zXT1cInt1cGRhdGVPbjogJ2JsdXInfVwiIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQpXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1BcnJheVwiIFtmb3JtR3JvdXBdPVwiJGFueShmb3JtQXJyYXkuY29udHJvbHMpW3Jvd0luZGV4XSB8IGZvcm1Hcm91cFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJlY3Vyc2l2ZUNvbnRhaW5lclwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7c2VnbWVudHM6IGNvbHVtbi5uYW1lLnNwbGl0KCcuJyksIGZvcm1Hcm91cDogZm9ybUFycmF5LmNvbnRyb2xzW3Jvd0luZGV4XX1cIj48L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFZELVNlbGVjdCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5TZWxlY3RcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIiFmb3JtQXJyYXlcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cImNlbnRlciBzdGFydFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBkZW5zZS0zIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDx2ZC1zZWxlY3QgKm5nSWY9XCIhZm9ybUFycmF5XCIgbmFtZT1cInt7Y29sdW1uLm5hbWV9fXt7cm93SW5kZXh9fVwiIFtlbnVtXT1cImNvbHVtbi5lbnVtVHlwZVwiIFtlbnVtTWV0YWRhdGFdPVwiY29sdW1uLmVudW1NZXRhZGF0YVwiIFtlbnVtRmlsdGVyXT1cImNvbHVtbj8uZW51bUZpbHRlciAgfCBmdW5jOnJvdzpjb250ZXh0XCIgW3ByZWZpeF09XCJjb2x1bW4uZW51bVByZWZpeFwiIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zXCIgW2RlZmF1bHRPcHRpb25dPVwiY29sdW1uLmRlZmF1bHRPcHRpb24/P3RydWVcIiBbbmdNb2RlbF09XCJyb3cgfCBwcm9wZXJ0eTpjb2x1bW4ubmFtZVwiIChuZ01vZGVsQ2hhbmdlKT1cInNldE5lc3RlZFByb3BlcnR5KHJvdywgY29sdW1uLm5hbWUsICRldmVudCk7XCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KSkpXCIgKGNoYW5nZSk9XCJjb2x1bW4uY2hhbmdlP2NvbHVtbi5jaGFuZ2Uocm93LCB1bmRlZmluZWQsIGNvbnRleHQpOnBhdGNoKHJvdywgW2NvbHVtbi5uYW1lXSwgJGV2ZW50LnZhbHVlLCBjb2x1bW4ucGF0Y2hJbmNsdWRlcylcIiAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVLZXlkb3duRW50ZXIoJGV2ZW50KVwiPjwvdmQtc2VsZWN0PlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtQXJyYXlcIiBbZm9ybUdyb3VwXT1cIiRhbnkoZm9ybUFycmF5LmNvbnRyb2xzKVtyb3dJbmRleF0gfCBmb3JtR3JvdXBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZWN1cnNpdmVDb250YWluZXJcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3NlZ21lbnRzOiBjb2x1bW4ubmFtZS5zcGxpdCgnLicpLCBmb3JtR3JvdXA6IGZvcm1BcnJheS5jb250cm9sc1tyb3dJbmRleF19XCI+PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBBY3Rpb24gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5BY3Rpb25cIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ubWVudVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwibWVudS17e3Jvdy5pZH19XCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47IHBvc2l0aW9uOiBmaXhlZDtcIiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudS5tYXRNZW51IVwiICpuZ0lmPVwibWVudT8ubWF0TWVudSAmJiAhcm93LmxvY2tlZCAmJiBoYXNWaXNpYmxlUm93TWVudUl0ZW1zKHJvdywgY29sdW1uKVwiPjwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8dmQtZHluYW1pYy1tZW51IFtpdGVtc109XCJbY29sdW1uLm1lbnVdXCIgW2RhdGFdPVwicm93XCIgW2NvbnRleHRdPVwiY29udGV4dFwiICNtZW51PjwvdmQtZHluYW1pYy1tZW51PlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gTWVudSAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm1lbnVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx2ZC1keW5hbWljLW1lbnUgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuTWVudVwiIFtpdGVtc109XCJbY29sdW1uLm1lbnVdXCIgW2RhdGFdPVwicm93XCIgW2NvbnRleHRdPVwiY29udGV4dFwiPjwvdmQtZHluYW1pYy1tZW51PlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIGljb24gLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuSWNvblwiIGxheW91dD1cInJvd1wiIGxheW91dC1hbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/Lm1hdEljb25cIiBmb250U2V0PVwie3tjb2x1bW4uaWNvbj8uZm9udFNldCB8fCAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCd9fVwiIFtjbGFzc109XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5jc3NDbGFzcz8/JycsIHJvdylcIj57e2hhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb24/Lm1hdEljb24hLCByb3cpfX08L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/LnN2Z0ljb25cIiBmb250U2V0PVwie3tjb2x1bW4uaWNvbj8uZm9udFNldCB8fCAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCd9fVwiIFtjbGFzc109XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5jc3NDbGFzcz8/JycsIHJvdylcIiBbc3ZnSWNvbl09XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5zdmdJY29uISwgcm93KSFcIj48L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/LmZvbnRJY29uXCIgZm9udFNldD1cInt7Y29sdW1uLmljb24/LmZvbnRTZXQgfHwgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQnfX1cIiBbY2xhc3NdPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbj8uY3NzQ2xhc3M/PycnLCByb3cpXCIgW2ZvbnRJY29uXT1cImhhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb24/LmZvbnRJY29uISwgcm93KSFcIj48L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBpY29uIGJ1dHRvbiAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8YSBtYXQtaWNvbi1idXR0b24gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuSWNvbkJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Y29sdW1uLmljb25CdXR0b24/LmV2ZW50P2NvbHVtbi5pY29uQnV0dG9uPy5ldmVudChyb3csIGNvbnRleHQpOm51bGxcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxtYXQtaWNvbiBmb250U2V0PVwie3tjb2x1bW4uaWNvbkJ1dHRvbj8uaWNvbkZvbnRTZXQgfHwgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQnfX1cIiBbY2xhc3NdPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbkJ1dHRvbj8uaWNvbkNsYXNzPz8nJywgcm93KVwiPnt7aGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbkJ1dHRvbj8uaWNvbj8/J3JhZGlvX2J1dHRvbl9jaGVja2VkJywgcm93KSB8fCAncmFkaW9fYnV0dG9uX2NoZWNrZWQnfX08L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdDwvYT5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBPdGhlciBjb2x1bW4gdHlwZXMgLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoRGVmYXVsdCBbaW5uZXJIdG1sXT1cInJvd1ZhbHVlPz8nJ1wiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIEZpbHRlciByb3cgLS0+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVNvdXJjZSAmJiBmaWx0ZXJhYmxlXCI+XHJcblx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jXCI+XHJcblx0XHRcdFx0PG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJmaWx0ZXIue3tjb2x1bW4uZmlsdGVyIHx8IGNvbHVtbi5uYW1lfX1cIiBbc3RpY2t5XT1cImNvbHVtbi5zdGlja3lcIiBbc3RpY2t5RW5kXT1cImNvbHVtbi5zdGlja3lFbmRcIj5cclxuXHRcdFx0XHRcdDx0aCBtYXQtaGVhZGVyLWNlbGwgKmNka0hlYWRlckNlbGxEZWYgW2hpZGRlbl09XCJjb2x1bW4uaGlkZGVuXCIgW25nU3R5bGVdPVwie21heFdpZHRoOmNvbHVtbi5tYXhXaWR0aD8oY29sdW1uLm1heFdpZHRoKyhjb2x1bW4ubWF4V2lkdGhVbml0IHx8ICdweCcpKTpudWxsLG1pbldpZHRoOmNvbHVtbi5taW5XaWR0aD8oY29sdW1uLm1pbldpZHRoKyhjb2x1bW4ubWluV2lkdGhVbml0IHx8ICdweCcpKTpudWxsLHdpZHRoOmNvbHVtbi53aWR0aD8oY29sdW1uLndpZHRoKyhjb2x1bW4ud2lkdGhVbml0IHx8ICdweCcpKTpudWxsfVwiIFtuZ0NsYXNzXT1cInsnZ3QteHMnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhzLCAnZ3Qtc20nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlNtLCAnZ3QtbWQnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk1kLCAnZ3QtbGcnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLkxnLCAnZ3QteGwnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhsLCAnZ3QteHhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YeGwsICdoaWRkZW4nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk5vbmV9XCI+XHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBTZWxlY3QgZmlsdGVyIC0tPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cIihjb2x1bW4uZW5kcG9pbnQgfHwgY29sdW1uLmVudW1UeXBlIHx8IGNvbHVtbi5vcHRpb25zKSBlbHNlIG5vdFNlbGVjdEZpbHRlclwiIGZpbHRlci1zZWxlY3QgW2VuZHBvaW50XT1cImNvbHVtbi5lbmRwb2ludFwiIFtlbnVtXT1cImNvbHVtbi5lbnVtVHlwZVwiIFtlbnVtTWV0YWRhdGFdPVwiY29sdW1uLmVudW1NZXRhZGF0YVwiIFtlbnVtRmlsdGVyXT1cImNvbHVtbi5lbnVtRmlsdGVyIHwgZnVuYzp7fTpjb250ZXh0XCIgW3ByZWZpeF09XCJjb2x1bW4uZW51bVByZWZpeFwiIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zXCIgW3RleHRdPVwiY29sdW1uLmZpbHRlck9wdGlvblRleHQgfHwgJ25hbWUnXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVGV4dCBmaWx0ZXIgLS0+XHJcblx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjbm90U2VsZWN0RmlsdGVyPlxyXG5cdFx0XHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwibm90U2VsZWN0RmlsdGVyICYmIChjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLlRleHQgfHwgY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5UZXh0SW5wdXQgfHwgY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5OdW1iZXIpIGVsc2Ugbm90SW5wdXRGaWx0ZXJcIiBmaWx0ZXItaW5wdXQgW29ubHlOdW1iZXJdPVwiY29sdW1uLmZpbHRlcklucHV0TnVtYmVyPz9mYWxzZVwiIFtvcGVyYXRvcl09XCIhdXNlRmlsdGVyT3BlcmF0b3IgPyB1bmRlZmluZWQgOiBjb2x1bW4uZmlsdGVyT3BlcmF0b3JcIj48L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBEYXRlIGZpbHRlciAtLT5cclxuXHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub3RJbnB1dEZpbHRlcj5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuRGF0ZSBlbHNlIG5vdERhdGVGaWx0ZXJcIiBmaWx0ZXItZGF0ZT48L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBBY3Rpb24gZmlsdGVyIChjbGVhcikgLS0+XHJcblx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjbm90RGF0ZUZpbHRlcj5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuQWN0aW9uXCIgZmlsdGVyLWNsZWFyPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdFx0PC90aD5cclxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHQ8IS0tICNyZWdpb24gRGV0YWlscyBjb2x1bW4gLS0+XHJcblx0XHQ8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImV4cGFuZGVkRGV0YWlsXCI+XHJcblx0XHRcdDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7IGxldCBpbmRleCA9IGluZGV4XCIgW2F0dHIuY29sc3Bhbl09XCIoZGlzcGxheWVkQ29sdW1ucyQgfCBhc3luYyk/Lmxlbmd0aFwiPlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJyb3ctZGV0YWlsXCIgW0BkZXRhaWxFeHBhbmRdPVwicm93ID09IGV4cGFuZGVkUm93ID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCIgI2RldGFpbHNUZW1wbGF0ZT5cclxuXHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJ0ZW1wbGF0ZVJlZiAmJiByb3cgPT09IGV4cGFuZGVkUm93XCI+XHJcblx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVJlZjsgY29udGV4dDp7cm93OiByb3csIGluZGV4OiBpbmRleCwgY29udGV4dDogY29udGV4dH1cIj48L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8L3RkPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIEZpbHRlciBoZWFkZXIgLS0+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyYWJsZVwiPlxyXG5cdFx0XHQ8dHIgbWF0LWhlYWRlci1yb3cgKmNka0hlYWRlclJvd0RlZj1cImRpc3BsYXllZEZpbHRlckNvbHVtbnMkIHwgYXN5bmNcIj48L3RyPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0PHRyIG1hdC1oZWFkZXItcm93ICpjZGtIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zJCB8IGFzeW5jOyBzdGlja3k6IHN0aWNreUZpbHRlclwiPjwvdHI+XHJcblx0XHQ8dHIgbWF0LXJvdyAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyQgfCBhc3luYzsgbGV0IGluZGV4ID0gZGF0YUluZGV4XCIgW25nQ2xhc3NdPVwicm93TmdDbGFzcz9yb3dOZ0NsYXNzKHJvdywgY29udGV4dCk6bnVsbFwiIFtjbGFzcy5leHBhbmRlZC1yb3ddPVwiZXhwYW5kZWRSb3cgPT09IHJvd1wiIChjbGljayk9XCJoYW5kbGVSb3dDbGljayhpbmRleCwgcm93KVwiIChjb250ZXh0bWVudSk9XCJoYW5kbGVSb3dSaWdodENsaWNrKCRldmVudCwgcm93KVwiPjwvdHI+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIERldHJhaWxzIHJvdyAtLT5cclxuXHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXRhaWxzVGVtcGxhdGUgfHwgdGVtcGxhdGVSZWZcIj5cclxuXHRcdFx0PHRyIG1hdC1yb3cgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWREZXRhaWwnXVwiIGNsYXNzPVwiZGV0YWlsLXJvd1wiIFtuZ0NsYXNzXT1cInJvd05nQ2xhc3M/cm93TmdDbGFzcyhyb3csIGNvbnRleHQpOm51bGxcIj48L3RyPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0PC90YWJsZT5cclxuPC9kaXY+XHJcbjwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbjwhLS0gI3JlZ2lvbiBSb3cgc2hvd24gd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBkYXRhLi0tPlxyXG48ZGl2IGNsYXNzPVwibWF0LWNlbGwgcGFkIHRhYmxlLWVtcHR5IHR4dC1pdGFsaWNcIiAqbmdJZj1cIiFkYXRhU291cmNlPy5maWx0ZXJlZERhdGE/Lmxlbmd0aCAmJiAhZGF0YVNvdXJjZT8udG90YWxcIiBpMThuPVwiQEBub1Jlc3VsdHNGb3VuZFwiPk5vIHJlc3VsdHMgd2VyZSBmb3VuZC48L2Rpdj5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuPCEtLSAjcmVnaW9uIERlYnVnIHZhbHVlIC0tPlxyXG48Y29kZSAqbmdJZj1cImRlYnVnVmFsdWVcIj5cclxuXHQ8cHJlPnt7Zm9ybVZhbHVlIHwganNvbn19PC9wcmU+XHJcbjwvY29kZT5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuPGRpdiBjbGFzcz1cInRhYmxlLWZvb3RlclwiIGxheW91dD1cInJvd1wiPlxyXG5cdDxuZy1jb250ZW50IHNlbGVjdD1cIlt0YWJsZS1mb290ZXJdXCI+PC9uZy1jb250ZW50PlxyXG5cdDxzcGFuIGZsZXg+PC9zcGFuPlxyXG5cdDxtYXQtcGFnaW5hdG9yICpuZ0lmPVwicGFnaW5hYmxlXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCIgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz1cInRydWVcIj48L21hdC1wYWdpbmF0b3I+XHJcbjwvZGl2PiJdfQ==