@eui/ecl 17.0.0-next.7 → 17.0.0-next.9

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 (417) hide show
  1. package/assets/i18n-ecl/bg.json +1 -0
  2. package/assets/i18n-ecl/cs.json +1 -0
  3. package/assets/i18n-ecl/da.json +1 -0
  4. package/assets/i18n-ecl/de.json +1 -0
  5. package/assets/i18n-ecl/el.json +1 -0
  6. package/assets/i18n-ecl/en.json +1 -0
  7. package/assets/i18n-ecl/es.json +1 -0
  8. package/assets/i18n-ecl/et.json +1 -0
  9. package/assets/i18n-ecl/fi.json +1 -0
  10. package/assets/i18n-ecl/fr.json +1 -0
  11. package/assets/i18n-ecl/ga.json +1 -0
  12. package/assets/i18n-ecl/hr.json +1 -0
  13. package/assets/i18n-ecl/hu.json +1 -0
  14. package/assets/i18n-ecl/it.json +1 -0
  15. package/assets/i18n-ecl/lt.json +1 -0
  16. package/assets/i18n-ecl/lv.json +1 -0
  17. package/assets/i18n-ecl/mt.json +1 -0
  18. package/assets/i18n-ecl/nl.json +1 -0
  19. package/assets/i18n-ecl/pl.json +1 -0
  20. package/assets/i18n-ecl/pt.json +1 -0
  21. package/assets/i18n-ecl/ro.json +1 -0
  22. package/assets/i18n-ecl/sk.json +1 -0
  23. package/assets/i18n-ecl/sl.json +1 -0
  24. package/assets/i18n-ecl/sv.json +1 -0
  25. package/esm2022/lib/components/ecl-accordion/ecl-accordion-item.component.mjs +3 -3
  26. package/esm2022/lib/components/ecl-accordion/ecl-accordion.component.mjs +3 -3
  27. package/esm2022/lib/components/ecl-accordion/ecl-accordion.module.mjs +4 -4
  28. package/esm2022/lib/components/ecl-app/deprecated/common/ecl-app.component.mjs +6 -6
  29. package/esm2022/lib/components/ecl-app/deprecated/ecl-app-core/ecl-app-core.component.mjs +6 -6
  30. package/esm2022/lib/components/ecl-app/deprecated/ecl-app-core/ecl-app-core.module.mjs +4 -4
  31. package/esm2022/lib/components/ecl-app/deprecated/ecl-app-harmonised/ecl-app-harmonised.component.mjs +6 -6
  32. package/esm2022/lib/components/ecl-app/deprecated/ecl-app-harmonised/ecl-app-harmonised.module.mjs +4 -4
  33. package/esm2022/lib/components/ecl-app/deprecated/ecl-app-standardised/ecl-app-standardised.component.mjs +6 -6
  34. package/esm2022/lib/components/ecl-app/deprecated/ecl-app-standardised/ecl-app-standardised.module.mjs +4 -4
  35. package/esm2022/lib/components/ecl-app/ecl-app.component.mjs +5 -5
  36. package/esm2022/lib/components/ecl-app/ecl-app.module.mjs +4 -4
  37. package/esm2022/lib/components/ecl-banner/deprecated/ecl-hero-banner/ecl-hero-banner-credit.directive.mjs +3 -3
  38. package/esm2022/lib/components/ecl-banner/deprecated/ecl-hero-banner/ecl-hero-banner-cta-link.directive.mjs +5 -5
  39. package/esm2022/lib/components/ecl-banner/deprecated/ecl-hero-banner/ecl-hero-banner-description.directive.mjs +3 -3
  40. package/esm2022/lib/components/ecl-banner/deprecated/ecl-hero-banner/ecl-hero-banner-title.directive.mjs +3 -3
  41. package/esm2022/lib/components/ecl-banner/deprecated/ecl-hero-banner/ecl-hero-banner.component.mjs +4 -4
  42. package/esm2022/lib/components/ecl-banner/deprecated/ecl-hero-banner/ecl-hero-banner.module.mjs +4 -4
  43. package/esm2022/lib/components/ecl-banner/deprecated/ecl-page-banner/ecl-page-banner-credit.directive.mjs +3 -3
  44. package/esm2022/lib/components/ecl-banner/deprecated/ecl-page-banner/ecl-page-banner-cta-link.directive.mjs +5 -5
  45. package/esm2022/lib/components/ecl-banner/deprecated/ecl-page-banner/ecl-page-banner-description.directive.mjs +3 -3
  46. package/esm2022/lib/components/ecl-banner/deprecated/ecl-page-banner/ecl-page-banner-title.directive.mjs +3 -3
  47. package/esm2022/lib/components/ecl-banner/deprecated/ecl-page-banner/ecl-page-banner.component.mjs +4 -4
  48. package/esm2022/lib/components/ecl-banner/deprecated/ecl-page-banner/ecl-page-banner.module.mjs +4 -4
  49. package/esm2022/lib/components/ecl-banner/ecl-banner-credit.directive.mjs +3 -3
  50. package/esm2022/lib/components/ecl-banner/ecl-banner-description.directive.mjs +6 -6
  51. package/esm2022/lib/components/ecl-banner/ecl-banner-picture.directive.mjs +6 -6
  52. package/esm2022/lib/components/ecl-banner/ecl-banner-title.directive.mjs +6 -6
  53. package/esm2022/lib/components/ecl-banner/ecl-banner.component.mjs +4 -4
  54. package/esm2022/lib/components/ecl-banner/ecl-banner.module.mjs +4 -4
  55. package/esm2022/lib/components/ecl-base.directive.mjs +3 -3
  56. package/esm2022/lib/components/ecl-blockquote/ecl-blockquote-picture.directive.mjs +6 -6
  57. package/esm2022/lib/components/ecl-blockquote/ecl-blockquote.component.mjs +16 -6
  58. package/esm2022/lib/components/ecl-blockquote/ecl-blockquote.module.mjs +4 -4
  59. package/esm2022/lib/components/ecl-breadcrumb/deprecated/common/ecl-breadcrumb-segment.component.mjs +5 -5
  60. package/esm2022/lib/components/ecl-breadcrumb/deprecated/common/ecl-breadcrumb.component.mjs +5 -5
  61. package/esm2022/lib/components/ecl-breadcrumb/deprecated/ecl-breadcrumb-core/ecl-breadcrumb-core-segment.component.mjs +5 -5
  62. package/esm2022/lib/components/ecl-breadcrumb/deprecated/ecl-breadcrumb-core/ecl-breadcrumb-core.component.mjs +4 -4
  63. package/esm2022/lib/components/ecl-breadcrumb/deprecated/ecl-breadcrumb-core/ecl-breadcrumb-core.module.mjs +4 -4
  64. package/esm2022/lib/components/ecl-breadcrumb/deprecated/ecl-breadcrumb-harmonised/ecl-breadcrumb-harmonised-segment.component.mjs +5 -5
  65. package/esm2022/lib/components/ecl-breadcrumb/deprecated/ecl-breadcrumb-harmonised/ecl-breadcrumb-harmonised.component.mjs +4 -4
  66. package/esm2022/lib/components/ecl-breadcrumb/deprecated/ecl-breadcrumb-harmonised/ecl-breadcrumb-harmonised.module.mjs +4 -4
  67. package/esm2022/lib/components/ecl-breadcrumb/deprecated/ecl-breadcrumb-standardised/ecl-breadcrumb-standardised-segment.component.mjs +5 -5
  68. package/esm2022/lib/components/ecl-breadcrumb/deprecated/ecl-breadcrumb-standardised/ecl-breadcrumb-standardised.component.mjs +4 -4
  69. package/esm2022/lib/components/ecl-breadcrumb/deprecated/ecl-breadcrumb-standardised/ecl-breadcrumb-standardised.module.mjs +4 -4
  70. package/esm2022/lib/components/ecl-breadcrumb/ecl-breadcrumb-segment.component.mjs +5 -5
  71. package/esm2022/lib/components/ecl-breadcrumb/ecl-breadcrumb.component.mjs +5 -5
  72. package/esm2022/lib/components/ecl-breadcrumb/ecl-breadcrumb.module.mjs +4 -4
  73. package/esm2022/lib/components/ecl-button/ecl-button-label.directive.mjs +3 -3
  74. package/esm2022/lib/components/ecl-button/ecl-button.component.mjs +5 -5
  75. package/esm2022/lib/components/ecl-button/ecl-button.module.mjs +4 -4
  76. package/esm2022/lib/components/ecl-card/ecl-card-body.component.mjs +3 -3
  77. package/esm2022/lib/components/ecl-card/ecl-card-image/ecl-card-image.component.mjs +3 -3
  78. package/esm2022/lib/components/ecl-card/ecl-card-picture.directive.mjs +6 -6
  79. package/esm2022/lib/components/ecl-card/ecl-card.component.mjs +3 -3
  80. package/esm2022/lib/components/ecl-card/ecl-card.module.mjs +4 -4
  81. package/esm2022/lib/components/ecl-carousel/ecl-carousel-item.component.mjs +3 -3
  82. package/esm2022/lib/components/ecl-carousel/ecl-carousel.component.mjs +7 -14
  83. package/esm2022/lib/components/ecl-carousel/ecl-carousel.module.mjs +4 -4
  84. package/esm2022/lib/components/ecl-category-filter/ecl-category-filter/ecl-category-filter.component.mjs +5 -5
  85. package/esm2022/lib/components/ecl-category-filter/ecl-category-filter-list/ecl-category-filter-item.component.mjs +4 -4
  86. package/esm2022/lib/components/ecl-category-filter/ecl-category-filter-list/ecl-category-filter-list.component.mjs +4 -4
  87. package/esm2022/lib/components/ecl-category-filter/ecl-category-filter.module.mjs +4 -4
  88. package/esm2022/lib/components/ecl-checkbox/ecl-checkbox-help.component.mjs +3 -3
  89. package/esm2022/lib/components/ecl-checkbox/ecl-checkbox-input.directive.mjs +6 -6
  90. package/esm2022/lib/components/ecl-checkbox/ecl-checkbox-label.component.mjs +3 -3
  91. package/esm2022/lib/components/ecl-checkbox/ecl-checkbox.directive.mjs +5 -4
  92. package/esm2022/lib/components/ecl-checkbox/ecl-checkbox.module.mjs +22 -8
  93. package/esm2022/lib/components/ecl-content-block/ecl-content-block-elements.directive.mjs +51 -51
  94. package/esm2022/lib/components/ecl-content-block/ecl-content-block.component.mjs +3 -3
  95. package/esm2022/lib/components/ecl-content-block/ecl-content-block.module.mjs +4 -4
  96. package/esm2022/lib/components/ecl-content-item/ecl-content-item-image.directive.mjs +6 -6
  97. package/esm2022/lib/components/ecl-content-item/ecl-content-item.component.mjs +4 -4
  98. package/esm2022/lib/components/ecl-content-item/ecl-content-item.module.mjs +4 -4
  99. package/esm2022/lib/components/ecl-date-block/ecl-date-block.component.mjs +5 -5
  100. package/esm2022/lib/components/ecl-date-block/ecl-date-block.module.mjs +4 -4
  101. package/esm2022/lib/components/ecl-date-picker/ecl-date-picker.directive.mjs +5 -5
  102. package/esm2022/lib/components/ecl-date-picker/ecl-date-picker.module.mjs +4 -4
  103. package/esm2022/lib/components/ecl-expandable/ecl-expandable.component.mjs +3 -3
  104. package/esm2022/lib/components/ecl-expandable/ecl-expandable.module.mjs +4 -4
  105. package/esm2022/lib/components/ecl-fact-figures/ecl-fact-figures-description.component.mjs +3 -3
  106. package/esm2022/lib/components/ecl-fact-figures/ecl-fact-figures-item.component.mjs +3 -3
  107. package/esm2022/lib/components/ecl-fact-figures/ecl-fact-figures-title.component.mjs +3 -3
  108. package/esm2022/lib/components/ecl-fact-figures/ecl-fact-figures-value.component.mjs +3 -3
  109. package/esm2022/lib/components/ecl-fact-figures/ecl-fact-figures-view-all.component.mjs +3 -3
  110. package/esm2022/lib/components/ecl-fact-figures/ecl-fact-figures.component.mjs +3 -3
  111. package/esm2022/lib/components/ecl-fact-figures/ecl-fact-figures.module.mjs +4 -4
  112. package/esm2022/lib/components/ecl-featured/ecl-featured-item-description.component.mjs +3 -3
  113. package/esm2022/lib/components/ecl-featured/ecl-featured-item-link.directive.mjs +3 -3
  114. package/esm2022/lib/components/ecl-featured/ecl-featured-item.component.mjs +3 -3
  115. package/esm2022/lib/components/ecl-featured/ecl-featured.component.mjs +3 -3
  116. package/esm2022/lib/components/ecl-featured/ecl-featured.module.mjs +4 -4
  117. package/esm2022/lib/components/ecl-feedback-message/ecl-feedback-message.directive.mjs +4 -4
  118. package/esm2022/lib/components/ecl-feedback-message/ecl-feedback-message.module.mjs +4 -4
  119. package/esm2022/lib/components/ecl-file/ecl-file-item/ecl-file-item.component.mjs +5 -5
  120. package/esm2022/lib/components/ecl-file/ecl-file-items/ecl-file-items.component.mjs +3 -3
  121. package/esm2022/lib/components/ecl-file/ecl-file-picture.directive.mjs +6 -6
  122. package/esm2022/lib/components/ecl-file/ecl-file-taxonomy/ecl-file-taxonomy.component.mjs +3 -3
  123. package/esm2022/lib/components/ecl-file/ecl-file.component.mjs +3 -3
  124. package/esm2022/lib/components/ecl-file/ecl-file.module.mjs +4 -4
  125. package/esm2022/lib/components/ecl-file-upload/ecl-file-upload.directive.mjs +6 -6
  126. package/esm2022/lib/components/ecl-file-upload/ecl-file-upload.module.mjs +4 -4
  127. package/esm2022/lib/components/ecl-form-group/ecl-form-group.component.mjs +3 -3
  128. package/esm2022/lib/components/ecl-form-group/ecl-form-group.module.mjs +4 -4
  129. package/esm2022/lib/components/ecl-form-label/ecl-form-label.component.mjs +3 -3
  130. package/esm2022/lib/components/ecl-form-label/ecl-form-label.module.mjs +4 -4
  131. package/esm2022/lib/components/ecl-gallery/ecl-gallery-footer.component.mjs +5 -5
  132. package/esm2022/lib/components/ecl-gallery/ecl-gallery-item.component.mjs +22 -7
  133. package/esm2022/lib/components/ecl-gallery/ecl-gallery-media.directive.mjs +8 -8
  134. package/esm2022/lib/components/ecl-gallery/ecl-gallery.component.mjs +91 -29
  135. package/esm2022/lib/components/ecl-gallery/ecl-gallery.module.mjs +4 -4
  136. package/esm2022/lib/components/ecl-help-block/ecl-help-block.directive.mjs +3 -3
  137. package/esm2022/lib/components/ecl-help-block/ecl-help-block.module.mjs +4 -4
  138. package/esm2022/lib/components/ecl-icon/ecl-icon.component.mjs +5 -5
  139. package/esm2022/lib/components/ecl-icon/ecl-icon.module.mjs +4 -4
  140. package/esm2022/lib/components/ecl-inpage-navigation/ecl-inpage-navigation-item.component.mjs +3 -3
  141. package/esm2022/lib/components/ecl-inpage-navigation/ecl-inpage-navigation.component.mjs +3 -3
  142. package/esm2022/lib/components/ecl-inpage-navigation/ecl-inpage-navigation.module.mjs +4 -4
  143. package/esm2022/lib/components/ecl-label/ecl-label.directive.mjs +3 -3
  144. package/esm2022/lib/components/ecl-label/ecl-label.module.mjs +4 -4
  145. package/esm2022/lib/components/ecl-language-list/ecl-language-list-item.component.mjs +5 -5
  146. package/esm2022/lib/components/ecl-language-list/ecl-language-list.component.mjs +5 -5
  147. package/esm2022/lib/components/ecl-language-list/ecl-language-list.module.mjs +4 -4
  148. package/esm2022/lib/components/ecl-link/ecl-link-label.directive.mjs +3 -3
  149. package/esm2022/lib/components/ecl-link/ecl-link.directive.mjs +5 -5
  150. package/esm2022/lib/components/ecl-link/ecl-link.module.mjs +4 -4
  151. package/esm2022/lib/components/ecl-list/ecl-description-list-definition/ecl-description-list-definition.component.mjs +3 -3
  152. package/esm2022/lib/components/ecl-list/ecl-description-list-definition-item.directive.mjs +3 -3
  153. package/esm2022/lib/components/ecl-list/ecl-list.directive.mjs +20 -20
  154. package/esm2022/lib/components/ecl-list/ecl-list.module.mjs +4 -4
  155. package/esm2022/lib/components/ecl-list-illustration/ecl-list-illustration-icon.directive.mjs +3 -3
  156. package/esm2022/lib/components/ecl-list-illustration/ecl-list-illustration-image/ecl-list-illustration-image.component.mjs +3 -3
  157. package/esm2022/lib/components/ecl-list-illustration/ecl-list-illustration-item.component.mjs +4 -4
  158. package/esm2022/lib/components/ecl-list-illustration/ecl-list-illustration-picture.directive.mjs +6 -6
  159. package/esm2022/lib/components/ecl-list-illustration/ecl-list-illustration.component.mjs +3 -3
  160. package/esm2022/lib/components/ecl-list-illustration/ecl-list-illustration.module.mjs +4 -4
  161. package/esm2022/lib/components/ecl-media-container/ecl-media-container-iframe.directive.mjs +5 -5
  162. package/esm2022/lib/components/ecl-media-container/ecl-media-container-item.directive.mjs +5 -5
  163. package/esm2022/lib/components/ecl-media-container/ecl-media-container-picture.directive.mjs +3 -3
  164. package/esm2022/lib/components/ecl-media-container/ecl-media-container.component.mjs +16 -7
  165. package/esm2022/lib/components/ecl-media-container/ecl-media-container.module.mjs +4 -4
  166. package/esm2022/lib/components/ecl-menu/ecl-menu/ecl-menu-item.component.mjs +5 -5
  167. package/esm2022/lib/components/ecl-menu/ecl-menu/ecl-menu.component.mjs +9 -5
  168. package/esm2022/lib/components/ecl-menu/ecl-menu-mega/ecl-menu-mega-item.component.mjs +4 -4
  169. package/esm2022/lib/components/ecl-menu/ecl-menu-mega/ecl-menu-mega.component.mjs +5 -5
  170. package/esm2022/lib/components/ecl-menu/ecl-menu.module.mjs +4 -4
  171. package/esm2022/lib/components/ecl-message/ecl-message-title.directive.mjs +3 -3
  172. package/esm2022/lib/components/ecl-message/ecl-message.component.mjs +3 -3
  173. package/esm2022/lib/components/ecl-message/ecl-message.module.mjs +4 -4
  174. package/esm2022/lib/components/ecl-modal/ecl-modal-body.component.mjs +3 -3
  175. package/esm2022/lib/components/ecl-modal/ecl-modal-close.directive.mjs +3 -3
  176. package/esm2022/lib/components/ecl-modal/ecl-modal-footer.component.mjs +4 -4
  177. package/esm2022/lib/components/ecl-modal/ecl-modal-header.component.mjs +3 -3
  178. package/esm2022/lib/components/ecl-modal/ecl-modal-trigger.directive.mjs +3 -3
  179. package/esm2022/lib/components/ecl-modal/ecl-modal.component.mjs +4 -4
  180. package/esm2022/lib/components/ecl-modal/ecl-modal.module.mjs +4 -4
  181. package/esm2022/lib/components/ecl-multiselect/boldText.pipe.mjs +36 -0
  182. package/esm2022/lib/components/ecl-multiselect/ecl-multiselect-dropdown/ecl-multiselect-dropdown.component.mjs +449 -0
  183. package/esm2022/lib/components/ecl-multiselect/ecl-multiselect-input/ecl-multiselect-input.component.mjs +92 -0
  184. package/esm2022/lib/components/ecl-multiselect/ecl-multiselect-optgroup/ecl-multiselect-optgroup.component.mjs +33 -0
  185. package/esm2022/lib/components/ecl-multiselect/ecl-multiselect-option/ecl-multiselect-option.component.mjs +130 -0
  186. package/esm2022/lib/components/ecl-multiselect/ecl-multiselect-option.directive.mjs +6 -15
  187. package/esm2022/lib/components/ecl-multiselect/ecl-multiselect.component.mjs +88 -824
  188. package/esm2022/lib/components/ecl-multiselect/ecl-multiselect.module.mjs +49 -7
  189. package/esm2022/lib/components/ecl-navigation-list/ecl-navigation-list-image/ecl-navigation-list-image.component.mjs +3 -3
  190. package/esm2022/lib/components/ecl-navigation-list/ecl-navigation-list-item.component.mjs +4 -4
  191. package/esm2022/lib/components/ecl-navigation-list/ecl-navigation-list-picture.directive.mjs +6 -6
  192. package/esm2022/lib/components/ecl-navigation-list/ecl-navigation-list.component.mjs +3 -3
  193. package/esm2022/lib/components/ecl-navigation-list/ecl-navigation-list.module.mjs +4 -4
  194. package/esm2022/lib/components/ecl-news-ticker/ecl-news-ticker-item.component.mjs +5 -5
  195. package/esm2022/lib/components/ecl-news-ticker/ecl-news-ticker.component.mjs +5 -5
  196. package/esm2022/lib/components/ecl-news-ticker/ecl-news-ticker.module.mjs +4 -4
  197. package/esm2022/lib/components/ecl-page-header/deprecated/common/ecl-page-header.component.mjs +3 -3
  198. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-core/ecl-page-header-core-description.directive.mjs +9 -9
  199. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-core/ecl-page-header-core-meta.directive.mjs +6 -6
  200. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-core/ecl-page-header-core-title.directive.mjs +3 -3
  201. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-core/ecl-page-header-core.component.mjs +3 -3
  202. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-core/ecl-page-header-core.module.mjs +4 -4
  203. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-harmonised/ecl-page-header-harmonised-description.directive.mjs +9 -9
  204. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-harmonised/ecl-page-header-harmonised-meta.directive.mjs +6 -6
  205. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-harmonised/ecl-page-header-harmonised-title.directive.mjs +3 -3
  206. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-harmonised/ecl-page-header-harmonised.component.mjs +3 -3
  207. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-harmonised/ecl-page-header-harmonised.module.mjs +4 -4
  208. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-standardised/ecl-page-header-standardised-description.directive.mjs +9 -9
  209. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-standardised/ecl-page-header-standardised-meta.directive.mjs +6 -6
  210. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-standardised/ecl-page-header-standardised-title.directive.mjs +3 -3
  211. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-standardised/ecl-page-header-standardised.component.mjs +3 -3
  212. package/esm2022/lib/components/ecl-page-header/deprecated/ecl-page-header-standardised/ecl-page-header-standardised.module.mjs +4 -4
  213. package/esm2022/lib/components/ecl-page-header/ecl-page-header-background.directive.mjs +6 -6
  214. package/esm2022/lib/components/ecl-page-header/ecl-page-header-description/ecl-page-header-description.component.mjs +3 -3
  215. package/esm2022/lib/components/ecl-page-header/ecl-page-header-description.directive.mjs +9 -9
  216. package/esm2022/lib/components/ecl-page-header/ecl-page-header-meta.directive.mjs +6 -6
  217. package/esm2022/lib/components/ecl-page-header/ecl-page-header-title.directive.mjs +3 -3
  218. package/esm2022/lib/components/ecl-page-header/ecl-page-header.component.mjs +3 -3
  219. package/esm2022/lib/components/ecl-page-header/ecl-page-header.module.mjs +4 -4
  220. package/esm2022/lib/components/ecl-pagination/ecl-pagination-item.component.mjs +3 -3
  221. package/esm2022/lib/components/ecl-pagination/ecl-pagination.component.mjs +3 -3
  222. package/esm2022/lib/components/ecl-pagination/ecl-pagination.module.mjs +4 -4
  223. package/esm2022/lib/components/ecl-popover/ecl-popover-content.directive.mjs +3 -3
  224. package/esm2022/lib/components/ecl-popover/ecl-popover-list.directive.mjs +9 -9
  225. package/esm2022/lib/components/ecl-popover/ecl-popover-toggle.directive.mjs +5 -5
  226. package/esm2022/lib/components/ecl-popover/ecl-popover.component.mjs +3 -3
  227. package/esm2022/lib/components/ecl-popover/ecl-popover.module.mjs +4 -4
  228. package/esm2022/lib/components/ecl-radio/ecl-radio-help.component.mjs +3 -3
  229. package/esm2022/lib/components/ecl-radio/ecl-radio-input.directive.mjs +6 -6
  230. package/esm2022/lib/components/ecl-radio/ecl-radio-label.component.mjs +3 -3
  231. package/esm2022/lib/components/ecl-radio/ecl-radio.directive.mjs +4 -4
  232. package/esm2022/lib/components/ecl-radio/ecl-radio.module.mjs +4 -4
  233. package/esm2022/lib/components/ecl-range/ecl-range-value.component.mjs +3 -3
  234. package/esm2022/lib/components/ecl-range/ecl-range.directive.mjs +6 -6
  235. package/esm2022/lib/components/ecl-range/ecl-range.module.mjs +4 -4
  236. package/esm2022/lib/components/ecl-rating-field/ecl-rating-field.component.mjs +5 -5
  237. package/esm2022/lib/components/ecl-rating-field/ecl-rating-field.module.mjs +4 -4
  238. package/esm2022/lib/components/ecl-search-form/ecl-search-form.component.mjs +3 -3
  239. package/esm2022/lib/components/ecl-search-form/ecl-search-form.module.mjs +4 -4
  240. package/esm2022/lib/components/ecl-select/ecl-select-container.component.mjs +3 -3
  241. package/esm2022/lib/components/ecl-select/ecl-select.directive.mjs +6 -6
  242. package/esm2022/lib/components/ecl-select/ecl-select.module.mjs +4 -4
  243. package/esm2022/lib/components/ecl-site-footer/deprecated/common/ecl-footer.component.mjs +5 -5
  244. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-core/ecl-footer-core.component.mjs +3 -3
  245. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-core/ecl-footer-core.module.mjs +4 -4
  246. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-core/ecl-footer-elements/ecl-footer-core-column.directive.mjs +3 -3
  247. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-core/ecl-footer-elements/ecl-footer-core-description.directive.mjs +3 -3
  248. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-core/ecl-footer-elements/ecl-footer-core-link.directive.mjs +3 -3
  249. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-core/ecl-footer-elements/ecl-footer-core-list.directive.mjs +6 -6
  250. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-core/ecl-footer-elements/ecl-footer-core-section.directive.mjs +3 -3
  251. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-core/ecl-footer-elements/ecl-footer-core-title.directive.mjs +6 -6
  252. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-harmonised/ecl-footer-elements/ecl-footer-harmonised-column.directive.mjs +9 -9
  253. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-harmonised/ecl-footer-elements/ecl-footer-harmonised-description.directive.mjs +3 -3
  254. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-harmonised/ecl-footer-elements/ecl-footer-harmonised-link.directive.mjs +9 -9
  255. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-harmonised/ecl-footer-elements/ecl-footer-harmonised-list.directive.mjs +15 -15
  256. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-harmonised/ecl-footer-elements/ecl-footer-harmonised-section.directive.mjs +3 -3
  257. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-harmonised/ecl-footer-elements/ecl-footer-harmonised-title.directive.mjs +6 -6
  258. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-harmonised/ecl-footer-harmonised.component.mjs +3 -3
  259. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-harmonised/ecl-footer-harmonised.module.mjs +4 -4
  260. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-standardised/ecl-footer-elements/ecl-footer-standardised-column.directive.mjs +9 -9
  261. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-standardised/ecl-footer-elements/ecl-footer-standardised-description.directive.mjs +3 -3
  262. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-standardised/ecl-footer-elements/ecl-footer-standardised-link.directive.mjs +9 -9
  263. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-standardised/ecl-footer-elements/ecl-footer-standardised-list.directive.mjs +6 -6
  264. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-standardised/ecl-footer-elements/ecl-footer-standardised-section.directive.mjs +3 -3
  265. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-standardised/ecl-footer-elements/ecl-footer-standardised-title.directive.mjs +6 -6
  266. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-standardised/ecl-footer-standardised.component.mjs +3 -3
  267. package/esm2022/lib/components/ecl-site-footer/deprecated/ecl-footer-standardised/ecl-footer-standardised.module.mjs +4 -4
  268. package/esm2022/lib/components/ecl-site-footer/ecl-footer-elements/ec/ecl-site-footer-fixed-content.mjs +5 -5
  269. package/esm2022/lib/components/ecl-site-footer/ecl-footer-elements/ecl-site-footer-column.directive.mjs +9 -9
  270. package/esm2022/lib/components/ecl-site-footer/ecl-footer-elements/ecl-site-footer-description.directive.mjs +3 -3
  271. package/esm2022/lib/components/ecl-site-footer/ecl-footer-elements/ecl-site-footer-link.directive.mjs +15 -15
  272. package/esm2022/lib/components/ecl-site-footer/ecl-footer-elements/ecl-site-footer-list.directive.mjs +15 -15
  273. package/esm2022/lib/components/ecl-site-footer/ecl-footer-elements/ecl-site-footer-section.directive.mjs +3 -3
  274. package/esm2022/lib/components/ecl-site-footer/ecl-footer-elements/ecl-site-footer-title.directive.mjs +6 -6
  275. package/esm2022/lib/components/ecl-site-footer/ecl-footer-elements/eu/ecl-site-footer-fixed-content.mjs +5 -5
  276. package/esm2022/lib/components/ecl-site-footer/ecl-site-footer.component.mjs +5 -5
  277. package/esm2022/lib/components/ecl-site-footer/ecl-site-footer.module.mjs +4 -4
  278. package/esm2022/lib/components/ecl-site-header/action/ecl-site-header-action.component.mjs +3 -3
  279. package/esm2022/lib/components/ecl-site-header/banner-top/ecl-site-header-banner-top.component.mjs +3 -3
  280. package/esm2022/lib/components/ecl-site-header/cta/ecl-site-header-cta.directive.mjs +3 -3
  281. package/esm2022/lib/components/ecl-site-header/deprecated/common/ecl-site-header-action.component.mjs +3 -3
  282. package/esm2022/lib/components/ecl-site-header/deprecated/common/ecl-site-header-banner-top.component.mjs +3 -3
  283. package/esm2022/lib/components/ecl-site-header/deprecated/common/ecl-site-header-language.component.mjs +3 -3
  284. package/esm2022/lib/components/ecl-site-header/deprecated/common/ecl-site-header-login.component.mjs +3 -3
  285. package/esm2022/lib/components/ecl-site-header/deprecated/common/ecl-site-header-search.component.mjs +3 -3
  286. package/esm2022/lib/components/ecl-site-header/deprecated/common/ecl-site-header.component.mjs +5 -5
  287. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-core/action/ecl-site-header-core-action.component.mjs +3 -3
  288. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-core/ecl-site-header-core.component.mjs +5 -5
  289. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-core/ecl-site-header-core.module.mjs +4 -4
  290. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-core/language/ecl-site-header-core-language.component.mjs +3 -3
  291. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-core/login/ecl-site-header-core-login-details.directive.mjs +6 -6
  292. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-core/login/ecl-site-header-core-login.component.mjs +3 -3
  293. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-core/search/ecl-site-header-core-search.component.mjs +3 -3
  294. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-harmonised/action/ecl-site-header-harmonised-action.component.mjs +3 -3
  295. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-harmonised/banner-top/ecl-site-header-harmonised-banner-top.component.mjs +3 -3
  296. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-harmonised/ecl-site-header-harmonised.component.mjs +5 -5
  297. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-harmonised/ecl-site-header-harmonised.module.mjs +4 -4
  298. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-harmonised/language/ecl-site-header-harmonised-language.component.mjs +3 -3
  299. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-harmonised/login/ecl-site-header-harmonised-login-details.directive.mjs +6 -6
  300. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-harmonised/login/ecl-site-header-harmonised-login.component.mjs +3 -3
  301. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-harmonised/search/ecl-site-header-harmonised-search.component.mjs +3 -3
  302. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-standardised/action/ecl-site-header-standardised-action.component.mjs +3 -3
  303. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-standardised/banner-top/ecl-site-header-standardised-banner-top.component.mjs +3 -3
  304. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-standardised/cta/ecl-site-header-standardised-cta.directive.mjs +3 -3
  305. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-standardised/ecl-site-header-standardised.component.mjs +5 -5
  306. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-standardised/ecl-site-header-standardised.module.mjs +4 -4
  307. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-standardised/language/ecl-site-header-standardised-language.component.mjs +3 -3
  308. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-standardised/login/ecl-site-header-standardised-login-details.directive.mjs +6 -6
  309. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-standardised/login/ecl-site-header-standardised-login.component.mjs +3 -3
  310. package/esm2022/lib/components/ecl-site-header/deprecated/ecl-site-header-standardised/search/ecl-site-header-standardised-search.component.mjs +3 -3
  311. package/esm2022/lib/components/ecl-site-header/ecl-site-header-environment/ecl-site-header-environment.component.mjs +5 -5
  312. package/esm2022/lib/components/ecl-site-header/ecl-site-header.component.mjs +5 -5
  313. package/esm2022/lib/components/ecl-site-header/ecl-site-header.module.mjs +4 -4
  314. package/esm2022/lib/components/ecl-site-header/language/ecl-site-header-language-popover.component.mjs +5 -5
  315. package/esm2022/lib/components/ecl-site-header/language/ecl-site-header-language.component.mjs +21 -5
  316. package/esm2022/lib/components/ecl-site-header/login/ecl-site-header-login-details.directive.mjs +6 -6
  317. package/esm2022/lib/components/ecl-site-header/login/ecl-site-header-login.component.mjs +3 -3
  318. package/esm2022/lib/components/ecl-site-header/message/ecl-site-header-message.component.mjs +3 -3
  319. package/esm2022/lib/components/ecl-site-header/search/ecl-site-header-search.component.mjs +8 -4
  320. package/esm2022/lib/components/ecl-social-media-follow/ecl-social-media-follow-item.component.mjs +3 -3
  321. package/esm2022/lib/components/ecl-social-media-follow/ecl-social-media-follow-link.directive.mjs +3 -3
  322. package/esm2022/lib/components/ecl-social-media-follow/ecl-social-media-follow.component.mjs +3 -3
  323. package/esm2022/lib/components/ecl-social-media-follow/ecl-social-media-follow.module.mjs +4 -4
  324. package/esm2022/lib/components/ecl-social-media-share/ecl-social-media-share-item.component.mjs +3 -3
  325. package/esm2022/lib/components/ecl-social-media-share/ecl-social-media-share-link.directive.mjs +3 -3
  326. package/esm2022/lib/components/ecl-social-media-share/ecl-social-media-share.component.mjs +3 -3
  327. package/esm2022/lib/components/ecl-social-media-share/ecl-social-media-share.module.mjs +4 -4
  328. package/esm2022/lib/components/ecl-spinner/ecl-spinner-label.directive.mjs +3 -3
  329. package/esm2022/lib/components/ecl-spinner/ecl-spinner.component.mjs +3 -3
  330. package/esm2022/lib/components/ecl-spinner/ecl-spinner.module.mjs +4 -4
  331. package/esm2022/lib/components/ecl-sticky-container/ecl-sticky-container.component.mjs +3 -3
  332. package/esm2022/lib/components/ecl-sticky-container/ecl-sticky-container.module.mjs +4 -4
  333. package/esm2022/lib/components/ecl-table/ecl-table-sort-button.component.mjs +5 -5
  334. package/esm2022/lib/components/ecl-table/ecl-table.directive.mjs +41 -25
  335. package/esm2022/lib/components/ecl-table/ecl-table.module.mjs +11 -8
  336. package/esm2022/lib/components/ecl-tabs/ecl-tab-label.component.mjs +3 -3
  337. package/esm2022/lib/components/ecl-tabs/ecl-tab-more.component.mjs +5 -5
  338. package/esm2022/lib/components/ecl-tabs/ecl-tab.component.mjs +5 -5
  339. package/esm2022/lib/components/ecl-tabs/ecl-tabs.component.mjs +5 -5
  340. package/esm2022/lib/components/ecl-tabs/ecl-tabs.module.mjs +4 -4
  341. package/esm2022/lib/components/ecl-tag/ecl-tag.component.mjs +3 -3
  342. package/esm2022/lib/components/ecl-tag/ecl-tag.module.mjs +4 -4
  343. package/esm2022/lib/components/ecl-text-area/ecl-text-area.directive.mjs +6 -6
  344. package/esm2022/lib/components/ecl-text-area/ecl-text-area.module.mjs +4 -4
  345. package/esm2022/lib/components/ecl-text-input/ecl-text-input.directive.mjs +7 -6
  346. package/esm2022/lib/components/ecl-text-input/ecl-text-input.module.mjs +7 -8
  347. package/esm2022/lib/components/ecl-timeline/ecl-timeline-item-label.directive.mjs +3 -3
  348. package/esm2022/lib/components/ecl-timeline/ecl-timeline-item-title.directive.mjs +3 -3
  349. package/esm2022/lib/components/ecl-timeline/ecl-timeline-item-toggler.component.mjs +3 -3
  350. package/esm2022/lib/components/ecl-timeline/ecl-timeline-item.component.mjs +4 -4
  351. package/esm2022/lib/components/ecl-timeline/ecl-timeline.component.mjs +4 -4
  352. package/esm2022/lib/components/ecl-timeline/ecl-timeline.module.mjs +4 -4
  353. package/esm2022/lib/model/ecl-multiselect-option.model.mjs +2 -0
  354. package/esm2022/lib/services/ecl-default-language.service.mjs +5 -5
  355. package/esm2022/lib/services/ecl-theme.service.mjs +5 -5
  356. package/esm2022/lib/shared/ecl-all.module.mjs +4 -4
  357. package/esm2022/lib/utils/constants/constants.mjs +11 -0
  358. package/esm2022/lib/utils/constants/index.mjs +2 -0
  359. package/esm2022/lib/utils/directives/ecl-click-outside/ecl-click-outside.directive.mjs +5 -5
  360. package/esm2022/lib/utils/directives/ecl-hidden/ecl-hidden.directive.mjs +3 -3
  361. package/esm2022/lib/utils/directives/ecl-hidden/ecl-hidden.module.mjs +4 -4
  362. package/esm2022/lib/utils/index.mjs +2 -1
  363. package/fesm2022/eui-ecl.mjs +2408 -2268
  364. package/fesm2022/eui-ecl.mjs.map +1 -1
  365. package/lib/components/ecl-blockquote/ecl-blockquote.component.d.ts +12 -2
  366. package/lib/components/ecl-blockquote/ecl-blockquote.component.d.ts.map +1 -1
  367. package/lib/components/ecl-carousel/ecl-carousel.component.d.ts +2 -3
  368. package/lib/components/ecl-carousel/ecl-carousel.component.d.ts.map +1 -1
  369. package/lib/components/ecl-checkbox/ecl-checkbox.directive.d.ts +1 -1
  370. package/lib/components/ecl-checkbox/ecl-checkbox.directive.d.ts.map +1 -1
  371. package/lib/components/ecl-checkbox/ecl-checkbox.module.d.ts +7 -7
  372. package/lib/components/ecl-checkbox/ecl-checkbox.module.d.ts.map +1 -1
  373. package/lib/components/ecl-gallery/ecl-gallery-item.component.d.ts +11 -4
  374. package/lib/components/ecl-gallery/ecl-gallery-item.component.d.ts.map +1 -1
  375. package/lib/components/ecl-gallery/ecl-gallery.component.d.ts +39 -5
  376. package/lib/components/ecl-gallery/ecl-gallery.component.d.ts.map +1 -1
  377. package/lib/components/ecl-media-container/ecl-media-container.component.d.ts +7 -3
  378. package/lib/components/ecl-media-container/ecl-media-container.component.d.ts.map +1 -1
  379. package/lib/components/ecl-menu/ecl-menu/ecl-menu.component.d.ts +1 -0
  380. package/lib/components/ecl-menu/ecl-menu/ecl-menu.component.d.ts.map +1 -1
  381. package/lib/components/ecl-multiselect/boldText.pipe.d.ts +11 -0
  382. package/lib/components/ecl-multiselect/boldText.pipe.d.ts.map +1 -0
  383. package/lib/components/ecl-multiselect/ecl-multiselect-dropdown/ecl-multiselect-dropdown.component.d.ts +94 -0
  384. package/lib/components/ecl-multiselect/ecl-multiselect-dropdown/ecl-multiselect-dropdown.component.d.ts.map +1 -0
  385. package/lib/components/ecl-multiselect/ecl-multiselect-input/ecl-multiselect-input.component.d.ts +26 -0
  386. package/lib/components/ecl-multiselect/ecl-multiselect-input/ecl-multiselect-input.component.d.ts.map +1 -0
  387. package/lib/components/ecl-multiselect/ecl-multiselect-optgroup/ecl-multiselect-optgroup.component.d.ts +19 -0
  388. package/lib/components/ecl-multiselect/ecl-multiselect-optgroup/ecl-multiselect-optgroup.component.d.ts.map +1 -0
  389. package/lib/components/ecl-multiselect/ecl-multiselect-option/ecl-multiselect-option.component.d.ts +49 -0
  390. package/lib/components/ecl-multiselect/ecl-multiselect-option/ecl-multiselect-option.component.d.ts.map +1 -0
  391. package/lib/components/ecl-multiselect/ecl-multiselect-option.directive.d.ts +3 -6
  392. package/lib/components/ecl-multiselect/ecl-multiselect-option.directive.d.ts.map +1 -1
  393. package/lib/components/ecl-multiselect/ecl-multiselect.component.d.ts +19 -113
  394. package/lib/components/ecl-multiselect/ecl-multiselect.component.d.ts.map +1 -1
  395. package/lib/components/ecl-multiselect/ecl-multiselect.module.d.ts +12 -3
  396. package/lib/components/ecl-multiselect/ecl-multiselect.module.d.ts.map +1 -1
  397. package/lib/components/ecl-site-header/language/ecl-site-header-language.component.d.ts +4 -0
  398. package/lib/components/ecl-site-header/language/ecl-site-header-language.component.d.ts.map +1 -1
  399. package/lib/components/ecl-site-header/search/ecl-site-header-search.component.d.ts +1 -0
  400. package/lib/components/ecl-site-header/search/ecl-site-header-search.component.d.ts.map +1 -1
  401. package/lib/components/ecl-table/ecl-table.directive.d.ts +5 -0
  402. package/lib/components/ecl-table/ecl-table.directive.d.ts.map +1 -1
  403. package/lib/components/ecl-table/ecl-table.module.d.ts +1 -1
  404. package/lib/components/ecl-table/ecl-table.module.d.ts.map +1 -1
  405. package/lib/components/ecl-text-input/ecl-text-input.directive.d.ts +1 -1
  406. package/lib/components/ecl-text-input/ecl-text-input.directive.d.ts.map +1 -1
  407. package/lib/components/ecl-text-input/ecl-text-input.module.d.ts +3 -3
  408. package/lib/components/ecl-text-input/ecl-text-input.module.d.ts.map +1 -1
  409. package/lib/model/ecl-multiselect-option.model.d.ts +8 -0
  410. package/lib/model/ecl-multiselect-option.model.d.ts.map +1 -0
  411. package/lib/utils/constants/constants.d.ts +10 -0
  412. package/lib/utils/constants/constants.d.ts.map +1 -0
  413. package/lib/utils/constants/index.d.ts +2 -0
  414. package/lib/utils/constants/index.d.ts.map +1 -0
  415. package/lib/utils/index.d.ts +1 -0
  416. package/lib/utils/index.d.ts.map +1 -1
  417. package/package.json +1 -1
