desy-angular 6.0.0 → 6.0.2

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 (513) hide show
  1. package/README.md +21 -21
  2. package/bundles/desy-angular.umd.js +10693 -10672
  3. package/bundles/desy-angular.umd.js.map +1 -1
  4. package/bundles/desy-angular.umd.min.js +1 -1
  5. package/bundles/desy-angular.umd.min.js.map +1 -1
  6. package/desy-angular.d.ts +51 -50
  7. package/desy-angular.metadata.json +1 -1
  8. package/esm2015/desy-angular.js +52 -51
  9. package/esm2015/lib/desy-angular.module.js +38 -38
  10. package/esm2015/lib/desy-buttons/components/button/button.component.js +92 -92
  11. package/esm2015/lib/desy-buttons/components/button-loader/button-loader.component.js +50 -50
  12. package/esm2015/lib/desy-buttons/components/dropdown/dropdown.component.js +111 -111
  13. package/esm2015/lib/desy-buttons/components/listbox/listbox-item/listbox-item.component.js +26 -26
  14. package/esm2015/lib/desy-buttons/components/listbox/listbox-label/listbox-label.component.js +14 -14
  15. package/esm2015/lib/desy-buttons/components/listbox/listbox.component.js +265 -265
  16. package/esm2015/lib/desy-buttons/components/pill/pill.component.js +64 -64
  17. package/esm2015/lib/desy-buttons/components/toggle/toggle-off-state/toggle-off-state.component.js +15 -15
  18. package/esm2015/lib/desy-buttons/components/toggle/toggle-on-state/toggle-on-state.component.js +15 -15
  19. package/esm2015/lib/desy-buttons/components/toggle/toggle.component.js +44 -44
  20. package/esm2015/lib/desy-buttons/desy-buttons.module.js +53 -53
  21. package/esm2015/lib/desy-buttons/interfaces/listbox-item-data.js +2 -2
  22. package/esm2015/lib/desy-buttons/interfaces/listbox-label-data.js +2 -2
  23. package/esm2015/lib/desy-commons/components/content/content.component.js +14 -14
  24. package/esm2015/lib/desy-commons/components/description/description.component.js +15 -15
  25. package/esm2015/lib/desy-commons/components/divider/divider.component.js +15 -15
  26. package/esm2015/lib/desy-commons/components/icon/icon.component.js +15 -15
  27. package/esm2015/lib/desy-commons/components/title/title.component.js +14 -14
  28. package/esm2015/lib/desy-commons/desy-commons.module.js +36 -36
  29. package/esm2015/lib/desy-commons/interfaces/content-data.js +2 -2
  30. package/esm2015/lib/desy-commons/interfaces/description-data.js +2 -2
  31. package/esm2015/lib/desy-commons/interfaces/divider-data.js +2 -2
  32. package/esm2015/lib/desy-commons/interfaces/icon-data.js +2 -2
  33. package/esm2015/lib/desy-commons/interfaces/index.js +6 -6
  34. package/esm2015/lib/desy-commons/interfaces/title-data.js +2 -2
  35. package/esm2015/lib/desy-forms/components/character-count/character-count.component.js +109 -109
  36. package/esm2015/lib/desy-forms/components/checkboxes/checkbox-item/checkbox-item.component.js +188 -188
  37. package/esm2015/lib/desy-forms/components/checkboxes/checkboxes.component.js +226 -226
  38. package/esm2015/lib/desy-forms/components/date-input/date-input-day/date-input-day.component.js +38 -38
  39. package/esm2015/lib/desy-forms/components/date-input/date-input-divider/date-input-divider.component.js +19 -19
  40. package/esm2015/lib/desy-forms/components/date-input/date-input-item/date-input-item.component.js +13 -13
  41. package/esm2015/lib/desy-forms/components/date-input/date-input-month/date-input-month.component.js +38 -38
  42. package/esm2015/lib/desy-forms/components/date-input/date-input-year/date-input-year.component.js +36 -36
  43. package/esm2015/lib/desy-forms/components/date-input/date-input.component.js +222 -222
  44. package/esm2015/lib/desy-forms/components/error-message/error-message.component.js +28 -28
  45. package/esm2015/lib/desy-forms/components/fieldset/fieldset.component.js +44 -44
  46. package/esm2015/lib/desy-forms/components/fieldset/legend/legend.component.js +16 -16
  47. package/esm2015/lib/desy-forms/components/file-upload/file-upload.component.js +51 -51
  48. package/esm2015/lib/desy-forms/components/form-field/form-field.component.js +103 -103
  49. package/esm2015/lib/desy-forms/components/hint/hint.component.js +27 -27
  50. package/esm2015/lib/desy-forms/components/input/input.component.js +67 -67
  51. package/esm2015/lib/desy-forms/components/input-group/input-group-divider/input-group-divider.component.js +20 -20
  52. package/esm2015/lib/desy-forms/components/input-group/input-group-input/input-group-input.component.js +39 -39
  53. package/esm2015/lib/desy-forms/components/input-group/input-group-item/input-group-item.component.js +13 -13
  54. package/esm2015/lib/desy-forms/components/input-group/input-group-select/input-group-select.component.js +35 -35
  55. package/esm2015/lib/desy-forms/components/input-group/input-group.component.js +179 -179
  56. package/esm2015/lib/desy-forms/components/label/label.component.js +30 -30
  57. package/esm2015/lib/desy-forms/components/radios/radio-item/radio-item.component.js +144 -144
  58. package/esm2015/lib/desy-forms/components/radios/radios.component.js +233 -233
  59. package/esm2015/lib/desy-forms/components/search-bar/search-bar.component.js +45 -45
  60. package/esm2015/lib/desy-forms/components/select/option/option.component.js +17 -17
  61. package/esm2015/lib/desy-forms/components/select/option-group/option-group.component.js +17 -17
  62. package/esm2015/lib/desy-forms/components/select/select-item/select-item.component.js +14 -14
  63. package/esm2015/lib/desy-forms/components/select/select.component.js +64 -64
  64. package/esm2015/lib/desy-forms/components/template-driven-wrapper/template-driven-wrapper.component.js +12 -12
  65. package/esm2015/lib/desy-forms/components/textarea/textarea.component.js +60 -60
  66. package/esm2015/lib/desy-forms/components/tree/interfaces/itree-item.js +3 -3
  67. package/esm2015/lib/desy-forms/components/tree/interfaces/quit-tree-item-focus-options.js +2 -2
  68. package/esm2015/lib/desy-forms/components/tree/tree-checkbox/tree-checkbox.component.js +151 -151
  69. package/esm2015/lib/desy-forms/components/tree/tree-item/tree-item.component.js +370 -370
  70. package/esm2015/lib/desy-forms/components/tree/tree-items-generator/tree-items-generator.component.js +25 -25
  71. package/esm2015/lib/desy-forms/components/tree/tree-sub/tree-sub.component.js +14 -14
  72. package/esm2015/lib/desy-forms/components/tree/tree.component.js +408 -408
  73. package/esm2015/lib/desy-forms/desy-forms.module.js +130 -130
  74. package/esm2015/lib/desy-forms/directives/condition.directive.js +32 -32
  75. package/esm2015/lib/desy-forms/interfaces/accesibility-data.js +2 -2
  76. package/esm2015/lib/desy-forms/interfaces/error-message-data.js +2 -2
  77. package/esm2015/lib/desy-forms/interfaces/fieldset-data.js +2 -2
  78. package/esm2015/lib/desy-forms/interfaces/hint-data.js +2 -2
  79. package/esm2015/lib/desy-forms/interfaces/index.js +13 -13
  80. package/esm2015/lib/desy-forms/interfaces/item-checkbox-data.js +2 -2
  81. package/esm2015/lib/desy-forms/interfaces/item-date-input-data.js +2 -2
  82. package/esm2015/lib/desy-forms/interfaces/item-divider-date-input-data.js +2 -2
  83. package/esm2015/lib/desy-forms/interfaces/item-divider-input-group-data.js +2 -2
  84. package/esm2015/lib/desy-forms/interfaces/item-input-group-data.js +2 -2
  85. package/esm2015/lib/desy-forms/interfaces/item-radio-data.js +2 -2
  86. package/esm2015/lib/desy-forms/interfaces/item-radio-with-template-data.js +2 -2
  87. package/esm2015/lib/desy-forms/interfaces/label-data.js +2 -2
  88. package/esm2015/lib/desy-forms/interfaces/legend-data.js +2 -2
  89. package/esm2015/lib/desy-forms/interfaces/select-item-data.js +2 -2
  90. package/esm2015/lib/desy-modals/components/dialog/dialog.component.js +121 -121
  91. package/esm2015/lib/desy-modals/components/modal/modal-button-loader-primary/modal-button-loader-primary.component.js +20 -20
  92. package/esm2015/lib/desy-modals/components/modal/modal-button-loader-secondary/modal-button-loader-secondary.component.js +19 -19
  93. package/esm2015/lib/desy-modals/components/modal/modal-button-primary/modal-button-primary.component.js +19 -19
  94. package/esm2015/lib/desy-modals/components/modal/modal-button-secondary/modal-button-secondary.component.js +19 -19
  95. package/esm2015/lib/desy-modals/components/modal/modal.component.js +145 -145
  96. package/esm2015/lib/desy-modals/desy-modals.module.js +41 -41
  97. package/esm2015/lib/desy-modals/interfaces/dialog-options.js +2 -2
  98. package/esm2015/lib/desy-modals/interfaces/index.js +8 -8
  99. package/esm2015/lib/desy-modals/interfaces/modal-button-data.js +2 -2
  100. package/esm2015/lib/desy-modals/interfaces/modal-data.js +2 -2
  101. package/esm2015/lib/desy-modals/interfaces/modal-icon-data.js +2 -2
  102. package/esm2015/lib/desy-modals/interfaces/modal-options.js +2 -2
  103. package/esm2015/lib/desy-modals/interfaces/open-dialog-result.js +2 -2
  104. package/esm2015/lib/desy-modals/services/dialog.service.js +117 -117
  105. package/esm2015/lib/desy-nav/components/breadcrumbs/breadcrumbs-item/breadcrumbs-item.component.js +15 -15
  106. package/esm2015/lib/desy-nav/components/breadcrumbs/breadcrumbs.component.js +42 -42
  107. package/esm2015/lib/desy-nav/components/error-summary/error-summary-item/error-summary-item.component.js +15 -15
  108. package/esm2015/lib/desy-nav/components/error-summary/error-summary.component.js +46 -46
  109. package/esm2015/lib/desy-nav/components/footer/footer-meta/footer-meta-item/footer-meta-item.component.js +16 -16
  110. package/esm2015/lib/desy-nav/components/footer/footer-meta/footer-meta.component.js +23 -23
  111. package/esm2015/lib/desy-nav/components/footer/footer-navigation/footer-navigation-item/footer-navigation-item.component.js +16 -16
  112. package/esm2015/lib/desy-nav/components/footer/footer-navigation/footer-navigation.component.js +16 -16
  113. package/esm2015/lib/desy-nav/components/footer/footer.component.js +52 -52
  114. package/esm2015/lib/desy-nav/components/header/header-custom-navigation/header-custom-navigation.component.js +11 -0
  115. package/esm2015/lib/desy-nav/components/header/header-dropdown/header-dropdown.component.js +36 -36
  116. package/esm2015/lib/desy-nav/components/header/header-navigation/header-navigation-item/header-navigation-item.component.js +19 -19
  117. package/esm2015/lib/desy-nav/components/header/header-navigation/header-navigation.component.js +29 -29
  118. package/esm2015/lib/desy-nav/components/header/header-offcanvas/header-offcanvas-button/header-offcanvas-button.component.js +22 -22
  119. package/esm2015/lib/desy-nav/components/header/header-offcanvas/header-offcanvas-close-button/header-offcanvas-close-button.component.js +11 -11
  120. package/esm2015/lib/desy-nav/components/header/header-offcanvas/header-offcanvas.component.js +88 -88
  121. package/esm2015/lib/desy-nav/components/header/header-subnav/header-subnav.component.js +34 -34
  122. package/esm2015/lib/desy-nav/components/header/header.component.js +66 -61
  123. package/esm2015/lib/desy-nav/components/menu-horizontal/menu-horizontal-item/menu-horizontal-item.component.js +28 -28
  124. package/esm2015/lib/desy-nav/components/menu-horizontal/menu-horizontal.component.js +68 -68
  125. package/esm2015/lib/desy-nav/components/menu-navigation/components/menu-navigation-item/menu-navigation-item.component.js +35 -35
  126. package/esm2015/lib/desy-nav/components/menu-navigation/components/menu-navigation-subitem/menu-navigation-subitem.component.js +31 -31
  127. package/esm2015/lib/desy-nav/components/menu-navigation/menu-navigation.component.js +568 -568
  128. package/esm2015/lib/desy-nav/components/menu-vertical/menu-vertical-item/menu-vertical-item.component.js +32 -32
  129. package/esm2015/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub/menu-vertical-item-sub.component.js +16 -16
  130. package/esm2015/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub-item/menu-vertical-item-sub-item.component.js +24 -24
  131. package/esm2015/lib/desy-nav/components/menu-vertical/menu-vertical.component.js +89 -89
  132. package/esm2015/lib/desy-nav/components/menubar/components/menubar-item/menubar-item.component.js +36 -36
  133. package/esm2015/lib/desy-nav/components/menubar/components/menubar-label/menubar-label.component.js +14 -14
  134. package/esm2015/lib/desy-nav/components/menubar/components/menubar-subitem/menubar-subitem.component.js +29 -29
  135. package/esm2015/lib/desy-nav/components/menubar/components/menubar-subsubitem/menubar-subsubitem.component.js +23 -23
  136. package/esm2015/lib/desy-nav/components/menubar/directives/menubaritem.directive.js +37 -37
  137. package/esm2015/lib/desy-nav/components/menubar/menubar.component.js +672 -672
  138. package/esm2015/lib/desy-nav/components/nav/nav-item/nav-item.component.js +30 -30
  139. package/esm2015/lib/desy-nav/components/nav/nav.component.js +105 -105
  140. package/esm2015/lib/desy-nav/components/notification/notification-item/notification-item.component.js +18 -18
  141. package/esm2015/lib/desy-nav/components/notification/notification.component.js +102 -102
  142. package/esm2015/lib/desy-nav/components/skip-link/skip-link.component.js +33 -33
  143. package/esm2015/lib/desy-nav/desy-nav.module.js +136 -133
  144. package/esm2015/lib/desy-nav/interfaces/breadcrumbs.data.js +2 -2
  145. package/esm2015/lib/desy-nav/interfaces/error-summary-data.js +2 -2
  146. package/esm2015/lib/desy-nav/interfaces/footer-data.js +2 -2
  147. package/esm2015/lib/desy-nav/interfaces/header-dropdown-data.js +2 -2
  148. package/esm2015/lib/desy-nav/interfaces/header-navigation-data.js +2 -2
  149. package/esm2015/lib/desy-nav/interfaces/header-navigation-item-data.js +2 -2
  150. package/esm2015/lib/desy-nav/interfaces/header-offcanvas-data.js +2 -2
  151. package/esm2015/lib/desy-nav/interfaces/header-subnav-data.js +2 -2
  152. package/esm2015/lib/desy-nav/interfaces/index.js +20 -20
  153. package/esm2015/lib/desy-nav/interfaces/menu-horizontal-item-data.js +2 -2
  154. package/esm2015/lib/desy-nav/interfaces/menu-horizontal-item-event-data.js +2 -2
  155. package/esm2015/lib/desy-nav/interfaces/menu-navigation-item-sub-item-sub-item.js +2 -2
  156. package/esm2015/lib/desy-nav/interfaces/menu-navigation-item-sub-item.js +2 -2
  157. package/esm2015/lib/desy-nav/interfaces/menu-navigation.js +2 -2
  158. package/esm2015/lib/desy-nav/interfaces/menu-vertical-items-data.js +2 -2
  159. package/esm2015/lib/desy-nav/interfaces/menu-vertical-sub-data.js +2 -2
  160. package/esm2015/lib/desy-nav/interfaces/menu-vertical-sub-items-data.js +2 -2
  161. package/esm2015/lib/desy-nav/interfaces/menubar-item-sub-item-sub-item.js +2 -2
  162. package/esm2015/lib/desy-nav/interfaces/menubar-item-sub-item.js +2 -2
  163. package/esm2015/lib/desy-nav/interfaces/menubar-item-sub.js +2 -2
  164. package/esm2015/lib/desy-nav/interfaces/menubar-item.js +2 -2
  165. package/esm2015/lib/desy-nav/interfaces/nav-item-event.data.js +2 -2
  166. package/esm2015/lib/desy-nav/interfaces/nav-item.data.js +2 -2
  167. package/esm2015/lib/desy-nav/interfaces/notification-items-data.js +2 -2
  168. package/esm2015/lib/desy-nav/interfaces/notification-options.js +2 -2
  169. package/esm2015/lib/desy-pagination/components/pagination/pagination.component.js +138 -138
  170. package/esm2015/lib/desy-pagination/components/pagination-item-perpage/pagination-item-perpage.component.js +15 -15
  171. package/esm2015/lib/desy-pagination/components/pagination-listbox-label/pagination-listbox-label.component.js +14 -14
  172. package/esm2015/lib/desy-pagination/desy-pagination.module.js +31 -31
  173. package/esm2015/lib/desy-pagination/interfaces/index.js +1 -1
  174. package/esm2015/lib/desy-pagination/interfaces/pagination-item.data.js +2 -2
  175. package/esm2015/lib/desy-tables/components/table/components/table-caption.component.js +14 -14
  176. package/esm2015/lib/desy-tables/components/table/components/table-cell.component.js +17 -17
  177. package/esm2015/lib/desy-tables/components/table/components/table-header.component.js +14 -14
  178. package/esm2015/lib/desy-tables/components/table/components/table-row.component.js +14 -14
  179. package/esm2015/lib/desy-tables/components/table/table.component.js +55 -55
  180. package/esm2015/lib/desy-tables/components/table-advanced/components/table-advanced-header-cell.component.js +33 -33
  181. package/esm2015/lib/desy-tables/components/table-advanced/components/table-advanced-header.component.js +14 -14
  182. package/esm2015/lib/desy-tables/components/table-advanced/components/table-advanced-row-cell.component.js +17 -17
  183. package/esm2015/lib/desy-tables/components/table-advanced/components/table-advanced-row.component.js +20 -20
  184. package/esm2015/lib/desy-tables/components/table-advanced/components/table-advanced-select.component.js +22 -22
  185. package/esm2015/lib/desy-tables/components/table-advanced/table-advanced.component.js +316 -316
  186. package/esm2015/lib/desy-tables/desy-tables.module.js +64 -64
  187. package/esm2015/lib/desy-tables/directives/cell.directive.js +26 -26
  188. package/esm2015/lib/desy-tables/directives/focus-clicked-cell.directive.js +78 -78
  189. package/esm2015/lib/desy-tables/directives/row.directive.js +24 -24
  190. package/esm2015/lib/desy-tables/interfaces/cell-data.js +2 -2
  191. package/esm2015/lib/desy-tables/interfaces/head-cell-data.js +7 -7
  192. package/esm2015/lib/desy-tables/interfaces/index.js +5 -5
  193. package/esm2015/lib/desy-tables/interfaces/recalculate-table-params.js +2 -2
  194. package/esm2015/lib/desy-tables/interfaces/row-data.js +2 -2
  195. package/esm2015/lib/desy-tables/interfaces/wrapper-data.js +2 -2
  196. package/esm2015/lib/desy-views/components/accordion/accordion-header/accordion-header.component.js +14 -14
  197. package/esm2015/lib/desy-views/components/accordion/accordion-item/accordion-item.component.js +43 -43
  198. package/esm2015/lib/desy-views/components/accordion/accordion.component.js +153 -153
  199. package/esm2015/lib/desy-views/components/accordion-history/accordion-history-item/accordion-history-item.component.js +31 -31
  200. package/esm2015/lib/desy-views/components/accordion-history/accordion-history.component.js +15 -15
  201. package/esm2015/lib/desy-views/components/accordion-history/accordion-item-hide-button/accordion-item-hide-button.component.js +14 -14
  202. package/esm2015/lib/desy-views/components/accordion-history/accordion-item-show-button/accordion-item-show-button.component.js +14 -14
  203. package/esm2015/lib/desy-views/components/alert/alert.component.js +75 -75
  204. package/esm2015/lib/desy-views/components/collapsible/collapsible.component.js +55 -55
  205. package/esm2015/lib/desy-views/components/description-list/definition/definition.component.js +15 -15
  206. package/esm2015/lib/desy-views/components/description-list/description-item/description-item.component.js +26 -26
  207. package/esm2015/lib/desy-views/components/description-list/description-list.component.js +22 -22
  208. package/esm2015/lib/desy-views/components/description-list/term/term.component.js +15 -15
  209. package/esm2015/lib/desy-views/components/details/details.component.js +20 -20
  210. package/esm2015/lib/desy-views/components/item/item-content-bottom/item-content-bottom.component.js +14 -14
  211. package/esm2015/lib/desy-views/components/item/item-content-right/item-content-right.component.js +11 -11
  212. package/esm2015/lib/desy-views/components/item/item-item/item-item.component.js +11 -11
  213. package/esm2015/lib/desy-views/components/item/item.component.js +87 -87
  214. package/esm2015/lib/desy-views/components/media-object/media-object-figure/media-object-figure.component.js +11 -11
  215. package/esm2015/lib/desy-views/components/media-object/media-object.component.js +67 -67
  216. package/esm2015/lib/desy-views/components/spinner/spinner.component.js +45 -45
  217. package/esm2015/lib/desy-views/components/status/status.component.js +58 -58
  218. package/esm2015/lib/desy-views/components/status-item/status-item.component.js +86 -86
  219. package/esm2015/lib/desy-views/components/tabs/panel/panel.component.js +15 -15
  220. package/esm2015/lib/desy-views/components/tabs/tab-item/tab-item.component.js +28 -28
  221. package/esm2015/lib/desy-views/components/tabs/tabs.component.js +150 -150
  222. package/esm2015/lib/desy-views/components/tooltip/tooltip-content/tooltip-content.component.js +11 -11
  223. package/esm2015/lib/desy-views/components/tooltip/tooltip.component.js +155 -155
  224. package/esm2015/lib/desy-views/desy-views.module.js +108 -108
  225. package/esm2015/lib/desy-views/interfaces/accordion-header.data.js +2 -2
  226. package/esm2015/lib/desy-views/interfaces/accordion-item.data.js +2 -2
  227. package/esm2015/lib/desy-views/interfaces/alert-options.js +2 -2
  228. package/esm2015/lib/desy-views/interfaces/description-item.data.js +2 -2
  229. package/esm2015/lib/desy-views/interfaces/index.js +11 -11
  230. package/esm2015/lib/desy-views/interfaces/open-alert-result.js +2 -2
  231. package/esm2015/lib/desy-views/interfaces/status-data.js +2 -2
  232. package/esm2015/lib/desy-views/interfaces/status-icon-data.js +2 -2
  233. package/esm2015/lib/desy-views/interfaces/status-item-title-data.js +2 -2
  234. package/esm2015/lib/desy-views/interfaces/tabs-items-data.js +2 -2
  235. package/esm2015/lib/desy-views/interfaces/tabs-panel-data.js +2 -2
  236. package/esm2015/lib/desy-views/interfaces/term-definition.data.js +2 -2
  237. package/esm2015/lib/desy-views/services/alert.service.js +89 -89
  238. package/esm2015/lib/shared/components/accessibility/accessibility.component.js +29 -29
  239. package/esm2015/lib/shared/components/accessibility-and-content-required/accessibility-and-content-required.component.js +27 -27
  240. package/esm2015/lib/shared/components/accessibility-and-text-or-html-required/accessibility-and-text-or-html-required.component.js +26 -26
  241. package/esm2015/lib/shared/components/content-base/content-base.component.js +20 -20
  242. package/esm2015/lib/shared/components/index.js +6 -6
  243. package/esm2015/lib/shared/components/text-or-html-required/text-or-html-required.component.js +14 -14
  244. package/esm2015/lib/shared/decorators/desy-content-child.decorator.js +41 -41
  245. package/esm2015/lib/shared/decorators/desy-on-input-change.decorator.js +19 -19
  246. package/esm2015/lib/shared/directives/attribute-change.directive.js +43 -43
  247. package/esm2015/lib/shared/directives/click-outside.directive.js +35 -35
  248. package/esm2015/lib/shared/directives/content-change.directive.js +43 -43
  249. package/esm2015/lib/shared/directives/custom-inner-content.directive.js +62 -62
  250. package/esm2015/lib/shared/directives/inner-content.directive.js +34 -34
  251. package/esm2015/lib/shared/interfaces/accesibility-data.js +2 -2
  252. package/esm2015/lib/shared/pipes/external-href.pipe.js +28 -28
  253. package/esm2015/lib/shared/pipes/inner-html.pipe.js +19 -19
  254. package/esm2015/lib/shared/pipes/make-html-list.pipe.js +16 -16
  255. package/esm2015/lib/shared/shared.module.js +62 -62
  256. package/esm2015/lib/shared/utils/focus-utils.js +51 -51
  257. package/esm2015/lib/shared/utils/search-utils.js +78 -78
  258. package/esm2015/lib/shared/utils/string-utils.js +18 -18
  259. package/esm2015/public-api.js +197 -197
  260. package/fesm2015/desy-angular.js +9589 -9574
  261. package/fesm2015/desy-angular.js.map +1 -1
  262. package/lib/desy-angular.module.d.ts +2 -2
  263. package/lib/desy-buttons/components/button/button.component.d.ts +31 -31
  264. package/lib/desy-buttons/components/button-loader/button-loader.component.d.ts +15 -15
  265. package/lib/desy-buttons/components/dropdown/dropdown.component.d.ts +22 -22
  266. package/lib/desy-buttons/components/listbox/listbox-item/listbox-item.component.d.ts +12 -12
  267. package/lib/desy-buttons/components/listbox/listbox-label/listbox-label.component.d.ts +4 -4
  268. package/lib/desy-buttons/components/listbox/listbox.component.d.ts +53 -53
  269. package/lib/desy-buttons/components/pill/pill.component.d.ts +22 -22
  270. package/lib/desy-buttons/components/toggle/toggle-off-state/toggle-off-state.component.d.ts +5 -5
  271. package/lib/desy-buttons/components/toggle/toggle-on-state/toggle-on-state.component.d.ts +5 -5
  272. package/lib/desy-buttons/components/toggle/toggle.component.d.ts +17 -17
  273. package/lib/desy-buttons/desy-buttons.module.d.ts +2 -2
  274. package/lib/desy-buttons/interfaces/listbox-item-data.d.ts +9 -9
  275. package/lib/desy-buttons/interfaces/listbox-label-data.d.ts +5 -5
  276. package/lib/desy-commons/components/content/content.component.d.ts +5 -5
  277. package/lib/desy-commons/components/description/description.component.d.ts +6 -6
  278. package/lib/desy-commons/components/divider/divider.component.d.ts +6 -6
  279. package/lib/desy-commons/components/icon/icon.component.d.ts +6 -6
  280. package/lib/desy-commons/components/title/title.component.d.ts +5 -5
  281. package/lib/desy-commons/desy-commons.module.d.ts +2 -2
  282. package/lib/desy-commons/interfaces/content-data.d.ts +5 -5
  283. package/lib/desy-commons/interfaces/description-data.d.ts +6 -6
  284. package/lib/desy-commons/interfaces/divider-data.d.ts +4 -4
  285. package/lib/desy-commons/interfaces/icon-data.d.ts +5 -5
  286. package/lib/desy-commons/interfaces/index.d.ts +5 -5
  287. package/lib/desy-commons/interfaces/title-data.d.ts +6 -6
  288. package/lib/desy-forms/components/character-count/character-count.component.d.ts +27 -27
  289. package/lib/desy-forms/components/checkboxes/checkbox-item/checkbox-item.component.d.ts +47 -47
  290. package/lib/desy-forms/components/checkboxes/checkboxes.component.d.ts +75 -75
  291. package/lib/desy-forms/components/date-input/date-input-day/date-input-day.component.d.ts +21 -21
  292. package/lib/desy-forms/components/date-input/date-input-divider/date-input-divider.component.d.ts +7 -7
  293. package/lib/desy-forms/components/date-input/date-input-item/date-input-item.component.d.ts +4 -4
  294. package/lib/desy-forms/components/date-input/date-input-month/date-input-month.component.d.ts +21 -21
  295. package/lib/desy-forms/components/date-input/date-input-year/date-input-year.component.d.ts +18 -18
  296. package/lib/desy-forms/components/date-input/date-input.component.d.ts +55 -55
  297. package/lib/desy-forms/components/error-message/error-message.component.d.ts +12 -12
  298. package/lib/desy-forms/components/fieldset/fieldset.component.d.ts +28 -28
  299. package/lib/desy-forms/components/fieldset/legend/legend.component.d.ts +6 -6
  300. package/lib/desy-forms/components/file-upload/file-upload.component.d.ts +20 -20
  301. package/lib/desy-forms/components/form-field/form-field.component.d.ts +40 -40
  302. package/lib/desy-forms/components/hint/hint.component.d.ts +11 -11
  303. package/lib/desy-forms/components/input/input.component.d.ts +23 -23
  304. package/lib/desy-forms/components/input-group/input-group-divider/input-group-divider.component.d.ts +8 -8
  305. package/lib/desy-forms/components/input-group/input-group-input/input-group-input.component.d.ts +20 -20
  306. package/lib/desy-forms/components/input-group/input-group-item/input-group-item.component.d.ts +4 -4
  307. package/lib/desy-forms/components/input-group/input-group-select/input-group-select.component.d.ts +16 -16
  308. package/lib/desy-forms/components/input-group/input-group.component.d.ts +56 -56
  309. package/lib/desy-forms/components/label/label.component.d.ts +14 -14
  310. package/lib/desy-forms/components/radios/radio-item/radio-item.component.d.ts +43 -43
  311. package/lib/desy-forms/components/radios/radios.component.d.ts +75 -75
  312. package/lib/desy-forms/components/search-bar/search-bar.component.d.ts +16 -16
  313. package/lib/desy-forms/components/select/option/option.component.d.ts +7 -7
  314. package/lib/desy-forms/components/select/option-group/option-group.component.d.ts +7 -7
  315. package/lib/desy-forms/components/select/select-item/select-item.component.d.ts +4 -4
  316. package/lib/desy-forms/components/select/select.component.d.ts +21 -21
  317. package/lib/desy-forms/components/template-driven-wrapper/template-driven-wrapper.component.d.ts +2 -2
  318. package/lib/desy-forms/components/textarea/textarea.component.d.ts +24 -24
  319. package/lib/desy-forms/components/tree/interfaces/itree-item.d.ts +5 -5
  320. package/lib/desy-forms/components/tree/interfaces/quit-tree-item-focus-options.d.ts +5 -5
  321. package/lib/desy-forms/components/tree/tree-checkbox/tree-checkbox.component.d.ts +43 -43
  322. package/lib/desy-forms/components/tree/tree-item/tree-item.component.d.ts +87 -87
  323. package/lib/desy-forms/components/tree/tree-items-generator/tree-items-generator.component.d.ts +10 -10
  324. package/lib/desy-forms/components/tree/tree-sub/tree-sub.component.d.ts +6 -6
  325. package/lib/desy-forms/components/tree/tree.component.d.ts +112 -112
  326. package/lib/desy-forms/desy-forms.module.d.ts +2 -2
  327. package/lib/desy-forms/directives/condition.directive.d.ts +15 -15
  328. package/lib/desy-forms/interfaces/accesibility-data.d.ts +15 -15
  329. package/lib/desy-forms/interfaces/error-message-data.d.ts +8 -8
  330. package/lib/desy-forms/interfaces/fieldset-data.d.ts +10 -10
  331. package/lib/desy-forms/interfaces/hint-data.d.ts +7 -7
  332. package/lib/desy-forms/interfaces/index.d.ts +12 -12
  333. package/lib/desy-forms/interfaces/item-checkbox-data.d.ts +21 -21
  334. package/lib/desy-forms/interfaces/item-date-input-data.d.ts +17 -17
  335. package/lib/desy-forms/interfaces/item-divider-date-input-data.d.ts +5 -5
  336. package/lib/desy-forms/interfaces/item-divider-input-group-data.d.ts +5 -5
  337. package/lib/desy-forms/interfaces/item-input-group-data.d.ts +23 -23
  338. package/lib/desy-forms/interfaces/item-radio-data.d.ts +20 -20
  339. package/lib/desy-forms/interfaces/item-radio-with-template-data.d.ts +5 -5
  340. package/lib/desy-forms/interfaces/label-data.d.ts +9 -9
  341. package/lib/desy-forms/interfaces/legend-data.d.ts +6 -6
  342. package/lib/desy-forms/interfaces/select-item-data.d.ts +8 -8
  343. package/lib/desy-modals/components/dialog/dialog.component.d.ts +35 -35
  344. package/lib/desy-modals/components/modal/modal-button-loader-primary/modal-button-loader-primary.component.d.ts +8 -8
  345. package/lib/desy-modals/components/modal/modal-button-loader-secondary/modal-button-loader-secondary.component.d.ts +7 -7
  346. package/lib/desy-modals/components/modal/modal-button-primary/modal-button-primary.component.d.ts +7 -7
  347. package/lib/desy-modals/components/modal/modal-button-secondary/modal-button-secondary.component.d.ts +7 -7
  348. package/lib/desy-modals/components/modal/modal.component.d.ts +51 -51
  349. package/lib/desy-modals/desy-modals.module.d.ts +2 -2
  350. package/lib/desy-modals/interfaces/dialog-options.d.ts +9 -9
  351. package/lib/desy-modals/interfaces/index.d.ts +6 -6
  352. package/lib/desy-modals/interfaces/modal-button-data.d.ts +20 -20
  353. package/lib/desy-modals/interfaces/modal-data.d.ts +5 -5
  354. package/lib/desy-modals/interfaces/modal-icon-data.d.ts +4 -4
  355. package/lib/desy-modals/interfaces/modal-options.d.ts +16 -16
  356. package/lib/desy-modals/interfaces/open-dialog-result.d.ts +6 -6
  357. package/lib/desy-modals/services/dialog.service.d.ts +14 -14
  358. package/lib/desy-nav/components/breadcrumbs/breadcrumbs-item/breadcrumbs-item.component.d.ts +6 -6
  359. package/lib/desy-nav/components/breadcrumbs/breadcrumbs.component.d.ts +18 -18
  360. package/lib/desy-nav/components/error-summary/error-summary-item/error-summary-item.component.d.ts +6 -6
  361. package/lib/desy-nav/components/error-summary/error-summary.component.d.ts +20 -20
  362. package/lib/desy-nav/components/footer/footer-meta/footer-meta-item/footer-meta-item.component.d.ts +7 -7
  363. package/lib/desy-nav/components/footer/footer-meta/footer-meta.component.d.ts +10 -10
  364. package/lib/desy-nav/components/footer/footer-navigation/footer-navigation-item/footer-navigation-item.component.d.ts +7 -7
  365. package/lib/desy-nav/components/footer/footer-navigation/footer-navigation.component.d.ts +8 -8
  366. package/lib/desy-nav/components/footer/footer.component.d.ts +27 -27
  367. package/lib/desy-nav/components/header/header-custom-navigation/header-custom-navigation.component.d.ts +3 -0
  368. package/lib/desy-nav/components/header/header-dropdown/header-dropdown.component.d.ts +12 -12
  369. package/lib/desy-nav/components/header/header-navigation/header-navigation-item/header-navigation-item.component.d.ts +10 -10
  370. package/lib/desy-nav/components/header/header-navigation/header-navigation.component.d.ts +13 -13
  371. package/lib/desy-nav/components/header/header-offcanvas/header-offcanvas-button/header-offcanvas-button.component.d.ts +5 -5
  372. package/lib/desy-nav/components/header/header-offcanvas/header-offcanvas-close-button/header-offcanvas-close-button.component.d.ts +3 -3
  373. package/lib/desy-nav/components/header/header-offcanvas/header-offcanvas.component.d.ts +30 -30
  374. package/lib/desy-nav/components/header/header-subnav/header-subnav.component.d.ts +11 -11
  375. package/lib/desy-nav/components/header/header.component.d.ts +34 -32
  376. package/lib/desy-nav/components/menu-horizontal/menu-horizontal-item/menu-horizontal-item.component.d.ts +15 -15
  377. package/lib/desy-nav/components/menu-horizontal/menu-horizontal.component.d.ts +16 -16
  378. package/lib/desy-nav/components/menu-navigation/components/menu-navigation-item/menu-navigation-item.component.d.ts +22 -22
  379. package/lib/desy-nav/components/menu-navigation/components/menu-navigation-subitem/menu-navigation-subitem.component.d.ts +19 -19
  380. package/lib/desy-nav/components/menu-navigation/menu-navigation.component.d.ts +80 -80
  381. package/lib/desy-nav/components/menu-vertical/menu-vertical-item/menu-vertical-item.component.d.ts +18 -18
  382. package/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub/menu-vertical-item-sub.component.d.ts +8 -8
  383. package/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub-item/menu-vertical-item-sub-item.component.d.ts +15 -15
  384. package/lib/desy-nav/components/menu-vertical/menu-vertical.component.d.ts +18 -18
  385. package/lib/desy-nav/components/menubar/components/menubar-item/menubar-item.component.d.ts +23 -23
  386. package/lib/desy-nav/components/menubar/components/menubar-label/menubar-label.component.d.ts +4 -4
  387. package/lib/desy-nav/components/menubar/components/menubar-subitem/menubar-subitem.component.d.ts +15 -15
  388. package/lib/desy-nav/components/menubar/components/menubar-subsubitem/menubar-subsubitem.component.d.ts +10 -10
  389. package/lib/desy-nav/components/menubar/directives/menubaritem.directive.d.ts +16 -16
  390. package/lib/desy-nav/components/menubar/menubar.component.d.ts +101 -101
  391. package/lib/desy-nav/components/nav/nav-item/nav-item.component.d.ts +17 -17
  392. package/lib/desy-nav/components/nav/nav.component.d.ts +20 -20
  393. package/lib/desy-nav/components/notification/notification-item/notification-item.component.d.ts +9 -9
  394. package/lib/desy-nav/components/notification/notification.component.d.ts +36 -36
  395. package/lib/desy-nav/components/skip-link/skip-link.component.d.ts +13 -13
  396. package/lib/desy-nav/desy-nav.module.d.ts +2 -2
  397. package/lib/desy-nav/interfaces/breadcrumbs.data.d.ts +7 -7
  398. package/lib/desy-nav/interfaces/error-summary-data.d.ts +7 -7
  399. package/lib/desy-nav/interfaces/footer-data.d.ts +24 -24
  400. package/lib/desy-nav/interfaces/header-dropdown-data.d.ts +11 -11
  401. package/lib/desy-nav/interfaces/header-navigation-data.d.ts +5 -5
  402. package/lib/desy-nav/interfaces/header-navigation-item-data.d.ts +12 -12
  403. package/lib/desy-nav/interfaces/header-offcanvas-data.d.ts +8 -8
  404. package/lib/desy-nav/interfaces/header-subnav-data.d.ts +11 -11
  405. package/lib/desy-nav/interfaces/index.d.ts +19 -19
  406. package/lib/desy-nav/interfaces/menu-horizontal-item-data.d.ts +13 -13
  407. package/lib/desy-nav/interfaces/menu-horizontal-item-event-data.d.ts +5 -5
  408. package/lib/desy-nav/interfaces/menu-navigation-item-sub-item-sub-item.d.ts +14 -14
  409. package/lib/desy-nav/interfaces/menu-navigation-item-sub-item.d.ts +6 -6
  410. package/lib/desy-nav/interfaces/menu-navigation.d.ts +17 -17
  411. package/lib/desy-nav/interfaces/menu-vertical-items-data.d.ts +19 -19
  412. package/lib/desy-nav/interfaces/menu-vertical-sub-data.d.ts +7 -7
  413. package/lib/desy-nav/interfaces/menu-vertical-sub-items-data.d.ts +16 -16
  414. package/lib/desy-nav/interfaces/menubar-item-sub-item-sub-item.d.ts +6 -6
  415. package/lib/desy-nav/interfaces/menubar-item-sub-item.d.ts +9 -9
  416. package/lib/desy-nav/interfaces/menubar-item-sub.d.ts +6 -6
  417. package/lib/desy-nav/interfaces/menubar-item.d.ts +18 -18
  418. package/lib/desy-nav/interfaces/nav-item-event.data.d.ts +5 -5
  419. package/lib/desy-nav/interfaces/nav-item.data.d.ts +15 -15
  420. package/lib/desy-nav/interfaces/notification-items-data.d.ts +10 -10
  421. package/lib/desy-nav/interfaces/notification-options.d.ts +15 -15
  422. package/lib/desy-pagination/components/pagination/pagination.component.d.ts +44 -44
  423. package/lib/desy-pagination/components/pagination-item-perpage/pagination-item-perpage.component.d.ts +7 -7
  424. package/lib/desy-pagination/components/pagination-listbox-label/pagination-listbox-label.component.d.ts +4 -4
  425. package/lib/desy-pagination/desy-pagination.module.d.ts +2 -2
  426. package/lib/desy-pagination/interfaces/index.d.ts +1 -1
  427. package/lib/desy-pagination/interfaces/pagination-item.data.d.ts +4 -4
  428. package/lib/desy-tables/components/table/components/table-caption.component.d.ts +4 -4
  429. package/lib/desy-tables/components/table/components/table-cell.component.d.ts +8 -8
  430. package/lib/desy-tables/components/table/components/table-header.component.d.ts +5 -5
  431. package/lib/desy-tables/components/table/components/table-row.component.d.ts +5 -5
  432. package/lib/desy-tables/components/table/table.component.d.ts +24 -24
  433. package/lib/desy-tables/components/table-advanced/components/table-advanced-header-cell.component.d.ts +20 -20
  434. package/lib/desy-tables/components/table-advanced/components/table-advanced-header.component.d.ts +5 -5
  435. package/lib/desy-tables/components/table-advanced/components/table-advanced-row-cell.component.d.ts +8 -8
  436. package/lib/desy-tables/components/table-advanced/components/table-advanced-row.component.d.ts +8 -8
  437. package/lib/desy-tables/components/table-advanced/components/table-advanced-select.component.d.ts +9 -9
  438. package/lib/desy-tables/components/table-advanced/table-advanced.component.d.ts +122 -122
  439. package/lib/desy-tables/desy-tables.module.d.ts +2 -2
  440. package/lib/desy-tables/directives/cell.directive.d.ts +14 -14
  441. package/lib/desy-tables/directives/focus-clicked-cell.directive.d.ts +10 -10
  442. package/lib/desy-tables/directives/row.directive.d.ts +16 -16
  443. package/lib/desy-tables/interfaces/cell-data.d.ts +9 -9
  444. package/lib/desy-tables/interfaces/head-cell-data.d.ts +18 -18
  445. package/lib/desy-tables/interfaces/index.d.ts +4 -4
  446. package/lib/desy-tables/interfaces/recalculate-table-params.d.ts +11 -11
  447. package/lib/desy-tables/interfaces/row-data.d.ts +6 -6
  448. package/lib/desy-tables/interfaces/wrapper-data.d.ts +4 -4
  449. package/lib/desy-views/components/accordion/accordion-header/accordion-header.component.d.ts +5 -5
  450. package/lib/desy-views/components/accordion/accordion-item/accordion-item.component.d.ts +17 -17
  451. package/lib/desy-views/components/accordion/accordion.component.d.ts +48 -48
  452. package/lib/desy-views/components/accordion-history/accordion-history-item/accordion-history-item.component.d.ts +9 -9
  453. package/lib/desy-views/components/accordion-history/accordion-history.component.d.ts +6 -6
  454. package/lib/desy-views/components/accordion-history/accordion-item-hide-button/accordion-item-hide-button.component.d.ts +4 -4
  455. package/lib/desy-views/components/accordion-history/accordion-item-show-button/accordion-item-show-button.component.d.ts +4 -4
  456. package/lib/desy-views/components/alert/alert.component.d.ts +29 -29
  457. package/lib/desy-views/components/collapsible/collapsible.component.d.ts +14 -14
  458. package/lib/desy-views/components/description-list/definition/definition.component.d.ts +6 -6
  459. package/lib/desy-views/components/description-list/description-item/description-item.component.d.ts +9 -9
  460. package/lib/desy-views/components/description-list/description-list.component.d.ts +11 -11
  461. package/lib/desy-views/components/description-list/term/term.component.d.ts +6 -6
  462. package/lib/desy-views/components/details/details.component.d.ts +10 -10
  463. package/lib/desy-views/components/item/item-content-bottom/item-content-bottom.component.d.ts +5 -5
  464. package/lib/desy-views/components/item/item-content-right/item-content-right.component.d.ts +3 -3
  465. package/lib/desy-views/components/item/item-item/item-item.component.d.ts +3 -3
  466. package/lib/desy-views/components/item/item.component.d.ts +37 -37
  467. package/lib/desy-views/components/media-object/media-object-figure/media-object-figure.component.d.ts +3 -3
  468. package/lib/desy-views/components/media-object/media-object.component.d.ts +33 -33
  469. package/lib/desy-views/components/spinner/spinner.component.d.ts +21 -21
  470. package/lib/desy-views/components/status/status.component.d.ts +25 -25
  471. package/lib/desy-views/components/status-item/status-item.component.d.ts +44 -44
  472. package/lib/desy-views/components/tabs/panel/panel.component.d.ts +6 -6
  473. package/lib/desy-views/components/tabs/tab-item/tab-item.component.d.ts +12 -12
  474. package/lib/desy-views/components/tabs/tabs.component.d.ts +48 -48
  475. package/lib/desy-views/components/tooltip/tooltip-content/tooltip-content.component.d.ts +3 -3
  476. package/lib/desy-views/components/tooltip/tooltip.component.d.ts +48 -48
  477. package/lib/desy-views/desy-views.module.d.ts +2 -2
  478. package/lib/desy-views/interfaces/accordion-header.data.d.ts +5 -5
  479. package/lib/desy-views/interfaces/accordion-item.data.d.ts +10 -10
  480. package/lib/desy-views/interfaces/alert-options.d.ts +8 -8
  481. package/lib/desy-views/interfaces/description-item.data.d.ts +8 -8
  482. package/lib/desy-views/interfaces/index.d.ts +10 -10
  483. package/lib/desy-views/interfaces/open-alert-result.d.ts +6 -6
  484. package/lib/desy-views/interfaces/status-data.d.ts +8 -8
  485. package/lib/desy-views/interfaces/status-icon-data.d.ts +4 -4
  486. package/lib/desy-views/interfaces/status-item-title-data.d.ts +5 -5
  487. package/lib/desy-views/interfaces/tabs-items-data.d.ts +9 -9
  488. package/lib/desy-views/interfaces/tabs-panel-data.d.ts +8 -8
  489. package/lib/desy-views/interfaces/term-definition.data.d.ts +7 -7
  490. package/lib/desy-views/services/alert.service.d.ts +14 -14
  491. package/lib/shared/components/accessibility/accessibility.component.d.ts +20 -20
  492. package/lib/shared/components/accessibility-and-content-required/accessibility-and-content-required.component.d.ts +26 -26
  493. package/lib/shared/components/accessibility-and-text-or-html-required/accessibility-and-text-or-html-required.component.d.ts +23 -23
  494. package/lib/shared/components/content-base/content-base.component.d.ts +9 -9
  495. package/lib/shared/components/index.d.ts +5 -5
  496. package/lib/shared/components/text-or-html-required/text-or-html-required.component.d.ts +8 -8
  497. package/lib/shared/decorators/desy-content-child.decorator.d.ts +15 -15
  498. package/lib/shared/decorators/desy-on-input-change.decorator.d.ts +5 -5
  499. package/lib/shared/directives/attribute-change.directive.d.ts +10 -10
  500. package/lib/shared/directives/click-outside.directive.d.ts +9 -9
  501. package/lib/shared/directives/content-change.directive.d.ts +19 -19
  502. package/lib/shared/directives/custom-inner-content.directive.d.ts +22 -22
  503. package/lib/shared/directives/inner-content.directive.d.ts +9 -9
  504. package/lib/shared/interfaces/accesibility-data.d.ts +16 -16
  505. package/lib/shared/pipes/external-href.pipe.d.ts +8 -8
  506. package/lib/shared/pipes/inner-html.pipe.d.ts +7 -7
  507. package/lib/shared/pipes/make-html-list.pipe.d.ts +4 -4
  508. package/lib/shared/shared.module.d.ts +2 -2
  509. package/lib/shared/utils/focus-utils.d.ts +4 -4
  510. package/lib/shared/utils/search-utils.d.ts +14 -14
  511. package/lib/shared/utils/string-utils.d.ts +10 -10
  512. package/package.json +1 -1
  513. package/public-api.d.ts +168 -168
