@seniorsistemas/angular-components 18.1.0-feature-sds-276-ea560ae6 → 18.1.0-feature-sds-276-ee045828

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 (341) hide show
  1. package/bignumber-input/lib/bignumber-input/bignumber-input.directive.d.ts +1 -1
  2. package/custom-fields/lib/custom-fields/custom-fields.component.d.ts +9 -8
  3. package/custom-fields/lib/custom-fields/custom-fields.service.d.ts +4 -3
  4. package/custom-fields/lib/custom-fields/models/custom-field-type.d.ts +33 -0
  5. package/custom-fields/lib/custom-fields/models/index.d.ts +1 -0
  6. package/custom-fields/public-api.d.ts +2 -1
  7. package/dynamic-form/{lib/dynamic-form → dynamic-form}/components/field-label/field-label.component.d.ts +3 -3
  8. package/dynamic-form/dynamic-form/components/grid/row/row.component.d.ts +22 -0
  9. package/dynamic-form/{lib/dynamic-form → dynamic-form}/components/lookup/lookup.component.d.ts +19 -34
  10. package/dynamic-form/dynamic-form/components/structure/base-structure-component.d.ts +10 -0
  11. package/dynamic-form/dynamic-form/components/structure/fieldset/fieldset.component.d.ts +12 -0
  12. package/dynamic-form/dynamic-form/components/structure/section/section.component.d.ts +14 -0
  13. package/dynamic-form/dynamic-form/configurations/registry.d.ts +8 -0
  14. package/dynamic-form/dynamic-form/configurations/structure/fieldset.d.ts +11 -0
  15. package/dynamic-form/dynamic-form/configurations/structure/row.d.ts +21 -0
  16. package/dynamic-form/{lib/dynamic-form → dynamic-form}/configurations/structure/section.d.ts +9 -8
  17. package/dynamic-form/dynamic-form/configurations/structure/structure.d.ts +11 -0
  18. package/dynamic-form/dynamic-form/dynamic-form.component.d.ts +19 -0
  19. package/dynamic-form/dynamic-form/dynamic-form.d.ts +39 -0
  20. package/dynamic-form/{lib/dynamic-form → dynamic-form}/dynamic-form.directive.d.ts +6 -12
  21. package/dynamic-form/dynamic-form/dynamic-form.module.d.ts +79 -0
  22. package/dynamic-form/dynamic-form/form-field/configurations/field-size.d.ts +13 -0
  23. package/dynamic-form/dynamic-form/form-field/configurations/fields/autocomplete-field.d.ts +21 -0
  24. package/dynamic-form/dynamic-form/form-field/configurations/fields/bignumber-field.d.ts +28 -0
  25. package/dynamic-form/dynamic-form/form-field/configurations/fields/blob-field.d.ts +28 -0
  26. package/dynamic-form/dynamic-form/form-field/configurations/fields/boolean-field.d.ts +21 -0
  27. package/dynamic-form/dynamic-form/form-field/configurations/fields/boolean-switch-field.d.ts +12 -0
  28. package/dynamic-form/dynamic-form/form-field/configurations/fields/button-field.d.ts +16 -0
  29. package/dynamic-form/dynamic-form/form-field/configurations/fields/calendar-field.d.ts +33 -0
  30. package/dynamic-form/dynamic-form/form-field/configurations/fields/checkbox-field.d.ts +11 -0
  31. package/dynamic-form/dynamic-form/form-field/configurations/fields/chips-field.d.ts +18 -0
  32. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/configurations/fields/country-phone-picker-field.d.ts +6 -7
  33. package/dynamic-form/dynamic-form/form-field/configurations/fields/currency-field.d.ts +15 -0
  34. package/dynamic-form/dynamic-form/form-field/configurations/fields/field.d.ts +43 -0
  35. package/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.d.ts +56 -0
  36. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/configurations/fields/number-field.d.ts +9 -22
  37. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/configurations/fields/password-field.d.ts +8 -20
  38. package/dynamic-form/dynamic-form/form-field/configurations/fields/profile-picture.d.ts +24 -0
  39. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/configurations/fields/radio-button-field.d.ts +7 -9
  40. package/dynamic-form/dynamic-form/form-field/configurations/fields/select-field.d.ts +33 -0
  41. package/dynamic-form/dynamic-form/form-field/configurations/fields/slider-field.d.ts +24 -0
  42. package/dynamic-form/dynamic-form/form-field/configurations/fields/star-rating-field.d.ts +16 -0
  43. package/dynamic-form/dynamic-form/form-field/configurations/fields/text-area-field.d.ts +18 -0
  44. package/dynamic-form/dynamic-form/form-field/configurations/fields/text-area-ia-field.d.ts +19 -0
  45. package/dynamic-form/dynamic-form/form-field/configurations/fields/text-field.d.ts +31 -0
  46. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/autocomplete/autocomplete-field.component.d.ts +9 -6
  47. package/dynamic-form/dynamic-form/form-field/fields/base-field-component.d.ts +7 -0
  48. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/bignumber/bignumber-field.component.d.ts +8 -8
  49. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/boolean/boolean-radio-field/boolean-field.component.d.ts +4 -4
  50. package/dynamic-form/dynamic-form/form-field/fields/boolean/boolean-switch-field/boolean-switch-field.component.d.ts +10 -0
  51. package/dynamic-form/dynamic-form/form-field/fields/button-field/button-field.component.d.ts +11 -0
  52. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/calendar/calendar-field.component.d.ts +10 -10
  53. package/dynamic-form/dynamic-form/form-field/fields/checkbox/checkbox-field.component.d.ts +10 -0
  54. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/chips/chips-field.component.d.ts +5 -5
  55. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/country-phone-picker/country-phone-picker-field.component.d.ts +4 -4
  56. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/currency/currency-field.component.d.ts +10 -6
  57. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/file-upload/file-upload-field.component.d.ts +7 -6
  58. package/dynamic-form/dynamic-form/form-field/fields/lookup/lookup-field.component.d.ts +18 -0
  59. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/number/number-field.component.d.ts +8 -9
  60. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/password/password-field.component.d.ts +8 -6
  61. package/dynamic-form/dynamic-form/form-field/fields/profile-picture/profile-picture-field.component.d.ts +10 -0
  62. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/radio-button/radio-button-field.component.d.ts +5 -5
  63. package/dynamic-form/dynamic-form/form-field/fields/select/select-field.component.d.ts +12 -0
  64. package/dynamic-form/dynamic-form/form-field/fields/slider/slider-field.component.d.ts +23 -0
  65. package/dynamic-form/dynamic-form/form-field/fields/star-rating/star-rating-field.component.d.ts +11 -0
  66. package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/text/text-field.component.d.ts +8 -8
  67. package/dynamic-form/dynamic-form/form-field/fields/text-area/text-area-field.component.d.ts +18 -0
  68. package/dynamic-form/dynamic-form/form-field/fields/text-area-ia/text-area-ia-field.component.d.ts +15 -0
  69. package/dynamic-form/dynamic-form/services/form-field-utils.service.d.ts +15 -0
  70. package/dynamic-form/public-api.d.ts +35 -43
  71. package/dynamic-form/src/optional-fields/editor/editor-field/editor-field.component.d.ts +10 -0
  72. package/dynamic-form/src/optional-fields/editor/editor-field.d.ts +15 -0
  73. package/dynamic-form/src/optional-fields/editor/index.d.ts +5 -0
  74. package/dynamic-form/src/optional-fields/editor/public-api.d.ts +1 -0
  75. package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +3 -3
  76. package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.directive.mjs +8 -6
  77. package/esm2022/custom-fields/lib/custom-fields/custom-fields.component.mjs +68 -69
  78. package/esm2022/custom-fields/lib/custom-fields/custom-fields.service.mjs +5 -5
  79. package/esm2022/custom-fields/lib/custom-fields/models/custom-field-type.mjs +26 -1
  80. package/esm2022/custom-fields/lib/custom-fields/models/index.mjs +2 -0
  81. package/esm2022/custom-fields/public-api.mjs +3 -2
  82. package/esm2022/dynamic-form/dynamic-form/components/field-label/field-label.component.mjs +21 -0
  83. package/esm2022/dynamic-form/dynamic-form/components/grid/row/row.component.mjs +39 -0
  84. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +661 -0
  85. package/esm2022/dynamic-form/dynamic-form/components/lookup/types/default-filter.mjs +2 -0
  86. package/esm2022/dynamic-form/dynamic-form/components/lookup/types/label-options.mjs +2 -0
  87. package/esm2022/dynamic-form/dynamic-form/components/structure/base-structure-component.mjs +2 -0
  88. package/esm2022/dynamic-form/dynamic-form/components/structure/fieldset/fieldset.component.mjs +17 -0
  89. package/esm2022/dynamic-form/dynamic-form/components/structure/section/section.component.mjs +23 -0
  90. package/esm2022/dynamic-form/dynamic-form/configurations/registry.mjs +12 -0
  91. package/esm2022/dynamic-form/dynamic-form/configurations/structure/fieldset.mjs +2 -0
  92. package/esm2022/dynamic-form/dynamic-form/configurations/structure/row.mjs +2 -0
  93. package/esm2022/dynamic-form/dynamic-form/configurations/structure/section.mjs +2 -0
  94. package/esm2022/dynamic-form/dynamic-form/configurations/structure/structure.mjs +2 -0
  95. package/esm2022/dynamic-form/dynamic-form/dynamic-form.component.mjs +37 -0
  96. package/esm2022/dynamic-form/dynamic-form/dynamic-form.directive.mjs +74 -0
  97. package/esm2022/dynamic-form/dynamic-form/dynamic-form.mjs +81 -0
  98. package/esm2022/dynamic-form/dynamic-form/dynamic-form.module.mjs +283 -0
  99. package/esm2022/dynamic-form/dynamic-form/form-field/addon-config.mjs +2 -0
  100. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/field-size.mjs +19 -0
  101. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/autocomplete-field.mjs +2 -0
  102. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/bignumber-field.mjs +2 -0
  103. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/blob-field.mjs +2 -0
  104. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/boolean-field.mjs +2 -0
  105. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/boolean-switch-field.mjs +2 -0
  106. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/button-field.mjs +2 -0
  107. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/calendar-field.mjs +2 -0
  108. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/checkbox-field.mjs +2 -0
  109. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/chips-field.mjs +2 -0
  110. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/country-phone-picker-field.mjs +2 -0
  111. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/currency-field.mjs +2 -0
  112. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/field.mjs +2 -0
  113. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.mjs +2 -0
  114. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/number-field.mjs +2 -0
  115. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/password-field.mjs +2 -0
  116. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/profile-picture.mjs +2 -0
  117. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/radio-button-field.mjs +9 -0
  118. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/select-field.mjs +2 -0
  119. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/slider-field.mjs +2 -0
  120. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/star-rating-field.mjs +2 -0
  121. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/text-area-field.mjs +2 -0
  122. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/text-area-ia-field.mjs +2 -0
  123. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/text-field.mjs +2 -0
  124. package/esm2022/dynamic-form/dynamic-form/form-field/fields/autocomplete/autocomplete-field.component.mjs +41 -0
  125. package/esm2022/dynamic-form/dynamic-form/form-field/fields/base-field-component.mjs +2 -0
  126. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +119 -0
  127. package/esm2022/dynamic-form/dynamic-form/form-field/fields/boolean/boolean-radio-field/boolean-field.component.mjs +21 -0
  128. package/esm2022/dynamic-form/dynamic-form/form-field/fields/boolean/boolean-switch-field/boolean-switch-field.component.mjs +17 -0
  129. package/esm2022/dynamic-form/dynamic-form/form-field/fields/button-field/button-field.component.mjs +28 -0
  130. package/esm2022/dynamic-form/dynamic-form/form-field/fields/calendar/calendar-field.component.mjs +123 -0
  131. package/esm2022/dynamic-form/dynamic-form/form-field/fields/checkbox/checkbox-field.component.mjs +15 -0
  132. package/esm2022/dynamic-form/dynamic-form/form-field/fields/chips/chips-field.component.mjs +53 -0
  133. package/esm2022/dynamic-form/dynamic-form/form-field/fields/country-phone-picker/country-phone-picker-field.component.mjs +23 -0
  134. package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +99 -0
  135. package/esm2022/dynamic-form/dynamic-form/form-field/fields/file-upload/file-upload-field.component.mjs +47 -0
  136. package/esm2022/dynamic-form/dynamic-form/form-field/fields/lookup/lookup-field.component.mjs +40 -0
  137. package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +114 -0
  138. package/esm2022/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.mjs +73 -0
  139. package/esm2022/dynamic-form/dynamic-form/form-field/fields/profile-picture/profile-picture-field.component.mjs +16 -0
  140. package/esm2022/dynamic-form/dynamic-form/form-field/fields/radio-button/radio-button-field.component.mjs +49 -0
  141. package/esm2022/dynamic-form/dynamic-form/form-field/fields/select/select-field.component.mjs +19 -0
  142. package/esm2022/dynamic-form/dynamic-form/form-field/fields/slider/slider-field.component.mjs +113 -0
  143. package/esm2022/dynamic-form/dynamic-form/form-field/fields/star-rating/star-rating-field.component.mjs +21 -0
  144. package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +79 -0
  145. package/esm2022/dynamic-form/dynamic-form/form-field/fields/text-area/text-area-field.component.mjs +34 -0
  146. package/esm2022/dynamic-form/dynamic-form/form-field/fields/text-area-ia/text-area-ia-field.component.mjs +27 -0
  147. package/esm2022/dynamic-form/dynamic-form/services/form-field-utils.service.mjs +39 -0
  148. package/esm2022/dynamic-form/public-api.mjs +61 -44
  149. package/esm2022/dynamic-form/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
  150. package/esm2022/dynamic-form/src/optional-fields/editor/editor-field/editor-field.component.mjs +18 -0
  151. package/esm2022/dynamic-form/src/optional-fields/editor/editor-field.mjs +2 -0
  152. package/esm2022/dynamic-form/src/optional-fields/editor/public-api.mjs +5 -0
  153. package/esm2022/dynamic-form/src/optional-fields/editor/seniorsistemas-angular-components-dynamic-form-src-optional-fields-editor.mjs +5 -0
  154. package/esm2022/file-upload/lib/file-upload/file-upload.component.mjs +5 -5
  155. package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-text-area-ia/inline-edit-text-area-ia.component.mjs +1 -1
  156. package/esm2022/select/lib/select/select.component.mjs +3 -3
  157. package/esm2022/table/lib/table/table-column/models/dynamic-editable-grid.interface.mjs +1 -1
  158. package/esm2022/text-area-ia/lib/text-area-ia/text-area-ia.component.mjs +6 -6
  159. package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +3 -3
  160. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +2 -2
  161. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
  162. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs +7 -5
  163. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs.map +1 -1
  164. package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs +95 -71
  165. package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs.map +1 -1
  166. package/fesm2022/seniorsistemas-angular-components-dynamic-form-src-optional-fields-editor.mjs +25 -0
  167. package/fesm2022/seniorsistemas-angular-components-dynamic-form-src-optional-fields-editor.mjs.map +1 -0
  168. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +871 -2437
  169. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  170. package/fesm2022/seniorsistemas-angular-components-file-upload.mjs +4 -4
  171. package/fesm2022/seniorsistemas-angular-components-file-upload.mjs.map +1 -1
  172. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +1 -1
  173. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
  174. package/fesm2022/seniorsistemas-angular-components-select.mjs +2 -2
  175. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  176. package/fesm2022/seniorsistemas-angular-components-text-area-ia.mjs +5 -5
  177. package/fesm2022/seniorsistemas-angular-components-text-area-ia.mjs.map +1 -1
  178. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +2 -2
  179. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
  180. package/file-upload/lib/file-upload/file-upload.component.d.ts +2 -2
  181. package/package.json +12 -18
  182. package/table/lib/table/table-column/models/dynamic-editable-grid.interface.d.ts +2 -2
  183. package/text-area-ia/lib/text-area-ia/text-area-ia.component.d.ts +2 -1
  184. package/dynamic-form/lib/dynamic-form/components/grid/row/row.component.d.ts +0 -15
  185. package/dynamic-form/lib/dynamic-form/components/structure/base-structure-component.d.ts +0 -8
  186. package/dynamic-form/lib/dynamic-form/components/structure/fieldset/fieldset.component.d.ts +0 -12
  187. package/dynamic-form/lib/dynamic-form/components/structure/section/section.component.d.ts +0 -14
  188. package/dynamic-form/lib/dynamic-form/configurations/dynamic-config.d.ts +0 -3
  189. package/dynamic-form/lib/dynamic-form/configurations/dynamic-type.d.ts +0 -24
  190. package/dynamic-form/lib/dynamic-form/configurations/grid/grid.d.ts +0 -14
  191. package/dynamic-form/lib/dynamic-form/configurations/grid/row.d.ts +0 -8
  192. package/dynamic-form/lib/dynamic-form/configurations/grid-type.d.ts +0 -3
  193. package/dynamic-form/lib/dynamic-form/configurations/structure/fieldset.d.ts +0 -10
  194. package/dynamic-form/lib/dynamic-form/configurations/structure/structure.d.ts +0 -14
  195. package/dynamic-form/lib/dynamic-form/configurations/structure-type.d.ts +0 -4
  196. package/dynamic-form/lib/dynamic-form/dynamic-form.component.d.ts +0 -19
  197. package/dynamic-form/lib/dynamic-form/dynamic-form.d.ts +0 -57
  198. package/dynamic-form/lib/dynamic-form/dynamic-form.module.d.ts +0 -83
  199. package/dynamic-form/lib/dynamic-form/form-field/configurations/field-size.d.ts +0 -7
  200. package/dynamic-form/lib/dynamic-form/form-field/configurations/field-type.d.ts +0 -32
  201. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/autocomplete-field.d.ts +0 -30
  202. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/bignumber-field.d.ts +0 -38
  203. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/blob-field.d.ts +0 -43
  204. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/boolean-field.d.ts +0 -29
  205. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/boolean-switch-field.d.ts +0 -11
  206. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/button-field.d.ts +0 -34
  207. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/calendar-field.d.ts +0 -45
  208. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/checkbox-field.d.ts +0 -9
  209. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/chips-field.d.ts +0 -24
  210. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/currency-field.d.ts +0 -9
  211. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/decimal-field.d.ts +0 -14
  212. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/editor-field.d.ts +0 -18
  213. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/field.d.ts +0 -96
  214. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/lookup-field.d.ts +0 -97
  215. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/profile-picture.d.ts +0 -35
  216. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/select-field.d.ts +0 -41
  217. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/slider-field.d.ts +0 -32
  218. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/star-rating-field.d.ts +0 -17
  219. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/text-area-field.d.ts +0 -24
  220. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/text-area-ia-field.d.ts +0 -26
  221. package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/text-field.d.ts +0 -41
  222. package/dynamic-form/lib/dynamic-form/form-field/fields/base-field-component.d.ts +0 -32
  223. package/dynamic-form/lib/dynamic-form/form-field/fields/boolean/boolean-switch-field/boolean-switch-field.component.d.ts +0 -10
  224. package/dynamic-form/lib/dynamic-form/form-field/fields/button-field/button-field.component.d.ts +0 -10
  225. package/dynamic-form/lib/dynamic-form/form-field/fields/checkbox/checkbox-field.component.d.ts +0 -10
  226. package/dynamic-form/lib/dynamic-form/form-field/fields/editor/editor-field.component.d.ts +0 -10
  227. package/dynamic-form/lib/dynamic-form/form-field/fields/lookup/lookup-field.component.d.ts +0 -9
  228. package/dynamic-form/lib/dynamic-form/form-field/fields/profile-picture/profile-picture-field.component.d.ts +0 -9
  229. package/dynamic-form/lib/dynamic-form/form-field/fields/select/select-field.component.d.ts +0 -10
  230. package/dynamic-form/lib/dynamic-form/form-field/fields/slider/slider-field.component.d.ts +0 -25
  231. package/dynamic-form/lib/dynamic-form/form-field/fields/star-rating/star-rating-field.component.d.ts +0 -10
  232. package/dynamic-form/lib/dynamic-form/form-field/fields/text-area/text-area-field.component.d.ts +0 -14
  233. package/dynamic-form/lib/dynamic-form/form-field/fields/text-area-ia/text-area-ia-field.component.d.ts +0 -9
  234. package/dynamic-form/lib/dynamic-form/form-field/form-field.d.ts +0 -192
  235. package/dynamic-form/lib/dynamic-form/services/dynamic-form-cache.d.ts +0 -12
  236. package/esm2022/dynamic-form/lib/dynamic-form/components/field-label/field-label.component.mjs +0 -20
  237. package/esm2022/dynamic-form/lib/dynamic-form/components/grid/row/row.component.mjs +0 -41
  238. package/esm2022/dynamic-form/lib/dynamic-form/components/lookup/lookup.component.mjs +0 -642
  239. package/esm2022/dynamic-form/lib/dynamic-form/components/lookup/types/default-filter.mjs +0 -2
  240. package/esm2022/dynamic-form/lib/dynamic-form/components/lookup/types/label-options.mjs +0 -2
  241. package/esm2022/dynamic-form/lib/dynamic-form/components/structure/base-structure-component.mjs +0 -2
  242. package/esm2022/dynamic-form/lib/dynamic-form/components/structure/fieldset/fieldset.component.mjs +0 -27
  243. package/esm2022/dynamic-form/lib/dynamic-form/components/structure/section/section.component.mjs +0 -33
  244. package/esm2022/dynamic-form/lib/dynamic-form/configurations/dynamic-config.mjs +0 -71
  245. package/esm2022/dynamic-form/lib/dynamic-form/configurations/dynamic-type.mjs +0 -26
  246. package/esm2022/dynamic-form/lib/dynamic-form/configurations/grid/grid.mjs +0 -14
  247. package/esm2022/dynamic-form/lib/dynamic-form/configurations/grid/row.mjs +0 -10
  248. package/esm2022/dynamic-form/lib/dynamic-form/configurations/grid-type.mjs +0 -5
  249. package/esm2022/dynamic-form/lib/dynamic-form/configurations/structure/fieldset.mjs +0 -10
  250. package/esm2022/dynamic-form/lib/dynamic-form/configurations/structure/section.mjs +0 -31
  251. package/esm2022/dynamic-form/lib/dynamic-form/configurations/structure/structure.mjs +0 -9
  252. package/esm2022/dynamic-form/lib/dynamic-form/configurations/structure-type.mjs +0 -6
  253. package/esm2022/dynamic-form/lib/dynamic-form/dynamic-form.component.mjs +0 -41
  254. package/esm2022/dynamic-form/lib/dynamic-form/dynamic-form.directive.mjs +0 -107
  255. package/esm2022/dynamic-form/lib/dynamic-form/dynamic-form.mjs +0 -189
  256. package/esm2022/dynamic-form/lib/dynamic-form/dynamic-form.module.mjs +0 -293
  257. package/esm2022/dynamic-form/lib/dynamic-form/form-field/addon-config.mjs +0 -2
  258. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/field-size.mjs +0 -13
  259. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/field-type.mjs +0 -34
  260. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/autocomplete-field.mjs +0 -24
  261. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/bignumber-field.mjs +0 -37
  262. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/blob-field.mjs +0 -31
  263. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/boolean-field.mjs +0 -30
  264. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/boolean-switch-field.mjs +0 -15
  265. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/button-field.mjs +0 -47
  266. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/calendar-field.mjs +0 -56
  267. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/checkbox-field.mjs +0 -9
  268. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/chips-field.mjs +0 -25
  269. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/country-phone-picker-field.mjs +0 -15
  270. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/currency-field.mjs +0 -14
  271. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/decimal-field.mjs +0 -16
  272. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/editor-field.mjs +0 -15
  273. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/field.mjs +0 -64
  274. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/lookup-field.mjs +0 -66
  275. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/number-field.mjs +0 -38
  276. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/password-field.mjs +0 -33
  277. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/profile-picture.mjs +0 -35
  278. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/radio-button-field.mjs +0 -27
  279. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/select-field.mjs +0 -43
  280. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/slider-field.mjs +0 -30
  281. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/star-rating-field.mjs +0 -17
  282. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/text-area-field.mjs +0 -30
  283. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/text-area-ia-field.mjs +0 -32
  284. package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/text-field.mjs +0 -38
  285. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/autocomplete/autocomplete-field.component.mjs +0 -37
  286. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/base-field-component.mjs +0 -22
  287. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +0 -124
  288. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/boolean/boolean-radio-field/boolean-field.component.mjs +0 -27
  289. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/boolean/boolean-switch-field/boolean-switch-field.component.mjs +0 -23
  290. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/button-field/button-field.component.mjs +0 -31
  291. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/calendar/calendar-field.component.mjs +0 -118
  292. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/checkbox/checkbox-field.component.mjs +0 -21
  293. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/chips/chips-field.component.mjs +0 -59
  294. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/country-phone-picker/country-phone-picker-field.component.mjs +0 -29
  295. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/currency/currency-field.component.mjs +0 -100
  296. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/editor/editor-field.component.mjs +0 -23
  297. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/file-upload/file-upload-field.component.mjs +0 -56
  298. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/lookup/lookup-field.component.mjs +0 -23
  299. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/number/number-field.component.mjs +0 -121
  300. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/password/password-field.component.mjs +0 -75
  301. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/profile-picture/profile-picture-field.component.mjs +0 -22
  302. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/radio-button/radio-button-field.component.mjs +0 -52
  303. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/select/select-field.component.mjs +0 -24
  304. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/slider/slider-field.component.mjs +0 -103
  305. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/star-rating/star-rating-field.component.mjs +0 -25
  306. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/text/text-field.component.mjs +0 -88
  307. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/text-area/text-area-field.component.mjs +0 -29
  308. package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/text-area-ia/text-area-ia-field.component.mjs +0 -22
  309. package/esm2022/dynamic-form/lib/dynamic-form/form-field/form-field.mjs +0 -243
  310. package/esm2022/dynamic-form/lib/dynamic-form/services/dynamic-form-cache.mjs +0 -150
  311. package/esm2022/form-dynamic/components/form-dynamic/form-dynamic.component.mjs +0 -53
  312. package/esm2022/form-dynamic/core/registry.mjs +0 -10
  313. package/esm2022/form-dynamic/fields-basic/boolean-field/boolean-field.component.mjs +0 -15
  314. package/esm2022/form-dynamic/fields-basic/string-field/string-field.component.mjs +0 -15
  315. package/esm2022/form-dynamic/optional-fields/editor/editor-field/editor-field.component.mjs +0 -30
  316. package/esm2022/form-dynamic/optional-fields/editor/editor-types.mjs +0 -2
  317. package/esm2022/form-dynamic/optional-fields/editor/public-api.mjs +0 -6
  318. package/esm2022/form-dynamic/optional-fields/editor/seniorsistemas-angular-components-form-dynamic-optional-fields-editor.mjs +0 -5
  319. package/esm2022/form-dynamic/public-api.mjs +0 -10
  320. package/esm2022/form-dynamic/schemas/field-dynamic.mjs +0 -2
  321. package/esm2022/form-dynamic/schemas/form-dynamic-schema.mjs +0 -2
  322. package/esm2022/form-dynamic/seniorsistemas-angular-components-form-dynamic.mjs +0 -5
  323. package/fesm2022/seniorsistemas-angular-components-form-dynamic-optional-fields-editor.mjs +0 -40
  324. package/fesm2022/seniorsistemas-angular-components-form-dynamic-optional-fields-editor.mjs.map +0 -1
  325. package/fesm2022/seniorsistemas-angular-components-form-dynamic.mjs +0 -94
  326. package/fesm2022/seniorsistemas-angular-components-form-dynamic.mjs.map +0 -1
  327. package/form-dynamic/components/form-dynamic/form-dynamic.component.d.ts +0 -15
  328. package/form-dynamic/core/registry.d.ts +0 -7
  329. package/form-dynamic/fields-basic/boolean-field/boolean-field.component.d.ts +0 -9
  330. package/form-dynamic/fields-basic/string-field/string-field.component.d.ts +0 -9
  331. package/form-dynamic/index.d.ts +0 -5
  332. package/form-dynamic/optional-fields/editor/editor-field/editor-field.component.d.ts +0 -15
  333. package/form-dynamic/optional-fields/editor/editor-types.d.ts +0 -8
  334. package/form-dynamic/optional-fields/editor/index.d.ts +0 -5
  335. package/form-dynamic/optional-fields/editor/public-api.d.ts +0 -8
  336. package/form-dynamic/public-api.d.ts +0 -4
  337. package/form-dynamic/schemas/field-dynamic.d.ts +0 -20
  338. package/form-dynamic/schemas/form-dynamic-schema.d.ts +0 -4
  339. /package/dynamic-form/{lib/dynamic-form → dynamic-form}/components/lookup/types/default-filter.d.ts +0 -0
  340. /package/dynamic-form/{lib/dynamic-form → dynamic-form}/components/lookup/types/label-options.d.ts +0 -0
  341. /package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/addon-config.d.ts +0 -0