@@ -1,875 +1,152 @@
1
1
  import { __decorate } from "tslib";
2
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
3
- import { Component, ContentChildren, EventEmitter, HostBinding, HostListener, Input, Optional, Output, Self, ViewEncapsulation, } from '@angular/core';
4
- import { v4 as uuidgen } from 'uuid';
2
+ import { Component, ContentChildren, EventEmitter, forwardRef, HostBinding, Input, Output, ViewEncapsulation, } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR, NgControl } from '@angular/forms';
5
4
  import { coerceBoolean } from '@eui/base';
6
5
  import { Subject, takeUntil } from 'rxjs';
7
6
  import { ECLBaseDirective } from '../ecl-base.directive';
8
- import { EclCheckboxLabelComponent } from '../ecl-checkbox/ecl-checkbox-label.component';
9
- import { EclIconComponent } from '../ecl-icon/ecl-icon.component';
7
+ import { EclMultiselectDropdownComponent } from './ecl-multiselect-dropdown/ecl-multiselect-dropdown.component';
10
8
  import { EclMultiselectOptionDirective } from './ecl-multiselect-option.directive';
9
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
11
10
  import * as i0 from "@angular/core";
12
- import * as i1 from "@angular/forms";
13
- import * as i2 from "@ngx-translate/core";
14
- var KeyCode;
15
- (function (KeyCode) {
16
- KeyCode["ARROW_UP"] = "ArrowUp";
17
- KeyCode["ARROW_DOWN"] = "ArrowDown";
18
- KeyCode["ARROW_LEFT"] = "ArrowLeft";
19
- KeyCode["ARROW_RIGHT"] = "ArrowRight";
20
- KeyCode["ESCAPE"] = "Escape";
21
- KeyCode["ENTER"] = "Enter";
22
- KeyCode["TAB"] = "Tab";
23
- })(KeyCode || (KeyCode = {}));
24
11
  export class EclMultiselectComponent extends ECLBaseDirective {
12
+ get isInvalid() {
13
+ return this._isInvalid;
14
+ }
15
+ set isInvalid(value) {
16
+ this._isInvalid = value;
17
+ if (this.multiselectComponent) {
18
+ this.multiselectComponent.isInvalid = value;
19
+ }
20
+ }
21
+ set disabled(value) {
22
+ if (this.multiselectComponent) {
23
+ this.multiselectComponent.disabled = coerceBooleanProperty(value);
24
+ }
25
+ this._disabled = coerceBooleanProperty(value);
26
+ }
27
+ get disabled() {
28
+ return this._disabled || undefined;
29
+ }
25
30
  get cssClasses() {
26
31
  return [super.getCssClasses('ecl-select')].join(' ').trim();
27
32
  }
28
33
  set eclPlaceholder(value) {
29
34
  this._eclPlaceholder = value;
30
- if (this.multiSelectInput) {
31
- this.multiSelectInput.setAttribute('placeholder', this._eclPlaceholder || '');
35
+ if (this.multiselectComponent) {
36
+ this.multiselectComponent.mainInputPlaceholder = value;
32
37
  }
33
38
  }
34
- get disabled() {
35
- if (this.ngControl) {
36
- return this.ngControl.disabled || null;
37
- }
38
- else {
39
- return this._disabled || null;
40
- }
41
- }
42
- set disabled(value) {
43
- this._disabled = coerceBooleanProperty(value);
39
+ get eclPlaceholder() {
40
+ return this._eclPlaceholder;
44
41
  }
45
- constructor(ngControl, el, viewContainerRef, differs, translate) {
42
+ constructor(injector, el, viewContainerRef, differs) {
46
43
  super();
47
- this.ngControl = ngControl;
44
+ this.injector = injector;
48
45
  this.el = el;
49
46
  this.viewContainerRef = viewContainerRef;
50
47
  this.differs = differs;
51
- this.translate = translate;
52
- this.isInvalid = false;
53
48
  this.eclChange = new EventEmitter();
54
- this.eclSize = 'm';
55
49
  this._disabled = false;
56
- this.multiSelectOptions = [];
57
- this.selectedValues = [];
50
+ this._isInvalid = false;
51
+ this._eclPlaceholder = 'Select item';
58
52
  this.destroy$ = new Subject();
59
- this.noResultsFoundText = 'No results found';
60
- this.CLASS_NO_RESULTS_FOUND = 'ecl-select__multiple-no-results';
61
- this.selectAllLabelText = 'Select all';
62
- this.closeText = 'Close';
63
- this.clearAllText = 'Clear all';
64
- this.propagateChange = (_) => { };
65
- this.propagateTouched = () => { };
66
53
  this.differ = this.differs.find([]).create();
67
- if (this.ngControl) {
68
- this.ngControl.valueAccessor = this;
54
+ }
55
+ ngDoCheck() {
56
+ const diff = this.differ.diff(this.eclOptionItems);
57
+ if (diff) {
58
+ if (this.multiselectComponent) {
59
+ this.multiselectComponent.multiOptionDirectives = this.eclOptionItems.toArray();
60
+ }
69
61
  }
70
- this.bindCallbacks();
71
62
  }
72
63
  ngOnInit() {
73
64
  this.hostEl = this.getHostElement();
74
65
  this.hostParentEl = this.getHostParentElement(this.hostEl);
75
66
  this.hostWrapperEl = this.createHostWrapperContainer();
76
- this.selectIconContainerEl = this.createIconContainer();
77
- this.multiselectWrapper = this.createWrapperMultiselect();
78
- this.multiselectContainer = this.createSelectContainerMultiselect();
79
- this.noResultsFound = this.createNoResultsFound();
67
+ this.multiselectComponentHtml = this.createMultiselectComponent();
68
+ }
69
+ ngAfterContentInit() {
70
+ this.attachOptions();
80
71
  if (this.hostParentEl != null) {
81
72
  this.hideOriginalSelectComponent();
82
- this.createHtmlElements();
83
- this.buildMultiselectDropdown(false);
84
- }
85
- this.handleTranslations();
86
- }
87
- ngDoCheck() {
88
- this.multiselectContainer.classList.toggle('ecl-select__container--disabled', this.disabled);
89
- this.multiselectContainer.classList.toggle('ecl-select__container--invalid', this.isInvalid);
90
- this.multiSelectInput.disabled = this.disabled;
91
- const diff = this.differ.diff(this.eclOptionItems);
92
- if (diff) {
93
- this.removeAllOptions();
94
- this.multiSelectOptions = [];
95
- diff.forEachItem((item) => {
96
- this.optionsWrapper.appendChild(this.createOption(item.item));
97
- });
98
- this.onOptionsChange();
99
- this.updateCurrentValue();
100
- this.updateSelectAllLabelText();
73
+ this.hostParentEl.appendChild(this.multiselectComponentHtml);
101
74
  }
102
75
  }
103
- ngAfterViewInit() {
104
- this.onOptionsChange();
105
- }
106
76
  ngOnDestroy() {
107
77
  this.destroy$.next(true);
108
78
  this.destroy$.unsubscribe();
109
- this.removeAllListeners();
110
- }
111
- writeValue(values) {
112
- this.resetComponent();
113
- this.writeValues(values);
114
- }
115
- registerOnChange(fn) {
116
- this.propagateChange = fn;
117
- }
118
- registerOnTouched(fn) {
119
- this.propagateTouched = fn;
120
- }
121
- onEscapeKey(event) {
122
- this.closeMultiselectDropdown();
123
- }
124
- onKeyUp(ev) {
125
- const isClickInside = this.multiDropdown.contains(ev.target) || this.multiSelectInput.contains(ev.target);
126
- if (!isClickInside) {
127
- this.closeMultiselectDropdown();
128
- }
129
- }
130
- createOption(el) {
131
- if (el.isOptGroup()) {
132
- return this.createOptGroup(el);
133
- }
134
- else {
135
- return this.createOptionWithCheckbox(el);
136
- }
137
- }
138
- createOptGroup(el) {
139
- const id = uuidgen();
140
- const div = document.createElement('div');
141
- div.id = id;
142
- div.classList.add('ecl-select__multiple-group');
143
- const h5 = document.createElement('h5');
144
- h5.classList.add('ecl-select__multiple-group__title');
145
- h5.innerText = el.label;
146
- div.appendChild(h5);
147
- el.eclOptionItems.forEach((item) => div.appendChild(this.createOptionWithCheckbox(item)));
148
- return div;
149
- }
150
- removeAllOptions() {
151
- while (this.optionsWrapper.firstChild) {
152
- this.optionsWrapper.firstChild.remove();
153
- }
154
- }
155
- onOptionsChange() {
156
- this.eclOptionItems.forEach((i) => i.changes.pipe(takeUntil(this.destroy$)).subscribe((e) => {
157
- setTimeout(() => {
158
- this.multiselectWrapper.removeChild(this.multiDropdown);
159
- this.multiDropdown.remove();
160
- this.multiSelectOptions = [];
161
- this.multiSelectInput.value = null;
162
- this.buildMultiselectDropdown(true);
163
- });
164
- }));
165
- }
166
- createNoResultsFound() {
167
- const noResultsDiv = document.createElement('div');
168
- noResultsDiv.classList.add(this.CLASS_NO_RESULTS_FOUND);
169
- const textSpan = document.createElement('span');
170
- textSpan.innerHTML = this.noResultsFoundText;
171
- noResultsDiv.appendChild(textSpan);
172
- return noResultsDiv;
173
79
  }
174
80
  hideOriginalSelectComponent() {
175
81
  this.hostParentEl.replaceChild(this.hostWrapperEl, this.hostEl);
176
82
  this.hostWrapperEl.appendChild(this.hostEl);
177
83
  this.hostWrapperEl.classList.add('ecl-select__container--hidden');
178
84
  }
179
- createHtmlElements() {
180
- this.hostParentEl.appendChild(this.multiselectWrapper);
181
- this.multiselectWrapper.appendChild(this.multiselectContainer);
182
- this.multiselectContainer.appendChild(this.selectIconContainerEl);
183
- this.selectIconContainerEl.appendChild(this.createIconComponent());
184
- }
185
- buildMultiselectDropdown(withOptions) {
186
- this.multiDropdown = this.createDropdownForMultiselect();
187
- this.multiselectWrapper.appendChild(this.multiDropdown);
188
- this.multiDropdown.appendChild(this.createSearchForMultiselect());
189
- this.multiDropdown.appendChild(this.createMultiSelectAll());
190
- this.optionsWrapper = this.createOptionsWrapper();
191
- this.multiDropdown.appendChild(this.optionsWrapper);
192
- if (withOptions) {
193
- this.eclOptionItems.forEach((item) => {
194
- this.optionsWrapper.appendChild(this.createOptionWithCheckbox(item));
195
- });
196
- }
197
- this.multiDropdown.appendChild(this.createMultiselectToolbar());
198
- this.updateSelectAllLabelText();
199
- }
200
- getHostElement() {
201
- return this.el.nativeElement;
202
- }
203
- getHostParentElement(hostEl) {
204
- return hostEl.parentElement;
205
- }
206
85
  createHostWrapperContainer() {
207
86
  const wrapperContainer = document.createElement('div');
208
87
  wrapperContainer.classList.add('ecl-select__container');
209
- wrapperContainer.classList.add(`ecl-select__container--${this.eclSize}`);
88
+ wrapperContainer.classList.add('ecl-select__container--m');
210
89
  return wrapperContainer;
211
90
  }
212
- createWrapperMultiselect() {
213
- const wrapperContainerMulti = document.createElement('div');
214
- wrapperContainerMulti.classList.add('ecl-select__multiple');
215
- return wrapperContainerMulti;
216
- }
217
- createSelectContainerMultiselect() {
218
- const selectContainerMulti = document.createElement('div');
219
- selectContainerMulti.classList.add('ecl-select__container');
220
- selectContainerMulti.classList.add(`ecl-select__container--${this.eclSize}`);
221
- if (this.disabled) {
222
- selectContainerMulti.classList.add('ecl-select__container--disabled');
223
- }
224
- selectContainerMulti.appendChild(this.createMultiselectCounter());
225
- this.multiSelectInput = document.createElement('input');
226
- this.multiSelectInput.setAttribute('placeholder', this._eclPlaceholder || '');
227
- this.multiSelectInput.readOnly = true;
228
- this.multiSelectInput.setAttribute('type', 'text');
229
- if (this.hostEl.hasAttribute('formControlName')) {
230
- this.multiSelectInput.setAttribute('formControlName', this.hostEl.getAttribute('formControlName'));
231
- }
232
- this.multiSelectInput.addEventListener('click', this.handleClickOnMainInput);
233
- this.multiSelectInput.classList.add('ecl-select');
234
- this.multiSelectInput.classList.add('ecl-select__multiple-toggle');
235
- this.multiSelectInput.addEventListener('keydown', this.handleKeydownOnMainInput);
236
- if (this.disabled) {
237
- this.multiSelectInput.disabled = true;
238
- }
239
- selectContainerMulti.appendChild(this.multiSelectInput);
240
- return selectContainerMulti;
241
- }
242
- createMultiselectCounter() {
243
- this.selectionCount = document.createElement('div');
244
- this.selectionCount.classList.add('ecl-select-multiple-selections-counter');
245
- const selectionCountText = document.createElement('span');
246
- this.selectionCount.appendChild(selectionCountText);
247
- return this.selectionCount;
248
- }
249
- showMultiselectCounter() {
250
- this.selectionCount.classList.add('ecl-select-multiple-selections-counter--visible');
251
- }
252
- hideMultiselectCounter() {
253
- this.selectionCount.classList.remove('ecl-select-multiple-selections-counter--visible');
254
- }
255
- createDropdownForMultiselect() {
256
- const dropdownDiv = document.createElement('div');
257
- dropdownDiv.classList.add('ecl-select__multiple-dropdown');
258
- dropdownDiv.classList.add('ecl-select__container');
259
- dropdownDiv.classList.add(`ecl-select__container--${this.eclSize}`);
260
- dropdownDiv.style.display = 'none';
261
- return dropdownDiv;
262
- }
263
- // search box to search among options
264
- createSearchForMultiselect() {
265
- this.multiSearch = document.createElement('input');
266
- this.multiSearch.type = 'search';
267
- this.multiSearch.classList.add('ecl-text-input');
268
- this.multiSearch.placeholder = 'Search';
269
- this.multiSearch.addEventListener('keydown', this.handleKeydownOnSearch);
270
- this.multiSearch.addEventListener('keyup', this.onSearchOptions);
271
- this.multiSearch.addEventListener('search', this.handleXBtnOnSearch);
272
- this.searchEl = this.multiSearch;
273
- return this.multiSearch;
274
- }
275
- createOptionWithCheckbox(el) {
276
- const id = uuidgen();
277
- const checkboxDiv = document.createElement('div');
278
- if (el.cssClasses) {
279
- el.cssClasses.split(' ').forEach((cl) => {
280
- checkboxDiv.classList.add(cl);
281
- });
282
- }
283
- const checkboxInput = this.createCheckboxInput(id, el.value);
284
- if (el.disabled) {
285
- checkboxDiv.classList.add('ecl-checkbox--disabled');
286
- checkboxInput.disabled = true;
287
- }
288
- else {
289
- checkboxInput.addEventListener('click', this.handleClickOnOption);
290
- }
291
- if (el.selected || this.selectedValues.indexOf(el.value) > -1) {
292
- checkboxInput.checked = true;
293
- this.multiSelectInput.value = this.multiSelectInput.value === '' ? el.label : this.multiSelectInput.value + ',' + el.label;
294
- }
295
- checkboxInput.addEventListener('keydown', this.handleKeydownOnOption);
296
- checkboxDiv.appendChild(checkboxInput);
297
- const checkboxLabel = this.createCheckboxLabel(el.label, id);
298
- checkboxDiv.appendChild(checkboxLabel);
299
- this.multiSelectOptions.push(checkboxDiv);
300
- return checkboxDiv;
301
- }
302
- createCheckboxLabel(text, id) {
303
- const checkboxLabel = this.viewContainerRef.createComponent(EclCheckboxLabelComponent);
304
- checkboxLabel.location.nativeElement.htmlFor = id;
305
- const textSpan = document.createElement('span');
306
- textSpan.classList.add('ecl-checkbox__label-text');
307
- textSpan.innerHTML = text;
308
- checkboxLabel.location.nativeElement.appendChild(textSpan);
309
- return checkboxLabel.location.nativeElement;
310
- }
311
- createCheckboxInput(id, value) {
312
- const checkboxInput = document.createElement('input');
313
- checkboxInput.type = 'checkbox';
314
- checkboxInput.classList.add('ecl-checkbox__input');
315
- checkboxInput.id = id;
316
- checkboxInput.value = value;
317
- return checkboxInput;
318
- }
319
- createMultiselectToolbar() {
320
- this.multiselectToolbar = document.createElement('div');
321
- this.multiselectToolbar.classList.add('ecl-select-multiple-toolbar');
322
- this.clearBtn = document.createElement('button');
323
- this.clearBtn.classList.add('ecl-button');
324
- this.clearBtn.classList.add('ecl-button--ghost');
325
- this.clearBtn.type = 'button';
326
- this.clearBtn.textContent = this.clearAllText;
327
- this.closeBtn = document.createElement('button');
328
- this.closeBtn.classList.add('ecl-button');
329
- this.closeBtn.classList.add('ecl-button--primary');
330
- this.closeBtn.textContent = this.closeText;
331
- this.closeBtn.type = 'button';
332
- this.multiselectToolbar.appendChild(this.clearBtn);
333
- this.multiselectToolbar.appendChild(this.closeBtn);
334
- this.clearBtn.addEventListener('keydown', this.handleKeydownOnClear);
335
- this.clearBtn.addEventListener('click', this.handleClickOnClear);
336
- this.closeBtn.addEventListener('keydown', this.handleKeydownOnClose);
337
- this.closeBtn.addEventListener('click', this.handleClickOnClose);
338
- this.updateToolbarDisplay();
339
- return this.multiselectToolbar;
340
- }
341
- updateToolbarDisplay() {
342
- if (this.selectedValues.length > 0) {
343
- this.showMultiselectToolbar();
344
- }
345
- else {
346
- this.hideMultiselectToolbar();
347
- }
348
- }
349
- showMultiselectToolbar() {
350
- this.multiselectToolbar.style.display = 'flex';
351
- }
352
- hideMultiselectToolbar() {
353
- this.multiselectToolbar.style.display = 'none';
354
- }
355
- handleClickOnClear() {
356
- this.checkboxSelectAll.checked = false;
357
- this.multiSelectOptions.forEach((el) => {
358
- const input = el.childNodes[0];
359
- if (!input.disabled) {
360
- input.checked = false;
361
- }
362
- });
363
- this.selectedValues = [];
364
- this.multiSelectInput.value = '';
365
- this.updateMultiselectCounter(0);
366
- this.hideMultiselectToolbar();
367
- this.eclChange.emit([this.selectedValues]);
368
- this.propagateChange(this.selectedValues);
369
- }
370
- handleClickOnClose() {
371
- this.closeMultiselectDropdown();
372
- }
373
- handleKeydownOnClose(evt) {
374
- switch (evt.key) {
375
- case KeyCode.ARROW_UP: {
376
- this.onCloseClearArrowUp();
377
- break;
378
- }
379
- case KeyCode.ARROW_LEFT: {
380
- this.onCloseArrowLeft();
381
- break;
382
- }
383
- default: {
384
- break;
385
- }
386
- }
387
- }
388
- onCloseClearArrowUp() {
389
- const currentOptions = this.getActiveOptions();
390
- const firstOption = currentOptions[currentOptions.length - 1].firstElementChild;
391
- firstOption.focus();
392
- }
393
- onCloseArrowLeft() {
394
- this.clearBtn.focus();
395
- }
396
- handleKeydownOnClear(evt) {
397
- switch (evt.key) {
398
- case KeyCode.ARROW_UP: {
399
- this.onCloseClearArrowUp();
400
- break;
401
- }
402
- case KeyCode.ARROW_RIGHT: {
403
- this.onClearArrowRight();
404
- break;
405
- }
406
- default: {
407
- break;
408
- }
409
- }
410
- }
411
- onClearArrowRight() {
412
- this.closeBtn.focus();
413
- }
414
- // Add/remove values from the select input
415
- updateCurrentValue() {
416
- const selectedElementsArray = [];
417
- const selectedElementsValuesArray = [];
418
- this.checkboxSelectAll.checked = false;
419
- this.multiSelectOptions.forEach((el) => {
420
- const input = el.childNodes[0];
421
- if (input.checked) {
422
- selectedElementsValuesArray.push(el.childNodes[0].value);
423
- selectedElementsArray.push(el.childNodes[1].textContent);
424
- }
425
- });
426
- this.selectedValues = selectedElementsValuesArray;
427
- this.multiSelectInput.value = selectedElementsArray.join(',');
428
- this.updateToolbarDisplay();
429
- this.updateMultiselectCounter(selectedElementsArray.length);
430
- this.propagateChange(this.selectedValues);
431
- }
432
- updateMultiselectCounter(count) {
433
- if (count > 0) {
434
- this.selectionCount.querySelector('span').textContent = '' + count;
435
- this.showMultiselectCounter();
436
- }
437
- else {
438
- this.hideMultiselectCounter();
439
- }
440
- }
441
- // Checkbox to select all the elements
442
- createMultiSelectAll() {
443
- const id = uuidgen();
444
- const checkboxDiv = document.createElement('div');
445
- checkboxDiv.classList.add('ecl-checkbox');
446
- checkboxDiv.classList.add('ecl-select__multiple-all');
447
- this.checkboxSelectAll = this.createCheckboxInput(id, 'all');
448
- this.checkboxSelectAll.addEventListener('keydown', this.handleKeydownOnSelectAll);
449
- this.checkboxSelectAll.addEventListener('click', this.handleClickOnSelectAll);
450
- checkboxDiv.appendChild(this.checkboxSelectAll);
451
- this.selectAllLabel = this.createCheckboxLabel(this.getSelectAllLabelText(), id);
452
- checkboxDiv.appendChild(this.selectAllLabel);
453
- this.selectAllEll = checkboxDiv;
454
- return checkboxDiv;
455
- }
456
- getSelectAllLabelText() {
457
- return `${this.selectAllLabelText} (${this.getActiveOptions().length})`;
458
- }
459
- createOptionsWrapper() {
460
- const div = document.createElement('div');
461
- div.classList.add('ecl-select__multiple-options');
462
- return div;
463
- }
464
- onSelectAll() {
465
- const selectedElementsArray = [];
466
- const selectedElementsValuesArray = [];
467
- // Select all the elements, that are not disabled
468
- this.multiSelectOptions
469
- .filter((elem) => elem.style.display !== 'none')
470
- .forEach((el) => {
471
- const input = el.childNodes[0];
472
- if (this.checkboxSelectAll.checked) {
473
- if (!input.disabled) {
474
- input.checked = true;
475
- selectedElementsValuesArray.push(input.value);
476
- selectedElementsArray.push(el.childNodes[1].textContent);
477
- }
478
- }
479
- else {
480
- input.checked = false;
481
- }
482
- });
483
- this.selectedValues = selectedElementsValuesArray;
484
- this.multiSelectInput.value = selectedElementsArray.join(',');
485
- this.updateMultiselectCounter(selectedElementsArray.length);
486
- this.updateToolbarDisplay();
487
- this.eclChange.emit(this.selectedValues);
488
- this.propagateChange(this.selectedValues);
489
- }
490
- createIconComponent() {
491
- const eclIconComponent = this.viewContainerRef.createComponent(EclIconComponent);
492
- eclIconComponent.instance.size = 's';
493
- eclIconComponent.instance.icon = 'corner-arrow';
494
- eclIconComponent.instance.transform = 'rotate-180';
495
- eclIconComponent.instance.class = 'ecl-select__icon-shape';
496
- return eclIconComponent.location.nativeElement;
497
- }
498
- createIconContainer() {
499
- const selectIconContainer = document.createElement('div');
500
- selectIconContainer.classList.add('ecl-select__icon');
501
- return selectIconContainer;
502
- }
503
- handleXBtnOnSearch(evt) {
504
- const keyword = evt.target.value;
505
- if (keyword === '') {
506
- this.setSelectAllDisableStatus(false);
507
- this.multiSelectOptions.forEach((item) => {
508
- item.style.display = 'flex';
509
- const labelNode = item.children[1].children[1];
510
- labelNode.innerHTML = item.textContent;
511
- });
512
- const noResultsFoundExists = this.optionsWrapper.lastChild.classList.contains(this.CLASS_NO_RESULTS_FOUND);
513
- if (noResultsFoundExists) {
514
- this.optionsWrapper.removeChild(this.noResultsFound);
515
- }
516
- }
517
- }
518
- onSearchOptions(evt) {
519
- const keyword = evt.target.value;
520
- let isMatchFound = false;
521
- if (keyword === '') {
522
- this.setSelectAllDisableStatus(false);
523
- isMatchFound = true;
524
- this.multiSelectOptions.forEach((item) => {
525
- item.style.display = 'flex';
526
- const labelNode = item.children[1].children[1];
527
- labelNode.innerHTML = item.textContent;
528
- });
529
- }
530
- else {
531
- this.setSelectAllDisableStatus(true);
532
- this.multiSelectOptions.forEach((item) => {
533
- if (item.textContent.toLowerCase().indexOf(keyword.toLowerCase()) < 0) {
534
- item.style.display = 'none';
535
- }
536
- else {
537
- isMatchFound = true;
538
- item.style.display = 'flex';
539
- this.highlightSearchText(item, keyword);
540
- }
541
- });
542
- }
543
- const noResultsFoundExists = this.optionsWrapper.lastChild.classList.contains(this.CLASS_NO_RESULTS_FOUND);
544
- if (!isMatchFound && !noResultsFoundExists) {
545
- this.optionsWrapper.appendChild(this.noResultsFound);
546
- }
547
- else if (isMatchFound && noResultsFoundExists) {
548
- this.optionsWrapper.removeChild(this.noResultsFound);
549
- }
550
- }
551
- highlightSearchText(item, keyword) {
552
- const labelNode = item.children[1].children[1];
553
- const re = new RegExp(keyword, 'gi');
554
- const text = item.textContent;
555
- const res = text.replace(re, '<b>$&</b>');
556
- labelNode.innerHTML = res;
557
- }
558
- setSelectAllDisableStatus(isDisabled) {
559
- this.checkboxSelectAll.disabled = isDisabled;
560
- this.selectAllEll.classList.toggle('ecl-checkbox--disabled', this.checkboxSelectAll.disabled);
561
- }
562
- resetComponent() {
563
- this.multiSelectOptions.forEach((el) => {
564
- const input = el.childNodes[0];
565
- if (input.checked) {
566
- input.checked = false;
567
- }
568
- });
569
- if (this.checkboxSelectAll) {
570
- this.checkboxSelectAll.checked = false;
571
- }
572
- if (this.multiSelectInput) {
573
- this.multiSelectInput.value = null;
574
- }
575
- this.selectedValues = [];
576
- if (this.selectionCount) {
577
- this.updateMultiselectCounter(0);
578
- }
579
- }
580
- writeValues(values) {
581
- if (values) {
582
- const selectedElementsArray = [];
583
- if (this.multiSelectOptions && this.multiSelectOptions.length > 0) {
584
- this.multiSelectOptions
585
- .filter((elem) => values.includes(elem.childNodes[0].value) &&
586
- !elem.childNodes[0].disabled)
587
- .forEach((el) => {
588
- const input = el.childNodes[0];
589
- input.checked = true;
590
- selectedElementsArray.push(el.childNodes[1].textContent);
591
- this.selectedValues.push(input.value);
592
- });
593
- if (this.multiSelectInput) {
594
- this.multiSelectInput.value = selectedElementsArray.join(',');
595
- }
596
- }
597
- else {
598
- values.forEach((val) => {
599
- this.selectedValues.push(val);
600
- });
601
- }
602
- if (this.selectionCount) {
603
- this.updateMultiselectCounter(values.length);
604
- }
605
- }
606
- }
607
- updateSelectAllLabelText() {
608
- this.selectAllLabel.lastElementChild.textContent = `${this.selectAllLabelText} (${this.getActiveOptions().length})`;
91
+ getHostElement() {
92
+ return this.el.nativeElement;
609
93
  }
610
- updateButtonsLabelText() {
611
- this.closeBtn.textContent = `${this.closeText}`;
612
- this.clearBtn.textContent = `${this.clearAllText}`;
94
+ getHostParentElement(hostEl) {
95
+ return hostEl.parentElement;
613
96
  }
614
- handleTranslations() {
615
- const SELECT_ALL_KEY = 'ecl.multiselect.SELECT-ALL';
616
- const NO_RESULTS_FOUND_KEY = 'ecl.multiselect.NO-RESULTS-FOUND';
617
- const CLOSE_KEY = 'ecl.common.CLOSE';
618
- const CLEAR_ALL_KEY = 'ecl.multiselect.CLEAR-ALL';
619
- const SEARCH_KEY = 'ecl.common.SEARCH';
620
- this.translate
621
- .stream([SELECT_ALL_KEY, NO_RESULTS_FOUND_KEY, CLOSE_KEY, CLEAR_ALL_KEY, SEARCH_KEY])
97
+ createMultiselectComponent() {
98
+ const ngControl = this.injector.get(NgControl, undefined, { optional: true });
99
+ const multiselect = this.viewContainerRef.createComponent(EclMultiselectDropdownComponent);
100
+ this.multiselectComponent = multiselect.instance;
101
+ this.multiselectComponent.eclChange
622
102
  .pipe(takeUntil(this.destroy$))
623
- .subscribe((translation) => {
624
- this.noResultsFoundText = translation[NO_RESULTS_FOUND_KEY];
625
- this.closeText = translation[CLOSE_KEY];
626
- this.clearAllText = translation[CLEAR_ALL_KEY];
627
- this.updateButtonsLabelText();
628
- if (this.selectAllLabel) {
629
- this.selectAllLabelText = translation[SELECT_ALL_KEY];
630
- this.updateSelectAllLabelText();
631
- }
632
- if (this.multiSearch) {
633
- this.multiSearch.placeholder = translation[SEARCH_KEY];
634
- }
103
+ .subscribe((evt) => {
104
+ this.eclChange.emit(evt);
635
105
  });
636
- }
637
- closeMultiselectDropdown() {
638
- this.multiDropdown.style.display = 'none';
639
- }
640
- openMultiselect() {
641
- this.multiDropdown.style.display = 'block';
642
- }
643
- getOptionIndexByIdFromActiveOptions(id) {
644
- return this.getActiveOptions().findIndex((option) => option.firstElementChild.id === id);
645
- }
646
- handleClickOnMainInput(evt) {
647
- evt.preventDefault();
648
- this.toggleDropdown();
649
- }
650
- toggleDropdown() {
651
- this.multiDropdown.style.display = this.multiDropdown.style.display === 'none' ? 'block' : 'none';
652
- }
653
- handleKeydownOnMainInput(evt) {
654
- switch (evt.key) {
655
- case KeyCode.ENTER: {
656
- evt.preventDefault();
657
- break;
658
- }
659
- case KeyCode.ARROW_DOWN: {
660
- this.onMainInputArrowDown(evt);
661
- break;
662
- }
663
- default: {
664
- break;
665
- }
666
- }
667
- }
668
- onMainInputArrowDown(evt) {
669
- evt.preventDefault();
670
- this.openMultiselect();
671
- this.searchEl.focus();
672
- }
673
- handleKeydownOnSearch(evt) {
674
- switch (evt.key) {
675
- case KeyCode.ENTER: {
676
- evt.preventDefault();
677
- break;
678
- }
679
- case KeyCode.TAB:
680
- case KeyCode.ARROW_DOWN: {
681
- this.onSearchArrowDownOrTab();
682
- evt.preventDefault();
683
- break;
684
- }
685
- case KeyCode.ARROW_UP: {
686
- this.onSearchArrowUp(evt);
687
- break;
688
- }
689
- case KeyCode.ESCAPE: {
690
- this.closeMultiselectDropdown();
691
- break;
692
- }
693
- default: {
694
- break;
695
- }
106
+ this.multiselectComponent.mainInputPlaceholder = this.eclPlaceholder;
107
+ if (ngControl) {
108
+ ngControl.valueAccessor = this.multiselectComponent;
696
109
  }
110
+ multiselect.instance.disabled = this.disabled;
111
+ multiselect.instance.isInvalid = this.isInvalid;
112
+ return multiselect.location.nativeElement;
697
113
  }
698
- onSearchArrowDownOrTab() {
699
- if (!this.checkboxSelectAll.disabled) {
700
- this.checkboxSelectAll.focus();
701
- }
702
- else {
703
- const currentOptions = this.getActiveOptions();
704
- const firstOption = currentOptions[0].firstElementChild;
705
- firstOption.focus();
706
- }
707
- }
708
- onSearchArrowUp(evt) {
709
- evt.preventDefault();
710
- this.closeMultiselectDropdown();
711
- this.multiSelectInput.focus();
712
- }
713
- handleClickOnSelectAll() {
714
- this.propagateTouched();
715
- this.onSelectAll();
716
- }
717
- handleKeydownOnSelectAll(evt) {
718
- evt.preventDefault();
719
- switch (evt.key) {
720
- case KeyCode.TAB:
721
- case KeyCode.ARROW_DOWN: {
722
- this.onSelectAllArrowDownOrTab(evt);
723
- break;
724
- }
725
- case KeyCode.ARROW_UP: {
726
- this.onSelectAllArrowUp();
727
- break;
728
- }
729
- case KeyCode.ENTER: {
730
- this.checkboxSelectAll.click();
731
- break;
732
- }
733
- case KeyCode.ESCAPE: {
734
- this.closeMultiselectDropdown();
735
- break;
736
- }
737
- default: {
738
- break;
739
- }
740
- }
741
- }
742
- onSelectAllArrowDownOrTab(evt) {
743
- evt.preventDefault();
744
- const currentOptions = this.getActiveOptions();
745
- if (currentOptions.length > 0) {
746
- const nextSiblingCheckbox = currentOptions[0].firstElementChild;
747
- nextSiblingCheckbox.focus();
748
- }
749
- }
750
- onSelectAllArrowUp() {
751
- this.searchEl.focus();
752
- }
753
- handleClickOnOption(evt) {
754
- this.updateCurrentValue();
755
- this.propagateTouched();
756
- this.eclChange.emit(this.selectedValues);
757
- }
758
- handleKeydownOnOption(evt) {
759
- switch (evt.key) {
760
- case KeyCode.ARROW_DOWN: {
761
- this.onOptionArrowDown(evt);
762
- break;
763
- }
764
- case KeyCode.ARROW_UP: {
765
- this.onOptionArrowUp(evt);
766
- break;
767
- }
768
- case KeyCode.ESCAPE: {
769
- this.closeMultiselectDropdown();
770
- break;
771
- }
772
- case KeyCode.ENTER: {
773
- evt.target.click();
774
- evt.preventDefault();
775
- break;
776
- }
777
- case KeyCode.TAB: {
778
- this.onOptionTab(evt);
779
- break;
780
- }
781
- default: {
782
- break;
783
- }
784
- }
785
- }
786
- onOptionArrowDown(evt) {
787
- evt.preventDefault();
788
- const index = this.getOptionIndexByIdFromActiveOptions(evt.target.id);
789
- const currentOptions = this.getActiveOptions();
790
- if (index !== currentOptions.length - 1) {
791
- const nextSiblingCheckbox = currentOptions[index + 1].firstElementChild;
792
- nextSiblingCheckbox.focus();
793
- }
794
- else {
795
- this.clearBtn.focus();
796
- }
797
- }
798
- onOptionArrowUp(evt) {
799
- evt.preventDefault();
800
- const index = this.getOptionIndexByIdFromActiveOptions(evt.target.id);
801
- if (index !== 0) {
802
- const prevSiblingCheckbox = this.getActiveOptions()[index - 1].firstElementChild;
803
- prevSiblingCheckbox.focus();
804
- }
805
- else if (this.checkboxSelectAll.disabled) {
806
- this.searchEl.focus();
807
- }
808
- else {
809
- this.checkboxSelectAll.focus();
810
- }
811
- }
812
- onOptionTab(evt) {
813
- const index = this.getOptionIndexByIdFromActiveOptions(evt.target.id);
814
- if (index === this.getActiveOptions().length - 1) {
815
- this.multiSelectInput.focus(); // Trap tab
816
- evt.preventDefault();
817
- }
818
- }
819
- getActiveOptions() {
820
- return this.multiSelectOptions.filter((item) => item.style.display !== 'none' && !item.classList.contains('ecl-checkbox--disabled'));
821
- }
822
- removeAllListeners() {
823
- this.multiSelectInput.removeEventListener('keydown', this.handleKeydownOnMainInput);
824
- this.multiSelectInput.removeEventListener('click', this.handleClickOnMainInput);
825
- this.searchEl.removeEventListener('keydown', this.handleKeydownOnSearch);
826
- this.searchEl.removeEventListener('keyup', this.onSearchOptions);
827
- this.searchEl.removeEventListener('search', this.handleXBtnOnSearch);
828
- this.checkboxSelectAll.removeEventListener('keydown', this.handleKeydownOnSelectAll);
829
- this.checkboxSelectAll.removeEventListener('click', this.handleClickOnSelectAll);
830
- this.clearBtn.removeEventListener('keydown', this.handleKeydownOnClear);
831
- this.clearBtn.removeEventListener('click', this.handleClickOnClear);
832
- this.closeBtn.removeEventListener('keydown', this.handleKeydownOnClose);
833
- this.closeBtn.removeEventListener('click', this.handleClickOnClose);
834
- this.multiSelectOptions.forEach((el) => {
835
- const checboxEl = el.firstElementChild;
836
- checboxEl.removeEventListener('keydown', this.handleKeydownOnOption);
837
- checboxEl.removeEventListener('click', this.handleClickOnOption);
114
+ attachOptions() {
115
+ setTimeout(() => {
116
+ this.multiselectComponent.multiOptionDirectives = this.eclOptionItems.toArray();
838
117
  });
839
118
  }
840
- bindCallbacks() {
841
- this.handleKeydownOnMainInput = this.handleKeydownOnMainInput.bind(this);
842
- this.handleKeydownOnSearch = this.handleKeydownOnSearch.bind(this);
843
- this.onSearchOptions = this.onSearchOptions.bind(this);
844
- this.handleXBtnOnSearch = this.handleXBtnOnSearch.bind(this);
845
- this.handleKeydownOnSelectAll = this.handleKeydownOnSelectAll.bind(this);
846
- this.handleKeydownOnOption = this.handleKeydownOnOption.bind(this);
847
- this.handleClickOnMainInput = this.handleClickOnMainInput.bind(this);
848
- this.handleClickOnSelectAll = this.handleClickOnSelectAll.bind(this);
849
- this.handleClickOnOption = this.handleClickOnOption.bind(this);
850
- this.handleClickOnClear = this.handleClickOnClear.bind(this);
851
- this.handleKeydownOnClear = this.handleKeydownOnClear.bind(this);
852
- this.handleKeydownOnClose = this.handleKeydownOnClose.bind(this);
853
- this.handleClickOnClose = this.handleClickOnClose.bind(this);
854
- }
855
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0-next.4", ngImport: i0, type: EclMultiselectComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i0.IterableDiffers }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
856
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.0-next.4", type: EclMultiselectComponent, selector: "select[eclMultiselect]", inputs: { isInvalid: "isInvalid", eclPlaceholder: "eclPlaceholder", eclSize: "eclSize", disabled: "disabled" }, outputs: { eclChange: "eclChange" }, host: { listeners: { "document:keyup.escape": "onEscapeKey($event)", "document:click": "onKeyUp($event)" }, properties: { "class": "this.cssClasses", "attr.disabled": "this.disabled" } }, queries: [{ propertyName: "eclOptionItems", predicate: EclMultiselectOptionDirective }], usesInheritance: true, ngImport: i0, template: "<ng-content></ng-content>\n", encapsulation: i0.ViewEncapsulation.None }); }
119
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0-next.7", ngImport: i0, type: EclMultiselectComponent, deps: [{ token: i0.Injector }, { token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component }); }
120
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.0-next.7", type: EclMultiselectComponent, selector: "select[eclMultiselect]", inputs: { isInvalid: "isInvalid", disabled: "disabled", eclPlaceholder: "eclPlaceholder" }, outputs: { eclChange: "eclChange" }, host: { properties: { "attr.disabled": "this.disabled", "class": "this.cssClasses" } }, providers: [
121
+ {
122
+ provide: NG_VALUE_ACCESSOR,
123
+ useExisting: forwardRef((() => EclMultiselectComponent)),
124
+ multi: true,
125
+ },
126
+ ], queries: [{ propertyName: "eclOptionItems", predicate: i0.forwardRef(() => EclMultiselectOptionDirective) }], usesInheritance: true, ngImport: i0, template: "<ng-content></ng-content>\n", encapsulation: i0.ViewEncapsulation.None }); }
857
127
  }
858
128
  __decorate([
859
129
  coerceBoolean
860
- ], EclMultiselectComponent.prototype, "isInvalid", void 0);
861
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-next.4", ngImport: i0, type: EclMultiselectComponent, decorators: [{
130
+ ], EclMultiselectComponent.prototype, "isInvalid", null);
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-next.7", ngImport: i0, type: EclMultiselectComponent, decorators: [{
862
132
  type: Component,
863
- args: [{ selector: 'select[eclMultiselect]', encapsulation: ViewEncapsulation.None, template: "<ng-content></ng-content>\n" }]
864
- }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
865
- type: Optional
866
- }, {
867
- type: Self
868
- }] }, { type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: i0.IterableDiffers }, { type: i2.TranslateService }]; }, propDecorators: { eclOptionItems: [{
133
+ args: [{ selector: 'select[eclMultiselect]', encapsulation: ViewEncapsulation.None, providers: [
134
+ {
135
+ provide: NG_VALUE_ACCESSOR,
136
+ useExisting: forwardRef((() => EclMultiselectComponent)),
137
+ multi: true,
138
+ },
139
+ ], template: "<ng-content></ng-content>\n" }]
140
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: i0.IterableDiffers }], propDecorators: { eclOptionItems: [{
869
141
  type: ContentChildren,
870
- args: [EclMultiselectOptionDirective]
142
+ args: [forwardRef(() => EclMultiselectOptionDirective)]
871
143
  }], isInvalid: [{
872
144
  type: Input
145
+ }], disabled: [{
146
+ type: Input
147
+ }, {
148
+ type: HostBinding,
149
+ args: ['attr.disabled']
873
150
  }], cssClasses: [{
874
151
  type: HostBinding,
875
152
  args: ['class']
@@ -877,18 +154,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-next.4",
877
154
  type: Output
878
155
  }], eclPlaceholder: [{
879
156
  type: Input
880
- }], eclSize: [{
881
- type: Input
882
- }], disabled: [{
883
- type: Input
884
- }, {
885
- type: HostBinding,
886
- args: ['attr.disabled']
887
- }], onEscapeKey: [{
888
- type: HostListener,
889
- args: ['document:keyup.escape', ['$event']]
890
- }], onKeyUp: [{
891
- type: HostListener,
892
- args: ['document:click', ['$event']]
893
157
  }] } });