@@ -1,672 +1,672 @@
1
- import { __decorate } from "tslib";
2
- import { ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, HostBinding, Input, Output, ViewChild, ViewChildren } from '@angular/core';
3
- import { AccessibilityComponent } from '../../../shared/components';
4
- import { MenubaritemDirective } from './directives/menubaritem.directive';
5
- import { StringUtils } from '../../../shared/utils/string-utils';
6
- import { MenubarItemComponent } from './components/menubar-item/menubar-item.component';
7
- import { MenubarSubitemComponent } from './components/menubar-subitem/menubar-subitem.component';
8
- import { MenubarSubsubitemComponent } from './components/menubar-subsubitem/menubar-subsubitem.component';
9
- import { MenubarLabelComponent } from './components/menubar-label/menubar-label.component';
10
- import { DesyContentChild } from '../../../shared/decorators/desy-content-child.decorator';
11
- export class MenubarComponent extends AccessibilityComponent {
12
- constructor(changeDetectorRef) {
13
- super();
14
- this.changeDetectorRef = changeDetectorRef;
15
- this.itemsChange = new EventEmitter();
16
- this.activeItemChange = new EventEmitter();
17
- this.activeSubItemChange = new EventEmitter();
18
- this.cfg = true;
19
- this.viewInit = false;
20
- this.currentFocusItemIndex = 0;
21
- }
22
- ngOnChanges(changes) {
23
- this.roleData = this.role ? this.role : null;
24
- this.ariaLabelData = this.ariaLabel ? this.ariaLabel : null;
25
- this.ariaDescribedbyData = this.ariaDescribedBy ? this.ariaDescribedBy : null;
26
- this.ariaLabelledbyData = this.ariaLabelledBy ? this.ariaLabelledBy : null;
27
- this.ariaHiddenData = this.ariaHidden ? this.ariaHidden : null;
28
- this.ariaDisabledData = this.ariaDisabled ? this.ariaDisabled : null;
29
- this.ariaControlsData = this.ariaControls ? this.ariaControls : null;
30
- this.ariaCurrentData = this.ariaCurrent ? this.ariaCurrent : null;
31
- this.ariaLiveData = this.ariaLive ? this.ariaLive : null;
32
- this.ariaExpandedData = this.ariaExpanded ? this.ariaExpanded : null;
33
- this.ariaErrormessageData = this.ariaErrorMessage ? this.ariaErrorMessage : null;
34
- this.ariaHaspopupData = this.ariaHasPopup ? this.ariaHasPopup : null;
35
- this.ariaModalData = this.ariaModal ? this.ariaModal : null;
36
- if (this.viewInit) {
37
- this.checkChanges();
38
- }
39
- }
40
- ngAfterViewInit() {
41
- this.viewInit = true;
42
- this.checkChanges();
43
- }
44
- checkChanges() {
45
- if (!this.menuItems) {
46
- return;
47
- }
48
- this.menuData = [];
49
- this.getItems().forEach((_, index) => {
50
- const itemData = {
51
- open: false,
52
- currentFocusSubItemIndex: 0,
53
- currentFocusSubSubItemIndex: 0,
54
- menuItem: this.menuItems.toArray()[index]
55
- };
56
- this.menuData.push(itemData);
57
- });
58
- if (this.viewInit) {
59
- this.checkRequired();
60
- }
61
- const lastCurrentFocusItemIndex = this.currentFocusItemIndex;
62
- const items = this.getItems();
63
- if (items) {
64
- while (!this.isItemFocusable(this.currentFocusItemIndex % items.length)) {
65
- this.currentFocusItemIndex = (this.currentFocusItemIndex + items.length + 1) % items.length;
66
- if (this.currentFocusItemIndex === lastCurrentFocusItemIndex) {
67
- break;
68
- }
69
- }
70
- }
71
- }
72
- /*
73
- * Eventos
74
- */
75
- handleMenuFocusIn() {
76
- this.isFocused = true;
77
- this.changeDetectorRef.detectChanges();
78
- }
79
- handleMenuFocusOut(event) {
80
- if (!this.menubar.nativeElement.contains(event.relatedTarget)) {
81
- this.closeMenu();
82
- }
83
- this.isFocused = false;
84
- this.changeDetectorRef.detectChanges();
85
- }
86
- handleMenuItemClick(event, itemIndex) {
87
- if (this.hasPopupMenu(itemIndex)) {
88
- event.preventDefault();
89
- const isOpen = this.menuData[itemIndex].open;
90
- this.closeMenu();
91
- if (!isOpen) {
92
- this.openMenu(itemIndex);
93
- }
94
- }
95
- else {
96
- this.activateMenuItem(itemIndex);
97
- }
98
- }
99
- handleMenuItemKeydown(event, itemIndex) {
100
- switch (event.key) {
101
- case 'Enter':
102
- case ' ':
103
- case 'ArrowDown':
104
- if (this.hasPopupMenu(itemIndex)) {
105
- this.openMenu(itemIndex);
106
- setTimeout(() => this.focusFirstSubItem(itemIndex));
107
- event.stopPropagation();
108
- event.preventDefault();
109
- }
110
- break;
111
- case 'Escape':
112
- if (this.hasPopupMenu(itemIndex)) {
113
- this.closeMenu(itemIndex);
114
- }
115
- event.stopPropagation();
116
- event.preventDefault();
117
- break;
118
- case 'ArrowLeft':
119
- this.focusNextAvailableItem(itemIndex, -1);
120
- event.stopPropagation();
121
- event.preventDefault();
122
- break;
123
- case 'ArrowRight':
124
- this.focusNextAvailableItem(itemIndex, +1);
125
- event.stopPropagation();
126
- event.preventDefault();
127
- break;
128
- case 'ArrowUp':
129
- if (this.hasPopupMenu(itemIndex)) {
130
- this.openMenu(itemIndex);
131
- setTimeout(() => this.focusLastSubItem(itemIndex));
132
- }
133
- event.stopPropagation();
134
- event.preventDefault();
135
- break;
136
- case 'Home':
137
- case 'PageUp':
138
- if (this.hasPopupMenu(itemIndex)) {
139
- this.closeMenu();
140
- }
141
- this.focusFirstItem();
142
- event.stopPropagation();
143
- event.preventDefault();
144
- break;
145
- case 'End':
146
- case 'PageDown':
147
- if (this.hasPopupMenu(itemIndex)) {
148
- this.closeMenu();
149
- }
150
- this.focusLastItem();
151
- event.stopPropagation();
152
- event.preventDefault();
153
- break;
154
- default:
155
- if (this.isPrintableChar(event.key)) {
156
- this.focusItemByFirstChar(event.key);
157
- event.stopPropagation();
158
- event.preventDefault();
159
- }
160
- break;
161
- }
162
- }
163
- handleMenuItemMouseOver(itemIndex) {
164
- this.focusItem(itemIndex, true);
165
- }
166
- handlePopupMenuItemClick(itemIndex, subItemIndex, subSubItemIndex) {
167
- this.activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex);
168
- this.focusItem(itemIndex);
169
- this.closeMenu(itemIndex);
170
- }
171
- handlePopupMenuItemKeydown(event, itemIndex, subItemIndex, subSubItemIndex) {
172
- const currentSubIndex = this.menuData[itemIndex].currentFocusSubItemIndex;
173
- const currentSubSubIndex = this.menuData[itemIndex].currentFocusSubSubItemIndex;
174
- const items = this.getItems();
175
- switch (event.key) {
176
- case ' ':
177
- this.activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex);
178
- if (this.mustCloseAfterSelectPopupItem(itemIndex, subItemIndex, subSubItemIndex)) {
179
- this.closeMenu(itemIndex);
180
- this.focusItem(itemIndex);
181
- }
182
- event.stopPropagation();
183
- event.preventDefault();
184
- break;
185
- case 'Enter':
186
- this.activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex);
187
- this.closeMenu(itemIndex);
188
- this.focusItem(itemIndex);
189
- event.stopPropagation();
190
- event.preventDefault();
191
- break;
192
- case 'Escape':
193
- this.closeMenu(itemIndex);
194
- this.focusItem(itemIndex);
195
- event.stopPropagation();
196
- event.preventDefault();
197
- break;
198
- case 'ArrowUp':
199
- this.focusNextAvailableSubItem(itemIndex, currentSubIndex, currentSubSubIndex, -1);
200
- // this.focusSubItem(itemIndex, (currentSubIndex + listLength - 1) % listLength);
201
- event.stopPropagation();
202
- event.preventDefault();
203
- break;
204
- case 'ArrowDown':
205
- this.focusNextAvailableSubItem(itemIndex, currentSubIndex, currentSubSubIndex, +1);
206
- // this.focusSubItem(itemIndex, (currentSubIndex + listLength + 1) % listLength);
207
- event.stopPropagation();
208
- event.preventDefault();
209
- break;
210
- case 'ArrowLeft':
211
- this.closeMenu(itemIndex);
212
- this.focusItem((itemIndex + items.length - 1) % items.length);
213
- event.stopPropagation();
214
- event.preventDefault();
215
- break;
216
- case 'ArrowRight':
217
- this.closeMenu(itemIndex);
218
- this.focusItem((itemIndex + items.length + 1) % items.length);
219
- event.stopPropagation();
220
- event.preventDefault();
221
- break;
222
- case 'Home':
223
- case 'PageUp':
224
- this.focusFirstSubItem(itemIndex);
225
- event.stopPropagation();
226
- event.preventDefault();
227
- break;
228
- case 'End':
229
- case 'PageDown':
230
- this.focusLastSubItem(itemIndex);
231
- event.stopPropagation();
232
- event.preventDefault();
233
- break;
234
- case 'Tab':
235
- this.closeMenu(itemIndex);
236
- this.focusItem(itemIndex);
237
- break;
238
- default:
239
- if (this.isPrintableChar(event.key)) {
240
- this.focusSubItemByFirstChar(itemIndex, event.key);
241
- event.stopPropagation();
242
- event.preventDefault();
243
- }
244
- break;
245
- }
246
- }
247
- handlePopupMenuItemMouseOver(itemIndex, subItemIndex, subSubItemIndex) {
248
- this.focusSubItem(itemIndex, subItemIndex, subSubItemIndex);
249
- }
250
- /*
251
- * Comunes
252
- */
253
- checkRequired() {
254
- const items = this.getItems();
255
- // No se ha puesto label required porque en algunos ejemplos de desy-html no aparece
256
- }
257
- activateMenuItem(itemIndex) {
258
- const items = this.getItems();
259
- this.activeItemChange.emit(items[itemIndex]);
260
- if (items[itemIndex] instanceof MenubarItemComponent) {
261
- items[itemIndex].selected.emit();
262
- }
263
- }
264
- activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex) {
265
- const items = this.getItems();
266
- const subItems = this.getItemSubitems(items[itemIndex]);
267
- let item = subItems[subItemIndex];
268
- let subSubItems = [];
269
- if (subSubItemIndex !== null && subSubItemIndex !== undefined) {
270
- subSubItems = this.getSubItemSubitems(item);
271
- item = subSubItems[subSubItemIndex];
272
- }
273
- let checkedChange = false;
274
- if (item.role === 'menuitemcheckbox') {
275
- item.checked = !item.checked;
276
- checkedChange = true;
277
- }
278
- else if (item.role === 'menuitemradio') {
279
- checkedChange = !item.checked;
280
- subSubItems.forEach(i => i.checked = false);
281
- item.checked = true;
282
- }
283
- this.itemsChange.emit(items);
284
- this.activeSubItemChange.emit(item);
285
- if (item instanceof MenubarSubitemComponent || item instanceof MenubarSubsubitemComponent) {
286
- item.selected.emit();
287
- if (checkedChange) {
288
- item.checkedChange.emit(item.checked);
289
- }
290
- }
291
- }
292
- mustCloseAfterSelectPopupItem(itemIndex, subItemIndex, subSubItemIndex) {
293
- const items = this.getItems();
294
- const subItems = this.getItemSubitems(items[itemIndex]);
295
- let item = subItems[subItemIndex];
296
- if (subSubItemIndex !== null && subSubItemIndex !== undefined) {
297
- const subSubItems = this.getSubItemSubitems(item);
298
- item = subSubItems[subSubItemIndex];
299
- }
300
- return item.role !== 'menuitemcheckbox' && item.role !== 'menuitemradio';
301
- }
302
- openMenu(itemIndex) {
303
- const wasOpened = this.menuData[itemIndex].open;
304
- this.menuData[itemIndex].open = true;
305
- if (wasOpened) {
306
- this.activateMenuItem(itemIndex);
307
- }
308
- }
309
- closeMenu(itemIndex) {
310
- if (itemIndex !== null && itemIndex !== undefined) {
311
- this.menuData[itemIndex].open = false;
312
- }
313
- else {
314
- this.menuData.forEach(item => item.open = false);
315
- }
316
- }
317
- hasPopupMenu(itemIndex) {
318
- const items = this.getItems();
319
- const subItems = this.getItemSubitems(items[itemIndex]);
320
- return items[itemIndex].sub && subItems && subItems.length > 0;
321
- }
322
- isPrintableChar(str) {
323
- return str.length === 1 && !!str.match(/\S/);
324
- }
325
- getMenuDataIndex(itemIndex, subItemIndex, subSubItemIndex) {
326
- let menuDataIndex = 0;
327
- const items = this.getItems();
328
- const subItems = this.getItemSubitems(items[itemIndex]);
329
- for (let i = 0; i < subItemIndex; i++) {
330
- const subItem = subItems[i];
331
- const subSubItems = this.getSubItemSubitems(subItem);
332
- menuDataIndex += subSubItems && subSubItems.length > 0 ? subSubItems.length : 1;
333
- }
334
- if (subSubItemIndex !== null && subSubItemIndex !== undefined) {
335
- menuDataIndex += subSubItemIndex;
336
- }
337
- return menuDataIndex;
338
- }
339
- /*
340
- * Comunes - focus
341
- */
342
- focusItem(itemIndex, hover) {
343
- const hasFocus = this.menubar.nativeElement.contains(document.activeElement);
344
- const isOpen = this.menuData[this.currentFocusItemIndex].open;
345
- if (!hover || hasFocus) {
346
- this.menuData[itemIndex].menuItem.link.nativeElement.focus();
347
- }
348
- this.closeMenu();
349
- if (isOpen && this.hasPopupMenu(itemIndex)) {
350
- this.openMenu(itemIndex);
351
- }
352
- this.currentFocusItemIndex = itemIndex;
353
- }
354
- focusNextAvailableItem(fromItemIndex, step) {
355
- let nextItem = fromItemIndex;
356
- const items = this.getItems();
357
- do {
358
- nextItem = (nextItem + items.length + step) % items.length;
359
- } while (!this.isItemFocusable(nextItem) && nextItem !== fromItemIndex);
360
- if (nextItem !== fromItemIndex) {
361
- this.focusItem(nextItem);
362
- }
363
- }
364
- focusFirstItem() {
365
- if (this.isItemFocusable(0)) {
366
- this.focusItem(0);
367
- }
368
- else {
369
- this.focusNextAvailableItem(0, +1);
370
- }
371
- }
372
- focusLastItem() {
373
- const items = this.getItems();
374
- if (this.isItemFocusable(items.length - 1)) {
375
- this.focusItem(items.length - 1);
376
- }
377
- else {
378
- this.focusNextAvailableItem(items.length - 1, -1);
379
- }
380
- }
381
- isItemFocusable(itemIndex) {
382
- return !this.getItems()[itemIndex].disabled;
383
- }
384
- focusItemByFirstChar(char) {
385
- const itemContents = this.menuItems.map(menuItem => menuItem.itemContentWrapper.nativeElement.textContent);
386
- let index = this.currentFocusItemIndex;
387
- let foundIndex = -1;
388
- do {
389
- index = (index + itemContents.length + 1) % itemContents.length;
390
- if (itemContents[index] && itemContents[index].trim().substr(0, 1).toLowerCase() === char.toLowerCase()
391
- && this.isItemFocusable(index)) {
392
- foundIndex = index;
393
- }
394
- } while (foundIndex === -1 && index !== this.currentFocusItemIndex);
395
- if (foundIndex >= 0) {
396
- this.focusItem(foundIndex);
397
- }
398
- }
399
- focusSubItem(itemIndex, subItemIndex, subSubItemIndex) {
400
- if (this.menuData[itemIndex].menuItem.popupMenuItems.length > 0) {
401
- const menuDataIndex = this.getMenuDataIndex(itemIndex, subItemIndex, subSubItemIndex);
402
- this.menuData[itemIndex].currentFocusSubItemIndex = subItemIndex;
403
- this.menuData[itemIndex].currentFocusSubSubItemIndex = subSubItemIndex;
404
- const elem = this.menuData[itemIndex].menuItem.popupMenuItems.toArray()[menuDataIndex].nativeElement;
405
- if (elem) {
406
- elem.focus();
407
- }
408
- else {
409
- console.error('No subitem to focus');
410
- }
411
- }
412
- else {
413
- console.error('No subitems');
414
- }
415
- }
416
- focusNextAvailableSubItem(itemIndex, fromItemSubIndex, fromItemSubSubIndex, step) {
417
- let nextSubIndex = fromItemSubIndex;
418
- let nextSubSubIndex = fromItemSubSubIndex;
419
- let allSubItemsChecked;
420
- const items = this.getItems();
421
- do {
422
- const nextIndexes = this.getNextSubItemIndexes(items, itemIndex, nextSubIndex, nextSubSubIndex, step);
423
- nextSubIndex = nextIndexes.subIndex;
424
- nextSubSubIndex = nextIndexes.subSubIndex;
425
- allSubItemsChecked = (fromItemSubIndex === nextSubIndex && fromItemSubSubIndex === nextSubSubIndex);
426
- } while (!this.isSubItemFocusable(itemIndex, nextSubIndex, nextSubSubIndex) && !allSubItemsChecked);
427
- if (!allSubItemsChecked) {
428
- this.focusSubItem(itemIndex, nextSubIndex, nextSubSubIndex);
429
- }
430
- }
431
- focusFirstSubItem(itemIndex) {
432
- let firstSubSubItem = null;
433
- const items = this.getItems();
434
- const subItems = this.getItemSubitems(items[itemIndex]);
435
- const subSubItems = this.getSubItemSubitems(subItems[0]);
436
- if (subSubItems && subSubItems.length > 0) {
437
- firstSubSubItem = 0;
438
- }
439
- if (this.isSubItemFocusable(itemIndex, 0, firstSubSubItem)) {
440
- this.focusSubItem(itemIndex, 0, firstSubSubItem);
441
- }
442
- else {
443
- this.focusNextAvailableSubItem(itemIndex, 0, firstSubSubItem, +1);
444
- }
445
- }
446
- focusLastSubItem(itemIndex) {
447
- const items = this.getItems();
448
- const subItems = this.getItemSubitems(items[itemIndex]);
449
- const lastItemIndex = subItems.length - 1;
450
- const lastItem = subItems[lastItemIndex];
451
- const subSubItems = this.getSubItemSubitems(lastItem);
452
- let lastSubSubItem = null;
453
- if (subSubItems && subSubItems.length > 0) {
454
- lastSubSubItem = subSubItems.length - 1;
455
- }
456
- if (this.isSubItemFocusable(itemIndex, lastItemIndex, lastSubSubItem)) {
457
- this.focusSubItem(itemIndex, lastItemIndex, lastSubSubItem);
458
- }
459
- else {
460
- this.focusNextAvailableSubItem(itemIndex, lastItemIndex, lastSubSubItem, -1);
461
- }
462
- }
463
- isSubItemFocusable(itemIndex, subItemIndex, subSubItemIndex) {
464
- const items = this.getItems();
465
- const subItems = this.getItemSubitems(items[itemIndex]);
466
- let item = subItems[subItemIndex];
467
- if (subSubItemIndex !== null && subSubItemIndex !== undefined) {
468
- const subSubItems = this.getSubItemSubitems(item);
469
- item = subSubItems[subSubItemIndex];
470
- }
471
- let isFocusable = false;
472
- if (item.role !== 'separator' && item.role !== 'none') {
473
- isFocusable = true;
474
- }
475
- return isFocusable;
476
- }
477
- focusSubItemByFirstChar(itemIndex, char) {
478
- const itemContents = this.menuItems.toArray()[itemIndex].popupMenuItems.map(menuItem => menuItem.nativeElement.textContent);
479
- let subItemIndex = this.menuData[itemIndex].currentFocusSubItemIndex;
480
- let subSubItemIndex = this.menuData[itemIndex].currentFocusSubSubItemIndex;
481
- let foundSubIndex = -1;
482
- let foundSubSubIndex = null;
483
- let allSubItemsChecked = false;
484
- const items = this.getItems();
485
- do {
486
- const nextIndexes = this.getNextSubItemIndexes(items, itemIndex, subItemIndex, subSubItemIndex, +1);
487
- subItemIndex = nextIndexes.subIndex;
488
- subSubItemIndex = nextIndexes.subSubIndex;
489
- const index = this.getMenuDataIndex(itemIndex, subItemIndex, subSubItemIndex);
490
- if (itemContents[index] && itemContents[index].trim().substr(0, 1).toLowerCase() === char.toLowerCase()
491
- && this.isSubItemFocusable(itemIndex, subItemIndex, subSubItemIndex)) {
492
- foundSubIndex = subItemIndex;
493
- foundSubSubIndex = subSubItemIndex;
494
- }
495
- allSubItemsChecked = (this.menuData[itemIndex].currentFocusSubItemIndex === subItemIndex
496
- && this.menuData[itemIndex].currentFocusSubSubItemIndex === subSubItemIndex);
497
- } while (foundSubIndex === -1 && !allSubItemsChecked);
498
- if (foundSubIndex >= 0) {
499
- this.focusSubItem(itemIndex, foundSubIndex, foundSubSubIndex);
500
- }
501
- }
502
- /*
503
- * Metodos para facilitar contenido
504
- */
505
- getItems() {
506
- let items;
507
- if (this.itemComponentList && this.itemComponentList.length > 0) {
508
- items = this.itemComponentList.toArray();
509
- }
510
- else {
511
- items = this.items;
512
- }
513
- return items;
514
- }
515
- getItemSubitems(item) {
516
- let subItems = [];
517
- if (item instanceof MenubarItemComponent) {
518
- subItems = item.getSubItems();
519
- }
520
- if (!subItems || subItems.length === 0) {
521
- subItems = item.sub ? item.sub.items : [];
522
- }
523
- return subItems;
524
- }
525
- getSubItemSubitems(item) {
526
- let subItems = [];
527
- if (item.role === 'group') {
528
- if (item instanceof MenubarSubitemComponent) {
529
- subItems = item.getSubItems();
530
- }
531
- if (!subItems || subItems.length === 0) {
532
- subItems = item.items ? item.items : [];
533
- }
534
- }
535
- return subItems;
536
- }
537
- getNextSubItemIndexes(items, itemIndex, nextSubIndex, nextSubSubIndex, step) {
538
- const subItems = this.getItemSubitems(items[itemIndex]);
539
- const subSubItems = this.getSubItemSubitems(subItems[nextSubIndex]);
540
- let checkNextSubItem = true;
541
- if (subSubItems && subSubItems.length > 0) {
542
- if (nextSubSubIndex + step >= 0 && nextSubSubIndex + step < subSubItems.length) {
543
- nextSubSubIndex += step;
544
- checkNextSubItem = false;
545
- }
546
- }
547
- if (checkNextSubItem) {
548
- nextSubIndex = (nextSubIndex + step + subItems.length) % subItems.length;
549
- const nextSubItemItems = this.getSubItemSubitems(subItems[nextSubIndex]);
550
- if (nextSubItemItems && nextSubItemItems.length > 0) {
551
- nextSubSubIndex = ((step > 0 ? -1 : 0) + step + nextSubItemItems.length) % nextSubItemItems.length;
552
- }
553
- else {
554
- nextSubSubIndex = null;
555
- }
556
- }
557
- return { subIndex: nextSubIndex, subSubIndex: nextSubSubIndex };
558
- }
559
- getIdPrefix() {
560
- return this.idPrefix ? this.idPrefix : this.id + 'menubar-item';
561
- }
562
- getLabelRef() {
563
- return this.labelComponent ? this.labelComponent.getContent() : this.labelRef;
564
- }
565
- getLabelContent() {
566
- let content;
567
- if (this.labelData) {
568
- content = this.labelData.html ? this.labelData.html : `<p>${StringUtils.escapeHtml(this.labelData.text)}</p>`;
569
- }
570
- else if (this.labelText) {
571
- content = `<p>${StringUtils.escapeHtml(this.labelText)}</p>`;
572
- }
573
- return content;
574
- }
575
- getItemId(item, index) {
576
- let id;
577
- if (item) {
578
- if (item.id) {
579
- id = item.id;
580
- }
581
- else {
582
- id = index === 0 ? this.getIdPrefix() : `${this.getIdPrefix()}-${index}`;
583
- }
584
- }
585
- return id;
586
- }
587
- getPopupStyle(itemIndex) {
588
- let style = {};
589
- if (this.menuData && itemIndex < this.menuData.length) {
590
- const menuItem = this.menuData[itemIndex].menuItem;
591
- const rect = menuItem.link.nativeElement.getBoundingClientRect();
592
- if (this.menuData[itemIndex].open) {
593
- style = {
594
- position: 'absolute',
595
- top: (rect.height - 1) + 'px',
596
- left: '0px',
597
- zIndex: 100,
598
- display: 'block'
599
- };
600
- }
601
- else {
602
- style = {
603
- zIndex: 0,
604
- display: 'none'
605
- };
606
- }
607
- }
608
- return style;
609
- }
610
- getSubItemId(item, index, parentId) {
611
- let id;
612
- if (item) {
613
- if (item.id) {
614
- id = item.id;
615
- }
616
- else {
617
- id = index === 0 ? `sub-${parentId}` : `sub-${parentId}-${index}`;
618
- }
619
- }
620
- return id;
621
- }
622
- getSubSubItemAriaChecked(subsubitem) {
623
- let ariaChecked = null;
624
- if (subsubitem.role === 'menuitemcheckbox' || subsubitem.role === 'menuitemradio') {
625
- ariaChecked = !!subsubitem.checked;
626
- }
627
- return ariaChecked;
628
- }
629
- }
630
- MenubarComponent.decorators = [
631
- { type: Component, args: [{
632
- selector: 'desy-menubar',
633
- template: " <ng-container *ngIf=\"getLabelRef()\">\r\n <div [id]=\"id + '-label'\" [class]=\"['mb-sm', labelComponent ? labelComponent.classes : (labelData ? labelData.classes : null)] | makeHtmlList\">\r\n <ng-container *ngTemplateOutlet=\"getLabelRef()\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!getLabelRef() && (labelData || labelText)\">\r\n <div [id]=\"id + '-label'\" [class]=\"['mb-sm', labelData ? labelData.classes : null] | makeHtmlList\">\r\n <ng-container *desyCustomInnerContent=\"{ html: getLabelContent() }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <ul #menubar [id]=\"id + '-menubar'\" class=\"lg:flex lg:flex-wrap\" role=\"menubar\"\r\n (focusin)=\"handleMenuFocusIn()\"\r\n (focusout)=\"handleMenuFocusOut($event)\"\r\n [ngClass]=\"{ 'focus': isFocused }\"\r\n [attr.aria-label]=\"ariaLabel ? ariaLabel : null\"\r\n [attr.aria-describedby]=\"getLabelRef() || labelData || labelText ? id + '-label' : null\">\r\n <ng-container *ngFor=\"let item of getItems(); index as itemIndex\">\r\n <li class=\"relative\" role=\"none\" desyMenubaritem (contentChanged)=\"checkChanges()\">\r\n <a *ngIf=\"item.sub\" #link\r\n role=\"menuitem\" aria-haspopup=\"true\" aria-expanded=\"false\"\r\n (click)=\"handleMenuItemClick($event, itemIndex)\"\r\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\r\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\r\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\r\n [id]=\"getItemId(item, itemIndex)\"\r\n [class]=\"['c-menubar__button', item.classes] | makeHtmlList\"\r\n [ngClass]=\"{'c-menubar__button--disabled': item.disabled, 'c-menubar__button--primary': item.active}\" \r\n [attr.aria-disabled]=\"item.disabled ? item.disabled : (item.ariaDisabled ? item.ariaDisabled : null)\"\r\n [attr.aria-describedby]=\"item.ariaDescribedBy ? item.ariaDescribedBy : null\"\r\n [attr.aria-labelledby]=\"item.ariaLabelledBy ? item.ariaLabelledBy : null\"\r\n [attr.aria-hidden]=\"item.ariaHidden ? item.ariaHidden : null\"\r\n [attr.aria-controls]=\"item.ariaControls ? item.ariaControls : null\"\r\n [attr.aria-current]=\"item.ariaCurrent ? item.ariaCurrent : null\"\r\n [attr.aria-live]=\"item.ariaLive ? item.ariaLive : null\"\r\n [attr.aria-errormessage]=\"item.ariaErrorMessage ? item.ariaErrorMessage : null\"\r\n [attr.aria-modal]=\"item.ariaModal ? item.ariaModal : null\"\r\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\">\r\n <span class=\"inline-flex self-center max-w-xs align-middle truncate\" #itemContentWrapper>\r\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\r\n </span>\r\n <svg class=\"inline-block -mr-2 align-middle -my-px\" viewBox=\"0 0 96 96\" aria-hidden=\"true\" fill=\"currentColor\" focusable=\"false\" width=\"1.5em\" height=\"1.5em\"><g><path d=\"M46.71 58.037a1.823 1.823 0 002.581 0L62.048 45.28a1.823 1.823 0 00-1.29-3.113H35.243a1.823 1.823 0 00-1.291 3.113z\"/></g></svg>\r\n </a>\r\n <a *ngIf=\"item.routerLink && !item.sub\" #link #itemContentWrapper\r\n role=\"menuitem\"\r\n (click)=\"handleMenuItemClick($event, itemIndex)\"\r\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\r\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\r\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\r\n [id]=\"getItemId(item, itemIndex)\"\r\n [routerLink]=\"item.routerLink\"\r\n [routerLinkActive]=\"item.routerLinkActiveClasses ? item.routerLinkActiveClasses : []\"\r\n [fragment]=\"item.fragment\"\r\n [class]=\"['c-menubar__button', item.classes] | makeHtmlList\"\r\n [ngClass]=\"{'c-menubar__button--disabled': item.disabled, 'c-menubar__button--primary': item.active}\"\r\n [attr.title]=\"item.title ? item.title : null\"\r\n [attr.disabled]=\"item.disabled ? item.disabled : null\"\r\n [attr.aria-disabled]=\"item.disabled ? item.disabled : (item.ariaDisabled ? item.ariaDisabled : null)\"\r\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\"\r\n [attr.target]=\"item.target ? item.target : null\"\r\n [attr.aria-describedby]=\"item.ariaDescribedBy ? item.ariaDescribedBy : null\"\r\n [attr.aria-labelledBy]=\"item.ariaLabelledBy ? item.ariaLabelledBy : null\"\r\n [attr.aria-hidden]=\"item.ariaHidden ? item.ariaHidden : null\"\r\n [attr.aria-controls]=\"item.ariaControls ? item.ariaControls : null\"\r\n [attr.aria-current]=\"item.ariaCurrent ? item.ariaCurrent : null\"\r\n [attr.aria-live]=\"item.ariaLive ? item.ariaLive : null\"\r\n [attr.aria-expanded]=\"item.ariaExpanded ? item.ariaExpanded : null\"\r\n [attr.aria-errormessage]=\"item.ariaErrorMessage ? item.ariaErrorMessage : null\"\r\n [attr.aria-haspopup]=\"item.ariaHasPopup ? item.ariaHasPopup : null\"\r\n [attr.aria-modal]=\"item.ariaModal ? item.ariaModal : null\">\r\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\r\n </a>\r\n <a *ngIf=\"!item.routerLink && item.href && !item.sub\" #link #itemContentWrapper\r\n role=\"menuitem\"\r\n (click)=\"handleMenuItemClick($event, itemIndex)\"\r\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\r\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\r\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\r\n [id]=\"getItemId(item, itemIndex)\"\r\n [href]=\"item.href | externalHref\"\r\n [class]=\"['c-menubar__button', item.classes] | makeHtmlList\"\r\n [ngClass]=\"{'c-menubar__button--disabled': item.disabled, 'c-menubar__button--primary': item.active}\"\r\n [attr.title]=\"item.title ? item.title : null\"\r\n [attr.disabled]=\"item.disabled ? item.disabled : null\"\r\n [attr.aria-disabled]=\"item.disabled ? item.disabled : (item.ariaDisabled ? item.ariaDisabled : null)\"\r\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\"\r\n [attr.target]=\"item.target ? item.target : null\"\r\n [attr.aria-describedby]=\"item.ariaDescribedBy ? item.ariaDescribedBy : null\"\r\n [attr.aria-labelledBy]=\"item.ariaLabelledBy ? item.ariaLabelledBy : null\"\r\n [attr.aria-hidden]=\"item.ariaHidden ? item.ariaHidden : null\"\r\n [attr.aria-controls]=\"item.ariaControls ? item.ariaControls : null\"\r\n [attr.aria-current]=\"item.ariaCurrent ? item.ariaCurrent : null\"\r\n [attr.aria-live]=\"item.ariaLive ? item.ariaLive : null\"\r\n [attr.aria-expanded]=\"item.ariaExpanded ? item.ariaExpanded : null\"\r\n [attr.aria-errormessage]=\"item.ariaErrorMessage ? item.ariaErrorMessage : null\"\r\n [attr.aria-haspopup]=\"item.ariaHasPopup ? item.ariaHasPopup : null\"\r\n [attr.aria-modal]=\"item.ariaModal ? item.ariaModal : null\">\r\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\r\n </a>\r\n\r\n <ul *ngIf=\"item.sub && getItemSubitems(item)\" #popupMenu role=\"menu\" tabindex=\"-1\"\r\n [ngStyle]=\"getPopupStyle(itemIndex)\"\r\n [class]=\"['c-menubar__tooltip w-max max-w-64 hidden border border-neutral-base shadow-md bg-white text-sm', item.sub.classes] | makeHtmlList\"\r\n [attr.aria-label]=\"item.ariaLabel ? item.ariaLabel : (item.sub.ariaLabel ? item.sub.ariaLabel : null)\"\r\n [attr.aria-describedby]=\"item.sub.ariaDescribedBy ? item.sub.ariaDescribedBy : null\"\r\n [attr.aria-labelledby]=\"item.sub.ariaLabelledBy ? item.sub.ariaLabelledBy : null\"\r\n [attr.aria-hidden]=\"item.sub.ariaHidden ? item.sub.ariaHidden : null\"\r\n [attr.aria-disabled]=\"item.sub.ariaDisabled ? item.sub.ariaDisabled : null\"\r\n [attr.aria-controls]=\"item.sub.ariaControls ? item.sub.ariaControls : null\"\r\n [attr.aria-current]=\"item.sub.ariaCurrent ? item.sub.ariaCurrent : null\"\r\n [attr.aria-live]=\"item.sub.ariaLive ? item.sub.ariaLive : null\"\r\n [attr.aria-expanded]=\"!!(menuData && menuData[itemIndex].open)\"\r\n [attr.aria-errormessage]=\"item.sub.ariaErrorMessage ? item.sub.ariaErrorMessage : null\"\r\n [attr.aria-haspopup]=\"item.sub.ariaHasPopup ? item.sub.ariaHasPopup : null\"\r\n [attr.aria-modal]=\"item.sub.ariaModal ? item.sub.ariaModal : null\">\r\n <ng-container *ngFor=\"let subItem of getItemSubitems(item); index as subItemIndex\">\r\n <ng-container [ngSwitch]=\"subItem.role\">\r\n <li #popupMenuItem *ngSwitchCase=\"'none'\" role=\"none\" tabindex=\"-1\"\r\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\r\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\r\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\r\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\">\r\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\r\n </li>\r\n <li *ngSwitchCase=\"'group'\" role=\"none\">\r\n <ul role=\"group\" [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\r\n [attr.aria-label]=\"subItem.ariaLabel ? subItem.ariaLabel : null\">\r\n <ng-container *ngFor=\"let subsubitem of getSubItemSubitems(subItem); index as subsubIndex\">\r\n <ng-container *ngIf=\"subsubitem\">\r\n <li #popupMenuItem [attr.role]=\"subsubitem.role ? subsubitem.role : null\" tabindex=\"-1\"\r\n [id]=\"getSubItemId(subsubitem, subsubIndex, getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex)))\"\r\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex, subsubIndex)\"\r\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex, subsubIndex)\"\r\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex, subsubIndex)\"\r\n [attr.aria-checked]=\"getSubSubItemAriaChecked(subsubitem)\"\r\n class=\"flex items-center pr-base pl-lg py-sm cursor-pointer hover:bg-primary-base hover:text-white\">\r\n <ng-container *desyCustomInnerContent=\"{ component: subsubitem, html: subsubitem.html, text: subsubitem.text}\"></ng-container>\r\n </li>\r\n </ng-container>\r\n </ng-container>\r\n </ul>\r\n </li>\r\n <li #popupMenuItem *ngSwitchCase=\"'menuitem'\" role=\"menuitem\" tabindex=\"-1\"\r\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\r\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\r\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\"\r\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\r\n class=\"flex items-center pr-base pl-lg py-sm cursor-pointer hover:bg-primary-base hover:text-white focus:bg-primary-base focus:text-white focus:outline-none\">\r\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\r\n </li>\r\n <li #popupMenuItem *ngSwitchCase=\"'menuitemcheckbox'\" role=\"menuitemcheckbox\" tabindex=\"-1\"\r\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\r\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\r\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\"\r\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\r\n [attr.aria-checked]=\"!!subItem.checked\"\r\n class=\"flex items-center pr-base pl-lg py-sm cursor-pointer hover:bg-primary-base hover:text-white\">\r\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\r\n </li>\r\n <li #popupMenuItem *ngSwitchCase=\"'separator'\" role=\"separator\"\r\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\r\n class=\"my-sm border-b border-neutral-base\">\r\n </li>\r\n </ng-container>\r\n </ng-container>\r\n </ul>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n"
634
- },] }
635
- ];
636
- MenubarComponent.ctorParameters = () => [
637
- { type: ChangeDetectorRef }
638
- ];
639
- MenubarComponent.propDecorators = {
640
- idPrefix: [{ type: Input }],
641
- items: [{ type: Input }],
642
- itemsChange: [{ type: Output }],
643
- activeItemChange: [{ type: Output }],
644
- activeSubItemChange: [{ type: Output }],
645
- labelRef: [{ type: Input }],
646
- labelData: [{ type: Input }],
647
- labelText: [{ type: Input }],
648
- classes: [{ type: Input }, { type: HostBinding, args: ['class',] }],
649
- cfg: [{ type: HostBinding, args: ['class.c-menubar',] }],
650
- id: [{ type: Input }, { type: HostBinding, args: ['attr.id',] }],
651
- roleData: [{ type: HostBinding, args: ['attr.role',] }],
652
- ariaLabelData: [{ type: HostBinding, args: ['attr.aria-label',] }],
653
- ariaDescribedbyData: [{ type: HostBinding, args: ['attr.aria-describedby',] }],
654
- ariaLabelledbyData: [{ type: HostBinding, args: ['attr.aria-labelledby',] }],
655
- ariaHiddenData: [{ type: HostBinding, args: ['attr.aria-hidden',] }],
656
- ariaDisabledData: [{ type: HostBinding, args: ['attr.aria-disabled',] }],
657
- ariaControlsData: [{ type: HostBinding, args: ['attr.aria-controls',] }],
658
- ariaCurrentData: [{ type: HostBinding, args: ['attr.aria-current',] }],
659
- ariaLiveData: [{ type: HostBinding, args: ['attr.aria-live',] }],
660
- ariaExpandedData: [{ type: HostBinding, args: ['attr.aria-expanded',] }],
661
- ariaErrormessageData: [{ type: HostBinding, args: ['attr.aria-errormessage',] }],
662
- ariaHaspopupData: [{ type: HostBinding, args: ['attr.aria-haspopup',] }],
663
- ariaModalData: [{ type: HostBinding, args: ['attr.aria-modal',] }],
664
- menubar: [{ type: ViewChild, args: ['menubar', { read: ElementRef },] }],
665
- menuItems: [{ type: ViewChildren, args: [MenubaritemDirective,] }],
666
- labelComponent: [{ type: ContentChildren, args: [MenubarLabelComponent,] }],
667
- itemComponentList: [{ type: ContentChildren, args: [MenubarItemComponent,] }]
668
- };
669
- __decorate([
670
- DesyContentChild()
671
- ], MenubarComponent.prototype, "labelComponent", void 0);
672
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXN5LWFuZ3VsYXIvc3JjL2xpYi9kZXN5LW5hdi9jb21wb25lbnRzL21lbnViYXIvbWVudWJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDVSxpQkFBaUIsRUFDaEMsU0FBUyxFQUFFLGVBQWUsRUFDMUIsVUFBVSxFQUFFLFlBQVksRUFDeEIsV0FBVyxFQUNYLEtBQUssRUFDTSxNQUFNLEVBSWpCLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFbEUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFLeEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQ3RGLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBQy9GLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLDhEQUE4RCxDQUFDO0FBQ3hHLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlEQUF5RCxDQUFDO0FBTXpGLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxzQkFBc0I7SUErQzFELFlBQW9CLGlCQUFvQztRQUN0RCxLQUFLLEVBQUUsQ0FBQztRQURVLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUEzQzlDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFDaEQscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUNuRCx3QkFBbUIsR0FBRyxJQUFJLFlB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V0FBVyxTQUFDLE9BQU87a0JBQzVCLFdBQVcsU0FBQyxpQkFBaUI7aUJBQzdCLEtBQUssWUFBSSxXQUFXLFNBQUMsU0FBUzt1QkFFOUIsV0FBVyxTQUFDLFdBQVc7NEJBQ3ZCLFdBQVcsU0FBQyxpQkFBaUI7a0NBQzdCLFdBQVcsU0FBQyx1QkFBdUI7aUNBQ25DLFdBQVcsU0FBQyxzQkFBc0I7NkJBQ2xDLFdBQVcsU0FBQyxrQkFBa0I7K0JBQzlCLFdBQVcsU0FBQyxvQkFBb0I7K0JBQ2hDLFdBQVcsU0FBQyxvQkFBb0I7OEJBQ2hDLFdBQVcsU0FBQyxtQkFBbUI7MkJBQy9CLFdBQVcsU0FBQyxnQkFBZ0I7K0JBQzVCLFdBQVcsU0FBQyxvQkFBb0I7bUNBQ2hDLFdBQVcsU0FBQyx3QkFBd0I7K0JBQ3BDLFdBQVcsU0FBQyxvQkFBb0I7NEJBQ2hDLFdBQVcsU0FBQyxpQkFBaUI7c0JBRTdCLFNBQVMsU0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO3dCQUN6QyxZQUFZLFNBQUMsb0JBQW9COzZCQUNiLGVBQWUsU0FBQyxxQkFBcUI7Z0NBQ3pELGVBQWUsU0FBQyxvQkFBb0I7O0FBRHVCO0lBQTNELGdCQUFnQixFQUFFO3dEQUErRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sXHJcbiAgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcywgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q2hpbGRyZW5cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBY2Nlc3NpYmlsaXR5Q29tcG9uZW50fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvY29tcG9uZW50cyc7XHJcbmltcG9ydCB7TWVudWJhckl0ZW19IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvbWVudWJhci1pdGVtJztcclxuaW1wb3J0IHtNZW51YmFyaXRlbURpcmVjdGl2ZX0gZnJvbSAnLi9kaXJlY3RpdmVzL21lbnViYXJpdGVtLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7TWVudWJhckl0ZW1TdWJJdGVtfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL21lbnViYXItaXRlbS1zdWItaXRlbSc7XHJcbmltcG9ydCB7TWVudWJhckl0ZW1TdWJJdGVtU3ViSXRlbX0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9tZW51YmFyLWl0ZW0tc3ViLWl0ZW0tc3ViLWl0ZW0nO1xyXG5pbXBvcnQge0xhYmVsQ29tcG9uZW50fSBmcm9tICcuLi8uLi8uLi9kZXN5LWZvcm1zL2NvbXBvbmVudHMvbGFiZWwvbGFiZWwuY29tcG9uZW50JztcclxuaW1wb3J0IHtMYWJlbERhdGF9IGZyb20gJy4uLy4uLy4uL2Rlc3ktZm9ybXMvaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7U3RyaW5nVXRpbHN9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC91dGlscy9zdHJpbmctdXRpbHMnO1xyXG5pbXBvcnQge01lbnViYXJJdGVtQ29tcG9uZW50fSBmcm9tICcuL2NvbXBvbmVudHMvbWVudWJhci1pdGVtL21lbnViYXItaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQge01lbnViYXJTdWJpdGVtQ29tcG9uZW50fSBmcm9tICcuL2NvbXBvbmVudHMvbWVudWJhci1zdWJpdGVtL21lbnViYXItc3ViaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQge01lbnViYXJTdWJzdWJpdGVtQ29tcG9uZW50fSBmcm9tICcuL2NvbXBvbmVudHMvbWVudWJhci1zdWJzdWJpdGVtL21lbnViYXItc3Vic3ViaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQge01lbnViYXJMYWJlbENvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnRzL21lbnViYXItbGFiZWwvbWVudWJhci1sYWJlbC5jb21wb25lbnQnO1xyXG5pbXBvcnQge0Rlc3lDb250ZW50Q2hpbGR9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9kZWNvcmF0b3JzL2Rlc3ktY29udGVudC1jaGlsZC5kZWNvcmF0b3InO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkZXN5LW1lbnViYXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9tZW51YmFyLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTWVudWJhckNvbXBvbmVudCBleHRlbmRzIEFjY2Vzc2liaWxpdHlDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xyXG5cclxuICBASW5wdXQoKSBpZFByZWZpeDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGl0ZW1zOiBNZW51YmFySXRlbVtdO1xyXG4gIEBPdXRwdXQoKSBpdGVtc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TWVudWJhckl0ZW1bXT4oKTtcclxuICBAT3V0cHV0KCkgYWN0aXZlSXRlbUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TWVudWJhckl0ZW0+KCk7XHJcbiAgQE91dHB1dCgpIGFjdGl2ZVN1Ykl0ZW1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnViYXJJdGVtU3ViSXRlbXxNZW51YmFySXRlbVN1Ykl0ZW1TdWJJdGVtPigpO1xyXG5cclxuICAvKipcclxuICAgKiBsYWJlbCwgZGlmZXJlbnRlcyBmb3JtYXMgZGUgaW1wbGVtZW50YXIsIGVudW1lcmFkYXMgcG9yIHByaW9yaWRhZFxyXG4gICAqIDEpIGluY2x1aXIgY29tcG9uZW50ZSBtZW51YmFyLWxhYmVsIGFuaWRhZG9cclxuICAgKiAyKSBpbmNsdWlyIHRlbXBsYXRlXHJcbiAgICogMykgaW5jbHVpciBvYmpldG8gbGFiZWwgKGludGVyZmF6IGV4cHVlc3RhKVxyXG4gICAqIDQpIGluY2x1aXIgbGVnZW5kVGV4dCAtIGluY2x1aXIgdW4gbGFiZWwgY29uIHNvbG8gdW4gdGV4dG9cclxuICAgKi9cclxuICBASW5wdXQoKSBsYWJlbFJlZjogVGVtcGxhdGVSZWY8TGFiZWxDb21wb25lbnQ+O1xyXG4gIEBJbnB1dCgpIGxhYmVsRGF0YTogTGFiZWxEYXRhO1xyXG4gIEBJbnB1dCgpIGxhYmVsVGV4dDogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKSBASG9zdEJpbmRpbmcoJ2NsYXNzJykgY2xhc3NlczogYW55O1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYy1tZW51YmFyJykgY2ZnID0gdHJ1ZVxyXG4gIEBJbnB1dCgpIEBIb3N0QmluZGluZygnYXR0ci5pZCcpIGlkOiBhbnk7XHJcblxyXG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJykgcm9sZURhdGE6IGFueTtcclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbCcpIGFyaWFMYWJlbERhdGE6IGFueTtcclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kZXNjcmliZWRieScpIGFyaWFEZXNjcmliZWRieURhdGE6IGFueTtcclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbGxlZGJ5JykgYXJpYUxhYmVsbGVkYnlEYXRhOiBhbnk7XHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaGlkZGVuJykgYXJpYUhpZGRlbkRhdGE6IGFueTtcclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kaXNhYmxlZCcpIGFyaWFEaXNhYmxlZERhdGE6IGFueTtcclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jb250cm9scycpIGFyaWFDb250cm9sc0RhdGE6IGFueTtcclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jdXJyZW50JykgYXJpYUN1cnJlbnREYXRhOiBhbnk7XHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbGl2ZScpIGFyaWFMaXZlRGF0YTogYW55O1xyXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWV4cGFuZGVkJykgYXJpYUV4cGFuZGVkRGF0YTogYW55O1xyXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWVycm9ybWVzc2FnZScpIGFyaWFFcnJvcm1lc3NhZ2VEYXRhOiBhbnk7XHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaGFzcG9wdXAnKSBhcmlhSGFzcG9wdXBEYXRhOiBhbnk7XHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbW9kYWwnKSBhcmlhTW9kYWxEYXRhOiBhbnlcclxuXHJcbiAgQFZpZXdDaGlsZCgnbWVudWJhcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBtZW51YmFyOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGRyZW4oTWVudWJhcml0ZW1EaXJlY3RpdmUpIG1lbnVJdGVtczogUXVlcnlMaXN0PE1lbnViYXJpdGVtRGlyZWN0aXZlPjtcclxuICBARGVzeUNvbnRlbnRDaGlsZCgpIEBDb250ZW50Q2hpbGRyZW4oTWVudWJhckxhYmVsQ29tcG9uZW50KSBsYWJlbENvbXBvbmVudDogTWVudWJhckxhYmVsQ29tcG9uZW50O1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oTWVudWJhckl0ZW1Db21wb25lbnQpIGl0ZW1Db21wb25lbnRMaXN0OiBRdWVyeUxpc3Q8TWVudWJhckl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICBtZW51RGF0YTogYW55W107XHJcbiAgdmlld0luaXQgPSBmYWxzZTtcclxuICBpc0ZvY3VzZWQ6IGJvb2xlYW47XHJcbiAgY3VycmVudEZvY3VzSXRlbUluZGV4ID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzPzogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5yb2xlRGF0YSA9IHRoaXMucm9sZSA/IHRoaXMucm9sZSA6IG51bGw7XHJcbiAgICB0aGlzLmFyaWFMYWJlbERhdGEgPSB0aGlzLmFyaWFMYWJlbCA/IHRoaXMuYXJpYUxhYmVsIDogbnVsbDtcclxuICAgIHRoaXMuYXJpYURlc2NyaWJlZGJ5RGF0YSA9IHRoaXMuYXJpYURlc2NyaWJlZEJ5ID8gdGhpcy5hcmlhRGVzY3JpYmVkQnkgOiBudWxsO1xyXG4gICAgdGhpcy5hcmlhTGFiZWxsZWRieURhdGEgPSB0aGlzLmFyaWFMYWJlbGxlZEJ5ID8gdGhpcy5hcmlhTGFiZWxsZWRCeSA6IG51bGw7XHJcbiAgICB0aGlzLmFyaWFIaWRkZW5EYXRhID0gdGhpcy5hcmlhSGlkZGVuID8gdGhpcy5hcmlhSGlkZGVuIDogbnVsbDtcclxuICAgIHRoaXMuYXJpYURpc2FibGVkRGF0YSA9IHRoaXMuYXJpYURpc2FibGVkID8gdGhpcy5hcmlhRGlzYWJsZWQgOiBudWxsO1xyXG4gICAgdGhpcy5hcmlhQ29udHJvbHNEYXRhID0gdGhpcy5hcmlhQ29udHJvbHMgPyB0aGlzLmFyaWFDb250cm9scyA6IG51bGw7XHJcbiAgICB0aGlzLmFyaWFDdXJyZW50RGF0YSA9IHRoaXMuYXJpYUN1cnJlbnQgPyB0aGlzLmFyaWFDdXJyZW50IDogbnVsbDtcclxuICAgIHRoaXMuYXJpYUxpdmVEYXRhID0gdGhpcy5hcmlhTGl2ZSA/IHRoaXMuYXJpYUxpdmUgOiBudWxsO1xyXG4gICAgdGhpcy5hcmlhRXhwYW5kZWREYXRhID0gdGhpcy5hcmlhRXhwYW5kZWQgPyB0aGlzLmFyaWFFeHBhbmRlZCA6IG51bGw7XHJcbiAgICB0aGlzLmFyaWFFcnJvcm1lc3NhZ2VEYXRhID0gdGhpcy5hcmlhRXJyb3JNZXNzYWdlID8gdGhpcy5hcmlhRXJyb3JNZXNzYWdlIDogbnVsbDtcclxuICAgIHRoaXMuYXJpYUhhc3BvcHVwRGF0YSA9IHRoaXMuYXJpYUhhc1BvcHVwID8gdGhpcy5hcmlhSGFzUG9wdXAgOiBudWxsO1xyXG4gICAgdGhpcy5hcmlhTW9kYWxEYXRhID0gdGhpcy5hcmlhTW9kYWwgPyB0aGlzLmFyaWFNb2RhbCA6IG51bGw7XHJcbiAgICBpZiAodGhpcy52aWV3SW5pdCkge1xyXG4gICAgICB0aGlzLmNoZWNrQ2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3SW5pdCA9IHRydWU7XHJcbiAgICB0aGlzLmNoZWNrQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tDaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMubWVudURhdGEgPSBbXTtcclxuICAgIHRoaXMuZ2V0SXRlbXMoKS5mb3JFYWNoKChfLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtRGF0YSA9IHtcclxuICAgICAgICBvcGVuOiBmYWxzZSxcclxuICAgICAgICBjdXJyZW50Rm9jdXNTdWJJdGVtSW5kZXg6IDAsXHJcbiAgICAgICAgY3VycmVudEZvY3VzU3ViU3ViSXRlbUluZGV4OiAwLFxyXG4gICAgICAgIG1lbnVJdGVtOiB0aGlzLm1lbnVJdGVtcy50b0FycmF5KClbaW5kZXhdXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMubWVudURhdGEucHVzaChpdGVtRGF0YSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy52aWV3SW5pdCkge1xyXG4gICAgICB0aGlzLmNoZWNrUmVxdWlyZWQoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgY29uc3QgbGFzdEN1cnJlbnRGb2N1c0l0ZW1JbmRleCA9IHRoaXMuY3VycmVudEZvY3VzSXRlbUluZGV4O1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XHJcbiAgICBpZiAoaXRlbXMpIHtcclxuICAgICAgd2hpbGUgKCF0aGlzLmlzSXRlbUZvY3VzYWJsZSh0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleCAlIGl0ZW1zLmxlbmd0aCkpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleCA9ICh0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleCArIGl0ZW1zLmxlbmd0aCArIDEpICUgaXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleCA9PT0gbGFzdEN1cnJlbnRGb2N1c0l0ZW1JbmRleCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLypcclxuICAgKiBFdmVudG9zXHJcbiAgICovXHJcblxyXG4gIGhhbmRsZU1lbnVGb2N1c0luKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0ZvY3VzZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVNZW51Rm9jdXNPdXQoZXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5tZW51YmFyLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcclxuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNGb2N1c2VkID0gZmFsc2U7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZU1lbnVJdGVtQ2xpY2soZXZlbnQsIGl0ZW1JbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5oYXNQb3B1cE1lbnUoaXRlbUluZGV4KSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBjb25zdCBpc09wZW4gPSB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ub3BlbjtcclxuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcclxuICAgICAgaWYgKCFpc09wZW4pIHtcclxuICAgICAgICB0aGlzLm9wZW5NZW51KGl0ZW1JbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWN0aXZhdGVNZW51SXRlbShpdGVtSW5kZXgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlTWVudUl0ZW1LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcclxuICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICBjYXNlICcgJzpcclxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICBpZiAodGhpcy5oYXNQb3B1cE1lbnUoaXRlbUluZGV4KSkge1xyXG4gICAgICAgICAgdGhpcy5vcGVuTWVudShpdGVtSW5kZXgpO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzRmlyc3RTdWJJdGVtKGl0ZW1JbmRleCkpO1xyXG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzUG9wdXBNZW51KGl0ZW1JbmRleCkpIHtcclxuICAgICAgICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxyXG4gICAgICAgIHRoaXMuZm9jdXNOZXh0QXZhaWxhYmxlSXRlbShpdGVtSW5kZXgsIC0xKTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XHJcbiAgICAgICAgdGhpcy5mb2N1c05leHRBdmFpbGFibGVJdGVtKGl0ZW1JbmRleCwgKzEpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgICBpZiAodGhpcy5oYXNQb3B1cE1lbnUoaXRlbUluZGV4KSkge1xyXG4gICAgICAgICAgdGhpcy5vcGVuTWVudShpdGVtSW5kZXgpO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzTGFzdFN1Ykl0ZW0oaXRlbUluZGV4KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdIb21lJzpcclxuICAgICAgY2FzZSAnUGFnZVVwJzpcclxuICAgICAgICBpZiAodGhpcy5oYXNQb3B1cE1lbnUoaXRlbUluZGV4KSkge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb2N1c0ZpcnN0SXRlbSgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdFbmQnOlxyXG4gICAgICBjYXNlICdQYWdlRG93bic6XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzUG9wdXBNZW51KGl0ZW1JbmRleCkpIHtcclxuICAgICAgICAgIHRoaXMuY2xvc2VNZW51KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZm9jdXNMYXN0SXRlbSgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlmICh0aGlzLmlzUHJpbnRhYmxlQ2hhcihldmVudC5rZXkpKSB7XHJcbiAgICAgICAgICB0aGlzLmZvY3VzSXRlbUJ5Rmlyc3RDaGFyKGV2ZW50LmtleSk7XHJcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlTWVudUl0ZW1Nb3VzZU92ZXIoaXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9jdXNJdGVtKGl0ZW1JbmRleCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQb3B1cE1lbnVJdGVtQ2xpY2soaXRlbUluZGV4OiBudW1iZXIsIHN1Ykl0ZW1JbmRleDogbnVtYmVyLCBzdWJTdWJJdGVtSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZhdGVQb3B1cE1lbnVJdGVtKGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCBzdWJTdWJJdGVtSW5kZXgpO1xyXG4gICAgdGhpcy5mb2N1c0l0ZW0oaXRlbUluZGV4KTtcclxuICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQb3B1cE1lbnVJdGVtS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgaXRlbUluZGV4OiBudW1iZXIsIHN1Ykl0ZW1JbmRleDogbnVtYmVyLCBzdWJTdWJJdGVtSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGN1cnJlbnRTdWJJbmRleCA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJJdGVtSW5kZXg7XHJcbiAgICBjb25zdCBjdXJyZW50U3ViU3ViSW5kZXggPSB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0uY3VycmVudEZvY3VzU3ViU3ViSXRlbUluZGV4O1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XHJcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICBjYXNlICcgJzpcclxuICAgICAgICB0aGlzLmFjdGl2YXRlUG9wdXBNZW51SXRlbShpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KTtcclxuICAgICAgICBpZiAodGhpcy5tdXN0Q2xvc2VBZnRlclNlbGVjdFBvcHVwSXRlbShpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KSkge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZU1lbnUoaXRlbUluZGV4KTtcclxuICAgICAgICAgIHRoaXMuZm9jdXNJdGVtKGl0ZW1JbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVBvcHVwTWVudUl0ZW0oaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgsIHN1YlN1Ykl0ZW1JbmRleCk7XHJcbiAgICAgICAgdGhpcy5jbG9zZU1lbnUoaXRlbUluZGV4KTtcclxuICAgICAgICB0aGlzLmZvY3VzSXRlbShpdGVtSW5kZXgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XHJcbiAgICAgICAgdGhpcy5mb2N1c0l0ZW0oaXRlbUluZGV4KTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgdGhpcy5mb2N1c05leHRBdmFpbGFibGVTdWJJdGVtKGl0ZW1JbmRleCwgY3VycmVudFN1YkluZGV4LCBjdXJyZW50U3ViU3ViSW5kZXgsIC0xKTtcclxuICAgICAgICAvLyB0aGlzLmZvY3VzU3ViSXRlbShpdGVtSW5kZXgsIChjdXJyZW50U3ViSW5kZXggKyBsaXN0TGVuZ3RoIC0gMSkgJSBsaXN0TGVuZ3RoKTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICB0aGlzLmZvY3VzTmV4dEF2YWlsYWJsZVN1Ykl0ZW0oaXRlbUluZGV4LCBjdXJyZW50U3ViSW5kZXgsIGN1cnJlbnRTdWJTdWJJbmRleCwgKzEpO1xyXG4gICAgICAgIC8vIHRoaXMuZm9jdXNTdWJJdGVtKGl0ZW1JbmRleCwgKGN1cnJlbnRTdWJJbmRleCArIGxpc3RMZW5ndGggKyAxKSAlIGxpc3RMZW5ndGgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxyXG4gICAgICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XHJcbiAgICAgICAgdGhpcy5mb2N1c0l0ZW0oKGl0ZW1JbmRleCArIGl0ZW1zLmxlbmd0aCAtIDEpICUgaXRlbXMubGVuZ3RoKTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XHJcbiAgICAgICAgdGhpcy5jbG9zZU1lbnUoaXRlbUluZGV4KTtcclxuICAgICAgICB0aGlzLmZvY3VzSXRlbSgoaXRlbUluZGV4ICsgaXRlbXMubGVuZ3RoICsgMSkgJSBpdGVtcy5sZW5ndGgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdIb21lJzpcclxuICAgICAgY2FzZSAnUGFnZVVwJzpcclxuICAgICAgICB0aGlzLmZvY3VzRmlyc3RTdWJJdGVtKGl0ZW1JbmRleCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ0VuZCc6XHJcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcclxuICAgICAgICB0aGlzLmZvY3VzTGFzdFN1Ykl0ZW0oaXRlbUluZGV4KTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnVGFiJzpcclxuICAgICAgICB0aGlzLmNsb3NlTWVudShpdGVtSW5kZXgpO1xyXG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKGl0ZW1JbmRleCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlmICh0aGlzLmlzUHJpbnRhYmxlQ2hhcihldmVudC5rZXkpKSB7XHJcbiAgICAgICAgICB0aGlzLmZvY3VzU3ViSXRlbUJ5Rmlyc3RDaGFyKGl0ZW1JbmRleCwgZXZlbnQua2V5KTtcclxuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQb3B1cE1lbnVJdGVtTW91c2VPdmVyKGl0ZW1JbmRleDogbnVtYmVyLCBzdWJJdGVtSW5kZXg6IG51bWJlciwgc3ViU3ViSXRlbUluZGV4PzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmZvY3VzU3ViSXRlbShpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ29tdW5lc1xyXG4gICAqL1xyXG5cclxuICBjaGVja1JlcXVpcmVkKCk6IHZvaWQge1xyXG5cclxuXHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcclxuXHJcbiAgICAvLyBObyBzZSBoYSBwdWVzdG8gbGFiZWwgcmVxdWlyZWQgcG9ycXVlIGVuIGFsZ3Vub3MgZWplbXBsb3MgZGUgZGVzeS1odG1sIG5vIGFwYXJlY2VcclxuICB9XHJcblxyXG5cclxuICBhY3RpdmF0ZU1lbnVJdGVtKGl0ZW1JbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcclxuICAgIHRoaXMuYWN0aXZlSXRlbUNoYW5nZS5lbWl0KGl0ZW1zW2l0ZW1JbmRleF0gYXMgTWVudWJhckl0ZW0pO1xyXG4gICAgaWYgKGl0ZW1zW2l0ZW1JbmRleF0gaW5zdGFuY2VvZiBNZW51YmFySXRlbUNvbXBvbmVudCkge1xyXG4gICAgICAoaXRlbXNbaXRlbUluZGV4XSBhcyBNZW51YmFySXRlbUNvbXBvbmVudCkuc2VsZWN0ZWQuZW1pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWN0aXZhdGVQb3B1cE1lbnVJdGVtKGl0ZW1JbmRleDogbnVtYmVyLCBzdWJJdGVtSW5kZXg6IG51bWJlciwgc3ViU3ViSXRlbUluZGV4PzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcclxuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XHJcbiAgICBsZXQgaXRlbTogTWVudWJhckl0ZW1TdWJJdGVtfE1lbnViYXJJdGVtU3ViSXRlbVN1Ykl0ZW0gPSBzdWJJdGVtc1tzdWJJdGVtSW5kZXhdO1xyXG4gICAgbGV0IHN1YlN1Ykl0ZW1zID0gW107XHJcbiAgICBpZiAoc3ViU3ViSXRlbUluZGV4ICE9PSBudWxsICYmIHN1YlN1Ykl0ZW1JbmRleCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHN1YlN1Ykl0ZW1zID0gdGhpcy5nZXRTdWJJdGVtU3ViaXRlbXMoaXRlbSk7XHJcbiAgICAgIGl0ZW0gPSBzdWJTdWJJdGVtc1tzdWJTdWJJdGVtSW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBjaGVja2VkQ2hhbmdlID0gZmFsc2U7XHJcbiAgICBpZiAoaXRlbS5yb2xlID09PSAnbWVudWl0ZW1jaGVja2JveCcpIHtcclxuICAgICAgaXRlbS5jaGVja2VkID0gIWl0ZW0uY2hlY2tlZDtcclxuICAgICAgY2hlY2tlZENoYW5nZSA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKGl0ZW0ucm9sZSA9PT0gJ21lbnVpdGVtcmFkaW8nKSB7XHJcbiAgICAgIGNoZWNrZWRDaGFuZ2UgPSAhaXRlbS5jaGVja2VkO1xyXG4gICAgICBzdWJTdWJJdGVtcy5mb3JFYWNoKGkgPT4gaS5jaGVja2VkID0gZmFsc2UpO1xyXG4gICAgICBpdGVtLmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXRlbXNDaGFuZ2UuZW1pdChpdGVtcyk7XHJcbiAgICB0aGlzLmFjdGl2ZVN1Ykl0ZW1DaGFuZ2UuZW1pdChpdGVtIGFzIE1lbnViYXJJdGVtKTtcclxuICAgIGlmIChpdGVtIGluc3RhbmNlb2YgTWVudWJhclN1Yml0ZW1Db21wb25lbnQgfHwgaXRlbSBpbnN0YW5jZW9mIE1lbnViYXJTdWJzdWJpdGVtQ29tcG9uZW50KSB7XHJcbiAgICAgIGl0ZW0uc2VsZWN0ZWQuZW1pdCgpO1xyXG5cclxuICAgICAgaWYgKGNoZWNrZWRDaGFuZ2UpIHtcclxuICAgICAgICBpdGVtLmNoZWNrZWRDaGFuZ2UuZW1pdChpdGVtLmNoZWNrZWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtdXN0Q2xvc2VBZnRlclNlbGVjdFBvcHVwSXRlbShpdGVtSW5kZXg6IG51bWJlciwgc3ViSXRlbUluZGV4OiBudW1iZXIsIHN1YlN1Ykl0ZW1JbmRleD86IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XHJcbiAgICBjb25zdCBzdWJJdGVtcyA9IHRoaXMuZ2V0SXRlbVN1Yml0ZW1zKGl0ZW1zW2l0ZW1JbmRleF0pO1xyXG4gICAgbGV0IGl0ZW06IE1lbnViYXJJdGVtU3ViSXRlbXxNZW51YmFySXRlbVN1Ykl0ZW1TdWJJdGVtID0gc3ViSXRlbXNbc3ViSXRlbUluZGV4XTtcclxuICAgIGlmIChzdWJTdWJJdGVtSW5kZXggIT09IG51bGwgJiYgc3ViU3ViSXRlbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3Qgc3ViU3ViSXRlbXMgPSB0aGlzLmdldFN1Ykl0ZW1TdWJpdGVtcyhpdGVtKTtcclxuICAgICAgaXRlbSA9IHN1YlN1Ykl0ZW1zW3N1YlN1Ykl0ZW1JbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW0ucm9sZSAhPT0gJ21lbnVpdGVtY2hlY2tib3gnICYmIGl0ZW0ucm9sZSAhPT0gJ21lbnVpdGVtcmFkaW8nO1xyXG4gIH1cclxuXHJcbiAgb3Blbk1lbnUoaXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdhc09wZW5lZCA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5vcGVuO1xyXG4gICAgdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm9wZW4gPSB0cnVlO1xyXG4gICAgaWYgKHdhc09wZW5lZCkge1xyXG4gICAgICB0aGlzLmFjdGl2YXRlTWVudUl0ZW0oaXRlbUluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlTWVudShpdGVtSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpdGVtSW5kZXggIT09IG51bGwgJiYgaXRlbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm9wZW4gPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubWVudURhdGEuZm9yRWFjaChpdGVtID0+IGl0ZW0ub3BlbiA9IGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhc1BvcHVwTWVudShpdGVtSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XHJcbiAgICBjb25zdCBzdWJJdGVtcyA9IHRoaXMuZ2V0SXRlbVN1Yml0ZW1zKGl0ZW1zW2l0ZW1JbmRleF0pO1xyXG4gICAgcmV0dXJuIGl0ZW1zW2l0ZW1JbmRleF0uc3ViICYmIHN1Ykl0ZW1zICYmIHN1Ykl0ZW1zLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzUHJpbnRhYmxlQ2hhcihzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHN0ci5sZW5ndGggPT09IDEgJiYgISFzdHIubWF0Y2goL1xcUy8pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRNZW51RGF0YUluZGV4KGl0ZW1JbmRleDogbnVtYmVyLCBzdWJJdGVtSW5kZXg6IG51bWJlciwgc3ViU3ViSXRlbUluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBtZW51RGF0YUluZGV4ID0gMDtcclxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xyXG4gICAgY29uc3Qgc3ViSXRlbXMgPSB0aGlzLmdldEl0ZW1TdWJpdGVtcyhpdGVtc1tpdGVtSW5kZXhdKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViSXRlbUluZGV4OyBpKyspIHtcclxuICAgICAgY29uc3Qgc3ViSXRlbSA9IHN1Ykl0ZW1zW2ldO1xyXG4gICAgICBjb25zdCBzdWJTdWJJdGVtcyA9IHRoaXMuZ2V0U3ViSXRlbVN1Yml0ZW1zKHN1Ykl0ZW0pO1xyXG4gICAgICBtZW51RGF0YUluZGV4ICs9IHN1YlN1Ykl0ZW1zICYmIHN1YlN1Ykl0ZW1zLmxlbmd0aCA+IDAgPyBzdWJTdWJJdGVtcy5sZW5ndGggOiAxO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdWJTdWJJdGVtSW5kZXggIT09IG51bGwgJiYgc3ViU3ViSXRlbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbWVudURhdGFJbmRleCArPSBzdWJTdWJJdGVtSW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1lbnVEYXRhSW5kZXg7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENvbXVuZXMgLSBmb2N1c1xyXG4gICAqL1xyXG5cclxuICBmb2N1c0l0ZW0oaXRlbUluZGV4OiBudW1iZXIsIGhvdmVyPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3QgaGFzRm9jdXMgPSB0aGlzLm1lbnViYXIubmF0aXZlRWxlbWVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcclxuICAgIGNvbnN0IGlzT3BlbiA9IHRoaXMubWVudURhdGFbdGhpcy5jdXJyZW50Rm9jdXNJdGVtSW5kZXhdLm9wZW47XHJcblxyXG4gICAgaWYgKCFob3ZlciB8fCBoYXNGb2N1cykge1xyXG4gICAgICB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ubWVudUl0ZW0ubGluay5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbG9zZU1lbnUoKTtcclxuICAgIGlmIChpc09wZW4gJiYgdGhpcy5oYXNQb3B1cE1lbnUoaXRlbUluZGV4KSkge1xyXG4gICAgICB0aGlzLm9wZW5NZW51KGl0ZW1JbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jdXJyZW50Rm9jdXNJdGVtSW5kZXggPSBpdGVtSW5kZXg7XHJcbiAgfVxyXG5cclxuICBmb2N1c05leHRBdmFpbGFibGVJdGVtKGZyb21JdGVtSW5kZXg6IG51bWJlciwgc3RlcDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgbmV4dEl0ZW0gPSBmcm9tSXRlbUluZGV4O1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XHJcbiAgICBkbyB7XHJcbiAgICAgIG5leHRJdGVtID0gKG5leHRJdGVtICsgaXRlbXMubGVuZ3RoICsgc3RlcCkgJSBpdGVtcy5sZW5ndGg7XHJcbiAgICB9IHdoaWxlICghdGhpcy5pc0l0ZW1Gb2N1c2FibGUobmV4dEl0ZW0pICYmIG5leHRJdGVtICE9PSBmcm9tSXRlbUluZGV4KTtcclxuXHJcbiAgICBpZiAobmV4dEl0ZW0gIT09IGZyb21JdGVtSW5kZXgpIHtcclxuICAgICAgdGhpcy5mb2N1c0l0ZW0obmV4dEl0ZW0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9jdXNGaXJzdEl0ZW0oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc0l0ZW1Gb2N1c2FibGUoMCkpIHtcclxuICAgICAgdGhpcy5mb2N1c0l0ZW0oMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvY3VzTmV4dEF2YWlsYWJsZUl0ZW0oMCwgKzEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9jdXNMYXN0SXRlbSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xyXG4gICAgaWYgKHRoaXMuaXNJdGVtRm9jdXNhYmxlKGl0ZW1zLmxlbmd0aCAtIDEpKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNJdGVtKGl0ZW1zLmxlbmd0aCAtIDEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb2N1c05leHRBdmFpbGFibGVJdGVtKGl0ZW1zLmxlbmd0aCAtIDEsIC0xKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzSXRlbUZvY3VzYWJsZShpdGVtSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLmdldEl0ZW1zKClbaXRlbUluZGV4XS5kaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIGZvY3VzSXRlbUJ5Rmlyc3RDaGFyKGNoYXI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgaXRlbUNvbnRlbnRzOiBzdHJpbmdbXSA9IHRoaXMubWVudUl0ZW1zLm1hcChtZW51SXRlbSA9PiBtZW51SXRlbS5pdGVtQ29udGVudFdyYXBwZXIubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudCk7XHJcbiAgICBsZXQgaW5kZXggPSB0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleDtcclxuICAgIGxldCBmb3VuZEluZGV4ID0gLTE7XHJcbiAgICBkbyB7XHJcbiAgICAgIGluZGV4ID0gKGluZGV4ICsgaXRlbUNvbnRlbnRzLmxlbmd0aCArIDEpICUgaXRlbUNvbnRlbnRzLmxlbmd0aDtcclxuICAgICAgaWYgKGl0ZW1Db250ZW50c1tpbmRleF0gJiYgaXRlbUNvbnRlbnRzW2luZGV4XS50cmltKCkuc3Vic3RyKDAsIDEpLnRvTG93ZXJDYXNlKCkgPT09IGNoYXIudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgJiYgdGhpcy5pc0l0ZW1Gb2N1c2FibGUoaW5kZXgpKSB7XHJcbiAgICAgICAgZm91bmRJbmRleCA9IGluZGV4O1xyXG4gICAgICB9XHJcbiAgICB9IHdoaWxlIChmb3VuZEluZGV4ID09PSAtMSAmJiBpbmRleCAhPT0gdGhpcy5jdXJyZW50Rm9jdXNJdGVtSW5kZXgpO1xyXG5cclxuICAgIGlmIChmb3VuZEluZGV4ID49IDApIHtcclxuICAgICAgdGhpcy5mb2N1c0l0ZW0oZm91bmRJbmRleCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb2N1c1N1Ykl0ZW0oaXRlbUluZGV4OiBudW1iZXIsIHN1Ykl0ZW1JbmRleDogbnVtYmVyLCBzdWJTdWJJdGVtSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ubWVudUl0ZW0ucG9wdXBNZW51SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBtZW51RGF0YUluZGV4ID0gdGhpcy5nZXRNZW51RGF0YUluZGV4KGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCBzdWJTdWJJdGVtSW5kZXgpO1xyXG5cclxuICAgICAgdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLmN1cnJlbnRGb2N1c1N1Ykl0ZW1JbmRleCA9IHN1Ykl0ZW1JbmRleDtcclxuICAgICAgdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLmN1cnJlbnRGb2N1c1N1YlN1Ykl0ZW1JbmRleCA9IHN1YlN1Ykl0ZW1JbmRleDtcclxuICAgICAgY29uc3QgZWxlbSA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5tZW51SXRlbS5wb3B1cE1lbnVJdGVtcy50b0FycmF5KClbbWVudURhdGFJbmRleF0ubmF0aXZlRWxlbWVudDtcclxuICAgICAgaWYgKGVsZW0pIHtcclxuICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gc3ViaXRlbSB0byBmb2N1cycpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdObyBzdWJpdGVtcycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9jdXNOZXh0QXZhaWxhYmxlU3ViSXRlbShpdGVtSW5kZXg6IG51bWJlciwgZnJvbUl0ZW1TdWJJbmRleDogbnVtYmVyLCBmcm9tSXRlbVN1YlN1YkluZGV4OiBudW1iZXIsIHN0ZXA6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IG5leHRTdWJJbmRleCA9IGZyb21JdGVtU3ViSW5kZXg7XHJcbiAgICBsZXQgbmV4dFN1YlN1YkluZGV4ID0gZnJvbUl0ZW1TdWJTdWJJbmRleDtcclxuICAgIGxldCBhbGxTdWJJdGVtc0NoZWNrZWQ7XHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcclxuICAgIGRvIHtcclxuICAgICAgY29uc3QgbmV4dEluZGV4ZXMgPSB0aGlzLmdldE5leHRTdWJJdGVtSW5kZXhlcyhpdGVtcywgaXRlbUluZGV4LCBuZXh0U3ViSW5kZXgsIG5leHRTdWJTdWJJbmRleCwgc3RlcCk7XHJcbiAgICAgIG5leHRTdWJJbmRleCA9IG5leHRJbmRleGVzLnN1YkluZGV4O1xyXG4gICAgICBuZXh0U3ViU3ViSW5kZXggPSBuZXh0SW5kZXhlcy5zdWJTdWJJbmRleDtcclxuICAgICAgYWxsU3ViSXRlbXNDaGVja2VkID0gKGZyb21JdGVtU3ViSW5kZXggPT09IG5leHRTdWJJbmRleCAmJiBmcm9tSXRlbVN1YlN1YkluZGV4ID09PSBuZXh0U3ViU3ViSW5kZXgpO1xyXG4gICAgfSB3aGlsZSAoIXRoaXMuaXNTdWJJdGVtRm9jdXNhYmxlKGl0ZW1JbmRleCwgbmV4dFN1YkluZGV4LCBuZXh0U3ViU3ViSW5kZXgpICYmICFhbGxTdWJJdGVtc0NoZWNrZWQpO1xyXG5cclxuICAgIGlmICghYWxsU3ViSXRlbXNDaGVja2VkKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNTdWJJdGVtKGl0ZW1JbmRleCwgbmV4dFN1YkluZGV4LCBuZXh0U3ViU3ViSW5kZXgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9jdXNGaXJzdFN1Ykl0ZW0oaXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBmaXJzdFN1YlN1Ykl0ZW0gPSBudWxsO1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XHJcbiAgICBjb25zdCBzdWJJdGVtcyA9IHRoaXMuZ2V0SXRlbVN1Yml0ZW1zKGl0ZW1zW2l0ZW1JbmRleF0pO1xyXG4gICAgY29uc3Qgc3ViU3ViSXRlbXMgPSB0aGlzLmdldFN1Ykl0ZW1TdWJpdGVtcyhzdWJJdGVtc1swXSk7XHJcbiAgICBpZiAoc3ViU3ViSXRlbXMgJiYgc3ViU3ViSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBmaXJzdFN1YlN1Ykl0ZW0gPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzU3ViSXRlbUZvY3VzYWJsZShpdGVtSW5kZXgsIDAsIGZpcnN0U3ViU3ViSXRlbSkpIHtcclxuICAgICAgdGhpcy5mb2N1c1N1Ykl0ZW0oaXRlbUluZGV4LCAwLCBmaXJzdFN1YlN1Ykl0ZW0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb2N1c05leHRBdmFpbGFibGVTdWJJdGVtKGl0ZW1JbmRleCwgMCwgZmlyc3RTdWJTdWJJdGVtLCArMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb2N1c0xhc3RTdWJJdGVtKGl0ZW1JbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcclxuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XHJcbiAgICBjb25zdCBsYXN0SXRlbUluZGV4ID0gc3ViSXRlbXMubGVuZ3RoIC0gMTtcclxuICAgIGNvbnN0IGxhc3RJdGVtID0gc3ViSXRlbXNbbGFzdEl0ZW1JbmRleF07XHJcbiAgICBjb25zdCBzdWJTdWJJdGVtcyA9IHRoaXMuZ2V0U3ViSXRlbVN1Yml0ZW1zKGxhc3RJdGVtKTtcclxuICAgIGxldCBsYXN0U3ViU3ViSXRlbSA9IG51bGw7XHJcbiAgICBpZiAoc3ViU3ViSXRlbXMgJiYgc3ViU3ViSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsYXN0U3ViU3ViSXRlbSA9IHN1YlN1Ykl0ZW1zLmxlbmd0aCAtIDE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTdWJJdGVtRm9jdXNhYmxlKGl0ZW1JbmRleCwgbGFzdEl0ZW1JbmRleCwgbGFzdFN1YlN1Ykl0ZW0pKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNTdWJJdGVtKGl0ZW1JbmRleCwgbGFzdEl0ZW1JbmRleCwgbGFzdFN1YlN1Ykl0ZW0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb2N1c05leHRBdmFpbGFibGVTdWJJdGVtKGl0ZW1JbmRleCwgbGFzdEl0ZW1JbmRleCwgbGFzdFN1YlN1Ykl0ZW0sIC0xKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzU3ViSXRlbUZvY3VzYWJsZShpdGVtSW5kZXg6IG51bWJlciwgc3ViSXRlbUluZGV4OiBudW1iZXIsIHN1YlN1Ykl0ZW1JbmRleD86IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XHJcbiAgICBjb25zdCBzdWJJdGVtcyA9IHRoaXMuZ2V0SXRlbVN1Yml0ZW1zKGl0ZW1zW2l0ZW1JbmRleF0pO1xyXG4gICAgbGV0IGl0ZW06IE1lbnViYXJJdGVtU3ViSXRlbXxNZW51YmFySXRlbVN1Ykl0ZW1TdWJJdGVtID0gc3ViSXRlbXNbc3ViSXRlbUluZGV4XTtcclxuICAgIGlmIChzdWJTdWJJdGVtSW5kZXggIT09IG51bGwgJiYgc3ViU3ViSXRlbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3Qgc3ViU3ViSXRlbXMgPSB0aGlzLmdldFN1Ykl0ZW1TdWJpdGVtcyhpdGVtKTtcclxuICAgICAgaXRlbSA9IHN1YlN1Ykl0ZW1zW3N1YlN1Ykl0ZW1JbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGlzRm9jdXNhYmxlID0gZmFsc2U7XHJcbiAgICBpZiAoaXRlbS5yb2xlICE9PSAnc2VwYXJhdG9yJyAmJiBpdGVtLnJvbGUgIT09ICdub25lJykge1xyXG4gICAgICBpc0ZvY3VzYWJsZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzRm9jdXNhYmxlO1xyXG4gIH1cclxuXHJcbiAgZm9jdXNTdWJJdGVtQnlGaXJzdENoYXIoaXRlbUluZGV4OiBudW1iZXIsIGNoYXI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgaXRlbUNvbnRlbnRzOiBzdHJpbmdbXSA9IHRoaXMubWVudUl0ZW1zLnRvQXJyYXkoKVtpdGVtSW5kZXhdLnBvcHVwTWVudUl0ZW1zLm1hcChtZW51SXRlbSA9PiBtZW51SXRlbS5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50KTtcclxuICAgIGxldCBzdWJJdGVtSW5kZXggPSB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0uY3VycmVudEZvY3VzU3ViSXRlbUluZGV4O1xyXG4gICAgbGV0IHN1YlN1Ykl0ZW1JbmRleCA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJTdWJJdGVtSW5kZXg7XHJcbiAgICBsZXQgZm91bmRTdWJJbmRleCA9IC0xO1xyXG4gICAgbGV0IGZvdW5kU3ViU3ViSW5kZXggPSBudWxsO1xyXG4gICAgbGV0IGFsbFN1Ykl0ZW1zQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XHJcbiAgICBkbyB7XHJcbiAgICAgIGNvbnN0IG5leHRJbmRleGVzID0gdGhpcy5nZXROZXh0U3ViSXRlbUluZGV4ZXMoaXRlbXMsIGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCBzdWJTdWJJdGVtSW5kZXgsICsxKTtcclxuICAgICAgc3ViSXRlbUluZGV4ID0gbmV4dEluZGV4ZXMuc3ViSW5kZXg7XHJcbiAgICAgIHN1YlN1Ykl0ZW1JbmRleCA9IG5leHRJbmRleGVzLnN1YlN1YkluZGV4O1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0TWVudURhdGFJbmRleChpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KTtcclxuICAgICAgaWYgKGl0ZW1Db250ZW50c1tpbmRleF0gJiYgaXRlbUNvbnRlbnRzW2luZGV4XS50cmltKCkuc3Vic3RyKDAsIDEpLnRvTG93ZXJDYXNlKCkgPT09IGNoYXIudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgJiYgdGhpcy5pc1N1Ykl0ZW1Gb2N1c2FibGUoaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgsIHN1YlN1Ykl0ZW1JbmRleCkpIHtcclxuICAgICAgICBmb3VuZFN1YkluZGV4ID0gc3ViSXRlbUluZGV4O1xyXG4gICAgICAgIGZvdW5kU3ViU3ViSW5kZXggPSBzdWJTdWJJdGVtSW5kZXg7XHJcbiAgICAgIH1cclxuICAgICAgYWxsU3ViSXRlbXNDaGVja2VkID0gKHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJJdGVtSW5kZXggPT09IHN1Ykl0ZW1JbmRleFxyXG4gICAgICAgICYmIHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJTdWJJdGVtSW5kZXggPT09IHN1YlN1Ykl0ZW1JbmRleCk7XHJcbiAgICB9IHdoaWxlIChmb3VuZFN1YkluZGV4ID09PSAtMSAmJiAhYWxsU3ViSXRlbXNDaGVja2VkKTtcclxuXHJcbiAgICBpZiAoZm91bmRTdWJJbmRleCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNTdWJJdGVtKGl0ZW1JbmRleCwgZm91bmRTdWJJbmRleCwgZm91bmRTdWJTdWJJbmRleCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIE1ldG9kb3MgcGFyYSBmYWNpbGl0YXIgY29udGVuaWRvXHJcbiAgICovXHJcblxyXG4gIGdldEl0ZW1zKCk6IE1lbnViYXJJdGVtW118TWVudWJhckl0ZW1Db21wb25lbnRbXSB7XHJcbiAgICBsZXQgaXRlbXM7XHJcbiAgICBpZiAodGhpcy5pdGVtQ29tcG9uZW50TGlzdCAmJiB0aGlzLml0ZW1Db21wb25lbnRMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgaXRlbXMgPSB0aGlzLml0ZW1Db21wb25lbnRMaXN0LnRvQXJyYXkoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1zID0gdGhpcy5pdGVtcztcclxuICAgIH1cclxuICAgIHJldHVybiBpdGVtcztcclxuICB9XHJcblxyXG4gIGdldEl0ZW1TdWJpdGVtcyhpdGVtOiBNZW51YmFySXRlbXxNZW51YmFySXRlbUNvbXBvbmVudCk6IE1lbnViYXJJdGVtU3ViSXRlbVtdfE1lbnViYXJTdWJpdGVtQ29tcG9uZW50W10ge1xyXG4gICAgbGV0IHN1Ykl0ZW1zID0gW107XHJcbiAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIE1lbnViYXJJdGVtQ29tcG9uZW50KXtcclxuICAgICAgc3ViSXRlbXMgPSBpdGVtLmdldFN1Ykl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFzdWJJdGVtcyB8fCBzdWJJdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgc3ViSXRlbXMgPSBpdGVtLnN1YiA/IGl0ZW0uc3ViLml0ZW1zIDogW107XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN1Ykl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3ViSXRlbVN1Yml0ZW1zKGl0ZW06IE1lbnViYXJJdGVtU3ViSXRlbXxNZW51YmFyU3ViaXRlbUNvbXBvbmVudCk6IE1lbnViYXJJdGVtU3ViSXRlbVN1Ykl0ZW1bXXxNZW51YmFyU3Vic3ViaXRlbUNvbXBvbmVudFtdIHtcclxuICAgIGxldCBzdWJJdGVtcyA9IFtdO1xyXG5cclxuICAgIGlmIChpdGVtLnJvbGUgPT09ICdncm91cCcpIHtcclxuICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBNZW51YmFyU3ViaXRlbUNvbXBvbmVudCkge1xyXG4gICAgICAgIHN1Ykl0ZW1zID0gaXRlbS5nZXRTdWJJdGVtcygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXN1Ykl0ZW1zIHx8IHN1Ykl0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHN1Ykl0ZW1zID0gaXRlbS5pdGVtcyA/IGl0ZW0uaXRlbXMgOiBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdWJJdGVtcztcclxuICB9XHJcblxyXG4gIGdldE5leHRTdWJJdGVtSW5kZXhlcyhpdGVtcywgaXRlbUluZGV4LCBuZXh0U3ViSW5kZXgsIG5leHRTdWJTdWJJbmRleCwgc3RlcCk6IHsgc3ViSW5kZXg6IG51bWJlciwgc3ViU3ViSW5kZXg/OiBudW1iZXJ9IHtcclxuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XHJcbiAgICBjb25zdCBzdWJTdWJJdGVtcyA9IHRoaXMuZ2V0U3ViSXRlbVN1Yml0ZW1zKHN1Ykl0ZW1zW25leHRTdWJJbmRleF0pO1xyXG5cclxuICAgIGxldCBjaGVja05leHRTdWJJdGVtID0gdHJ1ZTtcclxuICAgIGlmIChzdWJTdWJJdGVtcyAmJiBzdWJTdWJJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmIChuZXh0U3ViU3ViSW5kZXggKyBzdGVwID49IDAgJiYgbmV4dFN1YlN1YkluZGV4ICsgc3RlcCA8IHN1YlN1Ykl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgIG5leHRTdWJTdWJJbmRleCArPSBzdGVwO1xyXG4gICAgICAgIGNoZWNrTmV4dFN1Ykl0ZW0gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGVja05leHRTdWJJdGVtKSB7XHJcbiAgICAgIG5leHRTdWJJbmRleCA9IChuZXh0U3ViSW5kZXggKyBzdGVwICsgc3ViSXRlbXMubGVuZ3RoKSAlIHN1Ykl0ZW1zLmxlbmd0aDtcclxuICAgICAgY29uc3QgbmV4dFN1Ykl0ZW1JdGVtcyA9IHRoaXMuZ2V0U3ViSXRlbVN1Yml0ZW1zKHN1Ykl0ZW1zW25leHRTdWJJbmRleF0pO1xyXG4gICAgICBpZiAobmV4dFN1Ykl0ZW1JdGVtcyAmJiBuZXh0U3ViSXRlbUl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBuZXh0U3ViU3ViSW5kZXggPSAoKHN0ZXAgPiAwID8gLTEgOiAwKSArIHN0ZXAgKyBuZXh0U3ViSXRlbUl0ZW1zLmxlbmd0aCkgJSBuZXh0U3ViSXRlbUl0ZW1zLmxlbmd0aDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXh0U3ViU3ViSW5kZXggPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtzdWJJbmRleDogbmV4dFN1YkluZGV4LCBzdWJTdWJJbmRleDogbmV4dFN1YlN1YkluZGV4fTtcclxuICB9XHJcblxyXG4gIGdldElkUHJlZml4KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5pZFByZWZpeCA/IHRoaXMuaWRQcmVmaXggOiB0aGlzLmlkICsgJ21lbnViYXItaXRlbSc7XHJcbiAgfVxyXG5cclxuICBnZXRMYWJlbFJlZigpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmxhYmVsQ29tcG9uZW50ID8gdGhpcy5sYWJlbENvbXBvbmVudC5nZXRDb250ZW50KCkgOiB0aGlzLmxhYmVsUmVmO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGFiZWxDb250ZW50KCk6IHN0cmluZyB7XHJcbiAgICBsZXQgY29udGVudDogc3RyaW5nO1xyXG4gICAgaWYgKHRoaXMubGFiZWxEYXRhKSB7XHJcbiAgICAgIGNvbnRlbnQgPSB0aGlzLmxhYmVsRGF0YS5odG1sID8gdGhpcy5sYWJlbERhdGEuaHRtbCA6IGA8cD4keyBTdHJpbmdVdGlscy5lc2NhcGVIdG1sKHRoaXMubGFiZWxEYXRhLnRleHQpIH08L3A+YDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5sYWJlbFRleHQpIHtcclxuICAgICAgY29udGVudCA9IGA8cD4keyBTdHJpbmdVdGlscy5lc2NhcGVIdG1sKHRoaXMubGFiZWxUZXh0KSB9PC9wPmA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29udGVudDtcclxuICB9XHJcblxyXG4gIGdldEl0ZW1JZChpdGVtLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBpZDogc3RyaW5nO1xyXG4gICAgaWYgKGl0ZW0pIHtcclxuICAgICAgaWYgKGl0ZW0uaWQpIHtcclxuICAgICAgICBpZCA9IGl0ZW0uaWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWQgPSBpbmRleCA9PT0gMCA/IHRoaXMuZ2V0SWRQcmVmaXgoKSA6IGAke3RoaXMuZ2V0SWRQcmVmaXgoKX0tJHtpbmRleH1gO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaWQ7XHJcbiAgfVxyXG5cclxuICBnZXRQb3B1cFN0eWxlKGl0ZW1JbmRleDogbnVtYmVyKTogb2JqZWN0IHtcclxuICAgIGxldCBzdHlsZSA9IHt9O1xyXG4gICAgaWYgKHRoaXMubWVudURhdGEgJiYgaXRlbUluZGV4IDwgdGhpcy5tZW51RGF0YS5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbWVudUl0ZW0gPSB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ubWVudUl0ZW07XHJcbiAgICAgIGNvbnN0IHJlY3QgPSBtZW51SXRlbS5saW5rLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGlmICh0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ub3Blbikge1xyXG4gICAgICAgIHN0eWxlID0ge1xyXG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXHJcbiAgICAgICAgICB0b3A6IChyZWN0LmhlaWdodCAtIDEpICsgJ3B4JyxcclxuICAgICAgICAgIGxlZnQ6ICcwcHgnLFxyXG4gICAgICAgICAgekluZGV4OiAxMDAsXHJcbiAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzdHlsZSA9IHtcclxuICAgICAgICAgIHpJbmRleDogMCxcclxuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3R5bGU7XHJcbiAgfVxyXG5cclxuICBnZXRTdWJJdGVtSWQoaXRlbSwgaW5kZXg6IG51bWJlciwgcGFyZW50SWQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgaWQ6IHN0cmluZztcclxuICAgIGlmIChpdGVtKSB7XHJcbiAgICAgIGlmIChpdGVtLmlkKSB7XHJcbiAgICAgICAgaWQgPSBpdGVtLmlkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlkID0gaW5kZXggPT09IDAgPyBgc3ViLSR7cGFyZW50SWR9YCA6IGBzdWItJHtwYXJlbnRJZH0tJHtpbmRleH1gO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaWQ7XHJcbiAgfVxyXG5cclxuICBnZXRTdWJTdWJJdGVtQXJpYUNoZWNrZWQoc3Vic3ViaXRlbSk6IHN0cmluZyB7XHJcbiAgICBsZXQgYXJpYUNoZWNrZWQgPSBudWxsO1xyXG4gICAgaWYgKHN1YnN1Yml0ZW0ucm9sZSA9PT0gJ21lbnVpdGVtY2hlY2tib3gnIHx8IHN1YnN1Yml0ZW0ucm9sZSA9PT0gJ21lbnVpdGVtcmFkaW8nKSB7XHJcbiAgICAgIGFyaWFDaGVja2VkID0gISFzdWJzdWJpdGVtLmNoZWNrZWQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXJpYUNoZWNrZWQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==
1
+ import { __decorate } from "tslib";
2
+ import { ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, HostBinding, Input, Output, ViewChild, ViewChildren } from '@angular/core';
3
+ import { AccessibilityComponent } from '../../../shared/components';
4
+ import { MenubaritemDirective } from './directives/menubaritem.directive';
5
+ import { StringUtils } from '../../../shared/utils/string-utils';
6
+ import { MenubarItemComponent } from './components/menubar-item/menubar-item.component';
7
+ import { MenubarSubitemComponent } from './components/menubar-subitem/menubar-subitem.component';
8
+ import { MenubarSubsubitemComponent } from './components/menubar-subsubitem/menubar-subsubitem.component';
9
+ import { MenubarLabelComponent } from './components/menubar-label/menubar-label.component';
10
+ import { DesyContentChild } from '../../../shared/decorators/desy-content-child.decorator';
11
+ export class MenubarComponent extends AccessibilityComponent {
12
+ constructor(changeDetectorRef) {
13
+ super();
14
+ this.changeDetectorRef = changeDetectorRef;
15
+ this.itemsChange = new EventEmitter();
16
+ this.activeItemChange = new EventEmitter();
17
+ this.activeSubItemChange = new EventEmitter();
18
+ this.cfg = true;
19
+ this.viewInit = false;
20
+ this.currentFocusItemIndex = 0;
21
+ }
22
+ ngOnChanges(changes) {
23
+ this.roleData = this.role ? this.role : null;
24
+ this.ariaLabelData = this.ariaLabel ? this.ariaLabel : null;
25
+ this.ariaDescribedbyData = this.ariaDescribedBy ? this.ariaDescribedBy : null;
26
+ this.ariaLabelledbyData = this.ariaLabelledBy ? this.ariaLabelledBy : null;
27
+ this.ariaHiddenData = this.ariaHidden ? this.ariaHidden : null;
28
+ this.ariaDisabledData = this.ariaDisabled ? this.ariaDisabled : null;
29
+ this.ariaControlsData = this.ariaControls ? this.ariaControls : null;
30
+ this.ariaCurrentData = this.ariaCurrent ? this.ariaCurrent : null;
31
+ this.ariaLiveData = this.ariaLive ? this.ariaLive : null;
32
+ this.ariaExpandedData = this.ariaExpanded ? this.ariaExpanded : null;
33
+ this.ariaErrormessageData = this.ariaErrorMessage ? this.ariaErrorMessage : null;
34
+ this.ariaHaspopupData = this.ariaHasPopup ? this.ariaHasPopup : null;
35
+ this.ariaModalData = this.ariaModal ? this.ariaModal : null;
36
+ if (this.viewInit) {
37
+ this.checkChanges();
38
+ }
39
+ }
40
+ ngAfterViewInit() {
41
+ this.viewInit = true;
42
+ this.checkChanges();
43
+ }
44
+ checkChanges() {
45
+ if (!this.menuItems) {
46
+ return;
47
+ }
48
+ this.menuData = [];
49
+ this.getItems().forEach((_, index) => {
50
+ const itemData = {
51
+ open: false,
52
+ currentFocusSubItemIndex: 0,
53
+ currentFocusSubSubItemIndex: 0,
54
+ menuItem: this.menuItems.toArray()[index]
55
+ };
56
+ this.menuData.push(itemData);
57
+ });
58
+ if (this.viewInit) {
59
+ this.checkRequired();
60
+ }
61
+ const lastCurrentFocusItemIndex = this.currentFocusItemIndex;
62
+ const items = this.getItems();
63
+ if (items) {
64
+ while (!this.isItemFocusable(this.currentFocusItemIndex % items.length)) {
65
+ this.currentFocusItemIndex = (this.currentFocusItemIndex + items.length + 1) % items.length;
66
+ if (this.currentFocusItemIndex === lastCurrentFocusItemIndex) {
67
+ break;
68
+ }
69
+ }
70
+ }
71
+ }
72
+ /*
73
+ * Eventos
74
+ */
75
+ handleMenuFocusIn() {
76
+ this.isFocused = true;
77
+ this.changeDetectorRef.detectChanges();
78
+ }
79
+ handleMenuFocusOut(event) {
80
+ if (!this.menubar.nativeElement.contains(event.relatedTarget)) {
81
+ this.closeMenu();
82
+ }
83
+ this.isFocused = false;
84
+ this.changeDetectorRef.detectChanges();
85
+ }
86
+ handleMenuItemClick(event, itemIndex) {
87
+ if (this.hasPopupMenu(itemIndex)) {
88
+ event.preventDefault();
89
+ const isOpen = this.menuData[itemIndex].open;
90
+ this.closeMenu();
91
+ if (!isOpen) {
92
+ this.openMenu(itemIndex);
93
+ }
94
+ }
95
+ else {
96
+ this.activateMenuItem(itemIndex);
97
+ }
98
+ }
99
+ handleMenuItemKeydown(event, itemIndex) {
100
+ switch (event.key) {
101
+ case 'Enter':
102
+ case ' ':
103
+ case 'ArrowDown':
104
+ if (this.hasPopupMenu(itemIndex)) {
105
+ this.openMenu(itemIndex);
106
+ setTimeout(() => this.focusFirstSubItem(itemIndex));
107
+ event.stopPropagation();
108
+ event.preventDefault();
109
+ }
110
+ break;
111
+ case 'Escape':
112
+ if (this.hasPopupMenu(itemIndex)) {
113
+ this.closeMenu(itemIndex);
114
+ }
115
+ event.stopPropagation();
116
+ event.preventDefault();
117
+ break;
118
+ case 'ArrowLeft':
119
+ this.focusNextAvailableItem(itemIndex, -1);
120
+ event.stopPropagation();
121
+ event.preventDefault();
122
+ break;
123
+ case 'ArrowRight':
124
+ this.focusNextAvailableItem(itemIndex, +1);
125
+ event.stopPropagation();
126
+ event.preventDefault();
127
+ break;
128
+ case 'ArrowUp':
129
+ if (this.hasPopupMenu(itemIndex)) {
130
+ this.openMenu(itemIndex);
131
+ setTimeout(() => this.focusLastSubItem(itemIndex));
132
+ }
133
+ event.stopPropagation();
134
+ event.preventDefault();
135
+ break;
136
+ case 'Home':
137
+ case 'PageUp':
138
+ if (this.hasPopupMenu(itemIndex)) {
139
+ this.closeMenu();
140
+ }
141
+ this.focusFirstItem();
142
+ event.stopPropagation();
143
+ event.preventDefault();
144
+ break;
145
+ case 'End':
146
+ case 'PageDown':
147
+ if (this.hasPopupMenu(itemIndex)) {
148
+ this.closeMenu();
149
+ }
150
+ this.focusLastItem();
151
+ event.stopPropagation();
152
+ event.preventDefault();
153
+ break;
154
+ default:
155
+ if (this.isPrintableChar(event.key)) {
156
+ this.focusItemByFirstChar(event.key);
157
+ event.stopPropagation();
158
+ event.preventDefault();
159
+ }
160
+ break;
161
+ }
162
+ }
163
+ handleMenuItemMouseOver(itemIndex) {
164
+ this.focusItem(itemIndex, true);
165
+ }
166
+ handlePopupMenuItemClick(itemIndex, subItemIndex, subSubItemIndex) {
167
+ this.activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex);
168
+ this.focusItem(itemIndex);
169
+ this.closeMenu(itemIndex);
170
+ }
171
+ handlePopupMenuItemKeydown(event, itemIndex, subItemIndex, subSubItemIndex) {
172
+ const currentSubIndex = this.menuData[itemIndex].currentFocusSubItemIndex;
173
+ const currentSubSubIndex = this.menuData[itemIndex].currentFocusSubSubItemIndex;
174
+ const items = this.getItems();
175
+ switch (event.key) {
176
+ case ' ':
177
+ this.activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex);
178
+ if (this.mustCloseAfterSelectPopupItem(itemIndex, subItemIndex, subSubItemIndex)) {
179
+ this.closeMenu(itemIndex);
180
+ this.focusItem(itemIndex);
181
+ }
182
+ event.stopPropagation();
183
+ event.preventDefault();
184
+ break;
185
+ case 'Enter':
186
+ this.activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex);
187
+ this.closeMenu(itemIndex);
188
+ this.focusItem(itemIndex);
189
+ event.stopPropagation();
190
+ event.preventDefault();
191
+ break;
192
+ case 'Escape':
193
+ this.closeMenu(itemIndex);
194
+ this.focusItem(itemIndex);
195
+ event.stopPropagation();
196
+ event.preventDefault();
197
+ break;
198
+ case 'ArrowUp':
199
+ this.focusNextAvailableSubItem(itemIndex, currentSubIndex, currentSubSubIndex, -1);
200
+ // this.focusSubItem(itemIndex, (currentSubIndex + listLength - 1) % listLength);
201
+ event.stopPropagation();
202
+ event.preventDefault();
203
+ break;
204
+ case 'ArrowDown':
205
+ this.focusNextAvailableSubItem(itemIndex, currentSubIndex, currentSubSubIndex, +1);
206
+ // this.focusSubItem(itemIndex, (currentSubIndex + listLength + 1) % listLength);
207
+ event.stopPropagation();
208
+ event.preventDefault();
209
+ break;
210
+ case 'ArrowLeft':
211
+ this.closeMenu(itemIndex);
212
+ this.focusItem((itemIndex + items.length - 1) % items.length);
213
+ event.stopPropagation();
214
+ event.preventDefault();
215
+ break;
216
+ case 'ArrowRight':
217
+ this.closeMenu(itemIndex);
218
+ this.focusItem((itemIndex + items.length + 1) % items.length);
219
+ event.stopPropagation();
220
+ event.preventDefault();
221
+ break;
222
+ case 'Home':
223
+ case 'PageUp':
224
+ this.focusFirstSubItem(itemIndex);
225
+ event.stopPropagation();
226
+ event.preventDefault();
227
+ break;
228
+ case 'End':
229
+ case 'PageDown':
230
+ this.focusLastSubItem(itemIndex);
231
+ event.stopPropagation();
232
+ event.preventDefault();
233
+ break;
234
+ case 'Tab':
235
+ this.closeMenu(itemIndex);
236
+ this.focusItem(itemIndex);
237
+ break;
238
+ default:
239
+ if (this.isPrintableChar(event.key)) {
240
+ this.focusSubItemByFirstChar(itemIndex, event.key);
241
+ event.stopPropagation();
242
+ event.preventDefault();
243
+ }
244
+ break;
245
+ }
246
+ }
247
+ handlePopupMenuItemMouseOver(itemIndex, subItemIndex, subSubItemIndex) {
248
+ this.focusSubItem(itemIndex, subItemIndex, subSubItemIndex);
249
+ }
250
+ /*
251
+ * Comunes
252
+ */
253
+ checkRequired() {
254
+ const items = this.getItems();
255
+ // No se ha puesto label required porque en algunos ejemplos de desy-html no aparece
256
+ }
257
+ activateMenuItem(itemIndex) {
258
+ const items = this.getItems();
259
+ this.activeItemChange.emit(items[itemIndex]);
260
+ if (items[itemIndex] instanceof MenubarItemComponent) {
261
+ items[itemIndex].selected.emit();
262
+ }
263
+ }
264
+ activatePopupMenuItem(itemIndex, subItemIndex, subSubItemIndex) {
265
+ const items = this.getItems();
266
+ const subItems = this.getItemSubitems(items[itemIndex]);
267
+ let item = subItems[subItemIndex];
268
+ let subSubItems = [];
269
+ if (subSubItemIndex !== null && subSubItemIndex !== undefined) {
270
+ subSubItems = this.getSubItemSubitems(item);
271
+ item = subSubItems[subSubItemIndex];
272
+ }
273
+ let checkedChange = false;
274
+ if (item.role === 'menuitemcheckbox') {
275
+ item.checked = !item.checked;
276
+ checkedChange = true;
277
+ }
278
+ else if (item.role === 'menuitemradio') {
279
+ checkedChange = !item.checked;
280
+ subSubItems.forEach(i => i.checked = false);
281
+ item.checked = true;
282
+ }
283
+ this.itemsChange.emit(items);
284
+ this.activeSubItemChange.emit(item);
285
+ if (item instanceof MenubarSubitemComponent || item instanceof MenubarSubsubitemComponent) {
286
+ item.selected.emit();
287
+ if (checkedChange) {
288
+ item.checkedChange.emit(item.checked);
289
+ }
290
+ }
291
+ }
292
+ mustCloseAfterSelectPopupItem(itemIndex, subItemIndex, subSubItemIndex) {
293
+ const items = this.getItems();
294
+ const subItems = this.getItemSubitems(items[itemIndex]);
295
+ let item = subItems[subItemIndex];
296
+ if (subSubItemIndex !== null && subSubItemIndex !== undefined) {
297
+ const subSubItems = this.getSubItemSubitems(item);
298
+ item = subSubItems[subSubItemIndex];
299
+ }
300
+ return item.role !== 'menuitemcheckbox' && item.role !== 'menuitemradio';
301
+ }
302
+ openMenu(itemIndex) {
303
+ const wasOpened = this.menuData[itemIndex].open;
304
+ this.menuData[itemIndex].open = true;
305
+ if (wasOpened) {
306
+ this.activateMenuItem(itemIndex);
307
+ }
308
+ }
309
+ closeMenu(itemIndex) {
310
+ if (itemIndex !== null && itemIndex !== undefined) {
311
+ this.menuData[itemIndex].open = false;
312
+ }
313
+ else {
314
+ this.menuData.forEach(item => item.open = false);
315
+ }
316
+ }
317
+ hasPopupMenu(itemIndex) {
318
+ const items = this.getItems();
319
+ const subItems = this.getItemSubitems(items[itemIndex]);
320
+ return items[itemIndex].sub && subItems && subItems.length > 0;
321
+ }
322
+ isPrintableChar(str) {
323
+ return str.length === 1 && !!str.match(/\S/);
324
+ }
325
+ getMenuDataIndex(itemIndex, subItemIndex, subSubItemIndex) {
326
+ let menuDataIndex = 0;
327
+ const items = this.getItems();
328
+ const subItems = this.getItemSubitems(items[itemIndex]);
329
+ for (let i = 0; i < subItemIndex; i++) {
330
+ const subItem = subItems[i];
331
+ const subSubItems = this.getSubItemSubitems(subItem);
332
+ menuDataIndex += subSubItems && subSubItems.length > 0 ? subSubItems.length : 1;
333
+ }
334
+ if (subSubItemIndex !== null && subSubItemIndex !== undefined) {
335
+ menuDataIndex += subSubItemIndex;
336
+ }
337
+ return menuDataIndex;
338
+ }
339
+ /*
340
+ * Comunes - focus
341
+ */
342
+ focusItem(itemIndex, hover) {
343
+ const hasFocus = this.menubar.nativeElement.contains(document.activeElement);
344
+ const isOpen = this.menuData[this.currentFocusItemIndex].open;
345
+ if (!hover || hasFocus) {
346
+ this.menuData[itemIndex].menuItem.link.nativeElement.focus();
347
+ }
348
+ this.closeMenu();
349
+ if (isOpen && this.hasPopupMenu(itemIndex)) {
350
+ this.openMenu(itemIndex);
351
+ }
352
+ this.currentFocusItemIndex = itemIndex;
353
+ }
354
+ focusNextAvailableItem(fromItemIndex, step) {
355
+ let nextItem = fromItemIndex;
356
+ const items = this.getItems();
357
+ do {
358
+ nextItem = (nextItem + items.length + step) % items.length;
359
+ } while (!this.isItemFocusable(nextItem) && nextItem !== fromItemIndex);
360
+ if (nextItem !== fromItemIndex) {
361
+ this.focusItem(nextItem);
362
+ }
363
+ }
364
+ focusFirstItem() {
365
+ if (this.isItemFocusable(0)) {
366
+ this.focusItem(0);
367
+ }
368
+ else {
369
+ this.focusNextAvailableItem(0, +1);
370
+ }
371
+ }
372
+ focusLastItem() {
373
+ const items = this.getItems();
374
+ if (this.isItemFocusable(items.length - 1)) {
375
+ this.focusItem(items.length - 1);
376
+ }
377
+ else {
378
+ this.focusNextAvailableItem(items.length - 1, -1);
379
+ }
380
+ }
381
+ isItemFocusable(itemIndex) {
382
+ return !this.getItems()[itemIndex].disabled;
383
+ }
384
+ focusItemByFirstChar(char) {
385
+ const itemContents = this.menuItems.map(menuItem => menuItem.itemContentWrapper.nativeElement.textContent);
386
+ let index = this.currentFocusItemIndex;
387
+ let foundIndex = -1;
388
+ do {
389
+ index = (index + itemContents.length + 1) % itemContents.length;
390
+ if (itemContents[index] && itemContents[index].trim().substr(0, 1).toLowerCase() === char.toLowerCase()
391
+ && this.isItemFocusable(index)) {
392
+ foundIndex = index;
393
+ }
394
+ } while (foundIndex === -1 && index !== this.currentFocusItemIndex);
395
+ if (foundIndex >= 0) {
396
+ this.focusItem(foundIndex);
397
+ }
398
+ }
399
+ focusSubItem(itemIndex, subItemIndex, subSubItemIndex) {
400
+ if (this.menuData[itemIndex].menuItem.popupMenuItems.length > 0) {
401
+ const menuDataIndex = this.getMenuDataIndex(itemIndex, subItemIndex, subSubItemIndex);
402
+ this.menuData[itemIndex].currentFocusSubItemIndex = subItemIndex;
403
+ this.menuData[itemIndex].currentFocusSubSubItemIndex = subSubItemIndex;
404
+ const elem = this.menuData[itemIndex].menuItem.popupMenuItems.toArray()[menuDataIndex].nativeElement;
405
+ if (elem) {
406
+ elem.focus();
407
+ }
408
+ else {
409
+ console.error('No subitem to focus');
410
+ }
411
+ }
412
+ else {
413
+ console.error('No subitems');
414
+ }
415
+ }
416
+ focusNextAvailableSubItem(itemIndex, fromItemSubIndex, fromItemSubSubIndex, step) {
417
+ let nextSubIndex = fromItemSubIndex;
418
+ let nextSubSubIndex = fromItemSubSubIndex;
419
+ let allSubItemsChecked;
420
+ const items = this.getItems();
421
+ do {
422
+ const nextIndexes = this.getNextSubItemIndexes(items, itemIndex, nextSubIndex, nextSubSubIndex, step);
423
+ nextSubIndex = nextIndexes.subIndex;
424
+ nextSubSubIndex = nextIndexes.subSubIndex;
425
+ allSubItemsChecked = (fromItemSubIndex === nextSubIndex && fromItemSubSubIndex === nextSubSubIndex);
426
+ } while (!this.isSubItemFocusable(itemIndex, nextSubIndex, nextSubSubIndex) && !allSubItemsChecked);
427
+ if (!allSubItemsChecked) {
428
+ this.focusSubItem(itemIndex, nextSubIndex, nextSubSubIndex);
429
+ }
430
+ }
431
+ focusFirstSubItem(itemIndex) {
432
+ let firstSubSubItem = null;
433
+ const items = this.getItems();
434
+ const subItems = this.getItemSubitems(items[itemIndex]);
435
+ const subSubItems = this.getSubItemSubitems(subItems[0]);
436
+ if (subSubItems && subSubItems.length > 0) {
437
+ firstSubSubItem = 0;
438
+ }
439
+ if (this.isSubItemFocusable(itemIndex, 0, firstSubSubItem)) {
440
+ this.focusSubItem(itemIndex, 0, firstSubSubItem);
441
+ }
442
+ else {
443
+ this.focusNextAvailableSubItem(itemIndex, 0, firstSubSubItem, +1);
444
+ }
445
+ }
446
+ focusLastSubItem(itemIndex) {
447
+ const items = this.getItems();
448
+ const subItems = this.getItemSubitems(items[itemIndex]);
449
+ const lastItemIndex = subItems.length - 1;
450
+ const lastItem = subItems[lastItemIndex];
451
+ const subSubItems = this.getSubItemSubitems(lastItem);
452
+ let lastSubSubItem = null;
453
+ if (subSubItems && subSubItems.length > 0) {
454
+ lastSubSubItem = subSubItems.length - 1;
455
+ }
456
+ if (this.isSubItemFocusable(itemIndex, lastItemIndex, lastSubSubItem)) {
457
+ this.focusSubItem(itemIndex, lastItemIndex, lastSubSubItem);
458
+ }
459
+ else {
460
+ this.focusNextAvailableSubItem(itemIndex, lastItemIndex, lastSubSubItem, -1);
461
+ }
462
+ }
463
+ isSubItemFocusable(itemIndex, subItemIndex, subSubItemIndex) {
464
+ const items = this.getItems();
465
+ const subItems = this.getItemSubitems(items[itemIndex]);
466
+ let item = subItems[subItemIndex];
467
+ if (subSubItemIndex !== null && subSubItemIndex !== undefined) {
468
+ const subSubItems = this.getSubItemSubitems(item);
469
+ item = subSubItems[subSubItemIndex];
470
+ }
471
+ let isFocusable = false;
472
+ if (item.role !== 'separator' && item.role !== 'none') {
473
+ isFocusable = true;
474
+ }
475
+ return isFocusable;
476
+ }
477
+ focusSubItemByFirstChar(itemIndex, char) {
478
+ const itemContents = this.menuItems.toArray()[itemIndex].popupMenuItems.map(menuItem => menuItem.nativeElement.textContent);
479
+ let subItemIndex = this.menuData[itemIndex].currentFocusSubItemIndex;
480
+ let subSubItemIndex = this.menuData[itemIndex].currentFocusSubSubItemIndex;
481
+ let foundSubIndex = -1;
482
+ let foundSubSubIndex = null;
483
+ let allSubItemsChecked = false;
484
+ const items = this.getItems();
485
+ do {
486
+ const nextIndexes = this.getNextSubItemIndexes(items, itemIndex, subItemIndex, subSubItemIndex, +1);
487
+ subItemIndex = nextIndexes.subIndex;
488
+ subSubItemIndex = nextIndexes.subSubIndex;
489
+ const index = this.getMenuDataIndex(itemIndex, subItemIndex, subSubItemIndex);
490
+ if (itemContents[index] && itemContents[index].trim().substr(0, 1).toLowerCase() === char.toLowerCase()
491
+ && this.isSubItemFocusable(itemIndex, subItemIndex, subSubItemIndex)) {
492
+ foundSubIndex = subItemIndex;
493
+ foundSubSubIndex = subSubItemIndex;
494
+ }
495
+ allSubItemsChecked = (this.menuData[itemIndex].currentFocusSubItemIndex === subItemIndex
496
+ && this.menuData[itemIndex].currentFocusSubSubItemIndex === subSubItemIndex);
497
+ } while (foundSubIndex === -1 && !allSubItemsChecked);
498
+ if (foundSubIndex >= 0) {
499
+ this.focusSubItem(itemIndex, foundSubIndex, foundSubSubIndex);
500
+ }
501
+ }
502
+ /*
503
+ * Metodos para facilitar contenido
504
+ */
505
+ getItems() {
506
+ let items;
507
+ if (this.itemComponentList && this.itemComponentList.length > 0) {
508
+ items = this.itemComponentList.toArray();
509
+ }
510
+ else {
511
+ items = this.items;
512
+ }
513
+ return items;
514
+ }
515
+ getItemSubitems(item) {
516
+ let subItems = [];
517
+ if (item instanceof MenubarItemComponent) {
518
+ subItems = item.getSubItems();
519
+ }
520
+ if (!subItems || subItems.length === 0) {
521
+ subItems = item.sub ? item.sub.items : [];
522
+ }
523
+ return subItems;
524
+ }
525
+ getSubItemSubitems(item) {
526
+ let subItems = [];
527
+ if (item.role === 'group') {
528
+ if (item instanceof MenubarSubitemComponent) {
529
+ subItems = item.getSubItems();
530
+ }
531
+ if (!subItems || subItems.length === 0) {
532
+ subItems = item.items ? item.items : [];
533
+ }
534
+ }
535
+ return subItems;
536
+ }
537
+ getNextSubItemIndexes(items, itemIndex, nextSubIndex, nextSubSubIndex, step) {
538
+ const subItems = this.getItemSubitems(items[itemIndex]);
539
+ const subSubItems = this.getSubItemSubitems(subItems[nextSubIndex]);
540
+ let checkNextSubItem = true;
541
+ if (subSubItems && subSubItems.length > 0) {
542
+ if (nextSubSubIndex + step >= 0 && nextSubSubIndex + step < subSubItems.length) {
543
+ nextSubSubIndex += step;
544
+ checkNextSubItem = false;
545
+ }
546
+ }
547
+ if (checkNextSubItem) {
548
+ nextSubIndex = (nextSubIndex + step + subItems.length) % subItems.length;
549
+ const nextSubItemItems = this.getSubItemSubitems(subItems[nextSubIndex]);
550
+ if (nextSubItemItems && nextSubItemItems.length > 0) {
551
+ nextSubSubIndex = ((step > 0 ? -1 : 0) + step + nextSubItemItems.length) % nextSubItemItems.length;
552
+ }
553
+ else {
554
+ nextSubSubIndex = null;
555
+ }
556
+ }
557
+ return { subIndex: nextSubIndex, subSubIndex: nextSubSubIndex };
558
+ }
559
+ getIdPrefix() {
560
+ return this.idPrefix ? this.idPrefix : this.id + 'menubar-item';
561
+ }
562
+ getLabelRef() {
563
+ return this.labelComponent ? this.labelComponent.getContent() : this.labelRef;
564
+ }
565
+ getLabelContent() {
566
+ let content;
567
+ if (this.labelData) {
568
+ content = this.labelData.html ? this.labelData.html : `<p>${StringUtils.escapeHtml(this.labelData.text)}</p>`;
569
+ }
570
+ else if (this.labelText) {
571
+ content = `<p>${StringUtils.escapeHtml(this.labelText)}</p>`;
572
+ }
573
+ return content;
574
+ }
575
+ getItemId(item, index) {
576
+ let id;
577
+ if (item) {
578
+ if (item.id) {
579
+ id = item.id;
580
+ }
581
+ else {
582
+ id = index === 0 ? this.getIdPrefix() : `${this.getIdPrefix()}-${index}`;
583
+ }
584
+ }
585
+ return id;
586
+ }
587
+ getPopupStyle(itemIndex) {
588
+ let style = {};
589
+ if (this.menuData && itemIndex < this.menuData.length) {
590
+ const menuItem = this.menuData[itemIndex].menuItem;
591
+ const rect = menuItem.link.nativeElement.getBoundingClientRect();
592
+ if (this.menuData[itemIndex].open) {
593
+ style = {
594
+ position: 'absolute',
595
+ top: (rect.height - 1) + 'px',
596
+ left: '0px',
597
+ zIndex: 100,
598
+ display: 'block'
599
+ };
600
+ }
601
+ else {
602
+ style = {
603
+ zIndex: 0,
604
+ display: 'none'
605
+ };
606
+ }
607
+ }
608
+ return style;
609
+ }
610
+ getSubItemId(item, index, parentId) {
611
+ let id;
612
+ if (item) {
613
+ if (item.id) {
614
+ id = item.id;
615
+ }
616
+ else {
617
+ id = index === 0 ? `sub-${parentId}` : `sub-${parentId}-${index}`;
618
+ }
619
+ }
620
+ return id;
621
+ }
622
+ getSubSubItemAriaChecked(subsubitem) {
623
+ let ariaChecked = null;
624
+ if (subsubitem.role === 'menuitemcheckbox' || subsubitem.role === 'menuitemradio') {
625
+ ariaChecked = !!subsubitem.checked;
626
+ }
627
+ return ariaChecked;
628
+ }
629
+ }
630
+ MenubarComponent.decorators = [
631
+ { type: Component, args: [{
632
+ selector: 'desy-menubar',
633
+ template: " <ng-container *ngIf=\"getLabelRef()\">\n <div [id]=\"id + '-label'\" [class]=\"['mb-sm', labelComponent ? labelComponent.classes : (labelData ? labelData.classes : null)] | makeHtmlList\">\n <ng-container *ngTemplateOutlet=\"getLabelRef()\"></ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!getLabelRef() && (labelData || labelText)\">\n <div [id]=\"id + '-label'\" [class]=\"['mb-sm', labelData ? labelData.classes : null] | makeHtmlList\">\n <ng-container *desyCustomInnerContent=\"{ html: getLabelContent() }\"></ng-container>\n </div>\n </ng-container>\n <ul #menubar [id]=\"id + '-menubar'\" class=\"lg:flex lg:flex-wrap\" role=\"menubar\"\n (focusin)=\"handleMenuFocusIn()\"\n (focusout)=\"handleMenuFocusOut($event)\"\n [ngClass]=\"{ 'focus': isFocused }\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : null\"\n [attr.aria-describedby]=\"getLabelRef() || labelData || labelText ? id + '-label' : null\">\n <ng-container *ngFor=\"let item of getItems(); index as itemIndex\">\n <li class=\"relative\" role=\"none\" desyMenubaritem (contentChanged)=\"checkChanges()\">\n <a *ngIf=\"item.sub\" #link\n role=\"menuitem\" aria-haspopup=\"true\" aria-expanded=\"false\"\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n [id]=\"getItemId(item, itemIndex)\"\n [class]=\"['c-menubar__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menubar__button--disabled': item.disabled, 'c-menubar__button--primary': item.active}\" \n [attr.aria-disabled]=\"item.disabled ? item.disabled : (item.ariaDisabled ? item.ariaDisabled : null)\"\n [attr.aria-describedby]=\"item.ariaDescribedBy ? item.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"item.ariaLabelledBy ? item.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"item.ariaHidden ? item.ariaHidden : null\"\n [attr.aria-controls]=\"item.ariaControls ? item.ariaControls : null\"\n [attr.aria-current]=\"item.ariaCurrent ? item.ariaCurrent : null\"\n [attr.aria-live]=\"item.ariaLive ? item.ariaLive : null\"\n [attr.aria-errormessage]=\"item.ariaErrorMessage ? item.ariaErrorMessage : null\"\n [attr.aria-modal]=\"item.ariaModal ? item.ariaModal : null\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\">\n <span class=\"inline-flex self-center max-w-xs align-middle truncate\" #itemContentWrapper>\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </span>\n <svg class=\"inline-block -mr-2 align-middle -my-px\" viewBox=\"0 0 96 96\" aria-hidden=\"true\" fill=\"currentColor\" focusable=\"false\" width=\"1.5em\" height=\"1.5em\"><g><path d=\"M46.71 58.037a1.823 1.823 0 002.581 0L62.048 45.28a1.823 1.823 0 00-1.29-3.113H35.243a1.823 1.823 0 00-1.291 3.113z\"/></g></svg>\n </a>\n <a *ngIf=\"item.routerLink && !item.sub\" #link #itemContentWrapper\n role=\"menuitem\"\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n [id]=\"getItemId(item, itemIndex)\"\n [routerLink]=\"item.routerLink\"\n [routerLinkActive]=\"item.routerLinkActiveClasses ? item.routerLinkActiveClasses : []\"\n [fragment]=\"item.fragment\"\n [class]=\"['c-menubar__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menubar__button--disabled': item.disabled, 'c-menubar__button--primary': item.active}\"\n [attr.title]=\"item.title ? item.title : null\"\n [attr.disabled]=\"item.disabled ? item.disabled : null\"\n [attr.aria-disabled]=\"item.disabled ? item.disabled : (item.ariaDisabled ? item.ariaDisabled : null)\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\"\n [attr.target]=\"item.target ? item.target : null\"\n [attr.aria-describedby]=\"item.ariaDescribedBy ? item.ariaDescribedBy : null\"\n [attr.aria-labelledBy]=\"item.ariaLabelledBy ? item.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"item.ariaHidden ? item.ariaHidden : null\"\n [attr.aria-controls]=\"item.ariaControls ? item.ariaControls : null\"\n [attr.aria-current]=\"item.ariaCurrent ? item.ariaCurrent : null\"\n [attr.aria-live]=\"item.ariaLive ? item.ariaLive : null\"\n [attr.aria-expanded]=\"item.ariaExpanded ? item.ariaExpanded : null\"\n [attr.aria-errormessage]=\"item.ariaErrorMessage ? item.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"item.ariaHasPopup ? item.ariaHasPopup : null\"\n [attr.aria-modal]=\"item.ariaModal ? item.ariaModal : null\">\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </a>\n <a *ngIf=\"!item.routerLink && item.href && !item.sub\" #link #itemContentWrapper\n role=\"menuitem\"\n (click)=\"handleMenuItemClick($event, itemIndex)\"\n (keydown)=\"handleMenuItemKeydown($event, itemIndex)\"\n (mouseover)=\"handleMenuItemMouseOver(itemIndex)\"\n (desyAttributeChange)=\"checkChanges()\" [attributesToCheck]=\"'disabled'\"\n [id]=\"getItemId(item, itemIndex)\"\n [href]=\"item.href | externalHref\"\n [class]=\"['c-menubar__button', item.classes] | makeHtmlList\"\n [ngClass]=\"{'c-menubar__button--disabled': item.disabled, 'c-menubar__button--primary': item.active}\"\n [attr.title]=\"item.title ? item.title : null\"\n [attr.disabled]=\"item.disabled ? item.disabled : null\"\n [attr.aria-disabled]=\"item.disabled ? item.disabled : (item.ariaDisabled ? item.ariaDisabled : null)\"\n [attr.tabindex]=\"item.disabled ? -1 : (itemIndex === currentFocusItemIndex ? 0 : -1)\"\n [attr.target]=\"item.target ? item.target : null\"\n [attr.aria-describedby]=\"item.ariaDescribedBy ? item.ariaDescribedBy : null\"\n [attr.aria-labelledBy]=\"item.ariaLabelledBy ? item.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"item.ariaHidden ? item.ariaHidden : null\"\n [attr.aria-controls]=\"item.ariaControls ? item.ariaControls : null\"\n [attr.aria-current]=\"item.ariaCurrent ? item.ariaCurrent : null\"\n [attr.aria-live]=\"item.ariaLive ? item.ariaLive : null\"\n [attr.aria-expanded]=\"item.ariaExpanded ? item.ariaExpanded : null\"\n [attr.aria-errormessage]=\"item.ariaErrorMessage ? item.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"item.ariaHasPopup ? item.ariaHasPopup : null\"\n [attr.aria-modal]=\"item.ariaModal ? item.ariaModal : null\">\n <ng-container *desyCustomInnerContent=\"{ component: item, html: item.html, text: item.text}\"></ng-container>\n </a>\n\n <ul *ngIf=\"item.sub && getItemSubitems(item)\" #popupMenu role=\"menu\" tabindex=\"-1\"\n [ngStyle]=\"getPopupStyle(itemIndex)\"\n [class]=\"['c-menubar__tooltip w-max max-w-64 hidden border border-neutral-base shadow-md bg-white text-sm', item.sub.classes] | makeHtmlList\"\n [attr.aria-label]=\"item.ariaLabel ? item.ariaLabel : (item.sub.ariaLabel ? item.sub.ariaLabel : null)\"\n [attr.aria-describedby]=\"item.sub.ariaDescribedBy ? item.sub.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"item.sub.ariaLabelledBy ? item.sub.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"item.sub.ariaHidden ? item.sub.ariaHidden : null\"\n [attr.aria-disabled]=\"item.sub.ariaDisabled ? item.sub.ariaDisabled : null\"\n [attr.aria-controls]=\"item.sub.ariaControls ? item.sub.ariaControls : null\"\n [attr.aria-current]=\"item.sub.ariaCurrent ? item.sub.ariaCurrent : null\"\n [attr.aria-live]=\"item.sub.ariaLive ? item.sub.ariaLive : null\"\n [attr.aria-expanded]=\"!!(menuData && menuData[itemIndex].open)\"\n [attr.aria-errormessage]=\"item.sub.ariaErrorMessage ? item.sub.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"item.sub.ariaHasPopup ? item.sub.ariaHasPopup : null\"\n [attr.aria-modal]=\"item.sub.ariaModal ? item.sub.ariaModal : null\">\n <ng-container *ngFor=\"let subItem of getItemSubitems(item); index as subItemIndex\">\n <ng-container [ngSwitch]=\"subItem.role\">\n <li #popupMenuItem *ngSwitchCase=\"'none'\" role=\"none\" tabindex=\"-1\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </li>\n <li *ngSwitchCase=\"'group'\" role=\"none\">\n <ul role=\"group\" [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n [attr.aria-label]=\"subItem.ariaLabel ? subItem.ariaLabel : null\">\n <ng-container *ngFor=\"let subsubitem of getSubItemSubitems(subItem); index as subsubIndex\">\n <ng-container *ngIf=\"subsubitem\">\n <li #popupMenuItem [attr.role]=\"subsubitem.role ? subsubitem.role : null\" tabindex=\"-1\"\n [id]=\"getSubItemId(subsubitem, subsubIndex, getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex)))\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex, subsubIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex, subsubIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex, subsubIndex)\"\n [attr.aria-checked]=\"getSubSubItemAriaChecked(subsubitem)\"\n class=\"flex items-center pr-base pl-lg py-sm cursor-pointer hover:bg-primary-base hover:text-white\">\n <ng-container *desyCustomInnerContent=\"{ component: subsubitem, html: subsubitem.html, text: subsubitem.text}\"></ng-container>\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </li>\n <li #popupMenuItem *ngSwitchCase=\"'menuitem'\" role=\"menuitem\" tabindex=\"-1\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n class=\"flex items-center pr-base pl-lg py-sm cursor-pointer hover:bg-primary-base hover:text-white focus:bg-primary-base focus:text-white focus:outline-none\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </li>\n <li #popupMenuItem *ngSwitchCase=\"'menuitemcheckbox'\" role=\"menuitemcheckbox\" tabindex=\"-1\"\n (click)=\"handlePopupMenuItemClick(itemIndex, subItemIndex)\"\n (mouseover)=\"handlePopupMenuItemMouseOver(itemIndex, subItemIndex)\"\n (keydown)=\"handlePopupMenuItemKeydown($event, itemIndex, subItemIndex)\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n [attr.aria-checked]=\"!!subItem.checked\"\n class=\"flex items-center pr-base pl-lg py-sm cursor-pointer hover:bg-primary-base hover:text-white\">\n <ng-container *desyCustomInnerContent=\"{ component: subItem, html: subItem.html, text: subItem.text}\"></ng-container>\n </li>\n <li #popupMenuItem *ngSwitchCase=\"'separator'\" role=\"separator\"\n [id]=\"getSubItemId(subItem, subItemIndex, getItemId(item, itemIndex))\"\n class=\"my-sm border-b border-neutral-base\">\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </li>\n </ng-container>\n </ul>\n"
634
+ },] }
635
+ ];
636
+ MenubarComponent.ctorParameters = () => [
637
+ { type: ChangeDetectorRef }
638
+ ];
639
+ MenubarComponent.propDecorators = {
640
+ idPrefix: [{ type: Input }],
641
+ items: [{ type: Input }],
642
+ itemsChange: [{ type: Output }],
643
+ activeItemChange: [{ type: Output }],
644
+ activeSubItemChange: [{ type: Output }],
645
+ labelRef: [{ type: Input }],
646
+ labelData: [{ type: Input }],
647
+ labelText: [{ type: Input }],
648
+ classes: [{ type: Input }, { type: HostBinding, args: ['class',] }],
649
+ cfg: [{ type: HostBinding, args: ['class.c-menubar',] }],
650
+ id: [{ type: Input }, { type: HostBinding, args: ['attr.id',] }],
651
+ roleData: [{ type: HostBinding, args: ['attr.role',] }],
652
+ ariaLabelData: [{ type: HostBinding, args: ['attr.aria-label',] }],
653
+ ariaDescribedbyData: [{ type: HostBinding, args: ['attr.aria-describedby',] }],
654
+ ariaLabelledbyData: [{ type: HostBinding, args: ['attr.aria-labelledby',] }],
655
+ ariaHiddenData: [{ type: HostBinding, args: ['attr.aria-hidden',] }],
656
+ ariaDisabledData: [{ type: HostBinding, args: ['attr.aria-disabled',] }],
657
+ ariaControlsData: [{ type: HostBinding, args: ['attr.aria-controls',] }],
658
+ ariaCurrentData: [{ type: HostBinding, args: ['attr.aria-current',] }],
659
+ ariaLiveData: [{ type: HostBinding, args: ['attr.aria-live',] }],
660
+ ariaExpandedData: [{ type: HostBinding, args: ['attr.aria-expanded',] }],
661
+ ariaErrormessageData: [{ type: HostBinding, args: ['attr.aria-errormessage',] }],
662
+ ariaHaspopupData: [{ type: HostBinding, args: ['attr.aria-haspopup',] }],
663
+ ariaModalData: [{ type: HostBinding, args: ['attr.aria-modal',] }],
664
+ menubar: [{ type: ViewChild, args: ['menubar', { read: ElementRef },] }],
665
+ menuItems: [{ type: ViewChildren, args: [MenubaritemDirective,] }],
666
+ labelComponent: [{ type: ContentChildren, args: [MenubarLabelComponent,] }],
667
+ itemComponentList: [{ type: ContentChildren, args: [MenubarItemComponent,] }]
668
+ };
669
+ __decorate([
670
+ DesyContentChild()
671
+ ], MenubarComponent.prototype, "labelComponent", void 0);
672
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXN5LWFuZ3VsYXIvc3JjL2xpYi9kZXN5LW5hdi9jb21wb25lbnRzL21lbnViYXIvbWVudWJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDVSxpQkFBaUIsRUFDaEMsU0FBUyxFQUFFLGVBQWUsRUFDMUIsVUFBVSxFQUFFLFlBQVksRUFDeEIsV0FBVyxFQUNYLEtBQUssRUFDTSxNQUFNLEVBSWpCLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFbEUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFLeEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQ3RGLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBQy9GLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLDhEQUE4RCxDQUFDO0FBQ3hHLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlEQUF5RCxDQUFDO0FBTXpGLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxzQkFBc0I7SUErQzFELFlBQW9CLGlCQUFvQztRQUN0RCxLQUFLLEVBQUUsQ0FBQztRQURVLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUEzQzlDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFDaEQscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUNuRCx3QkFBbUIsR0FBRyxJQUFJLFlB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V0FBVyxTQUFDLE9BQU87a0JBQzVCLFdBQVcsU0FBQyxpQkFBaUI7aUJBQzdCLEtBQUssWUFBSSxXQUFXLFNBQUMsU0FBUzt1QkFFOUIsV0FBVyxTQUFDLFdBQVc7NEJBQ3ZCLFdBQVcsU0FBQyxpQkFBaUI7a0NBQzdCLFdBQVcsU0FBQyx1QkFBdUI7aUNBQ25DLFdBQVcsU0FBQyxzQkFBc0I7NkJBQ2xDLFdBQVcsU0FBQyxrQkFBa0I7K0JBQzlCLFdBQVcsU0FBQyxvQkFBb0I7K0JBQ2hDLFdBQVcsU0FBQyxvQkFBb0I7OEJBQ2hDLFdBQVcsU0FBQyxtQkFBbUI7MkJBQy9CLFdBQVcsU0FBQyxnQkFBZ0I7K0JBQzVCLFdBQVcsU0FBQyxvQkFBb0I7bUNBQ2hDLFdBQVcsU0FBQyx3QkFBd0I7K0JBQ3BDLFdBQVcsU0FBQyxvQkFBb0I7NEJBQ2hDLFdBQVcsU0FBQyxpQkFBaUI7c0JBRTdCLFNBQVMsU0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO3dCQUN6QyxZQUFZLFNBQUMsb0JBQW9COzZCQUNiLGVBQWUsU0FBQyxxQkFBcUI7Z0NBQ3pELGVBQWUsU0FBQyxvQkFBb0I7O0FBRHVCO0lBQTNELGdCQUFnQixFQUFFO3dEQUErRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcywgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWNjZXNzaWJpbGl0eUNvbXBvbmVudH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtNZW51YmFySXRlbX0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9tZW51YmFyLWl0ZW0nO1xuaW1wb3J0IHtNZW51YmFyaXRlbURpcmVjdGl2ZX0gZnJvbSAnLi9kaXJlY3RpdmVzL21lbnViYXJpdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQge01lbnViYXJJdGVtU3ViSXRlbX0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9tZW51YmFyLWl0ZW0tc3ViLWl0ZW0nO1xuaW1wb3J0IHtNZW51YmFySXRlbVN1Ykl0ZW1TdWJJdGVtfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL21lbnViYXItaXRlbS1zdWItaXRlbS1zdWItaXRlbSc7XG5pbXBvcnQge0xhYmVsQ29tcG9uZW50fSBmcm9tICcuLi8uLi8uLi9kZXN5LWZvcm1zL2NvbXBvbmVudHMvbGFiZWwvbGFiZWwuY29tcG9uZW50JztcbmltcG9ydCB7TGFiZWxEYXRhfSBmcm9tICcuLi8uLi8uLi9kZXN5LWZvcm1zL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtTdHJpbmdVdGlsc30gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL3N0cmluZy11dGlscyc7XG5pbXBvcnQge01lbnViYXJJdGVtQ29tcG9uZW50fSBmcm9tICcuL2NvbXBvbmVudHMvbWVudWJhci1pdGVtL21lbnViYXItaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHtNZW51YmFyU3ViaXRlbUNvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnRzL21lbnViYXItc3ViaXRlbS9tZW51YmFyLXN1Yml0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7TWVudWJhclN1YnN1Yml0ZW1Db21wb25lbnR9IGZyb20gJy4vY29tcG9uZW50cy9tZW51YmFyLXN1YnN1Yml0ZW0vbWVudWJhci1zdWJzdWJpdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQge01lbnViYXJMYWJlbENvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnRzL21lbnViYXItbGFiZWwvbWVudWJhci1sYWJlbC5jb21wb25lbnQnO1xuaW1wb3J0IHtEZXN5Q29udGVudENoaWxkfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZGVjb3JhdG9ycy9kZXN5LWNvbnRlbnQtY2hpbGQuZGVjb3JhdG9yJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGVzeS1tZW51YmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lbnViYXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIE1lbnViYXJDb21wb25lbnQgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcblxuICBASW5wdXQoKSBpZFByZWZpeDogc3RyaW5nO1xuICBASW5wdXQoKSBpdGVtczogTWVudWJhckl0ZW1bXTtcbiAgQE91dHB1dCgpIGl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNZW51YmFySXRlbVtdPigpO1xuICBAT3V0cHV0KCkgYWN0aXZlSXRlbUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TWVudWJhckl0ZW0+KCk7XG4gIEBPdXRwdXQoKSBhY3RpdmVTdWJJdGVtQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNZW51YmFySXRlbVN1Ykl0ZW18TWVudWJhckl0ZW1TdWJJdGVtU3ViSXRlbT4oKTtcblxuICAvKipcbiAgICogbGFiZWwsIGRpZmVyZW50ZXMgZm9ybWFzIGRlIGltcGxlbWVudGFyLCBlbnVtZXJhZGFzIHBvciBwcmlvcmlkYWRcbiAgICogMSkgaW5jbHVpciBjb21wb25lbnRlIG1lbnViYXItbGFiZWwgYW5pZGFkb1xuICAgKiAyKSBpbmNsdWlyIHRlbXBsYXRlXG4gICAqIDMpIGluY2x1aXIgb2JqZXRvIGxhYmVsIChpbnRlcmZheiBleHB1ZXN0YSlcbiAgICogNCkgaW5jbHVpciBsZWdlbmRUZXh0IC0gaW5jbHVpciB1biBsYWJlbCBjb24gc29sbyB1biB0ZXh0b1xuICAgKi9cbiAgQElucHV0KCkgbGFiZWxSZWY6IFRlbXBsYXRlUmVmPExhYmVsQ29tcG9uZW50PjtcbiAgQElucHV0KCkgbGFiZWxEYXRhOiBMYWJlbERhdGE7XG4gIEBJbnB1dCgpIGxhYmVsVGV4dDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIEBIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzc2VzOiBhbnk7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYy1tZW51YmFyJykgY2ZnID0gdHJ1ZVxuICBASW5wdXQoKSBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKSBpZDogYW55O1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJykgcm9sZURhdGE6IGFueTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbGFiZWwnKSBhcmlhTGFiZWxEYXRhOiBhbnk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRlc2NyaWJlZGJ5JykgYXJpYURlc2NyaWJlZGJ5RGF0YTogYW55O1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbGxlZGJ5JykgYXJpYUxhYmVsbGVkYnlEYXRhOiBhbnk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWhpZGRlbicpIGFyaWFIaWRkZW5EYXRhOiBhbnk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRpc2FibGVkJykgYXJpYURpc2FibGVkRGF0YTogYW55O1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jb250cm9scycpIGFyaWFDb250cm9sc0RhdGE6IGFueTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtY3VycmVudCcpIGFyaWFDdXJyZW50RGF0YTogYW55O1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1saXZlJykgYXJpYUxpdmVEYXRhOiBhbnk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWV4cGFuZGVkJykgYXJpYUV4cGFuZGVkRGF0YTogYW55O1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1lcnJvcm1lc3NhZ2UnKSBhcmlhRXJyb3JtZXNzYWdlRGF0YTogYW55O1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1oYXNwb3B1cCcpIGFyaWFIYXNwb3B1cERhdGE6IGFueTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbW9kYWwnKSBhcmlhTW9kYWxEYXRhOiBhbnlcblxuICBAVmlld0NoaWxkKCdtZW51YmFyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIG1lbnViYXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGRyZW4oTWVudWJhcml0ZW1EaXJlY3RpdmUpIG1lbnVJdGVtczogUXVlcnlMaXN0PE1lbnViYXJpdGVtRGlyZWN0aXZlPjtcbiAgQERlc3lDb250ZW50Q2hpbGQoKSBAQ29udGVudENoaWxkcmVuKE1lbnViYXJMYWJlbENvbXBvbmVudCkgbGFiZWxDb21wb25lbnQ6IE1lbnViYXJMYWJlbENvbXBvbmVudDtcbiAgQENvbnRlbnRDaGlsZHJlbihNZW51YmFySXRlbUNvbXBvbmVudCkgaXRlbUNvbXBvbmVudExpc3Q6IFF1ZXJ5TGlzdDxNZW51YmFySXRlbUNvbXBvbmVudD47XG5cbiAgbWVudURhdGE6IGFueVtdO1xuICB2aWV3SW5pdCA9IGZhbHNlO1xuICBpc0ZvY3VzZWQ6IGJvb2xlYW47XG4gIGN1cnJlbnRGb2N1c0l0ZW1JbmRleCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlcz86IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICB0aGlzLnJvbGVEYXRhID0gdGhpcy5yb2xlID8gdGhpcy5yb2xlIDogbnVsbDtcbiAgICB0aGlzLmFyaWFMYWJlbERhdGEgPSB0aGlzLmFyaWFMYWJlbCA/IHRoaXMuYXJpYUxhYmVsIDogbnVsbDtcbiAgICB0aGlzLmFyaWFEZXNjcmliZWRieURhdGEgPSB0aGlzLmFyaWFEZXNjcmliZWRCeSA/IHRoaXMuYXJpYURlc2NyaWJlZEJ5IDogbnVsbDtcbiAgICB0aGlzLmFyaWFMYWJlbGxlZGJ5RGF0YSA9IHRoaXMuYXJpYUxhYmVsbGVkQnkgPyB0aGlzLmFyaWFMYWJlbGxlZEJ5IDogbnVsbDtcbiAgICB0aGlzLmFyaWFIaWRkZW5EYXRhID0gdGhpcy5hcmlhSGlkZGVuID8gdGhpcy5hcmlhSGlkZGVuIDogbnVsbDtcbiAgICB0aGlzLmFyaWFEaXNhYmxlZERhdGEgPSB0aGlzLmFyaWFEaXNhYmxlZCA/IHRoaXMuYXJpYURpc2FibGVkIDogbnVsbDtcbiAgICB0aGlzLmFyaWFDb250cm9sc0RhdGEgPSB0aGlzLmFyaWFDb250cm9scyA/IHRoaXMuYXJpYUNvbnRyb2xzIDogbnVsbDtcbiAgICB0aGlzLmFyaWFDdXJyZW50RGF0YSA9IHRoaXMuYXJpYUN1cnJlbnQgPyB0aGlzLmFyaWFDdXJyZW50IDogbnVsbDtcbiAgICB0aGlzLmFyaWFMaXZlRGF0YSA9IHRoaXMuYXJpYUxpdmUgPyB0aGlzLmFyaWFMaXZlIDogbnVsbDtcbiAgICB0aGlzLmFyaWFFeHBhbmRlZERhdGEgPSB0aGlzLmFyaWFFeHBhbmRlZCA/IHRoaXMuYXJpYUV4cGFuZGVkIDogbnVsbDtcbiAgICB0aGlzLmFyaWFFcnJvcm1lc3NhZ2VEYXRhID0gdGhpcy5hcmlhRXJyb3JNZXNzYWdlID8gdGhpcy5hcmlhRXJyb3JNZXNzYWdlIDogbnVsbDtcbiAgICB0aGlzLmFyaWFIYXNwb3B1cERhdGEgPSB0aGlzLmFyaWFIYXNQb3B1cCA/IHRoaXMuYXJpYUhhc1BvcHVwIDogbnVsbDtcbiAgICB0aGlzLmFyaWFNb2RhbERhdGEgPSB0aGlzLmFyaWFNb2RhbCA/IHRoaXMuYXJpYU1vZGFsIDogbnVsbDtcbiAgICBpZiAodGhpcy52aWV3SW5pdCkge1xuICAgICAgdGhpcy5jaGVja0NoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3SW5pdCA9IHRydWU7XG4gICAgdGhpcy5jaGVja0NoYW5nZXMoKTtcbiAgfVxuXG4gIGNoZWNrQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWVudUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIHRoaXMubWVudURhdGEgPSBbXTtcbiAgICB0aGlzLmdldEl0ZW1zKCkuZm9yRWFjaCgoXywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1EYXRhID0ge1xuICAgICAgICBvcGVuOiBmYWxzZSxcbiAgICAgICAgY3VycmVudEZvY3VzU3ViSXRlbUluZGV4OiAwLFxuICAgICAgICBjdXJyZW50Rm9jdXNTdWJTdWJJdGVtSW5kZXg6IDAsXG4gICAgICAgIG1lbnVJdGVtOiB0aGlzLm1lbnVJdGVtcy50b0FycmF5KClbaW5kZXhdXG4gICAgICB9O1xuICAgICAgdGhpcy5tZW51RGF0YS5wdXNoKGl0ZW1EYXRhKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnZpZXdJbml0KSB7XG4gICAgICB0aGlzLmNoZWNrUmVxdWlyZWQoKTtcbiAgICB9XG5cblxuICAgIGNvbnN0IGxhc3RDdXJyZW50Rm9jdXNJdGVtSW5kZXggPSB0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleDtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICBpZiAoaXRlbXMpIHtcbiAgICAgIHdoaWxlICghdGhpcy5pc0l0ZW1Gb2N1c2FibGUodGhpcy5jdXJyZW50Rm9jdXNJdGVtSW5kZXggJSBpdGVtcy5sZW5ndGgpKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzSXRlbUluZGV4ID0gKHRoaXMuY3VycmVudEZvY3VzSXRlbUluZGV4ICsgaXRlbXMubGVuZ3RoICsgMSkgJSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleCA9PT0gbGFzdEN1cnJlbnRGb2N1c0l0ZW1JbmRleCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICAvKlxuICAgKiBFdmVudG9zXG4gICAqL1xuXG4gIGhhbmRsZU1lbnVGb2N1c0luKCk6IHZvaWQge1xuICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGhhbmRsZU1lbnVGb2N1c091dChldmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tZW51YmFyLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xvc2VNZW51KCk7XG4gICAgfVxuICAgIHRoaXMuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBoYW5kbGVNZW51SXRlbUNsaWNrKGV2ZW50LCBpdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc1BvcHVwTWVudShpdGVtSW5kZXgpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgaXNPcGVuID0gdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm9wZW47XG4gICAgICB0aGlzLmNsb3NlTWVudSgpO1xuICAgICAgaWYgKCFpc09wZW4pIHtcbiAgICAgICAgdGhpcy5vcGVuTWVudShpdGVtSW5kZXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2YXRlTWVudUl0ZW0oaXRlbUluZGV4KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVNZW51SXRlbUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGl0ZW1JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgaWYgKHRoaXMuaGFzUG9wdXBNZW51KGl0ZW1JbmRleCkpIHtcbiAgICAgICAgICB0aGlzLm9wZW5NZW51KGl0ZW1JbmRleCk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzRmlyc3RTdWJJdGVtKGl0ZW1JbmRleCkpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIGlmICh0aGlzLmhhc1BvcHVwTWVudShpdGVtSW5kZXgpKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZU1lbnUoaXRlbUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHRoaXMuZm9jdXNOZXh0QXZhaWxhYmxlSXRlbShpdGVtSW5kZXgsIC0xKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgdGhpcy5mb2N1c05leHRBdmFpbGFibGVJdGVtKGl0ZW1JbmRleCwgKzEpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBpZiAodGhpcy5oYXNQb3B1cE1lbnUoaXRlbUluZGV4KSkge1xuICAgICAgICAgIHRoaXMub3Blbk1lbnUoaXRlbUluZGV4KTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNMYXN0U3ViSXRlbShpdGVtSW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgY2FzZSAnUGFnZVVwJzpcbiAgICAgICAgaWYgKHRoaXMuaGFzUG9wdXBNZW51KGl0ZW1JbmRleCkpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlTWVudSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9jdXNGaXJzdEl0ZW0oKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgY2FzZSAnUGFnZURvd24nOlxuICAgICAgICBpZiAodGhpcy5oYXNQb3B1cE1lbnUoaXRlbUluZGV4KSkge1xuICAgICAgICAgIHRoaXMuY2xvc2VNZW51KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb2N1c0xhc3RJdGVtKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHRoaXMuaXNQcmludGFibGVDaGFyKGV2ZW50LmtleSkpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzSXRlbUJ5Rmlyc3RDaGFyKGV2ZW50LmtleSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBoYW5kbGVNZW51SXRlbU1vdXNlT3ZlcihpdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNJdGVtKGl0ZW1JbmRleCwgdHJ1ZSk7XG4gIH1cblxuICBoYW5kbGVQb3B1cE1lbnVJdGVtQ2xpY2soaXRlbUluZGV4OiBudW1iZXIsIHN1Ykl0ZW1JbmRleDogbnVtYmVyLCBzdWJTdWJJdGVtSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2YXRlUG9wdXBNZW51SXRlbShpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KTtcbiAgICB0aGlzLmZvY3VzSXRlbShpdGVtSW5kZXgpO1xuICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XG4gIH1cblxuICBoYW5kbGVQb3B1cE1lbnVJdGVtS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgaXRlbUluZGV4OiBudW1iZXIsIHN1Ykl0ZW1JbmRleDogbnVtYmVyLCBzdWJTdWJJdGVtSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50U3ViSW5kZXggPSB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0uY3VycmVudEZvY3VzU3ViSXRlbUluZGV4O1xuICAgIGNvbnN0IGN1cnJlbnRTdWJTdWJJbmRleCA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJTdWJJdGVtSW5kZXg7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgICB0aGlzLmFjdGl2YXRlUG9wdXBNZW51SXRlbShpdGVtSW5kZXgsIHN1Ykl0ZW1JbmRleCwgc3ViU3ViSXRlbUluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMubXVzdENsb3NlQWZ0ZXJTZWxlY3RQb3B1cEl0ZW0oaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgsIHN1YlN1Ykl0ZW1JbmRleCkpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlTWVudShpdGVtSW5kZXgpO1xuICAgICAgICAgIHRoaXMuZm9jdXNJdGVtKGl0ZW1JbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIHRoaXMuYWN0aXZhdGVQb3B1cE1lbnVJdGVtKGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCBzdWJTdWJJdGVtSW5kZXgpO1xuICAgICAgICB0aGlzLmNsb3NlTWVudShpdGVtSW5kZXgpO1xuICAgICAgICB0aGlzLmZvY3VzSXRlbShpdGVtSW5kZXgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKGl0ZW1JbmRleCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIHRoaXMuZm9jdXNOZXh0QXZhaWxhYmxlU3ViSXRlbShpdGVtSW5kZXgsIGN1cnJlbnRTdWJJbmRleCwgY3VycmVudFN1YlN1YkluZGV4LCAtMSk7XG4gICAgICAgIC8vIHRoaXMuZm9jdXNTdWJJdGVtKGl0ZW1JbmRleCwgKGN1cnJlbnRTdWJJbmRleCArIGxpc3RMZW5ndGggLSAxKSAlIGxpc3RMZW5ndGgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHRoaXMuZm9jdXNOZXh0QXZhaWxhYmxlU3ViSXRlbShpdGVtSW5kZXgsIGN1cnJlbnRTdWJJbmRleCwgY3VycmVudFN1YlN1YkluZGV4LCArMSk7XG4gICAgICAgIC8vIHRoaXMuZm9jdXNTdWJJdGVtKGl0ZW1JbmRleCwgKGN1cnJlbnRTdWJJbmRleCArIGxpc3RMZW5ndGggKyAxKSAlIGxpc3RMZW5ndGgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKChpdGVtSW5kZXggKyBpdGVtcy5sZW5ndGggLSAxKSAlIGl0ZW1zLmxlbmd0aCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIHRoaXMuY2xvc2VNZW51KGl0ZW1JbmRleCk7XG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKChpdGVtSW5kZXggKyBpdGVtcy5sZW5ndGggKyAxKSAlIGl0ZW1zLmxlbmd0aCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICB0aGlzLmZvY3VzRmlyc3RTdWJJdGVtKGl0ZW1JbmRleCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgdGhpcy5mb2N1c0xhc3RTdWJJdGVtKGl0ZW1JbmRleCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgdGhpcy5jbG9zZU1lbnUoaXRlbUluZGV4KTtcbiAgICAgICAgdGhpcy5mb2N1c0l0ZW0oaXRlbUluZGV4KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICh0aGlzLmlzUHJpbnRhYmxlQ2hhcihldmVudC5rZXkpKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1N1Ykl0ZW1CeUZpcnN0Q2hhcihpdGVtSW5kZXgsIGV2ZW50LmtleSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBoYW5kbGVQb3B1cE1lbnVJdGVtTW91c2VPdmVyKGl0ZW1JbmRleDogbnVtYmVyLCBzdWJJdGVtSW5kZXg6IG51bWJlciwgc3ViU3ViSXRlbUluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c1N1Ykl0ZW0oaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgsIHN1YlN1Ykl0ZW1JbmRleCk7XG4gIH1cblxuICAvKlxuICAgKiBDb211bmVzXG4gICAqL1xuXG4gIGNoZWNrUmVxdWlyZWQoKTogdm9pZCB7XG5cblxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuXG4gICAgLy8gTm8gc2UgaGEgcHVlc3RvIGxhYmVsIHJlcXVpcmVkIHBvcnF1ZSBlbiBhbGd1bm9zIGVqZW1wbG9zIGRlIGRlc3ktaHRtbCBubyBhcGFyZWNlXG4gIH1cblxuXG4gIGFjdGl2YXRlTWVudUl0ZW0oaXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICB0aGlzLmFjdGl2ZUl0ZW1DaGFuZ2UuZW1pdChpdGVtc1tpdGVtSW5kZXhdIGFzIE1lbnViYXJJdGVtKTtcbiAgICBpZiAoaXRlbXNbaXRlbUluZGV4XSBpbnN0YW5jZW9mIE1lbnViYXJJdGVtQ29tcG9uZW50KSB7XG4gICAgICAoaXRlbXNbaXRlbUluZGV4XSBhcyBNZW51YmFySXRlbUNvbXBvbmVudCkuc2VsZWN0ZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIGFjdGl2YXRlUG9wdXBNZW51SXRlbShpdGVtSW5kZXg6IG51bWJlciwgc3ViSXRlbUluZGV4OiBudW1iZXIsIHN1YlN1Ykl0ZW1JbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XG4gICAgbGV0IGl0ZW06IE1lbnViYXJJdGVtU3ViSXRlbXxNZW51YmFySXRlbVN1Ykl0ZW1TdWJJdGVtID0gc3ViSXRlbXNbc3ViSXRlbUluZGV4XTtcbiAgICBsZXQgc3ViU3ViSXRlbXMgPSBbXTtcbiAgICBpZiAoc3ViU3ViSXRlbUluZGV4ICE9PSBudWxsICYmIHN1YlN1Ykl0ZW1JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdWJTdWJJdGVtcyA9IHRoaXMuZ2V0U3ViSXRlbVN1Yml0ZW1zKGl0ZW0pO1xuICAgICAgaXRlbSA9IHN1YlN1Ykl0ZW1zW3N1YlN1Ykl0ZW1JbmRleF07XG4gICAgfVxuXG4gICAgbGV0IGNoZWNrZWRDaGFuZ2UgPSBmYWxzZTtcbiAgICBpZiAoaXRlbS5yb2xlID09PSAnbWVudWl0ZW1jaGVja2JveCcpIHtcbiAgICAgIGl0ZW0uY2hlY2tlZCA9ICFpdGVtLmNoZWNrZWQ7XG4gICAgICBjaGVja2VkQ2hhbmdlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0ucm9sZSA9PT0gJ21lbnVpdGVtcmFkaW8nKSB7XG4gICAgICBjaGVja2VkQ2hhbmdlID0gIWl0ZW0uY2hlY2tlZDtcbiAgICAgIHN1YlN1Ykl0ZW1zLmZvckVhY2goaSA9PiBpLmNoZWNrZWQgPSBmYWxzZSk7XG4gICAgICBpdGVtLmNoZWNrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuaXRlbXNDaGFuZ2UuZW1pdChpdGVtcyk7XG4gICAgdGhpcy5hY3RpdmVTdWJJdGVtQ2hhbmdlLmVtaXQoaXRlbSBhcyBNZW51YmFySXRlbSk7XG4gICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBNZW51YmFyU3ViaXRlbUNvbXBvbmVudCB8fCBpdGVtIGluc3RhbmNlb2YgTWVudWJhclN1YnN1Yml0ZW1Db21wb25lbnQpIHtcbiAgICAgIGl0ZW0uc2VsZWN0ZWQuZW1pdCgpO1xuXG4gICAgICBpZiAoY2hlY2tlZENoYW5nZSkge1xuICAgICAgICBpdGVtLmNoZWNrZWRDaGFuZ2UuZW1pdChpdGVtLmNoZWNrZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG11c3RDbG9zZUFmdGVyU2VsZWN0UG9wdXBJdGVtKGl0ZW1JbmRleDogbnVtYmVyLCBzdWJJdGVtSW5kZXg6IG51bWJlciwgc3ViU3ViSXRlbUluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgY29uc3Qgc3ViSXRlbXMgPSB0aGlzLmdldEl0ZW1TdWJpdGVtcyhpdGVtc1tpdGVtSW5kZXhdKTtcbiAgICBsZXQgaXRlbTogTWVudWJhckl0ZW1TdWJJdGVtfE1lbnViYXJJdGVtU3ViSXRlbVN1Ykl0ZW0gPSBzdWJJdGVtc1tzdWJJdGVtSW5kZXhdO1xuICAgIGlmIChzdWJTdWJJdGVtSW5kZXggIT09IG51bGwgJiYgc3ViU3ViSXRlbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHN1YlN1Ykl0ZW1zID0gdGhpcy5nZXRTdWJJdGVtU3ViaXRlbXMoaXRlbSk7XG4gICAgICBpdGVtID0gc3ViU3ViSXRlbXNbc3ViU3ViSXRlbUluZGV4XTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbS5yb2xlICE9PSAnbWVudWl0ZW1jaGVja2JveCcgJiYgaXRlbS5yb2xlICE9PSAnbWVudWl0ZW1yYWRpbyc7XG4gIH1cblxuICBvcGVuTWVudShpdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdhc09wZW5lZCA9IHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5vcGVuO1xuICAgIHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5vcGVuID0gdHJ1ZTtcbiAgICBpZiAod2FzT3BlbmVkKSB7XG4gICAgICB0aGlzLmFjdGl2YXRlTWVudUl0ZW0oaXRlbUluZGV4KTtcbiAgICB9XG4gIH1cblxuICBjbG9zZU1lbnUoaXRlbUluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGl0ZW1JbmRleCAhPT0gbnVsbCAmJiBpdGVtSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm9wZW4gPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZW51RGF0YS5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5vcGVuID0gZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGhhc1BvcHVwTWVudShpdGVtSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XG4gICAgcmV0dXJuIGl0ZW1zW2l0ZW1JbmRleF0uc3ViICYmIHN1Ykl0ZW1zICYmIHN1Ykl0ZW1zLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwcml2YXRlIGlzUHJpbnRhYmxlQ2hhcihzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdHIubGVuZ3RoID09PSAxICYmICEhc3RyLm1hdGNoKC9cXFMvKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWVudURhdGFJbmRleChpdGVtSW5kZXg6IG51bWJlciwgc3ViSXRlbUluZGV4OiBudW1iZXIsIHN1YlN1Ykl0ZW1JbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IG1lbnVEYXRhSW5kZXggPSAwO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJJdGVtSW5kZXg7IGkrKykge1xuICAgICAgY29uc3Qgc3ViSXRlbSA9IHN1Ykl0ZW1zW2ldO1xuICAgICAgY29uc3Qgc3ViU3ViSXRlbXMgPSB0aGlzLmdldFN1Ykl0ZW1TdWJpdGVtcyhzdWJJdGVtKTtcbiAgICAgIG1lbnVEYXRhSW5kZXggKz0gc3ViU3ViSXRlbXMgJiYgc3ViU3ViSXRlbXMubGVuZ3RoID4gMCA/IHN1YlN1Ykl0ZW1zLmxlbmd0aCA6IDE7XG4gICAgfVxuXG4gICAgaWYgKHN1YlN1Ykl0ZW1JbmRleCAhPT0gbnVsbCAmJiBzdWJTdWJJdGVtSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVudURhdGFJbmRleCArPSBzdWJTdWJJdGVtSW5kZXg7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbnVEYXRhSW5kZXg7XG4gIH1cblxuICAvKlxuICAgKiBDb211bmVzIC0gZm9jdXNcbiAgICovXG5cbiAgZm9jdXNJdGVtKGl0ZW1JbmRleDogbnVtYmVyLCBob3Zlcj86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBoYXNGb2N1cyA9IHRoaXMubWVudWJhci5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICAgIGNvbnN0IGlzT3BlbiA9IHRoaXMubWVudURhdGFbdGhpcy5jdXJyZW50Rm9jdXNJdGVtSW5kZXhdLm9wZW47XG5cbiAgICBpZiAoIWhvdmVyIHx8IGhhc0ZvY3VzKSB7XG4gICAgICB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ubWVudUl0ZW0ubGluay5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICBpZiAoaXNPcGVuICYmIHRoaXMuaGFzUG9wdXBNZW51KGl0ZW1JbmRleCkpIHtcbiAgICAgIHRoaXMub3Blbk1lbnUoaXRlbUluZGV4KTtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRGb2N1c0l0ZW1JbmRleCA9IGl0ZW1JbmRleDtcbiAgfVxuXG4gIGZvY3VzTmV4dEF2YWlsYWJsZUl0ZW0oZnJvbUl0ZW1JbmRleDogbnVtYmVyLCBzdGVwOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgbmV4dEl0ZW0gPSBmcm9tSXRlbUluZGV4O1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGRvIHtcbiAgICAgIG5leHRJdGVtID0gKG5leHRJdGVtICsgaXRlbXMubGVuZ3RoICsgc3RlcCkgJSBpdGVtcy5sZW5ndGg7XG4gICAgfSB3aGlsZSAoIXRoaXMuaXNJdGVtRm9jdXNhYmxlKG5leHRJdGVtKSAmJiBuZXh0SXRlbSAhPT0gZnJvbUl0ZW1JbmRleCk7XG5cbiAgICBpZiAobmV4dEl0ZW0gIT09IGZyb21JdGVtSW5kZXgpIHtcbiAgICAgIHRoaXMuZm9jdXNJdGVtKG5leHRJdGVtKTtcbiAgICB9XG4gIH1cblxuICBmb2N1c0ZpcnN0SXRlbSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0l0ZW1Gb2N1c2FibGUoMCkpIHtcbiAgICAgIHRoaXMuZm9jdXNJdGVtKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzTmV4dEF2YWlsYWJsZUl0ZW0oMCwgKzEpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzTGFzdEl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgaWYgKHRoaXMuaXNJdGVtRm9jdXNhYmxlKGl0ZW1zLmxlbmd0aCAtIDEpKSB7XG4gICAgICB0aGlzLmZvY3VzSXRlbShpdGVtcy5sZW5ndGggLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c05leHRBdmFpbGFibGVJdGVtKGl0ZW1zLmxlbmd0aCAtIDEsIC0xKTtcbiAgICB9XG4gIH1cblxuICBpc0l0ZW1Gb2N1c2FibGUoaXRlbUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZ2V0SXRlbXMoKVtpdGVtSW5kZXhdLmRpc2FibGVkO1xuICB9XG5cbiAgZm9jdXNJdGVtQnlGaXJzdENoYXIoY2hhcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbUNvbnRlbnRzOiBzdHJpbmdbXSA9IHRoaXMubWVudUl0ZW1zLm1hcChtZW51SXRlbSA9PiBtZW51SXRlbS5pdGVtQ29udGVudFdyYXBwZXIubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudCk7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50Rm9jdXNJdGVtSW5kZXg7XG4gICAgbGV0IGZvdW5kSW5kZXggPSAtMTtcbiAgICBkbyB7XG4gICAgICBpbmRleCA9IChpbmRleCArIGl0ZW1Db250ZW50cy5sZW5ndGggKyAxKSAlIGl0ZW1Db250ZW50cy5sZW5ndGg7XG4gICAgICBpZiAoaXRlbUNvbnRlbnRzW2luZGV4XSAmJiBpdGVtQ29udGVudHNbaW5kZXhdLnRyaW0oKS5zdWJzdHIoMCwgMSkudG9Mb3dlckNhc2UoKSA9PT0gY2hhci50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgJiYgdGhpcy5pc0l0ZW1Gb2N1c2FibGUoaW5kZXgpKSB7XG4gICAgICAgIGZvdW5kSW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChmb3VuZEluZGV4ID09PSAtMSAmJiBpbmRleCAhPT0gdGhpcy5jdXJyZW50Rm9jdXNJdGVtSW5kZXgpO1xuXG4gICAgaWYgKGZvdW5kSW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5mb2N1c0l0ZW0oZm91bmRJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNTdWJJdGVtKGl0ZW1JbmRleDogbnVtYmVyLCBzdWJJdGVtSW5kZXg6IG51bWJlciwgc3ViU3ViSXRlbUluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5tZW51SXRlbS5wb3B1cE1lbnVJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtZW51RGF0YUluZGV4ID0gdGhpcy5nZXRNZW51RGF0YUluZGV4KGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCBzdWJTdWJJdGVtSW5kZXgpO1xuXG4gICAgICB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0uY3VycmVudEZvY3VzU3ViSXRlbUluZGV4ID0gc3ViSXRlbUluZGV4O1xuICAgICAgdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLmN1cnJlbnRGb2N1c1N1YlN1Ykl0ZW1JbmRleCA9IHN1YlN1Ykl0ZW1JbmRleDtcbiAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ubWVudUl0ZW0ucG9wdXBNZW51SXRlbXMudG9BcnJheSgpW21lbnVEYXRhSW5kZXhdLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoZWxlbSkge1xuICAgICAgICBlbGVtLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBzdWJpdGVtIHRvIGZvY3VzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHN1Yml0ZW1zJyk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNOZXh0QXZhaWxhYmxlU3ViSXRlbShpdGVtSW5kZXg6IG51bWJlciwgZnJvbUl0ZW1TdWJJbmRleDogbnVtYmVyLCBmcm9tSXRlbVN1YlN1YkluZGV4OiBudW1iZXIsIHN0ZXA6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBuZXh0U3ViSW5kZXggPSBmcm9tSXRlbVN1YkluZGV4O1xuICAgIGxldCBuZXh0U3ViU3ViSW5kZXggPSBmcm9tSXRlbVN1YlN1YkluZGV4O1xuICAgIGxldCBhbGxTdWJJdGVtc0NoZWNrZWQ7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgZG8ge1xuICAgICAgY29uc3QgbmV4dEluZGV4ZXMgPSB0aGlzLmdldE5leHRTdWJJdGVtSW5kZXhlcyhpdGVtcywgaXRlbUluZGV4LCBuZXh0U3ViSW5kZXgsIG5leHRTdWJTdWJJbmRleCwgc3RlcCk7XG4gICAgICBuZXh0U3ViSW5kZXggPSBuZXh0SW5kZXhlcy5zdWJJbmRleDtcbiAgICAgIG5leHRTdWJTdWJJbmRleCA9IG5leHRJbmRleGVzLnN1YlN1YkluZGV4O1xuICAgICAgYWxsU3ViSXRlbXNDaGVja2VkID0gKGZyb21JdGVtU3ViSW5kZXggPT09IG5leHRTdWJJbmRleCAmJiBmcm9tSXRlbVN1YlN1YkluZGV4ID09PSBuZXh0U3ViU3ViSW5kZXgpO1xuICAgIH0gd2hpbGUgKCF0aGlzLmlzU3ViSXRlbUZvY3VzYWJsZShpdGVtSW5kZXgsIG5leHRTdWJJbmRleCwgbmV4dFN1YlN1YkluZGV4KSAmJiAhYWxsU3ViSXRlbXNDaGVja2VkKTtcblxuICAgIGlmICghYWxsU3ViSXRlbXNDaGVja2VkKSB7XG4gICAgICB0aGlzLmZvY3VzU3ViSXRlbShpdGVtSW5kZXgsIG5leHRTdWJJbmRleCwgbmV4dFN1YlN1YkluZGV4KTtcbiAgICB9XG4gIH1cblxuICBmb2N1c0ZpcnN0U3ViSXRlbShpdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBmaXJzdFN1YlN1Ykl0ZW0gPSBudWxsO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XG4gICAgY29uc3Qgc3ViU3ViSXRlbXMgPSB0aGlzLmdldFN1Ykl0ZW1TdWJpdGVtcyhzdWJJdGVtc1swXSk7XG4gICAgaWYgKHN1YlN1Ykl0ZW1zICYmIHN1YlN1Ykl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpcnN0U3ViU3ViSXRlbSA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTdWJJdGVtRm9jdXNhYmxlKGl0ZW1JbmRleCwgMCwgZmlyc3RTdWJTdWJJdGVtKSkge1xuICAgICAgdGhpcy5mb2N1c1N1Ykl0ZW0oaXRlbUluZGV4LCAwLCBmaXJzdFN1YlN1Ykl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzTmV4dEF2YWlsYWJsZVN1Ykl0ZW0oaXRlbUluZGV4LCAwLCBmaXJzdFN1YlN1Ykl0ZW0sICsxKTtcbiAgICB9XG4gIH1cblxuICBmb2N1c0xhc3RTdWJJdGVtKGl0ZW1JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgY29uc3Qgc3ViSXRlbXMgPSB0aGlzLmdldEl0ZW1TdWJpdGVtcyhpdGVtc1tpdGVtSW5kZXhdKTtcbiAgICBjb25zdCBsYXN0SXRlbUluZGV4ID0gc3ViSXRlbXMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBsYXN0SXRlbSA9IHN1Ykl0ZW1zW2xhc3RJdGVtSW5kZXhdO1xuICAgIGNvbnN0IHN1YlN1Ykl0ZW1zID0gdGhpcy5nZXRTdWJJdGVtU3ViaXRlbXMobGFzdEl0ZW0pO1xuICAgIGxldCBsYXN0U3ViU3ViSXRlbSA9IG51bGw7XG4gICAgaWYgKHN1YlN1Ykl0ZW1zICYmIHN1YlN1Ykl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGxhc3RTdWJTdWJJdGVtID0gc3ViU3ViSXRlbXMubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1N1Ykl0ZW1Gb2N1c2FibGUoaXRlbUluZGV4LCBsYXN0SXRlbUluZGV4LCBsYXN0U3ViU3ViSXRlbSkpIHtcbiAgICAgIHRoaXMuZm9jdXNTdWJJdGVtKGl0ZW1JbmRleCwgbGFzdEl0ZW1JbmRleCwgbGFzdFN1YlN1Ykl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzTmV4dEF2YWlsYWJsZVN1Ykl0ZW0oaXRlbUluZGV4LCBsYXN0SXRlbUluZGV4LCBsYXN0U3ViU3ViSXRlbSwgLTEpO1xuICAgIH1cbiAgfVxuXG4gIGlzU3ViSXRlbUZvY3VzYWJsZShpdGVtSW5kZXg6IG51bWJlciwgc3ViSXRlbUluZGV4OiBudW1iZXIsIHN1YlN1Ykl0ZW1JbmRleD86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGNvbnN0IHN1Ykl0ZW1zID0gdGhpcy5nZXRJdGVtU3ViaXRlbXMoaXRlbXNbaXRlbUluZGV4XSk7XG4gICAgbGV0IGl0ZW06IE1lbnViYXJJdGVtU3ViSXRlbXxNZW51YmFySXRlbVN1Ykl0ZW1TdWJJdGVtID0gc3ViSXRlbXNbc3ViSXRlbUluZGV4XTtcbiAgICBpZiAoc3ViU3ViSXRlbUluZGV4ICE9PSBudWxsICYmIHN1YlN1Ykl0ZW1JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzdWJTdWJJdGVtcyA9IHRoaXMuZ2V0U3ViSXRlbVN1Yml0ZW1zKGl0ZW0pO1xuICAgICAgaXRlbSA9IHN1YlN1Ykl0ZW1zW3N1YlN1Ykl0ZW1JbmRleF07XG4gICAgfVxuXG4gICAgbGV0IGlzRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgaWYgKGl0ZW0ucm9sZSAhPT0gJ3NlcGFyYXRvcicgJiYgaXRlbS5yb2xlICE9PSAnbm9uZScpIHtcbiAgICAgIGlzRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNGb2N1c2FibGU7XG4gIH1cblxuICBmb2N1c1N1Ykl0ZW1CeUZpcnN0Q2hhcihpdGVtSW5kZXg6IG51bWJlciwgY2hhcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbUNvbnRlbnRzOiBzdHJpbmdbXSA9IHRoaXMubWVudUl0ZW1zLnRvQXJyYXkoKVtpdGVtSW5kZXhdLnBvcHVwTWVudUl0ZW1zLm1hcChtZW51SXRlbSA9PiBtZW51SXRlbS5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50KTtcbiAgICBsZXQgc3ViSXRlbUluZGV4ID0gdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLmN1cnJlbnRGb2N1c1N1Ykl0ZW1JbmRleDtcbiAgICBsZXQgc3ViU3ViSXRlbUluZGV4ID0gdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLmN1cnJlbnRGb2N1c1N1YlN1Ykl0ZW1JbmRleDtcbiAgICBsZXQgZm91bmRTdWJJbmRleCA9IC0xO1xuICAgIGxldCBmb3VuZFN1YlN1YkluZGV4ID0gbnVsbDtcbiAgICBsZXQgYWxsU3ViSXRlbXNDaGVja2VkID0gZmFsc2U7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgZG8ge1xuICAgICAgY29uc3QgbmV4dEluZGV4ZXMgPSB0aGlzLmdldE5leHRTdWJJdGVtSW5kZXhlcyhpdGVtcywgaXRlbUluZGV4LCBzdWJJdGVtSW5kZXgsIHN1YlN1Ykl0ZW1JbmRleCwgKzEpO1xuICAgICAgc3ViSXRlbUluZGV4ID0gbmV4dEluZGV4ZXMuc3ViSW5kZXg7XG4gICAgICBzdWJTdWJJdGVtSW5kZXggPSBuZXh0SW5kZXhlcy5zdWJTdWJJbmRleDtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRNZW51RGF0YUluZGV4KGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCBzdWJTdWJJdGVtSW5kZXgpO1xuICAgICAgaWYgKGl0ZW1Db250ZW50c1tpbmRleF0gJiYgaXRlbUNvbnRlbnRzW2luZGV4XS50cmltKCkuc3Vic3RyKDAsIDEpLnRvTG93ZXJDYXNlKCkgPT09IGNoYXIudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICYmIHRoaXMuaXNTdWJJdGVtRm9jdXNhYmxlKGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCBzdWJTdWJJdGVtSW5kZXgpKSB7XG4gICAgICAgIGZvdW5kU3ViSW5kZXggPSBzdWJJdGVtSW5kZXg7XG4gICAgICAgIGZvdW5kU3ViU3ViSW5kZXggPSBzdWJTdWJJdGVtSW5kZXg7XG4gICAgICB9XG4gICAgICBhbGxTdWJJdGVtc0NoZWNrZWQgPSAodGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLmN1cnJlbnRGb2N1c1N1Ykl0ZW1JbmRleCA9PT0gc3ViSXRlbUluZGV4XG4gICAgICAgICYmIHRoaXMubWVudURhdGFbaXRlbUluZGV4XS5jdXJyZW50Rm9jdXNTdWJTdWJJdGVtSW5kZXggPT09IHN1YlN1Ykl0ZW1JbmRleCk7XG4gICAgfSB3aGlsZSAoZm91bmRTdWJJbmRleCA9PT0gLTEgJiYgIWFsbFN1Ykl0ZW1zQ2hlY2tlZCk7XG5cbiAgICBpZiAoZm91bmRTdWJJbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLmZvY3VzU3ViSXRlbShpdGVtSW5kZXgsIGZvdW5kU3ViSW5kZXgsIGZvdW5kU3ViU3ViSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAqIE1ldG9kb3MgcGFyYSBmYWNpbGl0YXIgY29udGVuaWRvXG4gICAqL1xuXG4gIGdldEl0ZW1zKCk6IE1lbnViYXJJdGVtW118TWVudWJhckl0ZW1Db21wb25lbnRbXSB7XG4gICAgbGV0IGl0ZW1zO1xuICAgIGlmICh0aGlzLml0ZW1Db21wb25lbnRMaXN0ICYmIHRoaXMuaXRlbUNvbXBvbmVudExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgaXRlbXMgPSB0aGlzLml0ZW1Db21wb25lbnRMaXN0LnRvQXJyYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBnZXRJdGVtU3ViaXRlbXMoaXRlbTogTWVudWJhckl0ZW18TWVudWJhckl0ZW1Db21wb25lbnQpOiBNZW51YmFySXRlbVN1Ykl0ZW1bXXxNZW51YmFyU3ViaXRlbUNvbXBvbmVudFtdIHtcbiAgICBsZXQgc3ViSXRlbXMgPSBbXTtcbiAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIE1lbnViYXJJdGVtQ29tcG9uZW50KXtcbiAgICAgIHN1Ykl0ZW1zID0gaXRlbS5nZXRTdWJJdGVtcygpO1xuICAgIH1cblxuICAgIGlmICghc3ViSXRlbXMgfHwgc3ViSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzdWJJdGVtcyA9IGl0ZW0uc3ViID8gaXRlbS5zdWIuaXRlbXMgOiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3ViSXRlbXM7XG4gIH1cblxuICBnZXRTdWJJdGVtU3ViaXRlbXMoaXRlbTogTWVudWJhckl0ZW1TdWJJdGVtfE1lbnViYXJTdWJpdGVtQ29tcG9uZW50KTogTWVudWJhckl0ZW1TdWJJdGVtU3ViSXRlbVtdfE1lbnViYXJTdWJzdWJpdGVtQ29tcG9uZW50W10ge1xuICAgIGxldCBzdWJJdGVtcyA9IFtdO1xuXG4gICAgaWYgKGl0ZW0ucm9sZSA9PT0gJ2dyb3VwJykge1xuICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBNZW51YmFyU3ViaXRlbUNvbXBvbmVudCkge1xuICAgICAgICBzdWJJdGVtcyA9IGl0ZW0uZ2V0U3ViSXRlbXMoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdWJJdGVtcyB8fCBzdWJJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3ViSXRlbXMgPSBpdGVtLml0ZW1zID8gaXRlbS5pdGVtcyA6IFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdWJJdGVtcztcbiAgfVxuXG4gIGdldE5leHRTdWJJdGVtSW5kZXhlcyhpdGVtcywgaXRlbUluZGV4LCBuZXh0U3ViSW5kZXgsIG5leHRTdWJTdWJJbmRleCwgc3RlcCk6IHsgc3ViSW5kZXg6IG51bWJlciwgc3ViU3ViSW5kZXg/OiBudW1iZXJ9IHtcbiAgICBjb25zdCBzdWJJdGVtcyA9IHRoaXMuZ2V0SXRlbVN1Yml0ZW1zKGl0ZW1zW2l0ZW1JbmRleF0pO1xuICAgIGNvbnN0IHN1YlN1Ykl0ZW1zID0gdGhpcy5nZXRTdWJJdGVtU3ViaXRlbXMoc3ViSXRlbXNbbmV4dFN1YkluZGV4XSk7XG5cbiAgICBsZXQgY2hlY2tOZXh0U3ViSXRlbSA9IHRydWU7XG4gICAgaWYgKHN1YlN1Ykl0ZW1zICYmIHN1YlN1Ykl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChuZXh0U3ViU3ViSW5kZXggKyBzdGVwID49IDAgJiYgbmV4dFN1YlN1YkluZGV4ICsgc3RlcCA8IHN1YlN1Ykl0ZW1zLmxlbmd0aCkge1xuICAgICAgICBuZXh0U3ViU3ViSW5kZXggKz0gc3RlcDtcbiAgICAgICAgY2hlY2tOZXh0U3ViSXRlbSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGVja05leHRTdWJJdGVtKSB7XG4gICAgICBuZXh0U3ViSW5kZXggPSAobmV4dFN1YkluZGV4ICsgc3RlcCArIHN1Ykl0ZW1zLmxlbmd0aCkgJSBzdWJJdGVtcy5sZW5ndGg7XG4gICAgICBjb25zdCBuZXh0U3ViSXRlbUl0ZW1zID0gdGhpcy5nZXRTdWJJdGVtU3ViaXRlbXMoc3ViSXRlbXNbbmV4dFN1YkluZGV4XSk7XG4gICAgICBpZiAobmV4dFN1Ykl0ZW1JdGVtcyAmJiBuZXh0U3ViSXRlbUl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV4dFN1YlN1YkluZGV4ID0gKChzdGVwID4gMCA/IC0xIDogMCkgKyBzdGVwICsgbmV4dFN1Ykl0ZW1JdGVtcy5sZW5ndGgpICUgbmV4dFN1Ykl0ZW1JdGVtcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0U3ViU3ViSW5kZXggPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7c3ViSW5kZXg6IG5leHRTdWJJbmRleCwgc3ViU3ViSW5kZXg6IG5leHRTdWJTdWJJbmRleH07XG4gIH1cblxuICBnZXRJZFByZWZpeCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkUHJlZml4ID8gdGhpcy5pZFByZWZpeCA6IHRoaXMuaWQgKyAnbWVudWJhci1pdGVtJztcbiAgfVxuXG4gIGdldExhYmVsUmVmKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmxhYmVsQ29tcG9uZW50ID8gdGhpcy5sYWJlbENvbXBvbmVudC5nZXRDb250ZW50KCkgOiB0aGlzLmxhYmVsUmVmO1xuICB9XG5cbiAgZ2V0TGFiZWxDb250ZW50KCk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICBpZiAodGhpcy5sYWJlbERhdGEpIHtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLmxhYmVsRGF0YS5odG1sID8gdGhpcy5sYWJlbERhdGEuaHRtbCA6IGA8cD4keyBTdHJpbmdVdGlscy5lc2NhcGVIdG1sKHRoaXMubGFiZWxEYXRhLnRleHQpIH08L3A+YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGFiZWxUZXh0KSB7XG4gICAgICBjb250ZW50ID0gYDxwPiR7IFN0cmluZ1V0aWxzLmVzY2FwZUh0bWwodGhpcy5sYWJlbFRleHQpIH08L3A+YDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBnZXRJdGVtSWQoaXRlbSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgbGV0IGlkOiBzdHJpbmc7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIGlmIChpdGVtLmlkKSB7XG4gICAgICAgIGlkID0gaXRlbS5pZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlkID0gaW5kZXggPT09IDAgPyB0aGlzLmdldElkUHJlZml4KCkgOiBgJHt0aGlzLmdldElkUHJlZml4KCl9LSR7aW5kZXh9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgZ2V0UG9wdXBTdHlsZShpdGVtSW5kZXg6IG51bWJlcik6IG9iamVjdCB7XG4gICAgbGV0IHN0eWxlID0ge307XG4gICAgaWYgKHRoaXMubWVudURhdGEgJiYgaXRlbUluZGV4IDwgdGhpcy5tZW51RGF0YS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG1lbnVJdGVtID0gdGhpcy5tZW51RGF0YVtpdGVtSW5kZXhdLm1lbnVJdGVtO1xuICAgICAgY29uc3QgcmVjdCA9IG1lbnVJdGVtLmxpbmsubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmICh0aGlzLm1lbnVEYXRhW2l0ZW1JbmRleF0ub3Blbikge1xuICAgICAgICBzdHlsZSA9IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICB0b3A6IChyZWN0LmhlaWdodCAtIDEpICsgJ3B4JyxcbiAgICAgICAgICBsZWZ0OiAnMHB4JyxcbiAgICAgICAgICB6SW5kZXg6IDEwMCxcbiAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZSA9IHtcbiAgICAgICAgICB6SW5kZXg6IDAsXG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG5cbiAgZ2V0U3ViSXRlbUlkKGl0ZW0sIGluZGV4OiBudW1iZXIsIHBhcmVudElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBpZDogc3RyaW5nO1xuICAgIGlmIChpdGVtKSB7XG4gICAgICBpZiAoaXRlbS5pZCkge1xuICAgICAgICBpZCA9IGl0ZW0uaWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZCA9IGluZGV4ID09PSAwID8gYHN1Yi0ke3BhcmVudElkfWAgOiBgc3ViLSR7cGFyZW50SWR9LSR7aW5kZXh9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgZ2V0U3ViU3ViSXRlbUFyaWFDaGVja2VkKHN1YnN1Yml0ZW0pOiBzdHJpbmcge1xuICAgIGxldCBhcmlhQ2hlY2tlZCA9IG51bGw7XG4gICAgaWYgKHN1YnN1Yml0ZW0ucm9sZSA9PT0gJ21lbnVpdGVtY2hlY2tib3gnIHx8IHN1YnN1Yml0ZW0ucm9sZSA9PT0gJ21lbnVpdGVtcmFkaW8nKSB7XG4gICAgICBhcmlhQ2hlY2tlZCA9ICEhc3Vic3ViaXRlbS5jaGVja2VkO1xuICAgIH1cbiAgICByZXR1cm4gYXJpYUNoZWNrZWQ7XG4gIH1cbn1cbiJdfQ==