@@ -1,43 +1,35 @@
1
- export * from './lib/dynamic-form/configurations/dynamic-config';
2
- export * from './lib/dynamic-form/configurations/dynamic-type';
3
- export * from './lib/dynamic-form/configurations/grid-type';
4
- export * from './lib/dynamic-form/configurations/grid/grid';
5
- export * from './lib/dynamic-form/configurations/grid/row';
6
- export * from './lib/dynamic-form/configurations/structure-type';
7
- export * from './lib/dynamic-form/configurations/structure/fieldset';
8
- export * from './lib/dynamic-form/configurations/structure/section';
9
- export * from './lib/dynamic-form/configurations/structure/structure';
10
- export * from './lib/dynamic-form/dynamic-form.component';
11
- export * from './lib/dynamic-form/dynamic-form.directive';
12
- export * from './lib/dynamic-form/dynamic-form.module';
13
- export * from './lib/dynamic-form/form-field/configurations/fields/text-area-field';
14
- export { AutocompleteField, type AutocompleteFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/autocomplete-field";
15
- export { BignumberField, type BignumberFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/bignumber-field";
16
- export { BlobField, type BlobFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/blob-field";
17
- export { BooleanField, BooleanOptionsLabel, type BooleanFieldConfig, type BooleanOptionsLabelConfig } from "./lib/dynamic-form/form-field/configurations/fields/boolean-field";
18
- export { BooleanSwitchField, type BooleanSwitchFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/boolean-switch-field";
19
- export { ButtonField, type ButtonFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/button-field";
20
- export { CalendarField, type CalendarFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/calendar-field";
21
- export { CheckboxField, type CheckboxFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/checkbox-field";
22
- export { ChipsField, type ChipsFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/chips-field";
23
- export { CountryPhonePickerField, type CountryPhonePickerConfig } from "./lib/dynamic-form/form-field/configurations/fields/country-phone-picker-field";
24
- export { CurrencyField } from "./lib/dynamic-form/form-field/configurations/fields/currency-field";
25
- export { DecimalField, type DecimalFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/decimal-field";
26
- export { EditorField, type EditorFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/editor-field";
27
- export { Field, type FieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/field";
28
- export { LookupField, type DefaultFilter, type LookupFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/lookup-field";
29
- export { NumberField, type NumberFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/number-field";
30
- export { PasswordField, type PasswordFieldConfig, type PasswordStrengthOptions } from "./lib/dynamic-form/form-field/configurations/fields/password-field";
31
- export { ProfilePictureField, type ProfilePictureConfig } from "./lib/dynamic-form/form-field/configurations/fields/profile-picture";
32
- export { RadioButtonField, RationButtonOption, type RadioButtonFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/radio-button-field";
33
- export { SelectField, SelectOption, type SelectFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/select-field";
34
- export { SliderField, type SliderFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/slider-field";
35
- export { TextAreaField, type TextAreaFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/text-area-field";
36
- export { TextAreaIAField, type TextAreaIAFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/text-area-ia-field";
37
- export { TextField, type TextFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/text-field";
38
- export { StarRatingField, type StarRatingFieldConfig } from "./lib/dynamic-form/form-field/configurations/fields/star-rating-field";
39
- export { FieldSize } from './lib/dynamic-form/form-field/configurations/field-size';
40
- export { FieldType } from './lib/dynamic-form/form-field/configurations/field-type';
41
- export { FormField, Option } from './lib/dynamic-form/form-field/form-field';
42
- export { NumberFieldComponent } from './lib/dynamic-form/form-field/fields/number/number-field.component';
43
- export { LookupComponent } from './lib/dynamic-form/components/lookup/lookup.component';
1
+ export type { BaseFieldComponentConfig } from './dynamic-form/form-field/fields/base-field-component';
2
+ export { FieldLabelComponent } from './dynamic-form/components/field-label/field-label.component';
3
+ export * from './dynamic-form/dynamic-form.component';
4
+ export * from './dynamic-form/dynamic-form.directive';
5
+ export * from './dynamic-form/dynamic-form.module';
6
+ export * from './dynamic-form/form-field/configurations/fields/text-area-field';
7
+ export { type ExpandedDynamicType } from './dynamic-form/configurations/structure/row';
8
+ export { type AutocompleteFieldConfig } from './dynamic-form/form-field/configurations/fields/autocomplete-field';
9
+ export { type BignumberFieldConfig } from './dynamic-form/form-field/configurations/fields/bignumber-field';
10
+ export { type BlobFieldConfig } from './dynamic-form/form-field/configurations/fields/blob-field';
11
+ export { type BooleanFieldConfig, type BooleanOptionsLabelConfig, } from './dynamic-form/form-field/configurations/fields/boolean-field';
12
+ export { type BooleanSwitchFieldConfig } from './dynamic-form/form-field/configurations/fields/boolean-switch-field';
13
+ export { type ButtonFieldConfig } from './dynamic-form/form-field/configurations/fields/button-field';
14
+ export { type CalendarFieldConfig } from './dynamic-form/form-field/configurations/fields/calendar-field';
15
+ export { type CheckboxFieldConfig } from './dynamic-form/form-field/configurations/fields/checkbox-field';
16
+ export { type ChipsFieldConfig } from './dynamic-form/form-field/configurations/fields/chips-field';
17
+ export { type CountryPhonePickerConfig } from './dynamic-form/form-field/configurations/fields/country-phone-picker-field';
18
+ export { type CurrencyFieldConfig } from './dynamic-form/form-field/configurations/fields/currency-field';
19
+ export { type DefaultFilter, type LookupFieldConfig, type SearchObservable, } from './dynamic-form/form-field/configurations/fields/lookup-field';
20
+ export { type NumberFieldConfig } from './dynamic-form/form-field/configurations/fields/number-field';
21
+ export { type PasswordFieldConfig, type PasswordStrengthOptions, } from './dynamic-form/form-field/configurations/fields/password-field';
22
+ export { type ProfilePictureConfig } from './dynamic-form/form-field/configurations/fields/profile-picture';
23
+ export { RationButtonOption, type RadioButtonFieldConfig, } from './dynamic-form/form-field/configurations/fields/radio-button-field';
24
+ export { type SelectOption, type SelectFieldConfig, } from './dynamic-form/form-field/configurations/fields/select-field';
25
+ export { type SliderFieldConfig } from './dynamic-form/form-field/configurations/fields/slider-field';
26
+ export { type StarRatingFieldConfig } from './dynamic-form/form-field/configurations/fields/star-rating-field';
27
+ export { type TextAreaFieldConfig } from './dynamic-form/form-field/configurations/fields/text-area-field';
28
+ export { type TextAreaIAFieldConfig } from './dynamic-form/form-field/configurations/fields/text-area-ia-field';
29
+ export { type TextFieldConfig } from './dynamic-form/form-field/configurations/fields/text-field';
30
+ export { FieldSize } from './dynamic-form/form-field/configurations/field-size';
31
+ export { NumberFieldComponent } from './dynamic-form/form-field/fields/number/number-field.component';
32
+ export { LookupComponent } from './dynamic-form/components/lookup/lookup.component';
33
+ export type { DynamicType, FieldConfig, FieldType, FieldTypeMap, } from './dynamic-form/form-field/configurations/fields/field';
34
+ export type { DynamicStructure, StructureType } from './dynamic-form/configurations/structure/structure';
35
+ export { FormDynamicRegistry } from './dynamic-form/configurations/registry';
@@ -0,0 +1,10 @@
1
+ import { FormControl } from '@angular/forms';
2
+ import { BaseFieldComponentConfig } from '@seniorsistemas/angular-components/dynamic-form';
3
+ import { EditorFieldConfig } from '../editor-field';
4
+ import * as i0 from "@angular/core";
5
+ export declare class EditorFieldComponent implements BaseFieldComponentConfig {
6
+ field: import("@angular/core").InputSignal<EditorFieldConfig>;
7
+ formControl: import("@angular/core").InputSignal<FormControl<any>>;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<EditorFieldComponent, never>;
9
+ static ɵcmp: i0.ɵɵComponentDeclaration<EditorFieldComponent, "ng-component", never, { "field": { "alias": "field"; "required": true; "isSignal": true; }; "formControl": { "alias": "formControl"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
10
+ }
@@ -0,0 +1,15 @@
1
+ import { FieldConfig } from '@seniorsistemas/angular-components/dynamic-form';
2
+ export interface EditorFieldConfig extends FieldConfig {
3
+ type: 'editor';
4
+ formats?: string[];
5
+ readonly?: boolean;
6
+ modules?: any;
7
+ style?: {
8
+ [klass: string]: unknown;
9
+ };
10
+ }
11
+ declare module '@seniorsistemas/angular-components/dynamic-form' {
12
+ interface FieldTypeMap {
13
+ editor: EditorFieldConfig;
14
+ }
15
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@seniorsistemas/angular-components/dynamic-form/src/optional-fields/editor" />
5
+ export * from './public-api';
@@ -0,0 +1 @@
1
+ export * from './editor-field';
@@ -529,7 +529,7 @@ export class AutocompleteComponent {
529
529
  useExisting: forwardRef(() => AutocompleteComponent),
530
530
  multi: true,
531
531
  },
532
- ], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"flex h-[35px] w-full items-center overflow-hidden rounded-[4px] border focus-within:border-2 focus-within:border-primary hover:bg-grayscale-10\"\n [class]=\"inputClass()\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5 text-grayscale-30': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0 text-grayscale-90': !disabled(),\n 'border-criticality-red': invalid(),\n }\"\n>\n <div\n class=\"flex flex-grow gap-2 px-2\"\n [ngClass]=\"{\n 'border-r': dropdown(),\n 'border-grayscale-20': dropdown() && disabled(),\n 'border-grayscale-30 focus-within:border-r-2 focus-within:border-r-primary': dropdown() && !disabled(),\n 'bg-grayscale-5': disabled(),\n 'bg-grayscale-0': !disabled(),\n }\"\n >\n @if (multiple() && values().length > 0) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (suggestion of values(); track suggestion) {\n <s-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel()\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></s-autocomplete-chip>\n }\n </div>\n }\n <input\n #inputEl\n class=\"min-h-[35px] grow outline-none\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? 'platform.angular_components.type_to_search' | translate\"\n [readOnly]=\"readonly()\"\n [(ngModel)]=\"inputValue\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-autocomplete]=\"multiple() ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? filteredSuggestions()[focusedIndex()].id : null\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyUp)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading()) {\n <div class=\"flex items-center justify-center\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"animate-spin\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"#428bca\"\n stroke-width=\"2\"\n fill=\"none\"\n stroke-dasharray=\"56.5\"\n stroke-dashoffset=\"10\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n } @else {\n @if (value() && !this.disabled()) {\n <button\n class=\"px-2\"\n (click)=\"clear()\"\n tabindex=\"-1\"\n >\n <i class=\"far fa-times text-grayscale-60\"></i>\n </button>\n }\n }\n </div>\n\n @if (dropdown()) {\n <button\n class=\"flex h-full w-[35px] flex-shrink-0 flex-grow-0 items-center justify-center hover:bg-grayscale-10\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas text-grayscale-90\"\n [class.fa-caret-down]=\"!isOpen()\"\n [class.fa-caret-up]=\"isOpen()\"\n ></i>\n </button>\n }\n</div>\n\n@if (showEmptyMessage() || (filteredSuggestions().length > 0 && !readonly())) {\n <ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"isOpen.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"isOpen.set(false)\"\n >\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"mt-0.5 rounded-[4px] bg-grayscale-0 py-1 shadow\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"listbox\"\n >\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredSuggestions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let suggestion of enrichedFilteredSuggestions();\n let i = $index;\n trackBy: trackById\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredSuggestions().length <= 10) {\n @for (suggestion of enrichedFilteredSuggestions(); track suggestion.id; let i = $index) {\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n }\n }\n\n @if (showEmptyMessage()) {\n <span class=\"p-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </ul>\n </div>\n </ng-template>\n}\n\n<ng-template\n #suggestionItemTemplate\n let-suggestion=\"suggestion\"\n let-i=\"i\"\n>\n <li\n [id]=\"suggestion.id\"\n class=\"rounded-sm flex cursor-pointer items-center gap-2 px-3 py-2 text-grayscale-70\"\n [class.bg-grayscale-10]=\"i === focusedIndex()\"\n [class.bg-grayscale-20]=\"suggestion.isSelected\"\n [attr.aria-selected]=\"suggestion.isSelected\"\n role=\"option\"\n (click)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark() && multiple() && suggestion.isSelected) {\n <i class=\"far fa-check\"></i>\n }\n {{ suggestionLabel() ? suggestion.data[suggestionLabel()!] : suggestion.data }}\n </li>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i4.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "component", type: AutocompleteChipComponent, selector: "s-autocomplete-chip", inputs: ["suggestion", "suggestionLabel"], outputs: ["suggestionRemoved"] }] });
532
+ ], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"flex h-[35px] w-full items-center overflow-hidden rounded-[4px] border focus-within:border-2 focus-within:border-primary hover:bg-grayscale-10\"\n [class]=\"inputClass()\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5 text-grayscale-30': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0 text-grayscale-90': !disabled(),\n 'border-criticality-red': invalid(),\n }\"\n>\n <div\n class=\"flex flex-grow gap-2 px-2\"\n [ngClass]=\"{\n 'border-r': dropdown(),\n 'border-grayscale-20': dropdown() && disabled(),\n 'border-grayscale-30 focus-within:border-r-2 focus-within:border-r-primary': dropdown() && !disabled(),\n 'bg-grayscale-5': disabled(),\n 'bg-grayscale-0': !disabled(),\n }\"\n >\n @if (multiple() && values().length > 0) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (suggestion of values(); track suggestion) {\n <s-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel()\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></s-autocomplete-chip>\n }\n </div>\n }\n <input\n #inputEl\n class=\"min-h-[35px] grow outline-none\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? 'platform.angular_components.type_to_search' | translate\"\n [readOnly]=\"readonly()\"\n [(ngModel)]=\"inputValue\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-autocomplete]=\"multiple() ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? filteredSuggestions()[focusedIndex()].id : null\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyUp)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading()) {\n <div class=\"flex items-center justify-center\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"animate-spin\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"#428bca\"\n stroke-width=\"2\"\n fill=\"none\"\n stroke-dasharray=\"56.5\"\n stroke-dashoffset=\"10\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n } @else {\n @if (value() && !this.disabled()) {\n <button\n class=\"px-2\"\n (click)=\"clear()\"\n tabindex=\"-1\"\n >\n <i class=\"far fa-times text-grayscale-60\"></i>\n </button>\n }\n }\n </div>\n\n @if (dropdown()) {\n <button\n class=\"flex h-full w-[35px] flex-shrink-0 flex-grow-0 items-center justify-center hover:bg-grayscale-10\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas text-grayscale-90\"\n [class.fa-caret-down]=\"!isOpen()\"\n [class.fa-caret-up]=\"isOpen()\"\n ></i>\n </button>\n }\n</div>\n\n@if (showEmptyMessage() || (filteredSuggestions().length > 0 && !readonly())) {\n <ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"isOpen.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"isOpen.set(false)\"\n >\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"mt-0.5 rounded-[4px] bg-grayscale-0 py-1 shadow\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"listbox\"\n >\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredSuggestions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let suggestion of enrichedFilteredSuggestions();\n let i = $index;\n trackBy: trackById\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredSuggestions().length <= 10) {\n @for (suggestion of enrichedFilteredSuggestions(); track suggestion.id; let i = $index) {\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n }\n }\n\n @if (showEmptyMessage()) {\n <span class=\"p-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </ul>\n </div>\n </ng-template>\n}\n\n<ng-template\n #suggestionItemTemplate\n let-suggestion=\"suggestion\"\n let-i=\"i\"\n>\n <li\n [id]=\"suggestion.id\"\n class=\"rounded-sm flex cursor-pointer items-center gap-2 px-3 py-2 text-grayscale-70\"\n [class.bg-grayscale-10]=\"i === focusedIndex()\"\n [class.bg-grayscale-20]=\"suggestion.isSelected\"\n [attr.aria-selected]=\"suggestion.isSelected\"\n role=\"option\"\n (click)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark() && multiple() && suggestion.isSelected) {\n <i class=\"far fa-check\"></i>\n }\n {{ suggestionLabel() ? suggestion.data[suggestionLabel()!] : suggestion.data }}\n </li>\n</ng-template>\n\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i4.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "component", type: AutocompleteChipComponent, selector: "s-autocomplete-chip", inputs: ["suggestion", "suggestionLabel"], outputs: ["suggestionRemoved"] }] });
533
533
  }
534
534
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AutocompleteComponent, decorators: [{
535
535
  type: Component,
@@ -553,6 +553,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
553
553
  '[attr.aria-haspopup]': '"listbox"',
554
554
  '[attr.aria-owns]': 'isOpen() ? "dropdown-container-" + componentId : null',
555
555
  '(window:resize)': 'onWindowResize()',
556
- }, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"flex h-[35px] w-full items-center overflow-hidden rounded-[4px] border focus-within:border-2 focus-within:border-primary hover:bg-grayscale-10\"\n [class]=\"inputClass()\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5 text-grayscale-30': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0 text-grayscale-90': !disabled(),\n 'border-criticality-red': invalid(),\n }\"\n>\n <div\n class=\"flex flex-grow gap-2 px-2\"\n [ngClass]=\"{\n 'border-r': dropdown(),\n 'border-grayscale-20': dropdown() && disabled(),\n 'border-grayscale-30 focus-within:border-r-2 focus-within:border-r-primary': dropdown() && !disabled(),\n 'bg-grayscale-5': disabled(),\n 'bg-grayscale-0': !disabled(),\n }\"\n >\n @if (multiple() && values().length > 0) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (suggestion of values(); track suggestion) {\n <s-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel()\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></s-autocomplete-chip>\n }\n </div>\n }\n <input\n #inputEl\n class=\"min-h-[35px] grow outline-none\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? 'platform.angular_components.type_to_search' | translate\"\n [readOnly]=\"readonly()\"\n [(ngModel)]=\"inputValue\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-autocomplete]=\"multiple() ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? filteredSuggestions()[focusedIndex()].id : null\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyUp)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading()) {\n <div class=\"flex items-center justify-center\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"animate-spin\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"#428bca\"\n stroke-width=\"2\"\n fill=\"none\"\n stroke-dasharray=\"56.5\"\n stroke-dashoffset=\"10\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n } @else {\n @if (value() && !this.disabled()) {\n <button\n class=\"px-2\"\n (click)=\"clear()\"\n tabindex=\"-1\"\n >\n <i class=\"far fa-times text-grayscale-60\"></i>\n </button>\n }\n }\n </div>\n\n @if (dropdown()) {\n <button\n class=\"flex h-full w-[35px] flex-shrink-0 flex-grow-0 items-center justify-center hover:bg-grayscale-10\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas text-grayscale-90\"\n [class.fa-caret-down]=\"!isOpen()\"\n [class.fa-caret-up]=\"isOpen()\"\n ></i>\n </button>\n }\n</div>\n\n@if (showEmptyMessage() || (filteredSuggestions().length > 0 && !readonly())) {\n <ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"isOpen.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"isOpen.set(false)\"\n >\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"mt-0.5 rounded-[4px] bg-grayscale-0 py-1 shadow\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"listbox\"\n >\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredSuggestions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let suggestion of enrichedFilteredSuggestions();\n let i = $index;\n trackBy: trackById\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredSuggestions().length <= 10) {\n @for (suggestion of enrichedFilteredSuggestions(); track suggestion.id; let i = $index) {\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n }\n }\n\n @if (showEmptyMessage()) {\n <span class=\"p-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </ul>\n </div>\n </ng-template>\n}\n\n<ng-template\n #suggestionItemTemplate\n let-suggestion=\"suggestion\"\n let-i=\"i\"\n>\n <li\n [id]=\"suggestion.id\"\n class=\"rounded-sm flex cursor-pointer items-center gap-2 px-3 py-2 text-grayscale-70\"\n [class.bg-grayscale-10]=\"i === focusedIndex()\"\n [class.bg-grayscale-20]=\"suggestion.isSelected\"\n [attr.aria-selected]=\"suggestion.isSelected\"\n role=\"option\"\n (click)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark() && multiple() && suggestion.isSelected) {\n <i class=\"far fa-check\"></i>\n }\n {{ suggestionLabel() ? suggestion.data[suggestionLabel()!] : suggestion.data }}\n </li>\n</ng-template>\n" }]
556
+ }, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"flex h-[35px] w-full items-center overflow-hidden rounded-[4px] border focus-within:border-2 focus-within:border-primary hover:bg-grayscale-10\"\n [class]=\"inputClass()\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5 text-grayscale-30': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0 text-grayscale-90': !disabled(),\n 'border-criticality-red': invalid(),\n }\"\n>\n <div\n class=\"flex flex-grow gap-2 px-2\"\n [ngClass]=\"{\n 'border-r': dropdown(),\n 'border-grayscale-20': dropdown() && disabled(),\n 'border-grayscale-30 focus-within:border-r-2 focus-within:border-r-primary': dropdown() && !disabled(),\n 'bg-grayscale-5': disabled(),\n 'bg-grayscale-0': !disabled(),\n }\"\n >\n @if (multiple() && values().length > 0) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (suggestion of values(); track suggestion) {\n <s-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel()\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></s-autocomplete-chip>\n }\n </div>\n }\n <input\n #inputEl\n class=\"min-h-[35px] grow outline-none\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? 'platform.angular_components.type_to_search' | translate\"\n [readOnly]=\"readonly()\"\n [(ngModel)]=\"inputValue\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-autocomplete]=\"multiple() ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? filteredSuggestions()[focusedIndex()].id : null\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyUp)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading()) {\n <div class=\"flex items-center justify-center\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"animate-spin\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"#428bca\"\n stroke-width=\"2\"\n fill=\"none\"\n stroke-dasharray=\"56.5\"\n stroke-dashoffset=\"10\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n } @else {\n @if (value() && !this.disabled()) {\n <button\n class=\"px-2\"\n (click)=\"clear()\"\n tabindex=\"-1\"\n >\n <i class=\"far fa-times text-grayscale-60\"></i>\n </button>\n }\n }\n </div>\n\n @if (dropdown()) {\n <button\n class=\"flex h-full w-[35px] flex-shrink-0 flex-grow-0 items-center justify-center hover:bg-grayscale-10\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas text-grayscale-90\"\n [class.fa-caret-down]=\"!isOpen()\"\n [class.fa-caret-up]=\"isOpen()\"\n ></i>\n </button>\n }\n</div>\n\n@if (showEmptyMessage() || (filteredSuggestions().length > 0 && !readonly())) {\n <ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"isOpen.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"isOpen.set(false)\"\n >\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"mt-0.5 rounded-[4px] bg-grayscale-0 py-1 shadow\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"listbox\"\n >\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredSuggestions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let suggestion of enrichedFilteredSuggestions();\n let i = $index;\n trackBy: trackById\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredSuggestions().length <= 10) {\n @for (suggestion of enrichedFilteredSuggestions(); track suggestion.id; let i = $index) {\n <ng-container\n [ngTemplateOutlet]=\"suggestionItemTemplate\"\n [ngTemplateOutletContext]=\"{ suggestion, i }\"\n ></ng-container>\n }\n }\n\n @if (showEmptyMessage()) {\n <span class=\"p-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </ul>\n </div>\n </ng-template>\n}\n\n<ng-template\n #suggestionItemTemplate\n let-suggestion=\"suggestion\"\n let-i=\"i\"\n>\n <li\n [id]=\"suggestion.id\"\n class=\"rounded-sm flex cursor-pointer items-center gap-2 px-3 py-2 text-grayscale-70\"\n [class.bg-grayscale-10]=\"i === focusedIndex()\"\n [class.bg-grayscale-20]=\"suggestion.isSelected\"\n [attr.aria-selected]=\"suggestion.isSelected\"\n role=\"option\"\n (click)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark() && multiple() && suggestion.isSelected) {\n <i class=\"far fa-check\"></i>\n }\n {{ suggestionLabel() ? suggestion.data[suggestionLabel()!] : suggestion.data }}\n </li>\n</ng-template>\n\n" }]
557
557
  }], ctorParameters: () => [] });
558
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFFVixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNERBQTRELENBQUM7Ozs7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QWtCO3FCQUN4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBTY3JvbGxpbmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBEZXN0cm95UmVmLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgb3V0cHV0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlQ2hpcENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hdXRvY29tcGxldGUtY2hpcC9hdXRvY29tcGxldGUtY2hpcC5jb21wb25lbnQnO1xuXG4vKipcbiAqIFJlcHJlc2VudGEgdW0gaXRlbSBkZSBzdWdlc3TDo28gZW5jYXBzdWxhZG8sIHV0aWxpemFkbyBlbSBjb21wb25lbnRlcyBkZSBhdXRvY29tcGxldGUuXG4gKiBAdGVtcGxhdGUgVCBUaXBvIGRvcyBkYWRvcyBhc3NvY2lhZG9zIMOgIHN1Z2VzdMOjby5cbiAqIEBwcm9wZXJ0eSBkYXRhIE9zIGRhZG9zIGRhIHN1Z2VzdMOjby5cbiAqIEBwcm9wZXJ0eSBpZCBJZGVudGlmaWNhZG9yIMO6bmljbyBkYSBzdWdlc3TDo28uXG4gKiBAcHJvcGVydHkgW2lzU2VsZWN0ZWRdIEluZGljYSBzZSBhIHN1Z2VzdMOjbyBlc3TDoSBzZWxlY2lvbmFkYS5cbiAqL1xuaW50ZXJmYWNlIFN1Z2dlc3Rpb25XcmFwcGVyPFQ+IHtcbiAgICBkYXRhOiBUO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgaXNTZWxlY3RlZD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1hdXRvY29tcGxldGUnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBPdmVybGF5TW9kdWxlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgQXV0b2NvbXBsZXRlQ2hpcENvbXBvbmVudCxcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEF1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgcm9sZTogJ2NvbWJvYm94JyxcbiAgICAgICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ2lzT3BlbigpJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtaGFzcG9wdXBdJzogJ1wibGlzdGJveFwiJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtb3duc10nOiAnaXNPcGVuKCkgPyBcImRyb3Bkb3duLWNvbnRhaW5lci1cIiArIGNvbXBvbmVudElkIDogbnVsbCcsXG4gICAgICAgICcod2luZG93OnJlc2l6ZSknOiAnb25XaW5kb3dSZXNpemUoKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgICBwdWJsaWMgc3VnZ2VzdGlvbnMgPSBpbnB1dDxUW10+KFtdKTtcbiAgICBwdWJsaWMgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIHN1Z2dlc3Rpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XG4gICAgcHVibGljIHN1Z2dlc3Rpb25MYWJlbCA9IGlucHV0PGtleW9mIFQ+KCk7XG4gICAgcHVibGljIHJlYWRvbmx5ID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBlbXB0eU1lc3NhZ2UgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIGRlbGF5ID0gaW5wdXQoMzAwKTtcbiAgICBwdWJsaWMgaW52YWxpZCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gaW5wdXQoMzcpO1xuICAgIHB1YmxpYyBsYXp5ID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBkcm9wZG93biA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgZm9yY2VTZWxlY3Rpb24gPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIGNoZWNrbWFyayA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIG1pbkxlbmd0aFRvU2VhcmNoID0gaW5wdXQoMSk7XG4gICAgcHVibGljIGlucHV0Q2xhc3MgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgICBwdWJsaWMgZGF0YUtleSA9IGlucHV0PGtleW9mIFQ+KCk7XG5cbiAgICBwdWJsaWMgdmFsdWUgPSBtb2RlbDxUIHwgbnVsbD4oKTtcbiAgICBwdWJsaWMgdmFsdWVzID0gbW9kZWw8VFtdPihbXSk7XG4gICAgcHVibGljIGRpc2FibGVkID0gbW9kZWwoZmFsc2UpO1xuXG4gICAgcHVibGljIGxhenlMb2FkID0gb3V0cHV0PHsgcXVlcnk6IHN0cmluZzsgcmVzcG9uc2U6IChkYXRhOiBUW10pID0+IHZvaWQgfT4oKTtcbiAgICBwdWJsaWMgc2VsZWN0ZWQgPSBvdXRwdXQ8VD4oKTtcbiAgICBwdWJsaWMgdW5zZWxlY3RlZCA9IG91dHB1dDxUPigpO1xuICAgIHB1YmxpYyBibHVycmVkID0gb3V0cHV0PEV2ZW50PigpO1xuICAgIHB1YmxpYyBjbGVhcmVkID0gb3V0cHV0KCk7XG4gICAgcHVibGljIGtleVVwID0gb3V0cHV0PEV2ZW50PigpO1xuICAgIHB1YmxpYyBmb2N1c2VkID0gb3V0cHV0PGFueT4oKTtcbiAgICBwdWJsaWMgY29tcGxldGVNZXRob2QgPSBvdXRwdXQ8eyBxdWVyeTogc3RyaW5nIH0+KCk7XG5cbiAgICBwdWJsaWMgZm9jdXNlZEluZGV4ID0gc2lnbmFsKC0xKTtcbiAgICBwdWJsaWMgaXNPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwdWJsaWMgZmlsdGVyZWRTdWdnZXN0aW9ucyA9IHNpZ25hbDxTdWdnZXN0aW9uV3JhcHBlcjxUPltdPihbXSk7XG4gICAgcHVibGljIHNob3dFbXB0eU1lc3NhZ2UgPSBzaWduYWwoZmFsc2UpO1xuICAgIHB1YmxpYyBmaWx0ZXJUZXh0ID0gc2lnbmFsKCcnKTtcbiAgICBwdWJsaWMgaW5wdXRWYWx1ZSA9IHNpZ25hbCgnJyk7XG4gICAgcHVibGljIGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgcHVibGljIGNvbXBvbmVudElkID0gYGF1dG9jb21wbGV0ZV8ke0F1dG9jb21wbGV0ZUNvbXBvbmVudC5uZXh0SWQrK31gO1xuICAgIHB1YmxpYyBpbnB1dEVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdpbnB1dEVsJyk7XG5cbiAgICBwcml2YXRlIF9pbnB1dFN1YmplY3QkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgX2xhenlMb2FkU3ViamVjdCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIF9vbkNoYW5nZT86ICh2YWx1ZTogYW55IHwgYW55W10pID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkPzogKCkgPT4gdm9pZDtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHF1ZSByZXRvcm5hIHVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGRvIHRpcG8gYFN1Z2dlc3Rpb25XcmFwcGVyPFQ+YCxcbiAgICAgKiBhZGljaW9uYW5kbyB1bSBpZGVudGlmaWNhZG9yIMO6bmljbyBhIGNhZGEgc3VnZXN0w6NvLlxuICAgICAqIEByZXR1cm5zIFVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIHByb2Nlc3NhZGFzIGNvbSBpZGVudGlmaWNhZG9yZXMgw7puaWNvcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW50ZXJuYWxTdWdnZXN0aW9uID0gY29tcHV0ZWQ8U3VnZ2VzdGlvbldyYXBwZXI8VD5bXT4oKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5zdWdnZXN0aW9ucygpO1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkSWRUb1N1Z2dlc3Rpb25zKG9wdHMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSB1bSBjb25qdW50byAoYFNldGApIGNvbSBvcyBJRHMgZGFzIHN1Z2VzdMO1ZXMgc2VsZWNpb25hZGFzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZFN1Z2dlc3Rpb25JZHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdGhpcy52YWx1ZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFNldChcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU3VnZ2VzdGlvbigpLmZpbmQoKHMpID0+IEpTT04uc3RyaW5naWZ5KHMuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk/LmlkO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIHVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGZpbHRyYWRhcywgZW5yaXF1ZWNpZGFzIGNvbSBhIHByb3ByaWVkYWRlIGBpc1NlbGVjdGVkYC5cbiAgICAgKiBDYWRhIHN1Z2VzdMOjbyByZWNlYmUgdW0gY2FtcG8gYm9vbGVhbm8gYGlzU2VsZWN0ZWRgIGluZGljYW5kbyBzZSBlbGEgZXN0w6Egc2VsZWNpb25hZGEsXG4gICAgICogY29tIGJhc2Ugbm9zIElEcyBkYXMgc3VnZXN0w7VlcyBzZWxlY2lvbmFkYXMgZSBubyB2YWxvciBkYSBzdWdlc3TDo28uXG4gICAgICogQHJldHVybnMgVW1hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLCBjYWRhIHVtYSBjb20gYSBwcm9wcmllZGFkZSBhZGljaW9uYWwgYGlzU2VsZWN0ZWRgLlxuICAgICAqL1xuICAgIHB1YmxpYyBlbnJpY2hlZEZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JZHMoKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVyZWQubWFwKChzdWdnZXN0aW9uKSA9PiAoe1xuICAgICAgICAgICAgLi4uc3VnZ2VzdGlvbixcbiAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkSWRzLmhhcyhzdWdnZXN0aW9uLmlkKSxcbiAgICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5wdXRzKCk7XG4gICAgICAgIHRoaXMuX3NldHVwSW5wdXREZWJvdW5jZSgpO1xuICAgICAgICB0aGlzLl9zZXR1cExhenlMb2FkRGVib3VuY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyB2YWxvciBkbyBhdXRvY29tcGxldGUuXG4gICAgICogQHBhcmFtIHZhbHVlIFZhbG9yIGEgc2VyIGRlZmluaWRvLCDDum5pY28gb3UgYXJyYXksIGNvbmZvcm1lIHNlbGXDp8OjbyBtw7psdGlwbGEuXG4gICAgICogQHRocm93cyBTZSBtw7psdGlwbG8gZm9yIGZhbHNvIGUgdmFsdWUgZm9yIGFycmF5LlxuICAgICAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBUIHwgVFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25MYWJlbCA9IHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCk7XG5cbiAgICAgICAgaWYgKHZhbHVlICYmIHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgbXVzdCBub3QgYmUgYW4gYXJyYXkgd2hlbiBtdWx0aXBsZSBpcyBmYWxzZS4nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQodmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCF2YWx1ZSA/ICcnIDogc3VnZ2VzdGlvbkxhYmVsID8gU3RyaW5nKHZhbHVlW3N1Z2dlc3Rpb25MYWJlbF0pIDogU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgc2VtcHJlIHF1ZSBvIHZhbG9yIGRvIGNvbXBvbmVudGUgbXVkYXIuXG4gICAgICogQHBhcmFtIG9uQ2hhbmdlIEZ1bsOnw6NvIGEgc2VyIGNoYW1hZGEgcXVhbmRvIG8gdmFsb3IgbXVkYXIuIFJlY2ViZSBvIG5vdm8gdmFsb3IgY29tbyBhcmd1bWVudG8sIHF1ZSBwb2RlIHNlciB1bSDDum5pY28gdmFsb3Igb3UgdW0gYXJyYXkgZGUgdmFsb3Jlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBhbnkgfCBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciB0b2NhZG8gKHBlcmRlciBvIGZvY28pLlxuICAgICAqIEBwYXJhbSBvblRvdWNoZWQgRnVuw6fDo28gZGUgY2FsbGJhY2sgYSBzZXIgY2hhbWFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciB0b2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gZXN0YWRvIGRlIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCBJbmRpY2Egc2UgbyBjb21wb25lbnRlIGRldmUgc2VyIGRlc2FiaWxpdGFkbyAoYHRydWVgKSBvdSBoYWJpbGl0YWRvIChgZmFsc2VgKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZT8oZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoZGlzYWJsZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIGVudHJhZGEgZG8gdXN1w6FyaW8gbm8gY2FtcG8gZGUgdGV4dG8gZG8gYXV0b2NvbXBsZXRlLlxuICAgICAqIEVzdGUgbcOpdG9kbyDDqSBjaGFtYWRvIHNlbXByZSBxdWUgbyB1c3XDoXJpbyBkaWdpdGEgYWxnbyBubyBjYW1wbyBkZSBlbnRyYWRhLlxuICAgICAqIEVsZSBleGVjdXRhIGFzIHNlZ3VpbnRlcyBhw6fDtWVzOlxuICAgICAqIC0gRGlzcGFyYSBvIGNhbGxiYWNrIGRlIFwidG91Y2hlZFwiIHBhcmEgY29udHJvbGUgZGUgZm9ybXVsw6FyaW9zLlxuICAgICAqIC0gT2J0w6ltIG8gdmFsb3IgYXR1YWwgZG8gY2FtcG8gZGUgZW50cmFkYS5cbiAgICAgKiAtIFNlIG8gbW9kbyBsYXp5IGVzdGl2ZXIgYXRpdmFkbywgZW1pdGUgbyBldmVudG8gZGUgbGF6eUxvYWQgY29tIGEgY29uc3VsdGEgZSBhYnJlIG8gcGFpbmVsIGRlIHN1Z2VzdMO1ZXMuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGF0dWFsaXphIG8gdGV4dG8gZGUgZmlsdHJvLCBub3RpZmljYSBvcyBvYnNlcnZhZG9yZXMgZSBhYnJlIG8gcGFpbmVsIGRlIHN1Z2VzdMO1ZXMgc2UgaG91dmVyIHN1Z2VzdMO1ZXMgZGlzcG9uw612ZWlzLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGUgZW50cmFkYSBkbyB0aXBvIGBFdmVudGAgcHJvdmVuaWVudGUgZG8gY2FtcG8gZGUgdGV4dG8uXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZD8uKCk7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLmxhenkoKSkge1xuICAgICAgICAgICAgdGhpcy5fbGF6eUxvYWRTdWJqZWN0JC5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyVGV4dC5zZXQodmFsdWUpO1xuXG4gICAgICAgIHRoaXMuY29tcGxldGVNZXRob2QuZW1pdCh7IHF1ZXJ5OiB2YWx1ZSB9KTtcblxuICAgICAgICB0aGlzLl9pbnB1dFN1YmplY3QkLm5leHQodmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIHBlcmRhIGRlIGZvY28gKGJsdXIpIGRvIGNhbXBvIGRlIGVudHJhZGEgZG8gYXV0b2NvbXBsZXRlLlxuICAgICAqIEVzdGUgbcOpdG9kbyB2ZXJpZmljYSBzZSBvIHZhbG9yIGRpZ2l0YWRvIHBlbG8gdXN1w6FyaW8gY29ycmVzcG9uZGUgZXhhdGFtZW50ZSBhIGFsZ3VtIGRvcyBpdGVucyBzdWdlcmlkb3MuXG4gICAgICogLSBTZSBob3V2ZXIgY29ycmVzcG9uZMOqbmNpYTpcbiAgICAgKiAgIC0gTm8gbW9kbyBtw7psdGlwbG8gKGBtdWx0aXBsZWApLCBhZGljaW9uYSBvIGl0ZW0gc2VsZWNpb25hZG8gw6AgbGlzdGEgZGUgdmFsb3JlcywgY2FzbyBhaW5kYSBuw6NvIGVzdGVqYSBwcmVzZW50ZS5cbiAgICAgKiAgIC0gTm8gbW9kbyBzaW1wbGVzLCBzZWxlY2lvbmEgbyBpdGVtIGNvcnJlc3BvbmRlbnRlIHNlIGFpbmRhIG7Do28gZXN0aXZlciBzZWxlY2lvbmFkby5cbiAgICAgKiAtIFNlIG7Do28gaG91dmVyIGNvcnJlc3BvbmTDqm5jaWEsIGxpbXBhIG8gY2FtcG8gZGUgZW50cmFkYS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dEJsdXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBTdHJpbmcodGhpcy5pbnB1dFZhbHVlKCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gdGhpcy5pbnRlcm5hbFN1Z2dlc3Rpb24oKTtcblxuICAgICAgICBjb25zdCBtYXRjaCA9IHN1Z2dlc3Rpb25zLmZpbmQoKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCkgPyBkYXRhW3RoaXMuc3VnZ2VzdGlvbkxhYmVsKCkhXSA6IGRhdGE7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpID09PSBpbnB1dFZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSBjdXJyZW50VmFsdWVzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpID8gdmFsdWVbdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogdmFsdWUpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VnZ2VzdGlvblZhbHVlKCkgPyBtYXRjaC5kYXRhW3RoaXMuc3VnZ2VzdGlvblZhbHVlKCkhXSA6IG1hdGNoLmRhdGEpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFsuLi5jdXJyZW50VmFsdWVzLCBtYXRjaC5kYXRhXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZS5zZXQoJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSgpICE9PSBtYXRjaC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3VnZ2VzdGlvbihtYXRjaC5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3BhcmEgbyBldmVudG8gZGUgZm9jbyBxdWFuZG8gbyBjYW1wbyBkZSBlbnRyYWRhIHJlY2ViZSBmb2NvLlxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSBmb2NvIGRpc3BhcmFkbyBwZWxvIGVsZW1lbnRvIGRlIGVudHJhZGEuXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXRGb2N1cyhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIGV2ZW50b3MgZGUgdGVjbGFkbyBubyBjb21wb25lbnRlIGRlIGF1dG9jb21wbGV0ZS5cbiAgICAgKiBFc3RlIG3DqXRvZG8gZ2VyZW5jaWEgYSBuYXZlZ2HDp8OjbyBlIHNlbGXDp8OjbyBkZSBzdWdlc3TDtWVzIHVzYW5kbyBhcyB0ZWNsYXMgZG8gdGVjbGFkby5cbiAgICAgKiAtICdBcnJvd0Rvd24nOiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgc3VnZXN0w6NvLlxuICAgICAqIC0gJ0Fycm93VXAnOiBNb3ZlIG8gZm9jbyBwYXJhIGEgc3VnZXN0w6NvIGFudGVyaW9yLlxuICAgICAqIC0gJ0VudGVyJyBvdSAnVGFiJzogU2VsZWNpb25hIGEgc3VnZXN0w6NvIGF0dWFsbWVudGUgZm9jYWRhIGUgZmVjaGEgYSBsaXN0YSBkZSBzdWdlc3TDtWVzLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBzZW0gc2VsZWNpb25hciBuZW5odW0gaXRlbS5cbiAgICAgKiBAcGFyYW0gZXZlbnQgTyBldmVudG8gZGUgdGVjbGFkbyBkaXNwYXJhZG8gcGVsbyB1c3XDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG5cbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkPy4oKTtcblxuICAgICAgICBjb25zdCBfc2VsZWN0U3VnZ2VzdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpID49IDAgJiYgdGhpcy5mb2N1c2VkSW5kZXgoKSA8IHN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0U3VnZ2VzdGlvbihzdWdnZXN0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXNTdWdnZXN0aW9uKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgIF9zZWxlY3RTdWdnZXN0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRlIHVtIGV2ZW50byBxdWFuZG8gdW1hIHRlY2xhIMOpIGxpYmVyYWRhIG5vIGNvbXBvbmVudGUuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gYXNzb2NpYWRvIMOgIHRlY2xhIGxpYmVyYWRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleVVwKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmtleVVwLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZW0gZXZlbnRvcyBkZSByZWRpbWVuc2lvbmFtZW50byBkZSBqYW5lbGEuXG4gICAgICovXG4gICAgcHVibGljIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjaW9uYSB1bWEgc3VnZXN0w6NvIGRhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMuXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gKGBtdWx0aXBsZSgpYCByZXRvcm5hIHRydWUpLCBhZGljaW9uYSBhIHN1Z2VzdMOjbyDDoCBsaXN0YSBkZSBzdWdnZXN0w7VlcyBzZWxlY2lvbmFkYXMsXG4gICAgICogY2FzbyBlbGEgYWluZGEgbsOjbyBlc3RlamEgcHJlc2VudGUuIEVtIHNlZ3VpZGEsIGxpbXBhIG8gdmFsb3IgZG8gY2FtcG8gZGUgZW50cmFkYS5cbiAgICAgKiBTZSBvIG1vZG8gbcO6bHRpcGxvIG7Do28gZXN0aXZlciBhdGl2YWRvLCBkZWZpbmUgYSBzdWdlc3TDo28gY29tbyB2YWxvciBzZWxlY2lvbmFkbyBlIGF0dWFsaXphIG8gY2FtcG8gZGUgZW50cmFkYVxuICAgICAqIGNvbSBvIHLDs3R1bG8gY29ycmVzcG9uZGVudGUuXG4gICAgICogRW0gYW1ib3Mgb3MgY2Fzb3MsIGRpc3BhcmEgbyBjYWxsYmFjayBgX29uQ2hhbmdlYCBjb20gbyBub3ZvIHZhbG9yIGUgZmVjaGEgbyBwYWluZWwgZGUgc3VnZXN0w7Vlcy5cbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiAtIEEgc3VnZXN0w6NvIGEgc2VyIHNlbGVjaW9uYWRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IFQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlcyA9IHRoaXMudmFsdWVzKCk7XG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSBjdXJyZW50VmFsdWVzLnNvbWUoXG4gICAgICAgICAgICAgICAgKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAodGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHZhbHVlW3RoaXMuc3VnZ2VzdGlvblZhbHVlKCkhXSA6IHZhbHVlKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VnZ2VzdGlvblZhbHVlKCkgPyBzdWdnZXN0aW9uW3RoaXMuc3VnZ2VzdGlvblZhbHVlKCkhXSA6IHN1Z2dlc3Rpb24pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoWy4uLmN1cnJlbnRWYWx1ZXMsIHN1Z2dlc3Rpb25dKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZT8uKHRoaXMudmFsdWVzKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KHN1Z2dlc3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgX3ZhbHVlID0gdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogc3VnZ2VzdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IF9pbnB1dFZhbHVlID0gU3RyaW5nKHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCkgPyBzdWdnZXN0aW9uW3RoaXMuc3VnZ2VzdGlvbkxhYmVsKCkhXSA6IHN1Z2dlc3Rpb24pO1xuXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KF9pbnB1dFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4oX3ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChzdWdnZXN0aW9uKTtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGNvbXBvbmVudGUgZGUgYXV0b2NvbXBsZXRlLlxuICAgICAqIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvLCByZW1vdmUgdG9kb3Mgb3MgdmFsb3JlcyBzZWxlY2lvbmFkb3MuXG4gICAgICogQ2FzbyBjb250csOhcmlvLCBkZWZpbmUgbyB2YWxvciBjb21vIG51bG8uXG4gICAgICogVGFtYsOpbSBsaW1wYSBhcyBzdWdlc3TDtWVzIGZpbHRyYWRhcywgZmVjaGEgbyBwYWluZWwgZGUgc3VnZXN0w7Vlc1xuICAgICAqIGUgbGltcGEgbyB2YWxvciBkbyBjYW1wbyBkZSBlbnRyYWRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5zZXQoW10pO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcbiAgICAgICAgdGhpcy5jbGVhcmVkLmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIGEgZXhpYmnDp8OjbyBkbyBkcm9wZG93biBkZSBzdWdlc3TDtWVzIGRvIGF1dG9jb21wbGV0ZS5cbiAgICAgKiBFc3RlIG3DqXRvZG8gY29uZmlndXJhIG8gZGVib3VuY2UgZG8gaW5wdXQsIHZlcmlmaWNhIHNlIGjDoSBzdWdlc3TDtWVzIGZpbHRyYWRhc1xuICAgICAqIGUsIGNhc28gbsOjbyBoYWphIHN1Z2VzdMO1ZXMgZSBvIHRleHRvIGRvIGZpbHRybyBlc3RlamEgdmF6aW8sIHJlZGVmaW5lIGFzIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLlxuICAgICAqIFBvciBmaW0sIGFsdGVybmEgbyBlc3RhZG8gZGUgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZURyb3Bkb3duKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZXR1cElucHV0RGVib3VuY2UoKTtcblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJUZXh0KCkgPT09ICcnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXp5KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXp5TG9hZFN1YmplY3QkLm5leHQoJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsdGVyZWRTdWdnZXN0aW9ucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KCF0aGlzLmlzT3BlbigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW7Dp8OjbyB1dGlsaXphZGEgcGFyYSBvdGltaXphciBhIHJlbmRlcml6YcOnw6NvIGRlIGxpc3RhcyBubyBBbmd1bGFyLCBwZXJtaXRpbmRvIHF1ZSBvIGZyYW1ld29ya1xuICAgICAqIGlkZW50aWZpcXVlIGNhZGEgaXRlbSBkZSBmb3JtYSDDum5pY2EgcGVsbyBzZXUgYGlkYC4gRGV2ZSBzZXIgdXRpbGl6YWRhIGNvbW8gZnVuw6fDo28gZGUgYHRyYWNrQnlgXG4gICAgICogZW0gZGlyZXRpdmFzIGNvbW8gYCpuZ0ZvcmAuXG4gICAgICogQHBhcmFtIF8gLSDDjW5kaWNlIGRvIGl0ZW0gbmEgbGlzdGEgKG7Do28gdXRpbGl6YWRvKS5cbiAgICAgKiBAcGFyYW0gaXRlbSAtIE9iamV0byBkbyB0aXBvIGBTdWdnZXN0aW9uV3JhcHBlcjxUPmAgcXVlIHJlcHJlc2VudGEgbyBpdGVtIGF0dWFsLlxuICAgICAqIEByZXR1cm5zIE8gaWRlbnRpZmljYWRvciDDum5pY28gKGBpZGApIGRvIGl0ZW0uXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHVtYSBzdWdlc3TDo28gZGEgbGlzdGEgZGUgdmFsb3JlcyBzZWxlY2lvbmFkb3MuXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb24gTyBpdGVtIGEgc2VyIHJlbW92aWRvIGRhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdWdnZXN0aW9uVmFsdWUgPSB0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpO1xuXG4gICAgICAgIHRoaXMudmFsdWVzLnNldChcbiAgICAgICAgICAgIHRoaXMudmFsdWVzKCkuZmlsdGVyKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlW3N1Z2dlc3Rpb25WYWx1ZV0gIT09IHN1Z2dlc3Rpb25bc3VnZ2VzdGlvblZhbHVlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBzdWdnZXN0aW9uO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XG4gICAgICAgIHRoaXMudW5zZWxlY3RlZC5lbWl0KHN1Z2dlc3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlaW5pY2lhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXG4gICAgICogU2UgbyBtb2RvIGxhenkgZXN0aXZlciBhdGl2YWRvLCBlbWl0ZSB1bSBldmVudG8gcGFyYSBjYXJyZWdhciBzdWdlc3TDtWVzIGNvbSB1bWEgY29uc3VsdGEgdmF6aWEuXG4gICAgICogRW0gc2VndWlkYSwgcmVkZWZpbmUgYXMgc3VnZXN0w7VlcyBmaWx0cmFkYXMgcGFyYSBvIHZhbG9yIHJldG9ybmFkbyBwb3IgYGludGVybmFsU3VnZ2VzdGlvbigpYC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5sYXp5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhenlMb2FkU3ViamVjdCQubmV4dCgnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KHRoaXMuaW50ZXJuYWxTdWdnZXN0aW9uKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIHN1Z2VzdMOjbyBuYSBsaXN0YSBkZSBzdWdlc3TDtWVzLCBzZSBob3V2ZXIuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbnMgTGlzdGEgZGUgc3VnZXN0w7VlcyBkaXNwb27DrXZlaXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNOZXh0U3VnZ2VzdGlvbihzdWdnZXN0aW9uczogU3VnZ2VzdGlvbldyYXBwZXI8VD5bXSk6IHZvaWQge1xuICAgICAgICBsZXQgbmV4dEluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSArIDE7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IHN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRTdWdnZXN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgc3VnZXN0w6NvIGFudGVyaW9yIG5hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMsIHNlIGhvdXZlci5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzUHJldmlvdXNTdWdnZXN0aW9uKCk6IHZvaWQge1xuICAgICAgICBsZXQgcHJldkluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSAtIDE7XG5cbiAgICAgICAgaWYgKHByZXZJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQocHJldkluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZFN1Z2dlc3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvbGEgYSBsaXN0YSBkZSBzdWdlc3TDtWVzIHBhcmEgZ2FyYW50aXIgcXVlIGEgc3VnZXN0w6NvIGF0dWFsbWVudGUgZm9jYWRhIGVzdGVqYSB2aXPDrXZlbC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3Njcm9sbFRvRm9jdXNlZFN1Z2dlc3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKClbdGhpcy5mb2N1c2VkSW5kZXgoKV0/LmlkO1xuXG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbD8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkaWNpb25hIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvIGEgY2FkYSBzdWdlc3TDo28gZm9ybmVjaWRhLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb25zIC0gVW0gYXJyYXkgZGUgc3VnZXN0w7VlcyBkbyB0aXBvIFQuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgb2JqZXRvcyBgU3VnZ2VzdGlvbldyYXBwZXI8VD5gLCBjYWRhIHVtIGNvbnRlbmRvIGEgc3VnZXN0w6NvIG9yaWdpbmFsIGUgdW0gaWRlbnRpZmljYWRvciDDum5pY28uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYWRkSWRUb1N1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zOiBUW10pOiBTdWdnZXN0aW9uV3JhcHBlcjxUPltdIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPy5tYXAoKHN1Z2dlc3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBzdWdnZXN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5kYXRhS2V5KClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nKHN1Z2dlc3Rpb25bdGhpcy5kYXRhS2V5KCkhXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKCh0eXBlb2Ygc3VnZ2VzdGlvbiAhPT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3VnZ2VzdGlvbj8udG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBPYmplY3QudmFsdWVzKHN1Z2dlc3Rpb24gYXMgT2JqZWN0KS5qb2luKCdfJykpID8/ICcnKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkgPz8gW11cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmEgbyBkZWJvdW5jZSBlIHN3aXRjaE1hcCBwYXJhIGxhenkgbG9hZGluZywgcmVzb2x2ZW5kbyByYWNlIGNvbmRpdGlvbnMuXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgc3dpdGNoTWFwIHBhcmEgY2FuY2VsYXIgcmVxdWlzacOnw7VlcyBhbnRlcmlvcmVzIGF1dG9tYXRpY2FtZW50ZVxuICAgICAqIHF1YW5kbyB1bWEgbm92YSBidXNjYSDDqSBpbmljaWFkYSwgZXZpdGFuZG8gcXVlIHJlc3VsdGFkb3MgYW50aWdvcyBzb2JyZXNjcmV2YW1cbiAgICAgKiByZXN1bHRhZG9zIG1haXMgcmVjZW50ZXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXR1cExhenlMb2FkRGVib3VuY2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2xhenlMb2FkU3ViamVjdCRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlbGF5KCkpLFxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKChxdWVyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBNYW50ZXIgZmVjaGFkbyBvIGRyb3Bkb3duZCBhdMOpIGEgYnVzY2EgZXN0aXZlciBjb25jbHXDrWRhXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxUW10+KChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKCdMYXp5IGxvYWQgdGltZW91dCcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAzMDAwMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQ2FsbGJhY2sgPSAoZGF0YTogVFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkLmVtaXQoeyBxdWVyeSwgcmVzcG9uc2U6IHJlc3BvbnNlQ2FsbGJhY2sgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IChkYXRhOiBUW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFicmlyIG8gZHJvcGRvd24gc29tZW50ZSBhcXVpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRTdWdnZXN0aW9ucyA9IHRoaXMuX2FkZElkVG9TdWdnZXN0aW9ucyhkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLnNldCh3cmFwcGVkU3VnZ2VzdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dFbXB0eU1lc3NhZ2Uuc2V0KHdyYXBwZWRTdWdnZXN0aW9ucy5sZW5ndGggPT09IDApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQWJyaXIgbyBkcm9wZG93biBzb21lbnRlIGFxdWlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTGF6eSBsb2FkIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLnNldChbXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0VtcHR5TWVzc2FnZS5zZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYSBvIGRlYm91bmNlIHBhcmEgbyBpbnB1dCBkbyBhdXRvY29tcGxldGUuXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgdW0gU3ViamVjdCBwYXJhIGVzY3V0YXIgYXMgbXVkYW7Dp2FzIG5vIHZhbG9yIGRvIGlucHV0LFxuICAgICAqIGFwbGljYW5kbyB1bSBkZWJvdW5jZSBjb20gbyB0ZW1wbyBkZWZpbmlkbyBwb3IgYHRoaXMuZGVsYXkoKWAuIFF1YW5kbyB1bSBub3ZvIHZhbG9yIMOpIGVtaXRpZG86XG4gICAgICogLSBTZSBob3V2ZXIgdmFsb3IsIGZpbHRyYSBhcyBzdWdlc3TDtWVzIGNvbSBiYXNlIG5vIHRleHRvIGRpZ2l0YWRvIGUgYXR1YWxpemEgYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiAtIFNlIG7Do28gaG91dmVyIHZhbG9yIGUgbyBkcm9wZG93biBlc3RpdmVyIGF0aXZvLCByZXNldGEgYXMgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGxpbXBhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXG4gICAgICogVGFtYsOpbSBhdHVhbGl6YSBvIGVzdGFkbyBkYSBtZW5zYWdlbSBkZSBsaXN0YSB2YXppYSBlLCBzZSBhIHNlbGXDp8OjbyBmb3IgbGl2cmUgKGBmb3JjZVNlbGVjdGlvbmAgZm9yIGZhbHNvKSxcbiAgICAgKiBwcm9wYWdhIGEgbXVkYW7Dp2EgZGUgdmFsb3IgcGFyYSBvIGZvcm11bMOhcmlvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0dXBJbnB1dERlYm91bmNlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pbnB1dFN1YmplY3QkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWxheSgpKSxcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgIGZpbHRlcigodmFsdWUpID0+IHZhbHVlLmxlbmd0aCA+PSB0aGlzLm1pbkxlbmd0aFRvU2VhcmNoKCkgfHwgdmFsdWUubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFN1Z2dlc3Rpb24oKS5maWx0ZXIoKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBTdHJpbmcodGhpcy5zdWdnZXN0aW9uTGFiZWwoKSA/IGRhdGFbdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSFdIDogZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RW1wdHlNZXNzYWdlLnNldCh0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPT09IDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcm9wZG93bigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLnNldChbXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZvcmNlU2VsZWN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2U/Lih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhIGFzIGVudHJhZGFzIGRvIGNvbXBvbmVudGUgZGUgYXV0b2NvbXBsZXRlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHRocm93cyB7RXJyb3J9IFNlIGFzIHN1Z2VzdMO1ZXMgZm9yZW0gb2JqZXRvcyBlIGBzdWdnZXN0aW9uTGFiZWxgIG7Do28gZm9yIGZvcm5lY2lkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIF92YWxpZGF0ZUlucHV0cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSB0aGlzLnN1Z2dlc3Rpb25zKCk7XG5cbiAgICAgICAgaWYgKCFzdWdnZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc09iamVjdFN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnMuc29tZShcbiAgICAgICAgICAgIChzdWdnZXN0aW9uKSA9PiB0eXBlb2Ygc3VnZ2VzdGlvbiA9PT0gJ29iamVjdCcgJiYgc3VnZ2VzdGlvbiAhPT0gbnVsbCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaGFzT2JqZWN0U3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHN1Z2dlc3Rpb25MYWJlbCBpbnB1dCBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gc3VnZ2VzdGlvbnMgYXJlIG9iamVjdHMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgI2NvbnRhaW5lckRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwiZmxleCBoLVszNXB4XSB3LWZ1bGwgaXRlbXMtY2VudGVyIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVs0cHhdIGJvcmRlciBmb2N1cy13aXRoaW46Ym9yZGVyLTIgZm9jdXMtd2l0aGluOmJvcmRlci1wcmltYXJ5IGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgW2NsYXNzXT1cImlucHV0Q2xhc3MoKVwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAncG9pbnRlci1ldmVudHMtbm9uZSBib3JkZXItZ3JheXNjYWxlLTIwIGJnLWdyYXlzY2FsZS01IHRleHQtZ3JheXNjYWxlLTMwJzogZGlzYWJsZWQoKSxcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzLWF1dG8gYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtMCB0ZXh0LWdyYXlzY2FsZS05MCc6ICFkaXNhYmxlZCgpLFxuICAgICAgICAnYm9yZGVyLWNyaXRpY2FsaXR5LXJlZCc6IGludmFsaWQoKSxcbiAgICB9XCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWdyb3cgZ2FwLTIgcHgtMlwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdib3JkZXItcic6IGRyb3Bkb3duKCksXG4gICAgICAgICAgICAnYm9yZGVyLWdyYXlzY2FsZS0yMCc6IGRyb3Bkb3duKCkgJiYgZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICdib3JkZXItZ3JheXNjYWxlLTMwIGZvY3VzLXdpdGhpbjpib3JkZXItci0yIGZvY3VzLXdpdGhpbjpib3JkZXItci1wcmltYXJ5JzogZHJvcGRvd24oKSAmJiAhZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICdiZy1ncmF5c2NhbGUtNSc6IGRpc2FibGVkKCksXG4gICAgICAgICAgICAnYmctZ3JheXNjYWxlLTAnOiAhZGlzYWJsZWQoKSxcbiAgICAgICAgfVwiXG4gICAgPlxuICAgICAgICBAaWYgKG11bHRpcGxlKCkgJiYgdmFsdWVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKHN1Z2dlc3Rpb24gb2YgdmFsdWVzKCk7IHRyYWNrIHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtYXV0b2NvbXBsZXRlLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdWdnZXN0aW9uXT1cInN1Z2dlc3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N1Z2dlc3Rpb25MYWJlbF09XCJzdWdnZXN0aW9uTGFiZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc3VnZ2VzdGlvblJlbW92ZWQpPVwicmVtb3ZlU3VnZ2VzdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1hdXRvY29tcGxldGUtY2hpcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNpbnB1dEVsXG4gICAgICAgICAgICBjbGFzcz1cIm1pbi1oLVszNXB4XSBncm93IG91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIoKSA/PyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnR5cGVfdG9fc2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0VmFsdWVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYXV0b2NvbXBsZXRlXT1cIm11bHRpcGxlKCkgPyAnbGlzdCcgOiAnYm90aCdcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImZvY3VzZWRJbmRleCgpID49IDAgPyBmaWx0ZXJlZFN1Z2dlc3Rpb25zKClbZm9jdXNlZEluZGV4KCldLmlkIDogbnVsbFwiXG4gICAgICAgICAgICByb2xlPVwic2VhcmNoYm94XCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGtleVVwKT1cIm9uS2V5VXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAoYmx1cik9XCJvbklucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoJGV2ZW50KVwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFuaW1hdGUtc3BpblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBjeD1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN5PVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcj1cIjlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQyOGJjYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI1Ni41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0PVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAaWYgKHZhbHVlKCkgJiYgIXRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC0yXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyKClcIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLXRpbWVzIHRleHQtZ3JheXNjYWxlLTYwXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGRyb3Bkb3duKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LVszNXB4XSBmbGV4LXNocmluay0wIGZsZXgtZ3Jvdy0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIHRleHQtZ3JheXNjYWxlLTkwXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmEtY2FyZXQtZG93bl09XCIhaXNPcGVuKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mYS1jYXJldC11cF09XCJpc09wZW4oKVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cblxuQGlmIChzaG93RW1wdHlNZXNzYWdlKCkgfHwgKGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAwICYmICFyZWFkb25seSgpKSkge1xuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAjZHJvcGRvd25UZW1wbGF0ZVxuICAgICAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuKClcIlxuICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgICAgICAoYmFja2Ryb3BDbGljayk9XCJpc09wZW4uc2V0KGZhbHNlKVwiXG4gICAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgICAgICAoZGV0YWNoKT1cImlzT3Blbi5zZXQoZmFsc2UpXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtpZF09XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgICAgICAgICBjbGFzcz1cIm10LTAuNSByb3VuZGVkLVs0cHhdIGJnLWdyYXlzY2FsZS0wIHB5LTEgc2hhZG93XCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb250YWluZXJEaXYub2Zmc2V0V2lkdGhcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1heC1oLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIFZpcnR1YWwgc2Nyb2xsIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAodmlydHVhbFNjcm9sbCgpICYmIGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwidmlydHVhbFNjcm9sbEl0ZW1TaXplKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1Z2dlc3Rpb24gb2YgZW5yaWNoZWRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gJGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5SWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic3VnZ2VzdGlvbkl0ZW1UZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHN1Z2dlc3Rpb24sIGkgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgLS0+XG4gICAgICAgICAgICAgICAgQGlmICghdmlydHVhbFNjcm9sbCgpIHx8IGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPD0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAoc3VnZ2VzdGlvbiBvZiBlbnJpY2hlZEZpbHRlcmVkU3VnZ2VzdGlvbnMoKTsgdHJhY2sgc3VnZ2VzdGlvbi5pZDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzdWdnZXN0aW9uSXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBzdWdnZXN0aW9uLCBpIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmIChzaG93RW1wdHlNZXNzYWdlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLTMgdGV4dC1ncmF5c2NhbGUtNjBcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlKCkgPz8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ub19yZWNvcmRzX2ZvdW5kJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxufVxuXG48bmctdGVtcGxhdGVcbiAgICAjc3VnZ2VzdGlvbkl0ZW1UZW1wbGF0ZVxuICAgIGxldC1zdWdnZXN0aW9uPVwic3VnZ2VzdGlvblwiXG4gICAgbGV0LWk9XCJpXCJcbj5cbiAgICA8bGlcbiAgICAgICAgW2lkXT1cInN1Z2dlc3Rpb24uaWRcIlxuICAgICAgICBjbGFzcz1cInJvdW5kZWQtc20gZmxleCBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtMyBweS0yIHRleHQtZ3JheXNjYWxlLTcwXCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0xMF09XCJpID09PSBmb2N1c2VkSW5kZXgoKVwiXG4gICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMjBdPVwic3VnZ2VzdGlvbi5pc1NlbGVjdGVkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJzdWdnZXN0aW9uLmlzU2VsZWN0ZWRcIlxuICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbi5kYXRhKVwiXG4gICAgPlxuICAgICAgICBAaWYgKGNoZWNrbWFyaygpICYmIG11bHRpcGxlKCkgJiYgc3VnZ2VzdGlvbi5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhciBmYS1jaGVja1wiPjwvaT5cbiAgICAgICAgfVxuICAgICAgICB7eyBzdWdnZXN0aW9uTGFiZWwoKSA/IHN1Z2dlc3Rpb24uZGF0YVtzdWdnZXN0aW9uTGFiZWwoKSFdIDogc3VnZ2VzdGlvbi5kYXRhIH19XG4gICAgPC9saT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
558
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hdXRvY29tcGxldGUvc3JjL2xpYi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFFVixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNERBQTRELENBQUM7Ozs7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QWtCO3FCQUN4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBTY3JvbGxpbmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBEZXN0cm95UmVmLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgb3V0cHV0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlQ2hpcENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hdXRvY29tcGxldGUtY2hpcC9hdXRvY29tcGxldGUtY2hpcC5jb21wb25lbnQnO1xuXG4vKipcbiAqIFJlcHJlc2VudGEgdW0gaXRlbSBkZSBzdWdlc3TDo28gZW5jYXBzdWxhZG8sIHV0aWxpemFkbyBlbSBjb21wb25lbnRlcyBkZSBhdXRvY29tcGxldGUuXG4gKiBAdGVtcGxhdGUgVCBUaXBvIGRvcyBkYWRvcyBhc3NvY2lhZG9zIMOgIHN1Z2VzdMOjby5cbiAqIEBwcm9wZXJ0eSBkYXRhIE9zIGRhZG9zIGRhIHN1Z2VzdMOjby5cbiAqIEBwcm9wZXJ0eSBpZCBJZGVudGlmaWNhZG9yIMO6bmljbyBkYSBzdWdlc3TDo28uXG4gKiBAcHJvcGVydHkgW2lzU2VsZWN0ZWRdIEluZGljYSBzZSBhIHN1Z2VzdMOjbyBlc3TDoSBzZWxlY2lvbmFkYS5cbiAqL1xuaW50ZXJmYWNlIFN1Z2dlc3Rpb25XcmFwcGVyPFQ+IHtcbiAgICBkYXRhOiBUO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgaXNTZWxlY3RlZD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1hdXRvY29tcGxldGUnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBPdmVybGF5TW9kdWxlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgQXV0b2NvbXBsZXRlQ2hpcENvbXBvbmVudCxcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEF1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgcm9sZTogJ2NvbWJvYm94JyxcbiAgICAgICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ2lzT3BlbigpJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtaGFzcG9wdXBdJzogJ1wibGlzdGJveFwiJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtb3duc10nOiAnaXNPcGVuKCkgPyBcImRyb3Bkb3duLWNvbnRhaW5lci1cIiArIGNvbXBvbmVudElkIDogbnVsbCcsXG4gICAgICAgICcod2luZG93OnJlc2l6ZSknOiAnb25XaW5kb3dSZXNpemUoKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgICBwdWJsaWMgc3VnZ2VzdGlvbnMgPSBpbnB1dDxUW10+KFtdKTtcbiAgICBwdWJsaWMgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIHN1Z2dlc3Rpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XG4gICAgcHVibGljIHN1Z2dlc3Rpb25MYWJlbCA9IGlucHV0PGtleW9mIFQ+KCk7XG4gICAgcHVibGljIHJlYWRvbmx5ID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBlbXB0eU1lc3NhZ2UgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgcHVibGljIGRlbGF5ID0gaW5wdXQoMzAwKTtcbiAgICBwdWJsaWMgaW52YWxpZCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gaW5wdXQoMzcpO1xuICAgIHB1YmxpYyBsYXp5ID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBkcm9wZG93biA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgZm9yY2VTZWxlY3Rpb24gPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIGNoZWNrbWFyayA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIG1pbkxlbmd0aFRvU2VhcmNoID0gaW5wdXQoMSk7XG4gICAgcHVibGljIGlucHV0Q2xhc3MgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgICBwdWJsaWMgZGF0YUtleSA9IGlucHV0PGtleW9mIFQ+KCk7XG5cbiAgICBwdWJsaWMgdmFsdWUgPSBtb2RlbDxUIHwgbnVsbD4oKTtcbiAgICBwdWJsaWMgdmFsdWVzID0gbW9kZWw8VFtdPihbXSk7XG4gICAgcHVibGljIGRpc2FibGVkID0gbW9kZWwoZmFsc2UpO1xuXG4gICAgcHVibGljIGxhenlMb2FkID0gb3V0cHV0PHsgcXVlcnk6IHN0cmluZzsgcmVzcG9uc2U6IChkYXRhOiBUW10pID0+IHZvaWQgfT4oKTtcbiAgICBwdWJsaWMgc2VsZWN0ZWQgPSBvdXRwdXQ8VD4oKTtcbiAgICBwdWJsaWMgdW5zZWxlY3RlZCA9IG91dHB1dDxUPigpO1xuICAgIHB1YmxpYyBibHVycmVkID0gb3V0cHV0PEV2ZW50PigpO1xuICAgIHB1YmxpYyBjbGVhcmVkID0gb3V0cHV0KCk7XG4gICAgcHVibGljIGtleVVwID0gb3V0cHV0PEV2ZW50PigpO1xuICAgIHB1YmxpYyBmb2N1c2VkID0gb3V0cHV0PGFueT4oKTtcbiAgICBwdWJsaWMgY29tcGxldGVNZXRob2QgPSBvdXRwdXQ8eyBxdWVyeTogc3RyaW5nIH0+KCk7XG5cbiAgICBwdWJsaWMgZm9jdXNlZEluZGV4ID0gc2lnbmFsKC0xKTtcbiAgICBwdWJsaWMgaXNPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwdWJsaWMgZmlsdGVyZWRTdWdnZXN0aW9ucyA9IHNpZ25hbDxTdWdnZXN0aW9uV3JhcHBlcjxUPltdPihbXSk7XG4gICAgcHVibGljIHNob3dFbXB0eU1lc3NhZ2UgPSBzaWduYWwoZmFsc2UpO1xuICAgIHB1YmxpYyBmaWx0ZXJUZXh0ID0gc2lnbmFsKCcnKTtcbiAgICBwdWJsaWMgaW5wdXRWYWx1ZSA9IHNpZ25hbCgnJyk7XG4gICAgcHVibGljIGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgcHVibGljIGNvbXBvbmVudElkID0gYGF1dG9jb21wbGV0ZV8ke0F1dG9jb21wbGV0ZUNvbXBvbmVudC5uZXh0SWQrK31gO1xuICAgIHB1YmxpYyBpbnB1dEVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdpbnB1dEVsJyk7XG5cbiAgICBwcml2YXRlIF9pbnB1dFN1YmplY3QkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgX2xhenlMb2FkU3ViamVjdCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIF9vbkNoYW5nZT86ICh2YWx1ZTogYW55IHwgYW55W10pID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkPzogKCkgPT4gdm9pZDtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHF1ZSByZXRvcm5hIHVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGRvIHRpcG8gYFN1Z2dlc3Rpb25XcmFwcGVyPFQ+YCxcbiAgICAgKiBhZGljaW9uYW5kbyB1bSBpZGVudGlmaWNhZG9yIMO6bmljbyBhIGNhZGEgc3VnZXN0w6NvLlxuICAgICAqIEByZXR1cm5zIFVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIHByb2Nlc3NhZGFzIGNvbSBpZGVudGlmaWNhZG9yZXMgw7puaWNvcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW50ZXJuYWxTdWdnZXN0aW9uID0gY29tcHV0ZWQ8U3VnZ2VzdGlvbldyYXBwZXI8VD5bXT4oKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5zdWdnZXN0aW9ucygpO1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkSWRUb1N1Z2dlc3Rpb25zKG9wdHMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSB1bSBjb25qdW50byAoYFNldGApIGNvbSBvcyBJRHMgZGFzIHN1Z2VzdMO1ZXMgc2VsZWNpb25hZGFzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZFN1Z2dlc3Rpb25JZHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdGhpcy52YWx1ZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFNldChcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU3VnZ2VzdGlvbigpLmZpbmQoKHMpID0+IEpTT04uc3RyaW5naWZ5KHMuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk/LmlkO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIHVtYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGZpbHRyYWRhcywgZW5yaXF1ZWNpZGFzIGNvbSBhIHByb3ByaWVkYWRlIGBpc1NlbGVjdGVkYC5cbiAgICAgKiBDYWRhIHN1Z2VzdMOjbyByZWNlYmUgdW0gY2FtcG8gYm9vbGVhbm8gYGlzU2VsZWN0ZWRgIGluZGljYW5kbyBzZSBlbGEgZXN0w6Egc2VsZWNpb25hZGEsXG4gICAgICogY29tIGJhc2Ugbm9zIElEcyBkYXMgc3VnZXN0w7VlcyBzZWxlY2lvbmFkYXMgZSBubyB2YWxvciBkYSBzdWdlc3TDo28uXG4gICAgICogQHJldHVybnMgVW1hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLCBjYWRhIHVtYSBjb20gYSBwcm9wcmllZGFkZSBhZGljaW9uYWwgYGlzU2VsZWN0ZWRgLlxuICAgICAqL1xuICAgIHB1YmxpYyBlbnJpY2hlZEZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JZHMoKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVyZWQubWFwKChzdWdnZXN0aW9uKSA9PiAoe1xuICAgICAgICAgICAgLi4uc3VnZ2VzdGlvbixcbiAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkSWRzLmhhcyhzdWdnZXN0aW9uLmlkKSxcbiAgICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5wdXRzKCk7XG4gICAgICAgIHRoaXMuX3NldHVwSW5wdXREZWJvdW5jZSgpO1xuICAgICAgICB0aGlzLl9zZXR1cExhenlMb2FkRGVib3VuY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyB2YWxvciBkbyBhdXRvY29tcGxldGUuXG4gICAgICogQHBhcmFtIHZhbHVlIFZhbG9yIGEgc2VyIGRlZmluaWRvLCDDum5pY28gb3UgYXJyYXksIGNvbmZvcm1lIHNlbGXDp8OjbyBtw7psdGlwbGEuXG4gICAgICogQHRocm93cyBTZSBtw7psdGlwbG8gZm9yIGZhbHNvIGUgdmFsdWUgZm9yIGFycmF5LlxuICAgICAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBUIHwgVFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25MYWJlbCA9IHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCk7XG5cbiAgICAgICAgaWYgKHZhbHVlICYmIHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgbXVzdCBub3QgYmUgYW4gYXJyYXkgd2hlbiBtdWx0aXBsZSBpcyBmYWxzZS4nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQodmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCF2YWx1ZSA/ICcnIDogc3VnZ2VzdGlvbkxhYmVsID8gU3RyaW5nKHZhbHVlW3N1Z2dlc3Rpb25MYWJlbF0pIDogU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgc2VtcHJlIHF1ZSBvIHZhbG9yIGRvIGNvbXBvbmVudGUgbXVkYXIuXG4gICAgICogQHBhcmFtIG9uQ2hhbmdlIEZ1bsOnw6NvIGEgc2VyIGNoYW1hZGEgcXVhbmRvIG8gdmFsb3IgbXVkYXIuIFJlY2ViZSBvIG5vdm8gdmFsb3IgY29tbyBhcmd1bWVudG8sIHF1ZSBwb2RlIHNlciB1bSDDum5pY28gdmFsb3Igb3UgdW0gYXJyYXkgZGUgdmFsb3Jlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBhbnkgfCBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciB0b2NhZG8gKHBlcmRlciBvIGZvY28pLlxuICAgICAqIEBwYXJhbSBvblRvdWNoZWQgRnVuw6fDo28gZGUgY2FsbGJhY2sgYSBzZXIgY2hhbWFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciB0b2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gZXN0YWRvIGRlIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCBJbmRpY2Egc2UgbyBjb21wb25lbnRlIGRldmUgc2VyIGRlc2FiaWxpdGFkbyAoYHRydWVgKSBvdSBoYWJpbGl0YWRvIChgZmFsc2VgKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZT8oZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoZGlzYWJsZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIGVudHJhZGEgZG8gdXN1w6FyaW8gbm8gY2FtcG8gZGUgdGV4dG8gZG8gYXV0b2NvbXBsZXRlLlxuICAgICAqIEVzdGUgbcOpdG9kbyDDqSBjaGFtYWRvIHNlbXByZSBxdWUgbyB1c3XDoXJpbyBkaWdpdGEgYWxnbyBubyBjYW1wbyBkZSBlbnRyYWRhLlxuICAgICAqIEVsZSBleGVjdXRhIGFzIHNlZ3VpbnRlcyBhw6fDtWVzOlxuICAgICAqIC0gRGlzcGFyYSBvIGNhbGxiYWNrIGRlIFwidG91Y2hlZFwiIHBhcmEgY29udHJvbGUgZGUgZm9ybXVsw6FyaW9zLlxuICAgICAqIC0gT2J0w6ltIG8gdmFsb3IgYXR1YWwgZG8gY2FtcG8gZGUgZW50cmFkYS5cbiAgICAgKiAtIFNlIG8gbW9kbyBsYXp5IGVzdGl2ZXIgYXRpdmFkbywgZW1pdGUgbyBldmVudG8gZGUgbGF6eUxvYWQgY29tIGEgY29uc3VsdGEgZSBhYnJlIG8gcGFpbmVsIGRlIHN1Z2VzdMO1ZXMuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGF0dWFsaXphIG8gdGV4dG8gZGUgZmlsdHJvLCBub3RpZmljYSBvcyBvYnNlcnZhZG9yZXMgZSBhYnJlIG8gcGFpbmVsIGRlIHN1Z2VzdMO1ZXMgc2UgaG91dmVyIHN1Z2VzdMO1ZXMgZGlzcG9uw612ZWlzLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGUgZW50cmFkYSBkbyB0aXBvIGBFdmVudGAgcHJvdmVuaWVudGUgZG8gY2FtcG8gZGUgdGV4dG8uXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZD8uKCk7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLmxhenkoKSkge1xuICAgICAgICAgICAgdGhpcy5fbGF6eUxvYWRTdWJqZWN0JC5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyVGV4dC5zZXQodmFsdWUpO1xuXG4gICAgICAgIHRoaXMuY29tcGxldGVNZXRob2QuZW1pdCh7IHF1ZXJ5OiB2YWx1ZSB9KTtcblxuICAgICAgICB0aGlzLl9pbnB1dFN1YmplY3QkLm5leHQodmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIHBlcmRhIGRlIGZvY28gKGJsdXIpIGRvIGNhbXBvIGRlIGVudHJhZGEgZG8gYXV0b2NvbXBsZXRlLlxuICAgICAqIEVzdGUgbcOpdG9kbyB2ZXJpZmljYSBzZSBvIHZhbG9yIGRpZ2l0YWRvIHBlbG8gdXN1w6FyaW8gY29ycmVzcG9uZGUgZXhhdGFtZW50ZSBhIGFsZ3VtIGRvcyBpdGVucyBzdWdlcmlkb3MuXG4gICAgICogLSBTZSBob3V2ZXIgY29ycmVzcG9uZMOqbmNpYTpcbiAgICAgKiAgIC0gTm8gbW9kbyBtw7psdGlwbG8gKGBtdWx0aXBsZWApLCBhZGljaW9uYSBvIGl0ZW0gc2VsZWNpb25hZG8gw6AgbGlzdGEgZGUgdmFsb3JlcywgY2FzbyBhaW5kYSBuw6NvIGVzdGVqYSBwcmVzZW50ZS5cbiAgICAgKiAgIC0gTm8gbW9kbyBzaW1wbGVzLCBzZWxlY2lvbmEgbyBpdGVtIGNvcnJlc3BvbmRlbnRlIHNlIGFpbmRhIG7Do28gZXN0aXZlciBzZWxlY2lvbmFkby5cbiAgICAgKiAtIFNlIG7Do28gaG91dmVyIGNvcnJlc3BvbmTDqm5jaWEsIGxpbXBhIG8gY2FtcG8gZGUgZW50cmFkYS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dEJsdXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBTdHJpbmcodGhpcy5pbnB1dFZhbHVlKCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gdGhpcy5pbnRlcm5hbFN1Z2dlc3Rpb24oKTtcblxuICAgICAgICBjb25zdCBtYXRjaCA9IHN1Z2dlc3Rpb25zLmZpbmQoKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCkgPyBkYXRhW3RoaXMuc3VnZ2VzdGlvbkxhYmVsKCkhXSA6IGRhdGE7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpID09PSBpbnB1dFZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSBjdXJyZW50VmFsdWVzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpID8gdmFsdWVbdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogdmFsdWUpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VnZ2VzdGlvblZhbHVlKCkgPyBtYXRjaC5kYXRhW3RoaXMuc3VnZ2VzdGlvblZhbHVlKCkhXSA6IG1hdGNoLmRhdGEpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFsuLi5jdXJyZW50VmFsdWVzLCBtYXRjaC5kYXRhXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZS5zZXQoJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSgpICE9PSBtYXRjaC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3VnZ2VzdGlvbihtYXRjaC5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3BhcmEgbyBldmVudG8gZGUgZm9jbyBxdWFuZG8gbyBjYW1wbyBkZSBlbnRyYWRhIHJlY2ViZSBmb2NvLlxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSBmb2NvIGRpc3BhcmFkbyBwZWxvIGVsZW1lbnRvIGRlIGVudHJhZGEuXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXRGb2N1cyhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIGV2ZW50b3MgZGUgdGVjbGFkbyBubyBjb21wb25lbnRlIGRlIGF1dG9jb21wbGV0ZS5cbiAgICAgKiBFc3RlIG3DqXRvZG8gZ2VyZW5jaWEgYSBuYXZlZ2HDp8OjbyBlIHNlbGXDp8OjbyBkZSBzdWdlc3TDtWVzIHVzYW5kbyBhcyB0ZWNsYXMgZG8gdGVjbGFkby5cbiAgICAgKiAtICdBcnJvd0Rvd24nOiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgc3VnZXN0w6NvLlxuICAgICAqIC0gJ0Fycm93VXAnOiBNb3ZlIG8gZm9jbyBwYXJhIGEgc3VnZXN0w6NvIGFudGVyaW9yLlxuICAgICAqIC0gJ0VudGVyJyBvdSAnVGFiJzogU2VsZWNpb25hIGEgc3VnZXN0w6NvIGF0dWFsbWVudGUgZm9jYWRhIGUgZmVjaGEgYSBsaXN0YSBkZSBzdWdlc3TDtWVzLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBzZW0gc2VsZWNpb25hciBuZW5odW0gaXRlbS5cbiAgICAgKiBAcGFyYW0gZXZlbnQgTyBldmVudG8gZGUgdGVjbGFkbyBkaXNwYXJhZG8gcGVsbyB1c3XDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG5cbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkPy4oKTtcblxuICAgICAgICBjb25zdCBfc2VsZWN0U3VnZ2VzdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpID49IDAgJiYgdGhpcy5mb2N1c2VkSW5kZXgoKSA8IHN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0U3VnZ2VzdGlvbihzdWdnZXN0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXNTdWdnZXN0aW9uKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgIF9zZWxlY3RTdWdnZXN0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRlIHVtIGV2ZW50byBxdWFuZG8gdW1hIHRlY2xhIMOpIGxpYmVyYWRhIG5vIGNvbXBvbmVudGUuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gYXNzb2NpYWRvIMOgIHRlY2xhIGxpYmVyYWRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleVVwKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmtleVVwLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZW0gZXZlbnRvcyBkZSByZWRpbWVuc2lvbmFtZW50byBkZSBqYW5lbGEuXG4gICAgICovXG4gICAgcHVibGljIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjaW9uYSB1bWEgc3VnZXN0w6NvIGRhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMuXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gKGBtdWx0aXBsZSgpYCByZXRvcm5hIHRydWUpLCBhZGljaW9uYSBhIHN1Z2VzdMOjbyDDoCBsaXN0YSBkZSBzdWdnZXN0w7VlcyBzZWxlY2lvbmFkYXMsXG4gICAgICogY2FzbyBlbGEgYWluZGEgbsOjbyBlc3RlamEgcHJlc2VudGUuIEVtIHNlZ3VpZGEsIGxpbXBhIG8gdmFsb3IgZG8gY2FtcG8gZGUgZW50cmFkYS5cbiAgICAgKiBTZSBvIG1vZG8gbcO6bHRpcGxvIG7Do28gZXN0aXZlciBhdGl2YWRvLCBkZWZpbmUgYSBzdWdlc3TDo28gY29tbyB2YWxvciBzZWxlY2lvbmFkbyBlIGF0dWFsaXphIG8gY2FtcG8gZGUgZW50cmFkYVxuICAgICAqIGNvbSBvIHLDs3R1bG8gY29ycmVzcG9uZGVudGUuXG4gICAgICogRW0gYW1ib3Mgb3MgY2Fzb3MsIGRpc3BhcmEgbyBjYWxsYmFjayBgX29uQ2hhbmdlYCBjb20gbyBub3ZvIHZhbG9yIGUgZmVjaGEgbyBwYWluZWwgZGUgc3VnZXN0w7Vlcy5cbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiAtIEEgc3VnZXN0w6NvIGEgc2VyIHNlbGVjaW9uYWRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IFQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlcyA9IHRoaXMudmFsdWVzKCk7XG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSBjdXJyZW50VmFsdWVzLnNvbWUoXG4gICAgICAgICAgICAgICAgKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAodGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHZhbHVlW3RoaXMuc3VnZ2VzdGlvblZhbHVlKCkhXSA6IHZhbHVlKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VnZ2VzdGlvblZhbHVlKCkgPyBzdWdnZXN0aW9uW3RoaXMuc3VnZ2VzdGlvblZhbHVlKCkhXSA6IHN1Z2dlc3Rpb24pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoWy4uLmN1cnJlbnRWYWx1ZXMsIHN1Z2dlc3Rpb25dKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZT8uKHRoaXMudmFsdWVzKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KHN1Z2dlc3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgX3ZhbHVlID0gdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSA/IHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uVmFsdWUoKSFdIDogc3VnZ2VzdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IF9pbnB1dFZhbHVlID0gU3RyaW5nKHRoaXMuc3VnZ2VzdGlvbkxhYmVsKCkgPyBzdWdnZXN0aW9uW3RoaXMuc3VnZ2VzdGlvbkxhYmVsKCkhXSA6IHN1Z2dlc3Rpb24pO1xuXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KF9pbnB1dFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4oX3ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChzdWdnZXN0aW9uKTtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGNvbXBvbmVudGUgZGUgYXV0b2NvbXBsZXRlLlxuICAgICAqIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvLCByZW1vdmUgdG9kb3Mgb3MgdmFsb3JlcyBzZWxlY2lvbmFkb3MuXG4gICAgICogQ2FzbyBjb250csOhcmlvLCBkZWZpbmUgbyB2YWxvciBjb21vIG51bG8uXG4gICAgICogVGFtYsOpbSBsaW1wYSBhcyBzdWdlc3TDtWVzIGZpbHRyYWRhcywgZmVjaGEgbyBwYWluZWwgZGUgc3VnZXN0w7Vlc1xuICAgICAqIGUgbGltcGEgbyB2YWxvciBkbyBjYW1wbyBkZSBlbnRyYWRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5zZXQoW10pO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KCcnKTtcbiAgICAgICAgdGhpcy5jbGVhcmVkLmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIGEgZXhpYmnDp8OjbyBkbyBkcm9wZG93biBkZSBzdWdlc3TDtWVzIGRvIGF1dG9jb21wbGV0ZS5cbiAgICAgKiBFc3RlIG3DqXRvZG8gY29uZmlndXJhIG8gZGVib3VuY2UgZG8gaW5wdXQsIHZlcmlmaWNhIHNlIGjDoSBzdWdlc3TDtWVzIGZpbHRyYWRhc1xuICAgICAqIGUsIGNhc28gbsOjbyBoYWphIHN1Z2VzdMO1ZXMgZSBvIHRleHRvIGRvIGZpbHRybyBlc3RlamEgdmF6aW8sIHJlZGVmaW5lIGFzIHN1Z2VzdMO1ZXMgZmlsdHJhZGFzLlxuICAgICAqIFBvciBmaW0sIGFsdGVybmEgbyBlc3RhZG8gZGUgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZURyb3Bkb3duKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZXR1cElucHV0RGVib3VuY2UoKTtcblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJUZXh0KCkgPT09ICcnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXp5KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXp5TG9hZFN1YmplY3QkLm5leHQoJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsdGVyZWRTdWdnZXN0aW9ucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KCF0aGlzLmlzT3BlbigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW7Dp8OjbyB1dGlsaXphZGEgcGFyYSBvdGltaXphciBhIHJlbmRlcml6YcOnw6NvIGRlIGxpc3RhcyBubyBBbmd1bGFyLCBwZXJtaXRpbmRvIHF1ZSBvIGZyYW1ld29ya1xuICAgICAqIGlkZW50aWZpcXVlIGNhZGEgaXRlbSBkZSBmb3JtYSDDum5pY2EgcGVsbyBzZXUgYGlkYC4gRGV2ZSBzZXIgdXRpbGl6YWRhIGNvbW8gZnVuw6fDo28gZGUgYHRyYWNrQnlgXG4gICAgICogZW0gZGlyZXRpdmFzIGNvbW8gYCpuZ0ZvcmAuXG4gICAgICogQHBhcmFtIF8gLSDDjW5kaWNlIGRvIGl0ZW0gbmEgbGlzdGEgKG7Do28gdXRpbGl6YWRvKS5cbiAgICAgKiBAcGFyYW0gaXRlbSAtIE9iamV0byBkbyB0aXBvIGBTdWdnZXN0aW9uV3JhcHBlcjxUPmAgcXVlIHJlcHJlc2VudGEgbyBpdGVtIGF0dWFsLlxuICAgICAqIEByZXR1cm5zIE8gaWRlbnRpZmljYWRvciDDum5pY28gKGBpZGApIGRvIGl0ZW0uXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHVtYSBzdWdlc3TDo28gZGEgbGlzdGEgZGUgdmFsb3JlcyBzZWxlY2lvbmFkb3MuXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb24gTyBpdGVtIGEgc2VyIHJlbW92aWRvIGRhIGxpc3RhIGRlIHN1Z2VzdMO1ZXMuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdWdnZXN0aW9uVmFsdWUgPSB0aGlzLnN1Z2dlc3Rpb25WYWx1ZSgpO1xuXG4gICAgICAgIHRoaXMudmFsdWVzLnNldChcbiAgICAgICAgICAgIHRoaXMudmFsdWVzKCkuZmlsdGVyKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlW3N1Z2dlc3Rpb25WYWx1ZV0gIT09IHN1Z2dlc3Rpb25bc3VnZ2VzdGlvblZhbHVlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBzdWdnZXN0aW9uO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlPy4odGhpcy52YWx1ZXMoKSk7XG4gICAgICAgIHRoaXMudW5zZWxlY3RlZC5lbWl0KHN1Z2dlc3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlaW5pY2lhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXG4gICAgICogU2UgbyBtb2RvIGxhenkgZXN0aXZlciBhdGl2YWRvLCBlbWl0ZSB1bSBldmVudG8gcGFyYSBjYXJyZWdhciBzdWdlc3TDtWVzIGNvbSB1bWEgY29uc3VsdGEgdmF6aWEuXG4gICAgICogRW0gc2VndWlkYSwgcmVkZWZpbmUgYXMgc3VnZXN0w7VlcyBmaWx0cmFkYXMgcGFyYSBvIHZhbG9yIHJldG9ybmFkbyBwb3IgYGludGVybmFsU3VnZ2VzdGlvbigpYC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5sYXp5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhenlMb2FkU3ViamVjdCQubmV4dCgnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KHRoaXMuaW50ZXJuYWxTdWdnZXN0aW9uKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIHN1Z2VzdMOjbyBuYSBsaXN0YSBkZSBzdWdlc3TDtWVzLCBzZSBob3V2ZXIuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbnMgTGlzdGEgZGUgc3VnZXN0w7VlcyBkaXNwb27DrXZlaXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNOZXh0U3VnZ2VzdGlvbihzdWdnZXN0aW9uczogU3VnZ2VzdGlvbldyYXBwZXI8VD5bXSk6IHZvaWQge1xuICAgICAgICBsZXQgbmV4dEluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSArIDE7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IHN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRTdWdnZXN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgc3VnZXN0w6NvIGFudGVyaW9yIG5hIGxpc3RhIGRlIHN1Z2VzdMO1ZXMsIHNlIGhvdXZlci5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzUHJldmlvdXNTdWdnZXN0aW9uKCk6IHZvaWQge1xuICAgICAgICBsZXQgcHJldkluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSAtIDE7XG5cbiAgICAgICAgaWYgKHByZXZJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQocHJldkluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZFN1Z2dlc3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvbGEgYSBsaXN0YSBkZSBzdWdlc3TDtWVzIHBhcmEgZ2FyYW50aXIgcXVlIGEgc3VnZXN0w6NvIGF0dWFsbWVudGUgZm9jYWRhIGVzdGVqYSB2aXPDrXZlbC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3Njcm9sbFRvRm9jdXNlZFN1Z2dlc3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zKClbdGhpcy5mb2N1c2VkSW5kZXgoKV0/LmlkO1xuXG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbD8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkaWNpb25hIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvIGEgY2FkYSBzdWdlc3TDo28gZm9ybmVjaWRhLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHN1Z2dlc3Rpb25zIC0gVW0gYXJyYXkgZGUgc3VnZXN0w7VlcyBkbyB0aXBvIFQuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgb2JqZXRvcyBgU3VnZ2VzdGlvbldyYXBwZXI8VD5gLCBjYWRhIHVtIGNvbnRlbmRvIGEgc3VnZXN0w6NvIG9yaWdpbmFsIGUgdW0gaWRlbnRpZmljYWRvciDDum5pY28uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYWRkSWRUb1N1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zOiBUW10pOiBTdWdnZXN0aW9uV3JhcHBlcjxUPltdIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPy5tYXAoKHN1Z2dlc3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBzdWdnZXN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5kYXRhS2V5KClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nKHN1Z2dlc3Rpb25bdGhpcy5kYXRhS2V5KCkhXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKCh0eXBlb2Ygc3VnZ2VzdGlvbiAhPT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3VnZ2VzdGlvbj8udG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBPYmplY3QudmFsdWVzKHN1Z2dlc3Rpb24gYXMgT2JqZWN0KS5qb2luKCdfJykpID8/ICcnKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkgPz8gW11cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmEgbyBkZWJvdW5jZSBlIHN3aXRjaE1hcCBwYXJhIGxhenkgbG9hZGluZywgcmVzb2x2ZW5kbyByYWNlIGNvbmRpdGlvbnMuXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgc3dpdGNoTWFwIHBhcmEgY2FuY2VsYXIgcmVxdWlzacOnw7VlcyBhbnRlcmlvcmVzIGF1dG9tYXRpY2FtZW50ZVxuICAgICAqIHF1YW5kbyB1bWEgbm92YSBidXNjYSDDqSBpbmljaWFkYSwgZXZpdGFuZG8gcXVlIHJlc3VsdGFkb3MgYW50aWdvcyBzb2JyZXNjcmV2YW1cbiAgICAgKiByZXN1bHRhZG9zIG1haXMgcmVjZW50ZXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXR1cExhenlMb2FkRGVib3VuY2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2xhenlMb2FkU3ViamVjdCRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlbGF5KCkpLFxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKChxdWVyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBNYW50ZXIgZmVjaGFkbyBvIGRyb3Bkb3duZCBhdMOpIGEgYnVzY2EgZXN0aXZlciBjb25jbHXDrWRhXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxUW10+KChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKCdMYXp5IGxvYWQgdGltZW91dCcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAzMDAwMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQ2FsbGJhY2sgPSAoZGF0YTogVFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhenlMb2FkLmVtaXQoeyBxdWVyeSwgcmVzcG9uc2U6IHJlc3BvbnNlQ2FsbGJhY2sgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IChkYXRhOiBUW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFicmlyIG8gZHJvcGRvd24gc29tZW50ZSBhcXVpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRTdWdnZXN0aW9ucyA9IHRoaXMuX2FkZElkVG9TdWdnZXN0aW9ucyhkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLnNldCh3cmFwcGVkU3VnZ2VzdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dFbXB0eU1lc3NhZ2Uuc2V0KHdyYXBwZWRTdWdnZXN0aW9ucy5sZW5ndGggPT09IDApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQWJyaXIgbyBkcm9wZG93biBzb21lbnRlIGFxdWlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTGF6eSBsb2FkIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLnNldChbXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0VtcHR5TWVzc2FnZS5zZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYSBvIGRlYm91bmNlIHBhcmEgbyBpbnB1dCBkbyBhdXRvY29tcGxldGUuXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgdW0gU3ViamVjdCBwYXJhIGVzY3V0YXIgYXMgbXVkYW7Dp2FzIG5vIHZhbG9yIGRvIGlucHV0LFxuICAgICAqIGFwbGljYW5kbyB1bSBkZWJvdW5jZSBjb20gbyB0ZW1wbyBkZWZpbmlkbyBwb3IgYHRoaXMuZGVsYXkoKWAuIFF1YW5kbyB1bSBub3ZvIHZhbG9yIMOpIGVtaXRpZG86XG4gICAgICogLSBTZSBob3V2ZXIgdmFsb3IsIGZpbHRyYSBhcyBzdWdlc3TDtWVzIGNvbSBiYXNlIG5vIHRleHRvIGRpZ2l0YWRvIGUgYXR1YWxpemEgYSBsaXN0YSBkZSBzdWdlc3TDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiAtIFNlIG7Do28gaG91dmVyIHZhbG9yIGUgbyBkcm9wZG93biBlc3RpdmVyIGF0aXZvLCByZXNldGEgYXMgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGxpbXBhIGEgbGlzdGEgZGUgc3VnZXN0w7VlcyBmaWx0cmFkYXMuXG4gICAgICogVGFtYsOpbSBhdHVhbGl6YSBvIGVzdGFkbyBkYSBtZW5zYWdlbSBkZSBsaXN0YSB2YXppYSBlLCBzZSBhIHNlbGXDp8OjbyBmb3IgbGl2cmUgKGBmb3JjZVNlbGVjdGlvbmAgZm9yIGZhbHNvKSxcbiAgICAgKiBwcm9wYWdhIGEgbXVkYW7Dp2EgZGUgdmFsb3IgcGFyYSBvIGZvcm11bMOhcmlvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0dXBJbnB1dERlYm91bmNlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pbnB1dFN1YmplY3QkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWxheSgpKSxcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgIGZpbHRlcigodmFsdWUpID0+IHZhbHVlLmxlbmd0aCA+PSB0aGlzLm1pbkxlbmd0aFRvU2VhcmNoKCkgfHwgdmFsdWUubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMuc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFN1Z2dlc3Rpb24oKS5maWx0ZXIoKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBTdHJpbmcodGhpcy5zdWdnZXN0aW9uTGFiZWwoKSA/IGRhdGFbdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSFdIDogZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RW1wdHlNZXNzYWdlLnNldCh0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPT09IDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcm9wZG93bigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLnNldChbXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZvcmNlU2VsZWN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2U/Lih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhIGFzIGVudHJhZGFzIGRvIGNvbXBvbmVudGUgZGUgYXV0b2NvbXBsZXRlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHRocm93cyB7RXJyb3J9IFNlIGFzIHN1Z2VzdMO1ZXMgZm9yZW0gb2JqZXRvcyBlIGBzdWdnZXN0aW9uTGFiZWxgIG7Do28gZm9yIGZvcm5lY2lkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIF92YWxpZGF0ZUlucHV0cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSB0aGlzLnN1Z2dlc3Rpb25zKCk7XG5cbiAgICAgICAgaWYgKCFzdWdnZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc09iamVjdFN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnMuc29tZShcbiAgICAgICAgICAgIChzdWdnZXN0aW9uKSA9PiB0eXBlb2Ygc3VnZ2VzdGlvbiA9PT0gJ29iamVjdCcgJiYgc3VnZ2VzdGlvbiAhPT0gbnVsbCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaGFzT2JqZWN0U3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdWdnZXN0aW9uTGFiZWwoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHN1Z2dlc3Rpb25MYWJlbCBpbnB1dCBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gc3VnZ2VzdGlvbnMgYXJlIG9iamVjdHMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgI2NvbnRhaW5lckRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwiZmxleCBoLVszNXB4XSB3LWZ1bGwgaXRlbXMtY2VudGVyIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVs0cHhdIGJvcmRlciBmb2N1cy13aXRoaW46Ym9yZGVyLTIgZm9jdXMtd2l0aGluOmJvcmRlci1wcmltYXJ5IGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgW2NsYXNzXT1cImlucHV0Q2xhc3MoKVwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAncG9pbnRlci1ldmVudHMtbm9uZSBib3JkZXItZ3JheXNjYWxlLTIwIGJnLWdyYXlzY2FsZS01IHRleHQtZ3JheXNjYWxlLTMwJzogZGlzYWJsZWQoKSxcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzLWF1dG8gYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtMCB0ZXh0LWdyYXlzY2FsZS05MCc6ICFkaXNhYmxlZCgpLFxuICAgICAgICAnYm9yZGVyLWNyaXRpY2FsaXR5LXJlZCc6IGludmFsaWQoKSxcbiAgICB9XCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWdyb3cgZ2FwLTIgcHgtMlwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdib3JkZXItcic6IGRyb3Bkb3duKCksXG4gICAgICAgICAgICAnYm9yZGVyLWdyYXlzY2FsZS0yMCc6IGRyb3Bkb3duKCkgJiYgZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICdib3JkZXItZ3JheXNjYWxlLTMwIGZvY3VzLXdpdGhpbjpib3JkZXItci0yIGZvY3VzLXdpdGhpbjpib3JkZXItci1wcmltYXJ5JzogZHJvcGRvd24oKSAmJiAhZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICdiZy1ncmF5c2NhbGUtNSc6IGRpc2FibGVkKCksXG4gICAgICAgICAgICAnYmctZ3JheXNjYWxlLTAnOiAhZGlzYWJsZWQoKSxcbiAgICAgICAgfVwiXG4gICAgPlxuICAgICAgICBAaWYgKG11bHRpcGxlKCkgJiYgdmFsdWVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKHN1Z2dlc3Rpb24gb2YgdmFsdWVzKCk7IHRyYWNrIHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtYXV0b2NvbXBsZXRlLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdWdnZXN0aW9uXT1cInN1Z2dlc3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N1Z2dlc3Rpb25MYWJlbF09XCJzdWdnZXN0aW9uTGFiZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc3VnZ2VzdGlvblJlbW92ZWQpPVwicmVtb3ZlU3VnZ2VzdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1hdXRvY29tcGxldGUtY2hpcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNpbnB1dEVsXG4gICAgICAgICAgICBjbGFzcz1cIm1pbi1oLVszNXB4XSBncm93IG91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIoKSA/PyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnR5cGVfdG9fc2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0VmFsdWVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYXV0b2NvbXBsZXRlXT1cIm11bHRpcGxlKCkgPyAnbGlzdCcgOiAnYm90aCdcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImZvY3VzZWRJbmRleCgpID49IDAgPyBmaWx0ZXJlZFN1Z2dlc3Rpb25zKClbZm9jdXNlZEluZGV4KCldLmlkIDogbnVsbFwiXG4gICAgICAgICAgICByb2xlPVwic2VhcmNoYm94XCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGtleVVwKT1cIm9uS2V5VXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAoYmx1cik9XCJvbklucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoJGV2ZW50KVwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFuaW1hdGUtc3BpblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBjeD1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN5PVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcj1cIjlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQyOGJjYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI1Ni41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0PVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAaWYgKHZhbHVlKCkgJiYgIXRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC0yXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyKClcIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLXRpbWVzIHRleHQtZ3JheXNjYWxlLTYwXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGRyb3Bkb3duKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LVszNXB4XSBmbGV4LXNocmluay0wIGZsZXgtZ3Jvdy0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIHRleHQtZ3JheXNjYWxlLTkwXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmEtY2FyZXQtZG93bl09XCIhaXNPcGVuKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mYS1jYXJldC11cF09XCJpc09wZW4oKVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cblxuQGlmIChzaG93RW1wdHlNZXNzYWdlKCkgfHwgKGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAwICYmICFyZWFkb25seSgpKSkge1xuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAjZHJvcGRvd25UZW1wbGF0ZVxuICAgICAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuKClcIlxuICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgICAgICAoYmFja2Ryb3BDbGljayk9XCJpc09wZW4uc2V0KGZhbHNlKVwiXG4gICAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgICAgICAoZGV0YWNoKT1cImlzT3Blbi5zZXQoZmFsc2UpXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtpZF09XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgICAgICAgICBjbGFzcz1cIm10LTAuNSByb3VuZGVkLVs0cHhdIGJnLWdyYXlzY2FsZS0wIHB5LTEgc2hhZG93XCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb250YWluZXJEaXYub2Zmc2V0V2lkdGhcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1heC1oLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIFZpcnR1YWwgc2Nyb2xsIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAodmlydHVhbFNjcm9sbCgpICYmIGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwidmlydHVhbFNjcm9sbEl0ZW1TaXplKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1Z2dlc3Rpb24gb2YgZW5yaWNoZWRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gJGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5SWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic3VnZ2VzdGlvbkl0ZW1UZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHN1Z2dlc3Rpb24sIGkgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgLS0+XG4gICAgICAgICAgICAgICAgQGlmICghdmlydHVhbFNjcm9sbCgpIHx8IGZpbHRlcmVkU3VnZ2VzdGlvbnMoKS5sZW5ndGggPD0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAoc3VnZ2VzdGlvbiBvZiBlbnJpY2hlZEZpbHRlcmVkU3VnZ2VzdGlvbnMoKTsgdHJhY2sgc3VnZ2VzdGlvbi5pZDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzdWdnZXN0aW9uSXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBzdWdnZXN0aW9uLCBpIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmIChzaG93RW1wdHlNZXNzYWdlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLTMgdGV4dC1ncmF5c2NhbGUtNjBcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlKCkgPz8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ub19yZWNvcmRzX2ZvdW5kJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxufVxuXG48bmctdGVtcGxhdGVcbiAgICAjc3VnZ2VzdGlvbkl0ZW1UZW1wbGF0ZVxuICAgIGxldC1zdWdnZXN0aW9uPVwic3VnZ2VzdGlvblwiXG4gICAgbGV0LWk9XCJpXCJcbj5cbiAgICA8bGlcbiAgICAgICAgW2lkXT1cInN1Z2dlc3Rpb24uaWRcIlxuICAgICAgICBjbGFzcz1cInJvdW5kZWQtc20gZmxleCBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtMyBweS0yIHRleHQtZ3JheXNjYWxlLTcwXCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0xMF09XCJpID09PSBmb2N1c2VkSW5kZXgoKVwiXG4gICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMjBdPVwic3VnZ2VzdGlvbi5pc1NlbGVjdGVkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJzdWdnZXN0aW9uLmlzU2VsZWN0ZWRcIlxuICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbi5kYXRhKVwiXG4gICAgPlxuICAgICAgICBAaWYgKGNoZWNrbWFyaygpICYmIG11bHRpcGxlKCkgJiYgc3VnZ2VzdGlvbi5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhciBmYS1jaGVja1wiPjwvaT5cbiAgICAgICAgfVxuICAgICAgICB7eyBzdWdnZXN0aW9uTGFiZWwoKSA/IHN1Z2dlc3Rpb24uZGF0YVtzdWdnZXN0aW9uTGFiZWwoKSFdIDogc3VnZ2VzdGlvbi5kYXRhIH19XG4gICAgPC9saT5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==