894
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNsLW11bHRpc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lY2wtbXVsdGlzZWxlY3QvZWNsLW11bHRpc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lY2wtbXVsdGlzZWxlY3QvZWNsLW11bHRpc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBRUgsU0FBUyxFQUNULGVBQWUsRUFHZixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBS0wsUUFBUSxFQUNSLE1BQU0sRUFFTixJQUFJLEVBRUosaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxFQUFFLElBQUksT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDekYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7QUFFbkYsSUFBSyxPQVFKO0FBUkQsV0FBSyxPQUFPO0lBQ1IsK0JBQW9CLENBQUE7SUFDcEIsbUNBQXdCLENBQUE7SUFDeEIsbUNBQXdCLENBQUE7SUFDeEIscUNBQTBCLENBQUE7SUFDMUIsNEJBQWlCLENBQUE7SUFDakIsMEJB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Qix1QkFBdUIsOGFBQ2YsNkJBQTZCLG9EQ2pEbEQsNkJBQ0E7O0FEaUQ0QjtJQUF2QixhQUFhOzBEQUEyQztrR0FGaEQsdUJBQXVCO2tCQU5uQyxTQUFTOytCQUVJLHdCQUF3QixpQkFFbkIsaUJBQWlCLENBQUMsSUFBSTs7MEJBaUVoQyxRQUFROzswQkFBSSxJQUFJO2lLQTlEMkIsY0FBYztzQkFBN0QsZUFBZTt1QkFBQyw2QkFBNkI7Z0JBQ3RCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRWpCLFVBQVU7c0JBRGIsV0FBVzt1QkFBQyxPQUFPO2dCQUtWLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ00sY0FBYztzQkFBMUIsS0FBSztnQkFNRyxPQUFPO3NCQUFmLEtBQUs7Z0JBSUYsUUFBUTtzQkFGWCxLQUFLOztzQkFDTCxXQUFXO3VCQUFDLGVBQWU7Z0JBMEh1QixXQUFXO3NCQUE3RCxZQUFZO3VCQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUtqRCxPQUFPO3NCQUROLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRG9DaGVjayxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgSXRlcmFibGVEaWZmZXIsXG4gICAgSXRlcmFibGVEaWZmZXJzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTZWxmLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHY0IGFzIHV1aWRnZW4gfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW4gfSBmcm9tICdAZXVpL2Jhc2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFQ0xCYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZWNsLWJhc2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IEVjbENoZWNrYm94TGFiZWxDb21wb25lbnQgfSBmcm9tICcuLi9lY2wtY2hlY2tib3gvZWNsLWNoZWNrYm94LWxhYmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFY2xJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vZWNsLWljb24vZWNsLWljb24uY29tcG9uZW50JztcbmltcG9ydCB7IEVjbE11bHRpc2VsZWN0T3B0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi9lY2wtbXVsdGlzZWxlY3Qtb3B0aW9uLmRpcmVjdGl2ZSc7XG5cbmVudW0gS2V5Q29kZSB7XG4gICAgQVJST1dfVVAgPSAnQXJyb3dVcCcsXG4gICAgQVJST1dfRE9XTiA9ICdBcnJvd0Rvd24nLFxuICAgIEFSUk9XX0xFRlQgPSAnQXJyb3dMZWZ0JyxcbiAgICBBUlJPV19SSUdIVCA9ICdBcnJvd1JpZ2h0JyxcbiAgICBFU0NBUEUgPSAnRXNjYXBlJyxcbiAgICBFTlRFUiA9ICdFbnRlcicsXG4gICAgVEFCID0gJ1RhYicsXG59XG5cbkBDb21wb25lbnQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdzZWxlY3RbZWNsTXVsdGlzZWxlY3RdJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2VjbC1tdWx0aXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgRWNsTXVsdGlzZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBFQ0xCYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBEb0NoZWNrLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBAQ29udGVudENoaWxkcmVuKEVjbE11bHRpc2VsZWN0T3B0aW9uRGlyZWN0aXZlKSBlY2xPcHRpb25JdGVtczogUXVlcnlMaXN0PEVjbE11bHRpc2VsZWN0T3B0aW9uRGlyZWN0aXZlPjtcbiAgICBAY29lcmNlQm9vbGVhbiBASW5wdXQoKSBpc0ludmFsaWQ6IGJvb2xlYW4gfCBhbnkgPSBmYWxzZTtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgICBnZXQgY3NzQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gW3N1cGVyLmdldENzc0NsYXNzZXMoJ2VjbC1zZWxlY3QnKV0uam9pbignICcpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgZWNsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQElucHV0KCkgc2V0IGVjbFBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZWNsUGxhY2Vob2xkZXIgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlTZWxlY3RJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0LnNldEF0dHJpYnV0ZSgncGxhY2Vob2xkZXInLCB0aGlzLl9lY2xQbGFjZWhvbGRlciB8fCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQElucHV0KCkgZWNsU2l6ZTogc3RyaW5nID0gJ20nO1xuXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGlzYWJsZWQnKVxuICAgIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQgfHwgbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZCB8fCBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbiB8IGFueSkge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuICAgIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIF9lY2xQbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgIHByaXZhdGUgZGlmZmVyOiBJdGVyYWJsZURpZmZlcjxFY2xNdWx0aXNlbGVjdE9wdGlvbkRpcmVjdGl2ZT47XG4gICAgcHJpdmF0ZSBob3N0RWw6IEhUTUxTZWxlY3RFbGVtZW50O1xuICAgIHByaXZhdGUgaG9zdFBhcmVudEVsOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIGhvc3RXcmFwcGVyRWw6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgc2VsZWN0SWNvbkNvbnRhaW5lckVsOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIG11bHRpc2VsZWN0V3JhcHBlcjogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBtdWx0aXNlbGVjdENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBtdWx0aURyb3Bkb3duOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIG9wdGlvbnNXcmFwcGVyOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIG11bHRpU2VsZWN0T3B0aW9uczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIHByaXZhdGUgbXVsdGlTZWxlY3RJbnB1dDogSFRNTElucHV0RWxlbWVudDtcbiAgICBwcml2YXRlIG11bHRpU2VhcmNoOiBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHByaXZhdGUgbm9SZXN1bHRzRm91bmQ6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgY2hlY2tib3hTZWxlY3RBbGw6IEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBzZWxlY3RBbGxFbGw6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgc2VsZWN0ZWRWYWx1ZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBzZWFyY2hFbDogSFRNTElucHV0RWxlbWVudDtcbiAgICBwcml2YXRlIHNlbGVjdEFsbExhYmVsOiBIVE1MTGFiZWxFbGVtZW50O1xuICAgIHByaXZhdGUgc2VsZWN0aW9uQ291bnQ6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgbXVsdGlzZWxlY3RUb29sYmFyOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIGRlc3Ryb3kkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgICBwcml2YXRlIGNsZWFyQnRuOiBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBwcml2YXRlIGNsb3NlQnRuOiBIVE1MQnV0dG9uRWxlbWVudDtcblxuICAgIHByaXZhdGUgbm9SZXN1bHRzRm91bmRUZXh0ID0gJ05vIHJlc3VsdHMgZm91bmQnO1xuICAgIHByaXZhdGUgQ0xBU1NfTk9fUkVTVUxUU19GT1VORCA9ICdlY2wtc2VsZWN0X19tdWx0aXBsZS1uby1yZXN1bHRzJztcbiAgICBwcml2YXRlIHNlbGVjdEFsbExhYmVsVGV4dCA9ICdTZWxlY3QgYWxsJztcbiAgICBwcml2YXRlIGNsb3NlVGV4dCA9ICdDbG9zZSc7XG4gICAgcHJpdmF0ZSBjbGVhckFsbFRleHQgPSAnQ2xlYXIgYWxsJztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHByb3RlY3RlZCBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcml2YXRlIGRpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5kaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZChbXSkuY3JlYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iaW5kQ2FsbGJhY2tzKCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG9zdEVsID0gdGhpcy5nZXRIb3N0RWxlbWVudCgpO1xuICAgICAgICB0aGlzLmhvc3RQYXJlbnRFbCA9IHRoaXMuZ2V0SG9zdFBhcmVudEVsZW1lbnQodGhpcy5ob3N0RWwpO1xuICAgICAgICB0aGlzLmhvc3RXcmFwcGVyRWwgPSB0aGlzLmNyZWF0ZUhvc3RXcmFwcGVyQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0SWNvbkNvbnRhaW5lckVsID0gdGhpcy5jcmVhdGVJY29uQ29udGFpbmVyKCk7XG5cbiAgICAgICAgdGhpcy5tdWx0aXNlbGVjdFdyYXBwZXIgPSB0aGlzLmNyZWF0ZVdyYXBwZXJNdWx0aXNlbGVjdCgpO1xuICAgICAgICB0aGlzLm11bHRpc2VsZWN0Q29udGFpbmVyID0gdGhpcy5jcmVhdGVTZWxlY3RDb250YWluZXJNdWx0aXNlbGVjdCgpO1xuICAgICAgICB0aGlzLm5vUmVzdWx0c0ZvdW5kID0gdGhpcy5jcmVhdGVOb1Jlc3VsdHNGb3VuZCgpO1xuXG4gICAgICAgIGlmICh0aGlzLmhvc3RQYXJlbnRFbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVPcmlnaW5hbFNlbGVjdENvbXBvbmVudCgpO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVIdG1sRWxlbWVudHMoKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRNdWx0aXNlbGVjdERyb3Bkb3duKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlVHJhbnNsYXRpb25zKCk7XG4gICAgfVxuXG4gICAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm11bHRpc2VsZWN0Q29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoJ2VjbC1zZWxlY3RfX2NvbnRhaW5lci0tZGlzYWJsZWQnLCB0aGlzLmRpc2FibGVkKTtcbiAgICAgICAgdGhpcy5tdWx0aXNlbGVjdENvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdlY2wtc2VsZWN0X19jb250YWluZXItLWludmFsaWQnLCB0aGlzLmlzSW52YWxpZCk7XG5cbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcblxuICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5kaWZmZXIuZGlmZih0aGlzLmVjbE9wdGlvbkl0ZW1zKTtcblxuICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxPcHRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9ucyA9IFtdO1xuICAgICAgICAgICAgZGlmZi5mb3JFYWNoSXRlbSgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc1dyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVPcHRpb24oaXRlbS5pdGVtKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMub25PcHRpb25zQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRWYWx1ZSgpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RBbGxMYWJlbFRleHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbk9wdGlvbnNDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZXM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlc2V0Q29tcG9uZW50KCk7XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZXModmFsdWVzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVUb3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5dXAuZXNjYXBlJywgWyckZXZlbnQnXSkgb25Fc2NhcGVLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbG9zZU11bHRpc2VsZWN0RHJvcGRvd24oKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gICAgb25LZXlVcChldjogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0NsaWNrSW5zaWRlID0gdGhpcy5tdWx0aURyb3Bkb3duLmNvbnRhaW5zKDxFbGVtZW50PmV2LnRhcmdldCkgfHwgdGhpcy5tdWx0aVNlbGVjdElucHV0LmNvbnRhaW5zKDxFbGVtZW50PmV2LnRhcmdldCk7XG4gICAgICAgIGlmICghaXNDbGlja0luc2lkZSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZU11bHRpc2VsZWN0RHJvcGRvd24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlT3B0aW9uKGVsOiBFY2xNdWx0aXNlbGVjdE9wdGlvbkRpcmVjdGl2ZSk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgaWYgKGVsLmlzT3B0R3JvdXAoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlT3B0R3JvdXAoZWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlT3B0aW9uV2l0aENoZWNrYm94KGVsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlT3B0R3JvdXAoZWw6IEVjbE11bHRpc2VsZWN0T3B0aW9uRGlyZWN0aXZlKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBpZCA9IHV1aWRnZW4oKTtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5pZCA9IGlkO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnZWNsLXNlbGVjdF9fbXVsdGlwbGUtZ3JvdXAnKTtcbiAgICAgICAgY29uc3QgaDUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNScpO1xuICAgICAgICBoNS5jbGFzc0xpc3QuYWRkKCdlY2wtc2VsZWN0X19tdWx0aXBsZS1ncm91cF9fdGl0bGUnKTtcbiAgICAgICAgaDUuaW5uZXJUZXh0ID0gZWwubGFiZWw7XG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChoNSk7XG4gICAgICAgIGVsLmVjbE9wdGlvbkl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IGRpdi5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZU9wdGlvbldpdGhDaGVja2JveChpdGVtKSkpO1xuICAgICAgICByZXR1cm4gZGl2O1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlQWxsT3B0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgd2hpbGUgKHRoaXMub3B0aW9uc1dyYXBwZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zV3JhcHBlci5maXJzdENoaWxkLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk9wdGlvbnNDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWNsT3B0aW9uSXRlbXMuZm9yRWFjaCgoaSkgPT5cbiAgICAgICAgICAgIGkuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubXVsdGlzZWxlY3RXcmFwcGVyLnJlbW92ZUNoaWxkKHRoaXMubXVsdGlEcm9wZG93bik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubXVsdGlEcm9wZG93bi5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0LnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZE11bHRpc2VsZWN0RHJvcGRvd24odHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlTm9SZXN1bHRzRm91bmQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBub1Jlc3VsdHNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbm9SZXN1bHRzRGl2LmNsYXNzTGlzdC5hZGQodGhpcy5DTEFTU19OT19SRVNVTFRTX0ZPVU5EKTtcbiAgICAgICAgY29uc3QgdGV4dFNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHRleHRTcGFuLmlubmVySFRNTCA9IHRoaXMubm9SZXN1bHRzRm91bmRUZXh0O1xuICAgICAgICBub1Jlc3VsdHNEaXYuYXBwZW5kQ2hpbGQodGV4dFNwYW4pO1xuICAgICAgICByZXR1cm4gbm9SZXN1bHRzRGl2O1xuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZU9yaWdpbmFsU2VsZWN0Q29tcG9uZW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvc3RQYXJlbnRFbC5yZXBsYWNlQ2hpbGQodGhpcy5ob3N0V3JhcHBlckVsLCB0aGlzLmhvc3RFbCk7XG4gICAgICAgIHRoaXMuaG9zdFdyYXBwZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmhvc3RFbCk7XG4gICAgICAgIHRoaXMuaG9zdFdyYXBwZXJFbC5jbGFzc0xpc3QuYWRkKCdlY2wtc2VsZWN0X19jb250YWluZXItLWhpZGRlbicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlSHRtbEVsZW1lbnRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvc3RQYXJlbnRFbC5hcHBlbmRDaGlsZCh0aGlzLm11bHRpc2VsZWN0V3JhcHBlcik7XG4gICAgICAgIHRoaXMubXVsdGlzZWxlY3RXcmFwcGVyLmFwcGVuZENoaWxkKHRoaXMubXVsdGlzZWxlY3RDb250YWluZXIpO1xuICAgICAgICB0aGlzLm11bHRpc2VsZWN0Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2VsZWN0SWNvbkNvbnRhaW5lckVsKTtcbiAgICAgICAgdGhpcy5zZWxlY3RJY29uQ29udGFpbmVyRWwuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVJY29uQ29tcG9uZW50KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG5cbiAgICBwcml2YXRlIHByb3BhZ2F0ZVRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICAgIHByaXZhdGUgYnVpbGRNdWx0aXNlbGVjdERyb3Bkb3duKHdpdGhPcHRpb25zOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMubXVsdGlEcm9wZG93biA9IHRoaXMuY3JlYXRlRHJvcGRvd25Gb3JNdWx0aXNlbGVjdCgpO1xuICAgICAgICB0aGlzLm11bHRpc2VsZWN0V3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLm11bHRpRHJvcGRvd24pO1xuICAgICAgICB0aGlzLm11bHRpRHJvcGRvd24uYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVTZWFyY2hGb3JNdWx0aXNlbGVjdCgpKTtcbiAgICAgICAgdGhpcy5tdWx0aURyb3Bkb3duLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlTXVsdGlTZWxlY3RBbGwoKSk7XG4gICAgICAgIHRoaXMub3B0aW9uc1dyYXBwZXIgPSB0aGlzLmNyZWF0ZU9wdGlvbnNXcmFwcGVyKCk7XG4gICAgICAgIHRoaXMubXVsdGlEcm9wZG93bi5hcHBlbmRDaGlsZCh0aGlzLm9wdGlvbnNXcmFwcGVyKTtcblxuICAgICAgICBpZiAod2l0aE9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZWNsT3B0aW9uSXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc1dyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVPcHRpb25XaXRoQ2hlY2tib3goaXRlbSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm11bHRpRHJvcGRvd24uYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVNdWx0aXNlbGVjdFRvb2xiYXIoKSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RBbGxMYWJlbFRleHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEhvc3RFbGVtZW50KCk6IEhUTUxTZWxlY3RFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEhvc3RQYXJlbnRFbGVtZW50KGhvc3RFbDogSFRNTFNlbGVjdEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiBob3N0RWwucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUhvc3RXcmFwcGVyQ29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3Qgd3JhcHBlckNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB3cmFwcGVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2VjbC1zZWxlY3RfX2NvbnRhaW5lcicpO1xuICAgICAgICB3cmFwcGVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoYGVjbC1zZWxlY3RfX2NvbnRhaW5lci0tJHt0aGlzLmVjbFNpemV9YCk7XG4gICAgICAgIHJldHVybiB3cmFwcGVyQ29udGFpbmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlV3JhcHBlck11bHRpc2VsZWN0KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3Qgd3JhcHBlckNvbnRhaW5lck11bHRpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHdyYXBwZXJDb250YWluZXJNdWx0aS5jbGFzc0xpc3QuYWRkKCdlY2wtc2VsZWN0X19tdWx0aXBsZScpO1xuICAgICAgICByZXR1cm4gd3JhcHBlckNvbnRhaW5lck11bHRpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU2VsZWN0Q29udGFpbmVyTXVsdGlzZWxlY3QoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBzZWxlY3RDb250YWluZXJNdWx0aSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBzZWxlY3RDb250YWluZXJNdWx0aS5jbGFzc0xpc3QuYWRkKCdlY2wtc2VsZWN0X19jb250YWluZXInKTtcbiAgICAgICAgc2VsZWN0Q29udGFpbmVyTXVsdGkuY2xhc3NMaXN0LmFkZChgZWNsLXNlbGVjdF9fY29udGFpbmVyLS0ke3RoaXMuZWNsU2l6ZX1gKTtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHNlbGVjdENvbnRhaW5lck11bHRpLmNsYXNzTGlzdC5hZGQoJ2VjbC1zZWxlY3RfX2NvbnRhaW5lci0tZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBzZWxlY3RDb250YWluZXJNdWx0aS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZU11bHRpc2VsZWN0Q291bnRlcigpKTtcbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0LnNldEF0dHJpYnV0ZSgncGxhY2Vob2xkZXInLCB0aGlzLl9lY2xQbGFjZWhvbGRlciB8fCAnJyk7XG4gICAgICAgIHRoaXMubXVsdGlTZWxlY3RJbnB1dC5yZWFkT25seSA9IHRydWU7XG4gICAgICAgIHRoaXMubXVsdGlTZWxlY3RJbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dCcpO1xuICAgICAgICBpZiAodGhpcy5ob3N0RWwuaGFzQXR0cmlidXRlKCdmb3JtQ29udHJvbE5hbWUnKSkge1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0LnNldEF0dHJpYnV0ZSgnZm9ybUNvbnRyb2xOYW1lJywgdGhpcy5ob3N0RWwuZ2V0QXR0cmlidXRlKCdmb3JtQ29udHJvbE5hbWUnKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGlja09uTWFpbklucHV0KTtcbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0LmNsYXNzTGlzdC5hZGQoJ2VjbC1zZWxlY3QnKTtcbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0LmNsYXNzTGlzdC5hZGQoJ2VjbC1zZWxlY3RfX211bHRpcGxlLXRvZ2dsZScpO1xuICAgICAgICB0aGlzLm11bHRpU2VsZWN0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5ZG93bk9uTWFpbklucHV0KTtcblxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdENvbnRhaW5lck11bHRpLmFwcGVuZENoaWxkKHRoaXMubXVsdGlTZWxlY3RJbnB1dCk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdENvbnRhaW5lck11bHRpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlTXVsdGlzZWxlY3RDb3VudGVyKCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Db3VudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNvdW50LmNsYXNzTGlzdC5hZGQoJ2VjbC1zZWxlY3QtbXVsdGlwbGUtc2VsZWN0aW9ucy1jb3VudGVyJyk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvdW50VGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Db3VudC5hcHBlbmRDaGlsZChzZWxlY3Rpb25Db3VudFRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Db3VudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dNdWx0aXNlbGVjdENvdW50ZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ291bnQuY2xhc3NMaXN0LmFkZCgnZWNsLXNlbGVjdC1tdWx0aXBsZS1zZWxlY3Rpb25zLWNvdW50ZXItLXZpc2libGUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhpZGVNdWx0aXNlbGVjdENvdW50ZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ291bnQuY2xhc3NMaXN0LnJlbW92ZSgnZWNsLXNlbGVjdC1tdWx0aXBsZS1zZWxlY3Rpb25zLWNvdW50ZXItLXZpc2libGUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZURyb3Bkb3duRm9yTXVsdGlzZWxlY3QoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBkcm9wZG93bkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkcm9wZG93bkRpdi5jbGFzc0xpc3QuYWRkKCdlY2wtc2VsZWN0X19tdWx0aXBsZS1kcm9wZG93bicpO1xuICAgICAgICBkcm9wZG93bkRpdi5jbGFzc0xpc3QuYWRkKCdlY2wtc2VsZWN0X19jb250YWluZXInKTtcbiAgICAgICAgZHJvcGRvd25EaXYuY2xhc3NMaXN0LmFkZChgZWNsLXNlbGVjdF9fY29udGFpbmVyLS0ke3RoaXMuZWNsU2l6ZX1gKTtcbiAgICAgICAgZHJvcGRvd25EaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgcmV0dXJuIGRyb3Bkb3duRGl2O1xuICAgIH1cblxuICAgIC8vIHNlYXJjaCBib3ggdG8gc2VhcmNoIGFtb25nIG9wdGlvbnNcbiAgICBwcml2YXRlIGNyZWF0ZVNlYXJjaEZvck11bHRpc2VsZWN0KCk6IEhUTUxJbnB1dEVsZW1lbnQge1xuICAgICAgICB0aGlzLm11bHRpU2VhcmNoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgdGhpcy5tdWx0aVNlYXJjaC50eXBlID0gJ3NlYXJjaCc7XG4gICAgICAgIHRoaXMubXVsdGlTZWFyY2guY2xhc3NMaXN0LmFkZCgnZWNsLXRleHQtaW5wdXQnKTtcbiAgICAgICAgdGhpcy5tdWx0aVNlYXJjaC5wbGFjZWhvbGRlciA9ICdTZWFyY2gnO1xuXG4gICAgICAgIHRoaXMubXVsdGlTZWFyY2guYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5ZG93bk9uU2VhcmNoKTtcbiAgICAgICAgdGhpcy5tdWx0aVNlYXJjaC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMub25TZWFyY2hPcHRpb25zKTtcbiAgICAgICAgdGhpcy5tdWx0aVNlYXJjaC5hZGRFdmVudExpc3RlbmVyKCdzZWFyY2gnLCB0aGlzLmhhbmRsZVhCdG5PblNlYXJjaCk7XG4gICAgICAgIHRoaXMuc2VhcmNoRWwgPSB0aGlzLm11bHRpU2VhcmNoO1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aVNlYXJjaDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU9wdGlvbldpdGhDaGVja2JveChlbDogRWNsTXVsdGlzZWxlY3RPcHRpb25EaXJlY3RpdmUpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGlkID0gdXVpZGdlbigpO1xuICAgICAgICBjb25zdCBjaGVja2JveERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGlmIChlbC5jc3NDbGFzc2VzKSB7XG4gICAgICAgICAgICBlbC5jc3NDbGFzc2VzLnNwbGl0KCcgJykuZm9yRWFjaCgoY2wpID0+IHtcbiAgICAgICAgICAgICAgICBjaGVja2JveERpdi5jbGFzc0xpc3QuYWRkKGNsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hlY2tib3hJbnB1dCA9IHRoaXMuY3JlYXRlQ2hlY2tib3hJbnB1dChpZCwgZWwudmFsdWUpO1xuICAgICAgICBpZiAoZWwuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGNoZWNrYm94RGl2LmNsYXNzTGlzdC5hZGQoJ2VjbC1jaGVja2JveC0tZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIGNoZWNrYm94SW5wdXQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hlY2tib3hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tPbk9wdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsLnNlbGVjdGVkIHx8IHRoaXMuc2VsZWN0ZWRWYWx1ZXMuaW5kZXhPZihlbC52YWx1ZSkgPiAtMSkge1xuICAgICAgICAgICAgY2hlY2tib3hJbnB1dC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RJbnB1dC52YWx1ZSA9IHRoaXMubXVsdGlTZWxlY3RJbnB1dC52YWx1ZSA9PT0gJycgPyBlbC5sYWJlbCA6IHRoaXMubXVsdGlTZWxlY3RJbnB1dC52YWx1ZSArICcsJyArIGVsLmxhYmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hlY2tib3hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlkb3duT25PcHRpb24pO1xuICAgICAgICBjaGVja2JveERpdi5hcHBlbmRDaGlsZChjaGVja2JveElucHV0KTtcblxuICAgICAgICBjb25zdCBjaGVja2JveExhYmVsID0gdGhpcy5jcmVhdGVDaGVja2JveExhYmVsKGVsLmxhYmVsLCBpZCk7XG4gICAgICAgIGNoZWNrYm94RGl2LmFwcGVuZENoaWxkKGNoZWNrYm94TGFiZWwpO1xuXG4gICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zLnB1c2goY2hlY2tib3hEaXYpO1xuICAgICAgICByZXR1cm4gY2hlY2tib3hEaXY7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDaGVja2JveExhYmVsKHRleHQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IEhUTUxMYWJlbEVsZW1lbnQge1xuICAgICAgICBjb25zdCBjaGVja2JveExhYmVsID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChFY2xDaGVja2JveExhYmVsQ29tcG9uZW50KTtcbiAgICAgICAgY2hlY2tib3hMYWJlbC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50Lmh0bWxGb3IgPSBpZDtcblxuICAgICAgICBjb25zdCB0ZXh0U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdGV4dFNwYW4uY2xhc3NMaXN0LmFkZCgnZWNsLWNoZWNrYm94X19sYWJlbC10ZXh0Jyk7XG4gICAgICAgIHRleHRTcGFuLmlubmVySFRNTCA9IHRleHQ7XG5cbiAgICAgICAgY2hlY2tib3hMYWJlbC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHRleHRTcGFuKTtcbiAgICAgICAgcmV0dXJuIGNoZWNrYm94TGFiZWwubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNoZWNrYm94SW5wdXQoaWQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IEhUTUxJbnB1dEVsZW1lbnQge1xuICAgICAgICBjb25zdCBjaGVja2JveElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgY2hlY2tib3hJbnB1dC50eXBlID0gJ2NoZWNrYm94JztcbiAgICAgICAgY2hlY2tib3hJbnB1dC5jbGFzc0xpc3QuYWRkKCdlY2wtY2hlY2tib3hfX2lucHV0Jyk7XG4gICAgICAgIGNoZWNrYm94SW5wdXQuaWQgPSBpZDtcbiAgICAgICAgY2hlY2tib3hJbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2hlY2tib3hJbnB1dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU11bHRpc2VsZWN0VG9vbGJhcigpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHRoaXMubXVsdGlzZWxlY3RUb29sYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMubXVsdGlzZWxlY3RUb29sYmFyLmNsYXNzTGlzdC5hZGQoJ2VjbC1zZWxlY3QtbXVsdGlwbGUtdG9vbGJhcicpO1xuICAgICAgICB0aGlzLmNsZWFyQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIHRoaXMuY2xlYXJCdG4uY2xhc3NMaXN0LmFkZCgnZWNsLWJ1dHRvbicpO1xuICAgICAgICB0aGlzLmNsZWFyQnRuLmNsYXNzTGlzdC5hZGQoJ2VjbC1idXR0b24tLWdob3N0Jyk7XG4gICAgICAgIHRoaXMuY2xlYXJCdG4udHlwZSA9ICdidXR0b24nO1xuICAgICAgICB0aGlzLmNsZWFyQnRuLnRleHRDb250ZW50ID0gdGhpcy5jbGVhckFsbFRleHQ7XG5cbiAgICAgICAgdGhpcy5jbG9zZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICB0aGlzLmNsb3NlQnRuLmNsYXNzTGlzdC5hZGQoJ2VjbC1idXR0b24nKTtcbiAgICAgICAgdGhpcy5jbG9zZUJ0bi5jbGFzc0xpc3QuYWRkKCdlY2wtYnV0dG9uLS1wcmltYXJ5Jyk7XG4gICAgICAgIHRoaXMuY2xvc2VCdG4udGV4dENvbnRlbnQgPSB0aGlzLmNsb3NlVGV4dDtcbiAgICAgICAgdGhpcy5jbG9zZUJ0bi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgIHRoaXMubXVsdGlzZWxlY3RUb29sYmFyLmFwcGVuZENoaWxkKHRoaXMuY2xlYXJCdG4pO1xuICAgICAgICB0aGlzLm11bHRpc2VsZWN0VG9vbGJhci5hcHBlbmRDaGlsZCh0aGlzLmNsb3NlQnRuKTtcblxuICAgICAgICB0aGlzLmNsZWFyQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleWRvd25PbkNsZWFyKTtcbiAgICAgICAgdGhpcy5jbGVhckJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tPbkNsZWFyKTtcblxuICAgICAgICB0aGlzLmNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleWRvd25PbkNsb3NlKTtcbiAgICAgICAgdGhpcy5jbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tPbkNsb3NlKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVRvb2xiYXJEaXNwbGF5KCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlzZWxlY3RUb29sYmFyO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVG9vbGJhckRpc3BsYXkoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd011bHRpc2VsZWN0VG9vbGJhcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oaWRlTXVsdGlzZWxlY3RUb29sYmFyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dNdWx0aXNlbGVjdFRvb2xiYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubXVsdGlzZWxlY3RUb29sYmFyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWRlTXVsdGlzZWxlY3RUb29sYmFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm11bHRpc2VsZWN0VG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ2xpY2tPbkNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoZWNrYm94U2VsZWN0QWxsLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gPEhUTUxJbnB1dEVsZW1lbnQ+ZWwuY2hpbGROb2Rlc1swXTtcbiAgICAgICAgICAgIGlmICghaW5wdXQuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzID0gW107XG4gICAgICAgIHRoaXMubXVsdGlTZWxlY3RJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICB0aGlzLnVwZGF0ZU11bHRpc2VsZWN0Q291bnRlcigwKTtcbiAgICAgICAgdGhpcy5oaWRlTXVsdGlzZWxlY3RUb29sYmFyKCk7XG4gICAgICAgIHRoaXMuZWNsQ2hhbmdlLmVtaXQoW3RoaXMuc2VsZWN0ZWRWYWx1ZXNdKTtcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5zZWxlY3RlZFZhbHVlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVDbGlja09uQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xvc2VNdWx0aXNlbGVjdERyb3Bkb3duKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVLZXlkb3duT25DbG9zZShldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChldnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuQVJST1dfVVA6IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2xvc2VDbGVhckFycm93VXAoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5BUlJPV19MRUZUOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNsb3NlQXJyb3dMZWZ0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2xvc2VDbGVhckFycm93VXAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gdGhpcy5nZXRBY3RpdmVPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IGZpcnN0T3B0aW9uID0gY3VycmVudE9wdGlvbnNbY3VycmVudE9wdGlvbnMubGVuZ3RoIC0gMV0uZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGZpcnN0T3B0aW9uLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNsb3NlQXJyb3dMZWZ0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyQnRuLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVLZXlkb3duT25DbGVhcihldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChldnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuQVJST1dfVVA6IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2xvc2VDbGVhckFycm93VXAoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5BUlJPV19SSUdIVDoge1xuICAgICAgICAgICAgICAgIHRoaXMub25DbGVhckFycm93UmlnaHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25DbGVhckFycm93UmlnaHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xvc2VCdG4uZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvLyBBZGQvcmVtb3ZlIHZhbHVlcyBmcm9tIHRoZSBzZWxlY3QgaW5wdXRcbiAgICBwcml2YXRlIHVwZGF0ZUN1cnJlbnRWYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50c0FycmF5ID0gW107XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHNWYWx1ZXNBcnJheSA9IFtdO1xuICAgICAgICB0aGlzLmNoZWNrYm94U2VsZWN0QWxsLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gPEhUTUxJbnB1dEVsZW1lbnQ+ZWwuY2hpbGROb2Rlc1swXTtcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1ZhbHVlc0FycmF5LnB1c2goKDxIVE1MSW5wdXRFbGVtZW50PmVsLmNoaWxkTm9kZXNbMF0pLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzQXJyYXkucHVzaChlbC5jaGlsZE5vZGVzWzFdLnRleHRDb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMgPSBzZWxlY3RlZEVsZW1lbnRzVmFsdWVzQXJyYXk7XG4gICAgICAgIHRoaXMubXVsdGlTZWxlY3RJbnB1dC52YWx1ZSA9IHNlbGVjdGVkRWxlbWVudHNBcnJheS5qb2luKCcsJyk7XG4gICAgICAgIHRoaXMudXBkYXRlVG9vbGJhckRpc3BsYXkoKTtcbiAgICAgICAgdGhpcy51cGRhdGVNdWx0aXNlbGVjdENvdW50ZXIoc2VsZWN0ZWRFbGVtZW50c0FycmF5Lmxlbmd0aCk7XG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuc2VsZWN0ZWRWYWx1ZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTXVsdGlzZWxlY3RDb3VudGVyKGNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Db3VudC5xdWVyeVNlbGVjdG9yKCdzcGFuJykudGV4dENvbnRlbnQgPSAnJyArIGNvdW50O1xuICAgICAgICAgICAgdGhpcy5zaG93TXVsdGlzZWxlY3RDb3VudGVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVNdWx0aXNlbGVjdENvdW50ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrYm94IHRvIHNlbGVjdCBhbGwgdGhlIGVsZW1lbnRzXG4gICAgcHJpdmF0ZSBjcmVhdGVNdWx0aVNlbGVjdEFsbCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGlkID0gdXVpZGdlbigpO1xuICAgICAgICBjb25zdCBjaGVja2JveERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBjaGVja2JveERpdi5jbGFzc0xpc3QuYWRkKCdlY2wtY2hlY2tib3gnKTtcbiAgICAgICAgY2hlY2tib3hEaXYuY2xhc3NMaXN0LmFkZCgnZWNsLXNlbGVjdF9fbXVsdGlwbGUtYWxsJyk7XG5cbiAgICAgICAgdGhpcy5jaGVja2JveFNlbGVjdEFsbCA9IHRoaXMuY3JlYXRlQ2hlY2tib3hJbnB1dChpZCwgJ2FsbCcpO1xuXG4gICAgICAgIHRoaXMuY2hlY2tib3hTZWxlY3RBbGwuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5ZG93bk9uU2VsZWN0QWxsKTtcbiAgICAgICAgdGhpcy5jaGVja2JveFNlbGVjdEFsbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tPblNlbGVjdEFsbCk7XG5cbiAgICAgICAgY2hlY2tib3hEaXYuYXBwZW5kQ2hpbGQodGhpcy5jaGVja2JveFNlbGVjdEFsbCk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RBbGxMYWJlbCA9IHRoaXMuY3JlYXRlQ2hlY2tib3hMYWJlbCh0aGlzLmdldFNlbGVjdEFsbExhYmVsVGV4dCgpLCBpZCk7XG4gICAgICAgIGNoZWNrYm94RGl2LmFwcGVuZENoaWxkKHRoaXMuc2VsZWN0QWxsTGFiZWwpO1xuICAgICAgICB0aGlzLnNlbGVjdEFsbEVsbCA9IGNoZWNrYm94RGl2O1xuICAgICAgICByZXR1cm4gY2hlY2tib3hEaXY7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTZWxlY3RBbGxMYWJlbFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuc2VsZWN0QWxsTGFiZWxUZXh0fSAoJHt0aGlzLmdldEFjdGl2ZU9wdGlvbnMoKS5sZW5ndGh9KWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVPcHRpb25zV3JhcHBlcigpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnZWNsLXNlbGVjdF9fbXVsdGlwbGUtb3B0aW9ucycpO1xuICAgICAgICByZXR1cm4gZGl2O1xuICAgIH1cblxuICAgIHByaXZhdGUgb25TZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHNBcnJheSA9IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzVmFsdWVzQXJyYXkgPSBbXTtcbiAgICAgICAgLy8gU2VsZWN0IGFsbCB0aGUgZWxlbWVudHMsIHRoYXQgYXJlIG5vdCBkaXNhYmxlZFxuICAgICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc1xuICAgICAgICAgICAgLmZpbHRlcigoZWxlbSkgPT4gZWxlbS5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpXG4gICAgICAgICAgICAuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IDxIVE1MSW5wdXRFbGVtZW50PmVsLmNoaWxkTm9kZXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tib3hTZWxlY3RBbGwuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0LmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHNWYWx1ZXNBcnJheS5wdXNoKGlucHV0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHNBcnJheS5wdXNoKGVsLmNoaWxkTm9kZXNbMV0udGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzID0gc2VsZWN0ZWRFbGVtZW50c1ZhbHVlc0FycmF5O1xuICAgICAgICB0aGlzLm11bHRpU2VsZWN0SW5wdXQudmFsdWUgPSBzZWxlY3RlZEVsZW1lbnRzQXJyYXkuam9pbignLCcpO1xuICAgICAgICB0aGlzLnVwZGF0ZU11bHRpc2VsZWN0Q291bnRlcihzZWxlY3RlZEVsZW1lbnRzQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgdGhpcy51cGRhdGVUb29sYmFyRGlzcGxheSgpO1xuICAgICAgICB0aGlzLmVjbENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRWYWx1ZXMpO1xuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnNlbGVjdGVkVmFsdWVzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUljb25Db21wb25lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBlY2xJY29uQ29tcG9uZW50ID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChFY2xJY29uQ29tcG9uZW50KTtcbiAgICAgICAgZWNsSWNvbkNvbXBvbmVudC5pbnN0YW5jZS5zaXplID0gJ3MnO1xuICAgICAgICBlY2xJY29uQ29tcG9uZW50Lmluc3RhbmNlLmljb24gPSAnY29ybmVyLWFycm93JztcbiAgICAgICAgZWNsSWNvbkNvbXBvbmVudC5pbnN0YW5jZS50cmFuc2Zvcm0gPSAncm90YXRlLTE4MCc7XG4gICAgICAgIGVjbEljb25Db21wb25lbnQuaW5zdGFuY2UuY2xhc3MgPSAnZWNsLXNlbGVjdF9faWNvbi1zaGFwZSc7XG4gICAgICAgIHJldHVybiBlY2xJY29uQ29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVJY29uQ29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0SWNvbkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBzZWxlY3RJY29uQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2VjbC1zZWxlY3RfX2ljb24nKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdEljb25Db250YWluZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVYQnRuT25TZWFyY2goZXZ0OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXl3b3JkID0gKGV2dC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGlmIChrZXl3b3JkID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RBbGxEaXNhYmxlU3RhdHVzKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWxOb2RlID0gaXRlbS5jaGlsZHJlblsxXS5jaGlsZHJlblsxXTtcbiAgICAgICAgICAgICAgICBsYWJlbE5vZGUuaW5uZXJIVE1MID0gaXRlbS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgbm9SZXN1bHRzRm91bmRFeGlzdHMgPSAodGhpcy5vcHRpb25zV3JhcHBlci5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLkNMQVNTX05PX1JFU1VMVFNfRk9VTkQpO1xuICAgICAgICAgICAgaWYgKG5vUmVzdWx0c0ZvdW5kRXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zV3JhcHBlci5yZW1vdmVDaGlsZCh0aGlzLm5vUmVzdWx0c0ZvdW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25TZWFyY2hPcHRpb25zKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXl3b3JkID0gKGV2dC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGxldCBpc01hdGNoRm91bmQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGtleXdvcmQgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdEFsbERpc2FibGVTdGF0dXMoZmFsc2UpO1xuICAgICAgICAgICAgaXNNYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWxOb2RlID0gaXRlbS5jaGlsZHJlblsxXS5jaGlsZHJlblsxXTtcbiAgICAgICAgICAgICAgICBsYWJlbE5vZGUuaW5uZXJIVE1MID0gaXRlbS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RBbGxEaXNhYmxlU3RhdHVzKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihrZXl3b3JkLnRvTG93ZXJDYXNlKCkpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaXNNYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFNlYXJjaFRleHQoaXRlbSwga2V5d29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9SZXN1bHRzRm91bmRFeGlzdHMgPSAodGhpcy5vcHRpb25zV3JhcHBlci5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLkNMQVNTX05PX1JFU1VMVFNfRk9VTkQpO1xuICAgICAgICBpZiAoIWlzTWF0Y2hGb3VuZCAmJiAhbm9SZXN1bHRzRm91bmRFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1dyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5ub1Jlc3VsdHNGb3VuZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaEZvdW5kICYmIG5vUmVzdWx0c0ZvdW5kRXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNXcmFwcGVyLnJlbW92ZUNoaWxkKHRoaXMubm9SZXN1bHRzRm91bmQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWdobGlnaHRTZWFyY2hUZXh0KGl0ZW06IEhUTUxFbGVtZW50LCBrZXl3b3JkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbGFiZWxOb2RlID0gaXRlbS5jaGlsZHJlblsxXS5jaGlsZHJlblsxXTtcbiAgICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGtleXdvcmQsICdnaScpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gaXRlbS50ZXh0Q29udGVudDtcbiAgICAgICAgY29uc3QgcmVzID0gdGV4dC5yZXBsYWNlKHJlLCAnPGI+JCY8L2I+Jyk7XG4gICAgICAgIGxhYmVsTm9kZS5pbm5lckhUTUwgPSByZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTZWxlY3RBbGxEaXNhYmxlU3RhdHVzKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jaGVja2JveFNlbGVjdEFsbC5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsRWxsLmNsYXNzTGlzdC50b2dnbGUoJ2VjbC1jaGVja2JveC0tZGlzYWJsZWQnLCB0aGlzLmNoZWNrYm94U2VsZWN0QWxsLmRpc2FibGVkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0Q29tcG9uZW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9ucy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSA8SFRNTElucHV0RWxlbWVudD5lbC5jaGlsZE5vZGVzWzBdO1xuICAgICAgICAgICAgaWYgKGlucHV0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5jaGVja2JveFNlbGVjdEFsbCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja2JveFNlbGVjdEFsbC5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubXVsdGlTZWxlY3RJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0LnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzID0gW107XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkNvdW50KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU11bHRpc2VsZWN0Q291bnRlcigwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVWYWx1ZXModmFsdWVzOiBBcnJheTxzdHJpbmc+KTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHNBcnJheSA9IFtdO1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlTZWxlY3RPcHRpb25zICYmIHRoaXMubXVsdGlTZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm11bHRpU2VsZWN0T3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVsZW0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmluY2x1ZGVzKCg8SFRNTElucHV0RWxlbWVudD5lbGVtLmNoaWxkTm9kZXNbMF0pLnZhbHVlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoPEhUTUxJbnB1dEVsZW1lbnQ+ZWxlbS5jaGlsZE5vZGVzWzBdKS5kaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSA8SFRNTElucHV0RWxlbWVudD5lbC5jaGlsZE5vZGVzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzQXJyYXkucHVzaChlbC5jaGlsZE5vZGVzWzFdLnRleHRDb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMucHVzaChpbnB1dC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpU2VsZWN0SW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0LnZhbHVlID0gc2VsZWN0ZWRFbGVtZW50c0FycmF5LmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcy5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Db3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTXVsdGlzZWxlY3RDb3VudGVyKHZhbHVlcy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVTZWxlY3RBbGxMYWJlbFRleHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsTGFiZWwubGFzdEVsZW1lbnRDaGlsZC50ZXh0Q29udGVudCA9IGAke3RoaXMuc2VsZWN0QWxsTGFiZWxUZXh0fSAoJHt0aGlzLmdldEFjdGl2ZU9wdGlvbnMoKS5sZW5ndGh9KWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVCdXR0b25zTGFiZWxUZXh0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsb3NlQnRuLnRleHRDb250ZW50ID0gYCR7dGhpcy5jbG9zZVRleHR9YDtcbiAgICAgICAgdGhpcy5jbGVhckJ0bi50ZXh0Q29udGVudCA9IGAke3RoaXMuY2xlYXJBbGxUZXh0fWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVUcmFuc2xhdGlvbnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IFNFTEVDVF9BTExfS0VZID0gJ2VjbC5tdWx0aXNlbGVjdC5TRUxFQ1QtQUxMJztcbiAgICAgICAgY29uc3QgTk9fUkVTVUxUU19GT1VORF9LRVkgPSAnZWNsLm11bHRpc2VsZWN0Lk5PLVJFU1VMVFMtRk9VTkQnO1xuICAgICAgICBjb25zdCBDTE9TRV9LRVkgPSAnZWNsLmNvbW1vbi5DTE9TRSc7XG4gICAgICAgIGNvbnN0IENMRUFSX0FMTF9LRVkgPSAnZWNsLm11bHRpc2VsZWN0LkNMRUFSLUFMTCc7XG4gICAgICAgIGNvbnN0IFNFQVJDSF9LRVkgPSAnZWNsLmNvbW1vbi5TRUFSQ0gnO1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVxuICAgICAgICAgICAgLnN0cmVhbShbU0VMRUNUX0FMTF9LRVksIE5PX1JFU1VMVFNfRk9VTkRfS0VZLCBDTE9TRV9LRVksIENMRUFSX0FMTF9LRVksIFNFQVJDSF9LRVldKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodHJhbnNsYXRpb246IEpTT04pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vUmVzdWx0c0ZvdW5kVGV4dCA9IHRyYW5zbGF0aW9uW05PX1JFU1VMVFNfRk9VTkRfS0VZXTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlVGV4dCA9IHRyYW5zbGF0aW9uW0NMT1NFX0tFWV07XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckFsbFRleHQgPSB0cmFuc2xhdGlvbltDTEVBUl9BTExfS0VZXTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJ1dHRvbnNMYWJlbFRleHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RBbGxMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEFsbExhYmVsVGV4dCA9IHRyYW5zbGF0aW9uW1NFTEVDVF9BTExfS0VZXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RBbGxMYWJlbFRleHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlTZWFyY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tdWx0aVNlYXJjaC5wbGFjZWhvbGRlciA9IHRyYW5zbGF0aW9uW1NFQVJDSF9LRVldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xvc2VNdWx0aXNlbGVjdERyb3Bkb3duKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm11bHRpRHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICBwcml2YXRlIG9wZW5NdWx0aXNlbGVjdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tdWx0aURyb3Bkb3duLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3B0aW9uSW5kZXhCeUlkRnJvbUFjdGl2ZU9wdGlvbnMoaWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZU9wdGlvbnMoKS5maW5kSW5kZXgoKG9wdGlvbikgPT4gb3B0aW9uLmZpcnN0RWxlbWVudENoaWxkLmlkID09PSBpZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVDbGlja09uTWFpbklucHV0KGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy50b2dnbGVEcm9wZG93bigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMubXVsdGlEcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gdGhpcy5tdWx0aURyb3Bkb3duLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVLZXlkb3duT25NYWluSW5wdXQoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkVOVEVSOiB7XG4gICAgICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuQVJST1dfRE9XTjoge1xuICAgICAgICAgICAgICAgIHRoaXMub25NYWluSW5wdXRBcnJvd0Rvd24oZXZ0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25NYWluSW5wdXRBcnJvd0Rvd24oZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm9wZW5NdWx0aXNlbGVjdCgpO1xuICAgICAgICB0aGlzLnNlYXJjaEVsLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVLZXlkb3duT25TZWFyY2goZXZ0KTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkVOVEVSOiB7XG4gICAgICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuVEFCOlxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkFSUk9XX0RPV046IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VhcmNoQXJyb3dEb3duT3JUYWIoKTtcbiAgICAgICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5BUlJPV19VUDoge1xuICAgICAgICAgICAgICAgIHRoaXMub25TZWFyY2hBcnJvd1VwKGV2dCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRVNDQVBFOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZU11bHRpc2VsZWN0RHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25TZWFyY2hBcnJvd0Rvd25PclRhYigpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrYm94U2VsZWN0QWxsLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrYm94U2VsZWN0QWxsLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50T3B0aW9ucyA9IHRoaXMuZ2V0QWN0aXZlT3B0aW9ucygpO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RPcHRpb24gPSBjdXJyZW50T3B0aW9uc1swXS5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGZpcnN0T3B0aW9uLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU2VhcmNoQXJyb3dVcChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY2xvc2VNdWx0aXNlbGVjdERyb3Bkb3duKCk7XG4gICAgICAgIHRoaXMubXVsdGlTZWxlY3RJbnB1dC5mb2N1cygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ2xpY2tPblNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVUb3VjaGVkKCk7XG4gICAgICAgIHRoaXMub25TZWxlY3RBbGwoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUtleWRvd25PblNlbGVjdEFsbChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlRBQjpcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5BUlJPV19ET1dOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdEFsbEFycm93RG93bk9yVGFiKGV2dCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuQVJST1dfVVA6IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0QWxsQXJyb3dVcCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkVOVEVSOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja2JveFNlbGVjdEFsbC5jbGljaygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkVTQ0FQRToge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VNdWx0aXNlbGVjdERyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU2VsZWN0QWxsQXJyb3dEb3duT3JUYWIoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBjdXJyZW50T3B0aW9ucyA9IHRoaXMuZ2V0QWN0aXZlT3B0aW9ucygpO1xuICAgICAgICBpZiAoY3VycmVudE9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmdDaGVja2JveCA9IGN1cnJlbnRPcHRpb25zWzBdLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgbmV4dFNpYmxpbmdDaGVja2JveC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblNlbGVjdEFsbEFycm93VXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VhcmNoRWwuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUNsaWNrT25PcHRpb24oZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHJvcGFnYXRlVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmVjbENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRWYWx1ZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlS2V5ZG93bk9uT3B0aW9uKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGV2dC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5BUlJPV19ET1dOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk9wdGlvbkFycm93RG93bihldnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkFSUk9XX1VQOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk9wdGlvbkFycm93VXAoZXZ0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5FU0NBUEU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTXVsdGlzZWxlY3REcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkVOVEVSOiB7XG4gICAgICAgICAgICAgICAgKGV2dC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2xpY2soKTtcbiAgICAgICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5UQUI6IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uT3B0aW9uVGFiKGV2dCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uT3B0aW9uQXJyb3dEb3duKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdldE9wdGlvbkluZGV4QnlJZEZyb21BY3RpdmVPcHRpb25zKChldnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmlkKTtcbiAgICAgICAgY29uc3QgY3VycmVudE9wdGlvbnMgPSB0aGlzLmdldEFjdGl2ZU9wdGlvbnMoKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSBjdXJyZW50T3B0aW9ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2libGluZ0NoZWNrYm94ID0gY3VycmVudE9wdGlvbnNbaW5kZXggKyAxXS5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIG5leHRTaWJsaW5nQ2hlY2tib3guZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJCdG4uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25PcHRpb25BcnJvd1VwKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdldE9wdGlvbkluZGV4QnlJZEZyb21BY3RpdmVPcHRpb25zKChldnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmlkKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2U2libGluZ0NoZWNrYm94ID0gdGhpcy5nZXRBY3RpdmVPcHRpb25zKClbaW5kZXggLSAxXS5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIHByZXZTaWJsaW5nQ2hlY2tib3guZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrYm94U2VsZWN0QWxsLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaEVsLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrYm94U2VsZWN0QWxsLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uT3B0aW9uVGFiKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0T3B0aW9uSW5kZXhCeUlkRnJvbUFjdGl2ZU9wdGlvbnMoKGV2dC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuaWQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuZ2V0QWN0aXZlT3B0aW9ucygpLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMubXVsdGlTZWxlY3RJbnB1dC5mb2N1cygpOyAvLyBUcmFwIHRhYlxuICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFjdGl2ZU9wdGlvbnMoKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpU2VsZWN0T3B0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgIWl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdlY2wtY2hlY2tib3gtLWRpc2FibGVkJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUFsbExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdElucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleWRvd25Pbk1haW5JbnB1dCk7XG4gICAgICAgIHRoaXMubXVsdGlTZWxlY3RJbnB1dC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tPbk1haW5JbnB1dCk7XG4gICAgICAgIHRoaXMuc2VhcmNoRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5ZG93bk9uU2VhcmNoKTtcbiAgICAgICAgdGhpcy5zZWFyY2hFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMub25TZWFyY2hPcHRpb25zKTtcbiAgICAgICAgdGhpcy5zZWFyY2hFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzZWFyY2gnLCB0aGlzLmhhbmRsZVhCdG5PblNlYXJjaCk7XG4gICAgICAgIHRoaXMuY2hlY2tib3hTZWxlY3RBbGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5ZG93bk9uU2VsZWN0QWxsKTtcbiAgICAgICAgdGhpcy5jaGVja2JveFNlbGVjdEFsbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tPblNlbGVjdEFsbCk7XG4gICAgICAgIHRoaXMuY2xlYXJCdG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5ZG93bk9uQ2xlYXIpO1xuICAgICAgICB0aGlzLmNsZWFyQnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGlja09uQ2xlYXIpO1xuICAgICAgICB0aGlzLmNsb3NlQnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleWRvd25PbkNsb3NlKTtcbiAgICAgICAgdGhpcy5jbG9zZUJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tPbkNsb3NlKTtcbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNib3hFbCA9IGVsLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgICAgICBjaGVjYm94RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5ZG93bk9uT3B0aW9uKTtcbiAgICAgICAgICAgIGNoZWNib3hFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tPbk9wdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZENhbGxiYWNrcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oYW5kbGVLZXlkb3duT25NYWluSW5wdXQgPSB0aGlzLmhhbmRsZUtleWRvd25Pbk1haW5JbnB1dC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmhhbmRsZUtleWRvd25PblNlYXJjaCA9IHRoaXMuaGFuZGxlS2V5ZG93bk9uU2VhcmNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25TZWFyY2hPcHRpb25zID0gdGhpcy5vblNlYXJjaE9wdGlvbnMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVYQnRuT25TZWFyY2ggPSB0aGlzLmhhbmRsZVhCdG5PblNlYXJjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmhhbmRsZUtleWRvd25PblNlbGVjdEFsbCA9IHRoaXMuaGFuZGxlS2V5ZG93bk9uU2VsZWN0QWxsLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaGFuZGxlS2V5ZG93bk9uT3B0aW9uID0gdGhpcy5oYW5kbGVLZXlkb3duT25PcHRpb24uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVDbGlja09uTWFpbklucHV0ID0gdGhpcy5oYW5kbGVDbGlja09uTWFpbklucHV0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2xpY2tPblNlbGVjdEFsbCA9IHRoaXMuaGFuZGxlQ2xpY2tPblNlbGVjdEFsbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrT25PcHRpb24gPSB0aGlzLmhhbmRsZUNsaWNrT25PcHRpb24uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVDbGlja09uQ2xlYXIgPSB0aGlzLmhhbmRsZUNsaWNrT25DbGVhci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmhhbmRsZUtleWRvd25PbkNsZWFyID0gdGhpcy5oYW5kbGVLZXlkb3duT25DbGVhci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmhhbmRsZUtleWRvd25PbkNsb3NlID0gdGhpcy5oYW5kbGVLZXlkb3duT25DbG9zZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrT25DbG9zZSA9IHRoaXMuaGFuZGxlQ2xpY2tPbkNsb3NlLmJpbmQodGhpcyk7XG4gICAgfVxufVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNsLW11bHRpc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lY2wtbXVsdGlzZWxlY3QvZWNsLW11bHRpc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lY2wtbXVsdGlzZWxlY3QvZWNsLW11bHRpc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUgsU0FBUyxFQUNULGVBQWUsRUFDZixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFBWSxLQUFLLEVBRzVCLE1BQU0sRUFHTixpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDaEgsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBZTlELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxnQkFBZ0I7SUFJMUMsSUFDWCxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxLQUEwQjtRQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUMz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QUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxFQUFDLEdBQUcsRUFBRSx3QkFBd0IsRUFBQzs0QkFDdEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7bUtBSytELGNBQWM7c0JBQS9FLGVBQWU7dUJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDZCQUE2QixDQUFDO2dCQUU1RCxTQUFTO3NCQURHLEtBQUs7Z0JBV2pCLFFBQVE7c0JBRFgsS0FBSzs7c0JBQUksV0FBVzt1QkFBQyxlQUFlO2dCQVdqQyxVQUFVO3NCQURiLFdBQVc7dUJBQUMsT0FBTztnQkFJVixTQUFTO3NCQUFsQixNQUFNO2dCQUVILGNBQWM7c0JBRGpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbiwgRG9DaGVjaywgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0QmluZGluZywgSW5qZWN0b3IsIElucHV0LCBJdGVyYWJsZURpZmZlciwgSXRlcmFibGVEaWZmZXJzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuIH0gZnJvbSAnQGV1aS9iYXNlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRUNMQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4uL2VjbC1iYXNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBFY2xNdWx0aXNlbGVjdERyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi9lY2wtbXVsdGlzZWxlY3QtZHJvcGRvd24vZWNsLW11bHRpc2VsZWN0LWRyb3Bkb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFY2xNdWx0aXNlbGVjdE9wdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4vZWNsLW11bHRpc2VsZWN0LW9wdGlvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcblxuQENvbXBvbmVudCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ3NlbGVjdFtlY2xNdWx0aXNlbGVjdF0nLFxuICAgIHRlbXBsYXRlVXJsOiAnZWNsLW11bHRpc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRWNsTXVsdGlzZWxlY3RDb21wb25lbnQpLFxuICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRWNsTXVsdGlzZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBFQ0xCYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgRG9DaGVjaywgT25Jbml0LFxuICAgIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCB7XG5cbiAgICBAQ29udGVudENoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gRWNsTXVsdGlzZWxlY3RPcHRpb25EaXJlY3RpdmUpKSBlY2xPcHRpb25JdGVtczogUXVlcnlMaXN0PEVjbE11bHRpc2VsZWN0T3B0aW9uRGlyZWN0aXZlPjtcbiAgICBAY29lcmNlQm9vbGVhbiBASW5wdXQoKVxuICAgIGdldCBpc0ludmFsaWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0ludmFsaWQ7XG4gICAgfVxuICAgIHNldCBpc0ludmFsaWQodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5faXNJbnZhbGlkID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLm11bHRpc2VsZWN0Q29tcG9uZW50LmlzSW52YWxpZCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIEBJbnB1dCgpIEBIb3N0QmluZGluZygnYXR0ci5kaXNhYmxlZCcpXG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuIHwgYW55KSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLm11bHRpc2VsZWN0Q29tcG9uZW50LmRpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuICAgIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gICAgZ2V0IGNzc0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFtzdXBlci5nZXRDc3NDbGFzc2VzKCdlY2wtc2VsZWN0JyldLmpvaW4oJyAnKS50cmltKCk7XG4gICAgfVxuICAgIEBPdXRwdXQoKSBlY2xDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBASW5wdXQoKVxuICAgIHNldCBlY2xQbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2VjbFBsYWNlaG9sZGVyID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLm11bHRpc2VsZWN0Q29tcG9uZW50Lm1haW5JbnB1dFBsYWNlaG9sZGVyID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGVjbFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lY2xQbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2lzSW52YWxpZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2VjbFBsYWNlaG9sZGVyID0gJ1NlbGVjdCBpdGVtJztcbiAgICBwcml2YXRlIGRpZmZlcjogSXRlcmFibGVEaWZmZXI8RWNsTXVsdGlzZWxlY3RPcHRpb25EaXJlY3RpdmU+O1xuICAgIHByaXZhdGUgbXVsdGlzZWxlY3RDb21wb25lbnQ6IEVjbE11bHRpc2VsZWN0RHJvcGRvd25Db21wb25lbnQ7XG4gICAgcHJpdmF0ZSBob3N0RWw6IEhUTUxTZWxlY3RFbGVtZW50O1xuICAgIHByaXZhdGUgaG9zdFBhcmVudEVsOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIGhvc3RXcmFwcGVyRWw6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgbXVsdGlzZWxlY3RDb21wb25lbnRIdG1sOiBhbnk7XG4gICAgcHJpdmF0ZSBkZXN0cm95JDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLCBwcml2YXRlIGRpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmRpZmZlciA9IHRoaXMuZGlmZmVycy5maW5kKFtdKS5jcmVhdGUoKTtcbiAgICB9XG5cbiAgICBuZ0RvQ2hlY2soKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMuZGlmZmVyLmRpZmYodGhpcy5lY2xPcHRpb25JdGVtcyk7XG5cbiAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tdWx0aXNlbGVjdENvbXBvbmVudC5tdWx0aU9wdGlvbkRpcmVjdGl2ZXMgPSB0aGlzLmVjbE9wdGlvbkl0ZW1zLnRvQXJyYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvc3RFbCA9IHRoaXMuZ2V0SG9zdEVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5ob3N0UGFyZW50RWwgPSB0aGlzLmdldEhvc3RQYXJlbnRFbGVtZW50KHRoaXMuaG9zdEVsKTtcbiAgICAgICAgdGhpcy5ob3N0V3JhcHBlckVsID0gdGhpcy5jcmVhdGVIb3N0V3JhcHBlckNvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLm11bHRpc2VsZWN0Q29tcG9uZW50SHRtbCA9IHRoaXMuY3JlYXRlTXVsdGlzZWxlY3RDb21wb25lbnQoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYXR0YWNoT3B0aW9ucygpO1xuICAgICAgICBpZiAodGhpcy5ob3N0UGFyZW50RWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlT3JpZ2luYWxTZWxlY3RDb21wb25lbnQoKTtcbiAgICAgICAgICAgIHRoaXMuaG9zdFBhcmVudEVsLmFwcGVuZENoaWxkKHRoaXMubXVsdGlzZWxlY3RDb21wb25lbnRIdG1sKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhpZGVPcmlnaW5hbFNlbGVjdENvbXBvbmVudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3N0UGFyZW50RWwucmVwbGFjZUNoaWxkKHRoaXMuaG9zdFdyYXBwZXJFbCwgdGhpcy5ob3N0RWwpO1xuICAgICAgICB0aGlzLmhvc3RXcmFwcGVyRWwuYXBwZW5kQ2hpbGQodGhpcy5ob3N0RWwpO1xuICAgICAgICB0aGlzLmhvc3RXcmFwcGVyRWwuY2xhc3NMaXN0LmFkZCgnZWNsLXNlbGVjdF9fY29udGFpbmVyLS1oaWRkZW4nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUhvc3RXcmFwcGVyQ29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3Qgd3JhcHBlckNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB3cmFwcGVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2VjbC1zZWxlY3RfX2NvbnRhaW5lcicpO1xuICAgICAgICB3cmFwcGVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2VjbC1zZWxlY3RfX2NvbnRhaW5lci0tbScpO1xuICAgICAgICByZXR1cm4gd3JhcHBlckNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEhvc3RFbGVtZW50KCk6IEhUTUxTZWxlY3RFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEhvc3RQYXJlbnRFbGVtZW50KGhvc3RFbDogSFRNTFNlbGVjdEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiBob3N0RWwucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU11bHRpc2VsZWN0Q29tcG9uZW50KCk6IGFueSB7XG4gICAgICAgIGNvbnN0IG5nQ29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCwgdW5kZWZpbmVkLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBtdWx0aXNlbGVjdCA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoRWNsTXVsdGlzZWxlY3REcm9wZG93bkNvbXBvbmVudCk7XG4gICAgICAgIHRoaXMubXVsdGlzZWxlY3RDb21wb25lbnQgPSBtdWx0aXNlbGVjdC5pbnN0YW5jZTtcbiAgICAgICAgdGhpcy5tdWx0aXNlbGVjdENvbXBvbmVudC5lY2xDaGFuZ2VcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2dCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZWNsQ2hhbmdlLmVtaXQoZXZ0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLm11bHRpc2VsZWN0Q29tcG9uZW50Lm1haW5JbnB1dFBsYWNlaG9sZGVyID0gdGhpcy5lY2xQbGFjZWhvbGRlcjtcbiAgICAgICAgaWYgKG5nQ29udHJvbCkge1xuICAgICAgICAgICAgbmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzLm11bHRpc2VsZWN0Q29tcG9uZW50O1xuICAgICAgICB9XG4gICAgICAgIG11bHRpc2VsZWN0Lmluc3RhbmNlLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcbiAgICAgICAgbXVsdGlzZWxlY3QuaW5zdGFuY2UuaXNJbnZhbGlkID0gdGhpcy5pc0ludmFsaWQ7XG4gICAgICAgIHJldHVybiBtdWx0aXNlbGVjdC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoT3B0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm11bHRpc2VsZWN0Q29tcG9uZW50Lm11bHRpT3B0aW9uRGlyZWN0aXZlcyA9IHRoaXMuZWNsT3B0aW9uSXRlbXMudG9BcnJheSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4iXX0=